IAM 教學課程:使用 IAM 角色將存取許可委派給不同 AWS 帳戶 - AWS Identity and Access Management

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

IAM 教學課程:使用 IAM 角色將存取許可委派給不同 AWS 帳戶

此教學課程教導您如何使用角色將存取許可委派給您所擁有不同 AWS 帳戶 中的資源 (生產開發)。您與不同帳戶中的使用者分享一個帳戶中的資源。透過以這種方式設定跨帳戶存取,您不需要在每個帳戶中建立個別的 IAM 使用者。此外,使用者不需要為了存取不同 AWS 帳戶 中的資源,登出一個帳戶然後登入另一個帳戶。在設定角色後,您便會了解如何從 AWS Management Console、AWS CLI 和 API 使用角色。

注意

IAM 角色和資源型政策只會在單一分割內跨帳戶委派存取許可。例如,假設您在標準 aws 分割區的美國西部 (加利佛尼亞北部) 中有一個帳戶。您在 aws-cn 分割區的中國 (北京) 中也有一個帳戶。您不能使用中國 (北京) 中帳戶的 Amazon S3 資源型政策,對標準 aws 帳戶中的使用者允許存取許可。

在本教學中,生產帳戶管理即時應用程式。開發人員和測試人員可以將開發帳戶作為自由測試應用程式的沙盒。在每個帳戶中,應用程式資訊存放在 Amazon S3 儲存貯體中。您管理開發帳戶中的 IAM 使用者,在該帳戶中您有兩個 IAM 使用者群組:開發人員測試人員。兩個群組中的使用者均具有許可能在開發帳戶中工作和存取資源。有時候,開發人員必須在生產帳戶中更新即時應用程式。開發人員將這些應用程式存放在稱為 productionapp 的 Amazon S3 儲存貯體中。

在本教學的結尾,您會擁有:

  • 開發帳戶 (受信任帳戶) 中允許擔任生產帳戶中特定角色的使用者。

  • 生產帳戶 (信任帳戶) 中允許存取特定 Amazon S3 儲存貯體的角色。

  • 生產帳戶中的 productionapp 儲存貯體。

開發人員可以使用 AWS Management Console 中的角色來存取生產帳戶中的 productionapp 儲存貯體。他們也可以透過使用 API 呼叫來存取儲存貯體,而該呼叫是由角色提供的暫時性憑證進行身分驗證。測試人員進行類似嘗試來使用角色會失敗。

此工作流程有三個基本步驟:

在生產帳戶中建立角色

首先,您使用 AWS Management Console 在生產帳戶 (ID 編號 999999999999) 和開發帳戶 (ID 編號 111111111111) 之間建立信任。透過建立一個名為 UpdateApp 的 IAM 角色開始。建立角色後,您可以定義開發帳戶為受信任的實體並指定許可政策,該政策允許受信任的使用者更新 productionapp 儲存貯體。

授予角色存取權

在本節中,您修改 IAM 使用者群組政策,拒絕測試人員存取 UpdateApp 角色。由於測試人員在這個案例中具有 PowerUser 存取許可,您必須明確拒絕使用角色的能力。

透過切換角色測試存取

最後,作為開發人員,您使用 UpdateApp 角色來更新生產帳戶中的 productionapp 儲存貯體。您會了解如何透過 AWS 主控台、AWS CLI 和 API 存取角色。

先決條件

此教學課程假設您已備妥下列項目:

  • 您可以使用兩個不同的 AWS 帳戶,一個代表開發帳戶,另一個代表生產帳戶。

  • 開發帳戶中使用者和使用者群組的建立和設定,如下所示:

    使用者 使用者群組 許可
    David 開發人員 兩位使用者皆可登入並使用開發帳戶中的 AWS Management Console。
    Jane 測試人員
  • 您不需要在生產帳戶中建立有任何使用者或使用者群組。

  • 生產帳戶中建立一個 Amazon S3 儲存貯體。您可在此教學課程中將其稱為 ProductionApp,但因為 S3 儲存貯體名稱必須是全域唯一,所以您必須使用不同名稱的儲存貯體。

在生產帳戶中建立角色

您可以允許一個 AWS 帳戶 的使用者存取另一個 AWS 帳戶 中的資源。若要執行此作業,請建立一個角色並定義誰可以存取該角色,以及角色可授與哪些許可給切換至該角色的使用者。

在教學課程的此步驟中,您在生產帳戶中建立角色,並指定開發帳戶作為受信任的實體。您也限制角色的許可為僅擁有讀取和寫入 productionapp 儲存貯體的存取許可。被授予許可以使用角色的任何人都可以讀取和寫入 productionapp 儲存貯體。

在您可以建立角色之前,您需要開發 AWS 帳戶 的帳戶 ID。每個 AWS 帳戶 具有指派給它的唯一帳戶 ID 識別碼。

若要取得開發 AWS 帳戶 ID
  1. 開發帳戶的管理員身分登入 AWS Management Console 並在 https://console.aws.amazon.com/iam/ 開啟 IAM 主控台。

  2. 在導覽列中,選擇 Support (支援),然後選擇 Support Center (支援中心)。您目前登入的 12 位數帳戶號碼 (ID) 會顯示在 Support Center (支援中心) 導覽窗格。在此案例中,您可以使用帳戶 ID 111111111111 表示開發帳戶。不過,如果您在測試環境中使用此案例,則應該使用有效的帳戶 ID。

在生產帳戶中建立開發帳戶可以使用的角色
  1. 生產帳戶的管理員身分登入 AWS Management Console,然後開啟 IAM 主控台。

  2. 建立角色之前,請準備定義角色所需許可的受管政策。您可以在稍後的步驟將此政策連接至角色。

    您想要設定 productionapp 儲存貯體的讀取和寫入存取許可。雖然 AWS 提供一些 Amazon S3 受管政策,但是沒有一條提供對單一 Amazon S3 儲存貯體的讀取和寫入存取許可。您可以改為建立自己的政策。

    在導覽窗格中,選擇 Policies (政策),然後選擇 Create policy (建立政策)

  3. 選擇 JSON 標籤並從下列 JSON 政策文件複製文字。將此文字貼到 JSON 文字方塊中,以您 Amazon S3 儲存貯體的真實 ARN 替換資源 ARN (arn:aws:s3:::productionapp)。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:ListAllMyBuckets", "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::productionapp" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::productionapp/*" } ] }

    ListAllMyBuckets 動作授予許可,可列出已經過身分驗證的請求發送者擁有的所有儲存貯體 ListBucket 許可允許使用者檢視 productionapp 儲存貯體中的物件。GetObjectPutObjectDeleteObject 許可允許使用者檢視、更新和刪除 productionapp 儲存貯體中的內容。

  4. 解決政策驗證期間產生的任何安全性警告、錯誤或一般性警告,然後選擇 Next (下一步)。

    注意

    您可以隨時切換視覺化JSON 編輯器選項。不過,如果您進行變更或在視覺化編輯器中選擇下一步,IAM 就可能會調整您的政策結構,以便針對視覺化編輯器進行最佳化。如需更多詳細資訊,請參閱 政策結構調整

  5. 檢視與建立頁面上,針對政策名稱輸入 read-write-app-bucket。檢視政策授與的許可,然後選擇建立政策來儲存您的工作。

    新的政策會出現在受管政策清單中。

  6. 在導覽窗格中,選擇 Roles (角色),然後選擇 Create role (建立角色)。

  7. 選擇 AWS 帳戶 角色類型。

  8. 針對 Account ID (帳戶 ID),輸入開發帳戶 ID。

    此教學課程對於開發帳戶使用範例帳戶 ID 111111111111。您應該使用有效的帳戶 ID。如果您使用無效的帳戶 ID (例如 111111111111),IAM 不會讓您建立新的角色。

    現在您不需要要求外部 ID,或要求使用者要有多重要素驗證 (MFA) 才能擔任角色。請保持不選取這些選項。如需更多詳細資訊,請參閱 在中使用多因素身份驗證(MFA) AWS

  9. 選擇 Next: Permissions (下一步:許可),以設定與角色建立關聯的許可。

  10. 選擇您之前建立的政策旁的核取方塊。

    秘訣

    針對 Filter (篩選條件),選擇 Customer managed (客戶受管) 以篩選清單,使其僅包含建立的政策。這會隱藏 AWS 建立的政策並讓找出所需項目更容易。

    然後選擇 Next (下一步)。

  11. (選用) 藉由連接標籤作為鍵值對,將中繼資料新增至角色。如需有關在 IAM 中使用標籤的詳細資訊,請參閱 標記 IAM 資源

  12. (選用) 在 Description (說明) 中,輸入新角色的說明。

  13. 檢閱角色之後,選擇 Create role (建立角色)

    UpdateApp 角色會顯示在角色清單中。

現在,您必須取得角色的 Amazon Resource Name (ARN),這是該角色的唯一識別碼。當您修改開發人員和測試人員使用者群組的政策時,您將指定角色的 ARN 以授予或拒絕許可。

若要取得 UpdateApp 的 ARN
  1. 在 IAM 主控台的導覽窗格中,選擇 Roles (角色)。

  2. 在角色清單中,選擇 UpdateApp 角色。

  3. 在詳細資訊窗格的 Summary (摘要) 區段中,複製 Role ARN (角色 ARN) 值。

    生產帳戶具有帳戶 ID 999999999999,所以角色 ARN 為 arn:aws:iam::999999999999:role/UpdateApp。確定您為「生產」帳戶提供真實的 AWS 帳戶 ID。

此時,您已建立生產開發帳戶之間的信任。完成上述作業的方法是在生產帳戶中建立角色,可將開發帳戶識別為受信任主體。您也定義切換到 UpdateApp 角色的使用者可以執行什麼動作。

接下來,修改使用者群組的許可。

授予角色存取權

此時,測試人員和開發人員使用者群組成員都具有允許他們自由在開發帳戶中測試應用程式的許可。使用以下所需的步驟以新增各種許可允許切換到該角色。

若要修改開發人員使用者群組以允許他們切換到 UpdateApp 角色
  1. 開發帳戶管理員身分登入,並開啟 IAM 主控台。

  2. 選擇 User Groups (使用者群組),然後選擇 Developers (開發人員)

  3. 選擇 Permissions (許可) 標籤,選擇 Add permissions (新增許可),然後選擇 Attach policy (連接政策)

  4. 請選擇 JSON 標籤。

  5. 新增以下政策陳述式,以允許生產帳戶中的 UpdateApp 角色進行 AssumeRole 動作。請務必將 Resource 元素中的 PRODUCTION-ACCOUNT-ID 變更為生產帳戶的實際 AWS 帳戶 ID。

    { "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::PRODUCTION-ACCOUNT-ID:role/UpdateApp" } }

    Allow 效果明確地允許開發人員群組存取生產帳戶中的 UpdateApp 角色。任何嘗試存取角色的開發人員都會成功。

  6. 選擇 Review policy (檢閱政策)

  7. 輸入名稱,例如 allow-assume-S3-role-in-production

  8. 選擇 建立政策

在大多數環境中,可能不需要以下程序。不過,如果您使用 PowerUserAccess 許可,則一些群組可能已經能夠切換角色。下列程序顯示如何將新增 "Deny" 許可到測試人員群組,以確保他們無法擔任角色。如果在您的環境中並不需要此程序,我們建議您不要新增。"Deny" 許可會讓整體許可情況變得更複雜,不易管理和了解。只在沒有更好的選項時使用 "Deny" 許可。

若要修改測試人員使用者群組以拒絕擔任 UpdateApp 角色的許可
  1. 選擇 User Groups (使用者群組),然後選擇 Testers (測試人員)

  2. 選擇 Permissions (許可) 標籤,選擇 Add permissions (新增許可),然後選擇 Attach policy (連接政策)

  3. 請選擇 JSON 標籤。

  4. 新增以下政策陳述式以拒絕 UpdateApp 角色的 AssumeRole 動作。請務必將 Resource 元素中的 PRODUCTION-ACCOUNT-ID 變更為生產帳戶的實際 AWS 帳戶 ID。

    { "Version": "2012-10-17", "Statement": { "Effect": "Deny", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::PRODUCTION-ACCOUNT-ID:role/UpdateApp" } }

    Deny 效果明確地拒絕讓測試人員群組存取生產帳戶中的 UpdateApp 角色。任何嘗試存取角色的測試人員都會收到存取遭拒的訊息。

  5. 選擇 Review policy (檢閱政策)。

  6. 輸入名稱,例如 deny-assume-S3-role-in-production

  7. 選擇 Create policy (建立政策)。

開發人員使用者群組現在具有許可,可使用生產帳戶中的 UpdateApp 角色。測試人員使用者群組就無法使用 UpdateApp 角色。

接下來,您可以了解開發人員 David 如何存取生產帳戶中的 productionapp 儲存貯體。David 可以從 AWS Management Console、AWS CLI 或 AWS API 存取儲存貯體。

透過切換角色測試存取

完成此教學課程的前兩個步驟後,您會有一個角色可授與存取生產帳戶中的資源。您也會在開發帳戶中有一個使用者群組,其中的使用者被允許使用該角色。此步驟討論如何測試從 AWS Management Console、AWS CLI 和 AWS API 切換到該角色。

重要

只有在您以 IAM 使用者或聯合身分使用者登入之後,才可以切換到角色。此外,如果您啟動 Amazon EC2 執行個體以執行應用程式,應用程式可透過其執行個體設定檔擔任角色。以 AWS 帳戶根使用者 身分登入時無法切換到特定角色。

切換角色 (主控台)

如果 David 需要在 AWS Management Console 中於生產環境內工作,則可以使用 Switch Role (切換角色)。他會指定帳戶 ID 或別名和角色名稱,而其許可會立即切換到角色所允許的項目。然後他可以利用主控台來使用 productionapp 儲存貯體,但無法使用生產中的任何其他資源。當 David 使用角色時,他也無法運用他在開發帳戶中的進階使用者許可。那是因為一次只有一組許可有效。

重要

使用 AWS Management Console 切換角色僅適用於不需要 ExternalId 的帳戶。例如,假設您將您帳戶的存取權授與第三方,並在許可政策的 Condition 元素中需要 ExternalId。在此情況下,第三方只能使用 AWS API 或命令列工具存取您的帳戶。第三方無法使用主控台,因為它無法提供 ExternalId 的值。如需此案例的詳細資訊,請參閱 將 AWS 資源的存取權授予第三方時如何使用外部 ID。,和 AWS 安全部落格中的 如何啟用對 AWS Management Console 的跨帳戶存取

David 可以使用 IAM 提供的兩種方式來進入 Switch Role (切換角色) 頁面:

  • David 從他們的管理員那裡收到指向預先定義的 Switch Role (切換角色) 組態的連結。該連結是在 Create Role (建立角色) 精靈的最終頁面上,或在跨帳戶角色的 Role Summary (角色摘要) 頁面上,提供給管理員。選擇此連結會帶領 David 前往已填寫 Account ID (帳戶 ID)Role name (角色名稱) 欄位的 Switch Role (切換角色) 頁面。David 需要做的只有選擇 Switch Role (切換角色)。

  • 管理員不會在電子郵件中傳送連結,但會改為傳送 Account ID (帳戶 ID) 號碼和 Role Name (角色名稱) 的值。若要切換角色,大衛必須手動輸入該值。下列程序中會以圖表說明:

擔任角色
  1. David 使用自己在開發使用者群組中的一般使用者登入 AWS Management Console。

  2. 他們選擇管理員電郵給他們的連結。這會將 David 導航到 Switch Role (切換角色) 頁面,其中帳戶 ID 或別名以及角色名稱資訊已填寫。

    —或—

    David 在導覽列上選擇他們的名稱 (Identity (身分) 選單),然後選擇 Switch Roles (切換角色)。

    如果這是 David 第一次以這種方式嘗試存取 Switch Role (切換角色) 頁面,他首先停留在初次執行的 Switch Role (切換角色) 頁面。此頁面提供有關切換角色如何讓使用者跨 AWS 帳戶 管理資源的額外資訊。David 必須在此頁面上選擇 Switch Role (切換角色),以完成此程序的剩餘部分。

  3. 接下來,為了存取角色,David 必須手動輸入生產帳戶 ID 號碼 (999999999999) 和角色名稱 (UpdateApp)。

    此外,David 想要監控 IAM 中目前作用中的角色 (以及相關聯的許可)。為了追蹤此資訊,他在 Display Name (顯示名稱) 文字方塊中輸入 PRODUCTION、選擇紅色選項,然後選擇 Switch Role (切換角色)

  4. David 現在可以使用 Amazon S3 主控台來使用 UpdateApp 角色所具有許可的 Amazon S3 儲存貯體或任何其他資源。

  5. 完成後,David 可以回到他們的原始許可。為了執行此作業,他們在導覽列上選擇 PRODUCTION (生產) 角色顯示名稱,然後選擇 Back to David @ 111111111111 (返回 David @ 111111111111)。

  6. 下次 David 想要切換角色和在導覽列中選擇 Identity (身分) 選單時,他會看到上次的 PRODUCTION 項目仍在那裡。他可以只要選擇該項目即可立即切換角色,而無需重新輸入帳戶 ID 和角色名稱。

切換角色 (AWS CLI)

如果 David 需要在命令列於生產環境中工作,則可以使用 AWS CLI。他執行 aws sts assume-role 命令,並傳遞角色 ARN 以取得該角色的暫時性安全憑證。然後,他在環境變數中設定這些憑證,讓後續 AWS CLI 命令工作時使用該角色的許可。雖然 David 使用該角色,他無法在開發帳戶中使用他的進階使用者許可,因為一次只能有一組許可有效。

請注意,所有存取金鑰和權杖僅為範例,不能如下所示般使用。以您實際環境中的適當值取代。

擔任角色
  1. David 開啟命令提示字元視窗,並透過執行命令確認 AWS CLI 用戶端運作中:

    aws help
    注意

    David 的預設環境使用其預設設定檔的 David 使用者憑證,這是使用 aws configure 命令建立的。如需詳細資訊,請參閱 AWS Command Line Interface 使用者指南中的設定 AWS Command Line Interface

  2. 他透過執行以下命令開始切換角色程序,以切換到生產帳戶中的 UpdateApp 角色。他從建立角色的管理員角色收到角色 ARN。該命令也會要求您提供工作階段名稱,您可以選擇您想要的任何文字。

    aws sts assume-role --role-arn "arn:aws:iam::999999999999:role/UpdateApp" --role-session-name "David-ProdUpdate"

    David 然後會在輸出中看到以下:

    { "Credentials": { "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", "SessionToken": "AQoDYXdzEGcaEXAMPLE2gsYULo+Im5ZEXAMPLEeYjs1M2FUIgIJx9tQqNMBEXAMPLE CvSRyh0FW7jEXAMPLEW+vE/7s1HRpXviG7b+qYf4nD00EXAMPLEmj4wxS04L/uZEXAMPLECihzFB5lTYLto9dyBgSDy EXAMPLE9/g7QRUhZp4bqbEXAMPLENwGPyOj59pFA4lNKCIkVgkREXAMPLEjlzxQ7y52gekeVEXAMPLEDiB9ST3Uuysg sKdEXAMPLE1TVastU1A0SKFEXAMPLEiywCC/Cs8EXAMPLEpZgOs+6hz4AP4KEXAMPLERbASP+4eZScEXAMPLEsnf87e NhyDHq6ikBQ==", "Expiration": "2014-12-11T23:08:07Z", "AccessKeyId": "AKIAIOSFODNN7EXAMPLE" } }
  3. David 在輸出的 Credentials (憑證) 區段看到他們需要的三個部分。

    • AccessKeyId

    • SecretAccessKey

    • SessionToken

    David 需要設定 AWS CLI 環境,以便在後續呼叫中使用這些參數。如需設定憑證各種方式的資訊,請參閱設定 AWS Command Line Interface。您不能使用 aws configure 命令,因為它不支援擷取工作階段權杖。不過,您可以將資訊手動輸入到組態檔案中。由於這些是暫時性憑證,其過期時間相對較短,最簡單的方式是將它們新增至您目前命令列工作階段的環境。

  4. 為新增三個值到環境,David 剪下並貼上前一個步驟的輸出到以下命令中。建議您剪下並貼上到簡單的文字編輯器,來處理工作階段權杖輸出中的換行問題。它必須新增為單一長字串,即使在這裡為清楚起見以換行方式顯示。

    注意

    以下範例顯示 Windows 環境中指定命令,其中 "set" 是用來建立環境變數的命令。在 Linux 或 macOS 電腦上,請改為使用命令 "export"。範例的所有其他部分在所有三個環境中均為有效。

    如需使用 Windows Powershell 工具的詳細資訊,請參閱切換至 IAM 角色 (Tools for Windows PowerShell)

    set AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE set AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY set AWS_SESSION_TOKEN=AQoDYXdzEGcaEXAMPLE2gsYULo+Im5ZEXAMPLEeYjs1M2FUIgIJx9tQqNMBEXAMPLECvS Ryh0FW7jEXAMPLEW+vE/7s1HRpXviG7b+qYf4nD00EXAMPLEmj4wxS04L/uZEXAMPLECihzFB5lTYLto9dyBgSDyEXA MPLEKEY9/g7QRUhZp4bqbEXAMPLENwGPyOj59pFA4lNKCIkVgkREXAMPLEjlzxQ7y52gekeVEXAMPLEDiB9ST3UusKd EXAMPLE1TVastU1A0SKFEXAMPLEiywCC/Cs8EXAMPLEpZgOs+6hz4AP4KEXAMPLERbASP+4eZScEXAMPLENhykxiHen DHq6ikBQ==

    此時,任何下列命令在這些憑證所識別角色的許可下執行。在 David 的案例中,為 UpdateApp 角色。

  5. 執行命令來存取生產帳戶中的資源。在這個範例中,David 只需要使用下列命令列出他們的 S3 儲存貯體的內容。

    aws s3 ls s3://productionapp

    由於 Amazon S3 儲存貯體名稱是全域唯一,所以不需要指定擁有該儲存貯體的帳戶 ID。若要存取其他 AWS 服務的資源,請參閱該服務的 AWS CLI 文件,以取得參考其資源所需的命令和語法。

使用 AssumeRole (AWS API)

當 David 需要從程式碼進行生產帳戶的更新時,他進行 AssumeRole 呼叫以擔任 UpdateApp 角色 。此呼叫會傳回他可用來存取生產帳戶中 productionapp 儲存貯體的暫時性憑證。David 可以使用這些憑證,來進行 API 呼叫以更新 productionapp 儲存貯體。不過,他無法進行 API 呼叫以存取生產帳戶中任何其他資源,即使他在開發帳戶中具有進階使用者許可。

擔任角色
  1. David 呼叫 AssumeRole 作為應用程式的一部分。他們必須指定 UpdateApp ARN:arn:aws:iam::999999999999:role/UpdateApp

    來自 AssumeRole 呼叫的回應包含具有 AccessKeyIdSecretAccessKey 的暫時性憑證。也包含 Expiration 時間,指出憑證何時過期以及必須請求新憑證的時間。

  2. David 使用暫時性憑證,進行 s3:PutObject 呼叫以更新 productionapp 儲存貯體。他們會將憑證作為 AuthParams 參數傳遞到 API 呼叫。由於暫時性角色憑證只有 productionapp 儲存貯體的讀取和寫入存取權,在生產帳戶中的任何其他動作會被拒絕。

如需程式碼範例 (使用 Python),請參閱 切換到身分與存取權管理角色 (AWS API)

總結

您已完成跨帳戶 API 存取教學課程。您建立了一個角色,以建立與另一個帳戶的信任,並定義了受信任實體可採取的動作。然後,您修改了群組政策,以控制哪個 IAM 使用者可存取角色。因此,開發帳戶的開發人員可以透過使用暫時性憑證,來更新生產帳戶中的 productionapp 儲存貯體。