範例 4 - 將跨帳戶許可授予其未擁有的物件的儲存貯體擁有者 - Amazon Simple Storage Service

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

範例 4 - 將跨帳戶許可授予其未擁有的物件的儲存貯體擁有者

在此範例案例中,您擁有儲存貯體,且已啟用其他 AWS 帳戶 上傳物件。如果您為儲存貯體套用儲存貯體擁有者強制執行的 S3 物件所有權設定,則會擁有儲存貯體中的所有物件,包括由另一個 AWS 帳戶寫入的物件。此方法可解決儲存貯體擁有者您未擁有物件的問題。然後,您可以將許可委派給您自己帳戶中的使用者或其他 AWS 帳戶。假設未啟用儲存貯體擁有者強制執行的 S3 物件擁有權設定。亦即,您的儲存貯體可以有其他 AWS 帳戶 所擁有的物件。

現在,假設身為儲存貯體擁有者,不論誰是擁有者,您都需要將物件的跨帳戶許可授予另一個帳戶中的使用者。例如,該使用者可以是需要存取物件中繼資料的帳單應用程式。有兩個核心問題:

  • 儲存貯體擁有者並不擁有其他 AWS 帳戶所建立物件的許可。若要讓儲存貯體擁有者授予其未擁有之物件的許可,物件擁有者必須先將許可授予儲存貯體擁有者。物件擁有者是 AWS 帳戶 建立物件的 。儲存貯體擁有者接著可以委派這些許可。

  • 儲存貯體擁有者帳戶可以將許可委派給其自身帳戶中的使用者 (請參閱 範例 3:授予對其未擁有之物件的許可的儲存貯體擁有者)。不過,儲存貯體擁有者帳戶無法將許可委派給其他 , AWS 帳戶 因為不支援跨帳戶委派。

在此案例中,儲存貯體擁有者可以建立具有存取物件許可的 AWS Identity and Access Management (IAM) 角色。然後,儲存貯體擁有者可以授予另一個 AWS 帳戶 許可來擔任角色,暫時使其能夠存取儲存貯體中的物件。

注意

S3 物件擁有權是 Amazon S3 儲存貯體層級設定,可用來控制上傳到儲存貯體的物件擁有權,以及停用或啟用 ACLs。根據預設,物件擁有權設定為儲存貯體擁有者強制執行設定,且所有 ACLs 都會停用。停用 ACLs 時,儲存貯體擁有者會擁有儲存貯體中的所有物件,並僅使用存取管理政策來管理對這些物件的存取。

Amazon S3 中的大多數現代使用案例不再需要使用 ACLs。建議您停用 ACLs,除非在異常情況下,您需要個別控制每個物件的存取。在停用 ACLs 的情況下,您可以使用 政策來控制對儲存貯體中所有物件的存取,無論物件上傳到儲存貯體的對象是誰。如需詳細資訊,請參閱控制物件的擁有權,並停用儲存貯體的 ACLs

了解跨帳戶許可並使用 IAM 角色

IAM 角色可讓多個案例委派對資源的存取,而跨帳戶存取是其中一個關鍵案例。在此範例中,儲存貯體擁有者 Account A 使用 IAM 角色暫時將物件存取跨帳戶委派給另一個 AWS 帳戶帳戶 Account C 中的使用者。您建立的每個 IAM 角色都連接了下列兩個政策:

  • 識別可擔任角色之另一個 AWS 帳戶 的信任政策。

  • 定義有人採用角色時允許之許可 (例如,s3:GetObject) 的存取政策。如需您可在政策中指定的許可清單,請參閱「Amazon S3 的政策動作」。

然後,信任政策中 AWS 帳戶 識別的 會授予其使用者擔任角色的許可。使用者接著可以執行下列操作來存取物件:

  • 採用角色,並據此取得暫時性安全憑證。

  • 使用暫時性安全憑證,存取儲存貯體中的物件。

如需 IAM 角色的詳細資訊,請參閱 IAM 使用者指南中的 Word 角色IAM

以下是逐步解說步驟的摘要:

使用 IAM 角色的跨帳戶許可。
  1. 帳戶 A 管理員使用者會連接儲存貯體政策,以將上傳物件的條件式許可授予帳戶 B。

  2. 帳戶 A 管理員會建立 IAM 角色,建立與帳戶 C 的信任,因此該帳戶中的使用者可存取帳戶 A。連接至該角色的存取政策會限制使用者存取帳戶 A 時,帳戶 C 中的使用者可以執行的動作。

  3. 帳戶 B 管理員會讓物件上傳至帳戶 A 所擁有的儲存貯體,以將完全控制許可授予儲存貯體擁有者。

  4. 帳戶 C 管理員會建立使用者,並連接允許使用者採用角色的使用者政策。

  5. 帳戶 C 中的使用者會先採用角色,以傳回使用者暫時性安全憑證。使用這些暫時性憑證,使用者則會存取儲存貯體中的物件。

在此範例中,您需要三個帳戶。下表顯示如何參照這些帳戶與這些帳戶中的管理員使用者。根據 IAM 指導方針 (請參閱 關於使用管理員使用者來建立資源並授予許可), AWS 帳戶根使用者 我們不會在此演練中使用 憑證。相反地,您可以在每個帳戶中建立管理員使用者,並使用這些憑證來建立資源以及將許可授予它們。

AWS 帳戶 ID 帳戶稱為 帳戶中的管理員使用者

1111-1111-1111

帳戶 A

AccountAadmin

2222-2222-2222

帳戶 B

AccountBadmin

3333-3333-3333

帳戶 C

AccountCadmin

步驟 0:準備演練

注意

您可能想要開啟文字編輯器,並在進行步驟時寫下一些資訊。特別是,您需要帳戶 IDs、正式使用者 IDs、每個帳戶的 IAM 使用者登入 URLs 來連線至主控台,以及 IAM 使用者的 Amazon Resource Names (ARNs) 和角色。

  1. 請確定您有三個 AWS 帳戶 ,且每個帳戶都有一個管理員使用者,如上一節的資料表所示。

    1. AWS 帳戶視需要註冊 。我們的這些帳戶指的是帳戶 A、帳戶 B 和帳戶 C。

    2. 使用帳戶 A 憑證,登入 IAM 主控台並執行下列動作以建立管理員使用者:

    3. 重複前一個步驟,以在帳戶 B 和帳戶 C 中建立管理員使用者。

  2. 對於帳戶 C,請注意正式使用者 ID。

    當您在帳戶 A 中建立 IAM 角色時,信任政策會授予帳戶 C 透過指定帳戶 ID 擔任角色的許可。您可以如下尋找帳戶資訊:

    1. 使用您的 AWS 帳戶 ID 或帳戶別名、IAM 使用者名稱和密碼登入 Amazon S3 主控台

    2. 選擇 Amazon S3 儲存貯體的名稱,以檢視該儲存貯體的詳細資訊。

    3. 選擇 Permissions (許可) 標籤,然後選擇 Access Control List (存取控制清單)

    4. Access for your AWS 帳戶 account (存取您的 AWS 帳戶帳戶) 區段的 Account (帳戶) 欄中是長識別碼,例如 c1daexampleaaf850ea79cf0430f33d72579fd1611c97f7ded193374c0b163b6。這是您的正式使用者 ID。

  3. 建立儲存貯體政策時,您需要下列資訊。請注意這些值:

    • 帳戶 A 的正式使用者 ID – 當帳戶 A 管理員將條件式上傳物件許可授予帳戶 B 管理員時,針對必須完全控制物件的帳戶 A 使用者,此條件指定其正式使用者 ID。

      注意

      正式使用者 ID 是 Amazon S3 才有的概念。它是帳戶 ID 的 64 字元混淆版本。

    • 帳戶 B 的 User ARN 管理員 – 您可以在 ARN 主控台中找到使用者 IAM。您必須選取使用者,並在摘要索引標籤中找到使用者的 ARN。

      在儲存貯體政策中,您授予上傳物件的AccountBadmin許可,並使用 ARN 指定使用者。以下是 ARN 值的範例:

      arn:aws:iam::AccountB-ID:user/AccountBadmin
  4. 設定 AWS Command Line Interface (CLI) 或 AWS Tools for Windows PowerShell。請確定您儲存管理員使用者憑證,如下所示:

    • 如果使用 AWS CLI,AccountBadmin請在組態檔案中建立設定檔AccountAadmin和 。

    • 如果使用 AWS Tools for Windows PowerShell,請確定您將工作階段的憑證儲存為 AccountAadminAccountBadmin

    如需說明,請參閱 設定演練的工具

步驟 1:執行帳戶 A 任務

在此範例中,帳戶 A 是儲存貯體擁有者。因此,帳戶 A 中的 user AccountAadmin 會執行下列動作:

  • 建立儲存貯體。

  • 連接儲存貯體政策,授予帳戶 B 管理員上傳物件的許可。

  • 建立 IAM 角色,授予帳戶 C 擔任該角色的許可,以便其存取儲存貯體中的物件。

步驟 1.1:登入 AWS Management Console

使用帳戶 A 的 IAM 使用者登入 URL,首先以AccountAadmin使用者 AWS Management Console 身分登入 。此使用者將建立儲存貯體並連接其政策。

步驟 1.2:建立儲存貯體並連接儲存貯體政策

在 Amazon S3 主控台中,執行下列操作:

  1. 建立儲存貯體。此練習採用儲存貯體名稱 amzn-s3-demo-bucket1

    如需說明,請參閱 建立儲存貯體

  2. 連接下列儲存貯體政策。此政策會授予帳戶 B 管理員有條件許可,以上傳物件。

    透過提供您自己的 amzn-s3-demo-bucket1AccountB-ID和 值來更新政策CanonicalUserId-of-AWSaccountA-BucketOwner

    { "Version": "2012-10-17", "Statement": [ { "Sid": "111", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*" }, { "Sid": "112", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*", "Condition": { "StringNotEquals": { "s3:x-amz-grant-full-control": "id=CanonicalUserId-of-AWSaccountA-BucketOwner" } } } ] }

步驟 1.3:建立 IAM 角色,以允許帳戶 A 中的帳戶 C 跨帳戶存取

IAM 主控台中,建立 IAM 角色 (examplerole),授予帳戶 C 擔任角色的許可。請確定您仍以帳戶 A 管理員身分登入,因為必須在帳戶 A 中建立角色。

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

    1. 在左側導覽窗格中,選擇政策,然後選擇建立政策

    2. 建立您自己的政策旁邊,選擇選取

    3. Policy Name (政策名稱) 欄位中,輸入 access-accountA-bucket

    4. 複製下列存取政策,並將其貼入 Policy Document (政策文件) 欄位。存取政策會授予角色s3:GetObject許可,因此當帳戶 C 使用者擔任角色時,只能執行 s3:GetObject操作。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/*" } ] }
    5. 選擇 建立政策

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

  2. 在左側導覽窗格中,選擇角色,然後選擇建立新角色

  3. 選取角色類型下,選取跨帳戶存取的角色,然後選擇 AWS 帳戶 在您擁有的之間提供存取權旁的選取按鈕。

  4. 輸入帳戶 C 帳戶 ID。

    在此演練中,您不需要要求使用者擁有多重要素驗證 (MFA) 來擔任角色,因此請保留未選取的該選項。

  5. 選擇下一步以設定將與角色相關聯的許可。

  6. 選取您建立的 access-accountA-bucket 政策旁的核取方塊,然後選擇下一步

    即會出現 Review (檢閱) 頁面,讓您可以在建立角色之前確認角色的設定。此頁面上要注意的一個極重要項目是可傳送給需要使用此角色之使用者的連結。使用連結的使用者會直接前往 Switch Role 頁面,其中包含已填入的帳戶 ID 和角色名稱欄位。您也可以稍後在角色摘要頁面上查看此連結,以取得任何跨帳戶角色。

  7. examplerole 輸入角色名稱,然後選擇下一步

  8. 檢閱角色後,選擇建立角色

    examplerole 角色即會顯示在角色清單中。

  9. 選擇角色名稱 examplerole

  10. 選取 Trust Relationships (信任關係) 標籤。

  11. 選擇顯示政策文件,並確認顯示的信任政策符合下列政策。

    下列信任政策會建立與帳戶 C 的信任,方法是讓它執行 sts:AssumeRole 動作。如需詳細資訊,請參閱 AssumeRoleAWS Security Token Service API 參考中。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountC-ID:root" }, "Action": "sts:AssumeRole" } ] }
  12. 請注意您建立之examplerole角色的 Amazon Resource Name (ARN)。

    稍後在下列步驟中,您將連接使用者政策,以允許 IAM 使用者擔任此角色,並依 ARN 值識別角色。

步驟 2:執行帳戶 B 任務

帳戶 A 所擁有的範例儲存貯體需要其他帳戶所擁有的物件。在此步驟中,帳戶 B 管理員會使用命令列工具來上傳物件。

  • 使用 put-object AWS CLI 命令,將物件上傳至 amzn-s3-demo-bucket1

    aws s3api put-object --bucket amzn-s3-demo-bucket1 --key HappyFace.jpg --body HappyFace.jpg --grant-full-control id="canonicalUserId-ofTheBucketOwner" --profile AccountBadmin

    注意下列事項:

    • --Profile 參數會指定AccountBadmin設定檔,因此物件為帳戶 B 所有。

    • grant-full-control 參數會根據儲存貯體政策要求,將物件的完全控制許可授予儲存貯體擁有者。

    • --body 參數會識別要上傳的來源檔案。例如,如果檔案位於 Windows 電腦,您可以指定 c:\HappyFace.jpg

步驟 3:執行帳戶 C 任務

在上述步驟中,帳戶 A 已建立角色,examplerole並建立與帳戶 C 的信任。此角色允許帳戶 C 中的使用者存取帳戶 A。在此步驟中,帳戶 C 管理員會建立使用者 (Dave) 並委派從帳戶 A 收到的sts:AssumeRole許可給他。此方法可讓 Dave 擔任 examplerole 並暫時存取帳戶 A。帳戶 A 連接至該角色的存取政策會限制 Dave 存取帳戶 A 時可以採取的動作,特別是在 中取得物件amzn-s3-demo-bucket1

步驟 3.1:在帳戶 C 中建立使用者,並委派許可擔任 examplerole

  1. 使用帳戶 C 的 IAM 使用者登入 URL,首先以AccountCadmin使用者 AWS Management Console 身分登入 。

  2. IAM 主控台中,建立使用者 Dave。

    如需 step-by-step 指示,請參閱 IAM 使用者指南中的建立 Word 使用者 (AWS Management Console)IAM

  3. 請注意 Dave 憑證。Dave 需要這些憑證,才能採用 examplerole 角色。

  4. 為 Dave IAM 使用者建立內嵌政策,以將sts:AssumeRole許可委派給帳戶 A 中examplerole角色的 Dave。

    1. 在左側導覽窗格中,選擇 Users (使用者)

    2. 選擇使用者名稱 Dave

    3. 在使用者詳細資訊頁面上,選取 Permissions (許可) 標籤,然後展開 Inline Policies (內嵌政策) 區段。

    4. 選擇 click here (按一下這裡) (或 Create User Policy (建立使用者政策))。

    5. 選擇 Custom Policy (自訂政策),然後選擇 Select (選取)。

    6. Policy Name (政策名稱) 欄位中輸入政策的名稱。

    7. 將下列政策複製到 Policy Document (政策文件) 欄位。

      您必須提供 來更新政策AccountA-ID

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["sts:AssumeRole"], "Resource": "arn:aws:iam::AccountA-ID:role/examplerole" } ] }
    8. 選擇 Apply Policy (套用政策)

  5. 透過 AWS CLI 新增另一個設定檔 將 Dave 的憑證儲存至 的組態檔案AccountCDave

    [profile AccountCDave] aws_access_key_id = UserDaveAccessKeyID aws_secret_access_key = UserDaveSecretAccessKey region = us-west-2

步驟 3.2:擔任角色 (examplerole) 和存取物件

現在,Dave 可以存取帳戶 A 所擁有之儲存貯體中的物件,如下所示:

  • Dave 先使用他自己的憑證來採用 examplerole。這會傳回暫時性憑證。

  • 使用暫時性憑證,Dave 接著將存取帳戶 A 之儲存貯體中的物件。

  1. 在命令提示中,使用 AccountCDave 設定檔執行下列 AWS CLI assume-role命令。

    您必須提供examplerole定義 AccountA-ID 的 ,以更新 命令中的 ARN 值。

    aws sts assume-role --role-arn arn:aws:iam::AccountA-ID:role/examplerole --profile AccountCDave --role-session-name test

    為了回應, AWS Security Token Service (AWS STS) 會傳回暫時安全憑證 (存取金鑰 ID、秘密存取金鑰和工作階段權杖)。

  2. TempCred設定檔下的 AWS CLI 組態檔案中儲存臨時安全憑證。

    [profile TempCred] aws_access_key_id = temp-access-key-ID aws_secret_access_key = temp-secret-access-key aws_session_token = session-token region = us-west-2
  3. 在命令提示中,執行下列 AWS CLI 命令,以使用暫時憑證存取物件。例如, 命令指定要擷取物件之HappyFace.jpg物件中繼資料的標頭 API。

    aws s3api get-object --bucket amzn-s3-demo-bucket1 --key HappyFace.jpg SaveFileAs.jpg --profile TempCred

    因為連接至 examplerole 的存取政策允許這些動作,所以 Amazon S3 會處理要求。您可以嘗試對儲存貯體中的其他任何物件執行其他任何動作。

    如果您嘗試任何其他動作,例如get-object-acl,由於不允許該角色執行該動作,因此將拒絕您的許可。

    aws s3api get-object-acl --bucket amzn-s3-demo-bucket1 --key HappyFace.jpg --profile TempCred

    我們已使用使用者 Dave 來採用角色,以及使用暫時性憑證來存取物件。它也可以是帳戶 C 中存取 amzn-s3-demo-bucket1 中物件的應用程式。應用程式可以取得暫時性安全憑證,而且帳戶 C 可以將採用 examplerole 的許可委派給應用程式。

步驟 4:清理

  1. 完成測試後,您可以執行下列動作來清除:

    1. 使用帳戶 A 憑證登入 AWS Management Console,並執行下列操作:

      • 在 Amazon S3 主控台中,移除連接至 amzn-s3-demo-bucket1 的儲存貯體政策。在儲存貯體 Properties (屬性) 中,刪除 Permissions (許可) 區段中的政策。

      • 如果儲存貯體是為此練習而建立,請在 Amazon S3 主控台中刪除物件,然後刪除儲存貯體。

      • IAM 主控台中,移除examplerole您在帳戶 A 中建立的 。For step-by-step 指示,請參閱 IAM 使用者指南中的刪除 IAM 使用者。

      • IAM 主控台中,移除 AccountAadmin 使用者。

  2. 使用帳戶 B 憑證登入 IAM 主控台。刪除使用者 AccountBadmin

  3. 使用帳戶 C 憑證登入 IAM 主控台。刪除 AccountCadmin 和使用者 Dave。

相關資源

如需此演練的相關資訊,請參閱 IAM 使用者指南中的下列資源: