範例 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 儲存貯體層級設定,您可以用來同時控制上傳至儲存貯體之物件的擁有權,以及停用或啟用 ACL。根據預設,物件擁有權設定為「儲存貯體擁有者強制執行」設定,而且所有 ACL 都會停用。停用 ACL 時,儲存貯體擁有者會擁有儲存貯體中的所有物件,並使用存取管理政策專門管理對這些物件的存取。

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

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

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

  • 識別另一個可以擔任 AWS 帳戶 該角色的信任原則。

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

信任原則中所 AWS 帳戶 識別的接著會授與其使用者權限來擔任該角色。使用者接著可以執行下列操作來存取物件:

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

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

如需 IAM 角色的更多相關資訊,請參閱 IAM 使用者指南中的 IAM 角色

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

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

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

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

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

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

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

AWS 帳戶 身份證 帳戶稱為 帳戶中的管理員使用者

1111-1111-1111

帳戶 A

AccountAadmin

2222-2222-2222

帳戶 B

AccountBadmin

3333-3333-3333

帳戶 C

AccountCadmin

步驟 0:準備演練

注意

您可能想要開啟文字編輯器,並在執行這些步驟時寫下部分資訊。特別的是,您需要每個帳戶的帳戶 ID、正式使用者 ID、IAM 使用者登入 URL 才能連接至主控台,以及 IAM 使用者和角色的 Amazon Resource Names (ARN)。

  1. 請確定您有三個帳戶, AWS 帳戶 而且每個帳戶都有一位系統管理員使用者,如前一節的表格所示。

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

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

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

  2. 對於帳戶 C,請記下規範的使用者 ID。

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

    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 管理員的使用者 ARN — 您可以在 IAM 主控台中找到使用者 ARN。您必須選取使用者,並在「摘要」索引標籤中找到使用者的 ARN。

      在儲存貯體原則中,您授與上傳物件的AccountBadmin權限,並使用 ARN 指定使用者。以下是 ARN 值範例:

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

    • 如果使用 AWS CLI,請在配置文件中創建配置文件AccountAadminAccountBadmin

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

    如需說明,請參閱設定逐步解說的工具

步驟 1:執行帳戶 A 任務

在此範例中,帳戶 A 是儲存貯體擁有者。因此,帳戶 A AccountAadmin 中的用戶將執行以下操作:

  • 建立儲存貯體。

  • 附加值區政策,授與帳戶 B 管理員上載物件的權限。

  • 建立 IAM 角色,授予帳戶 C 權限來擔任該角色,以便其可存取值區中的物件。

步驟 1.1:登入 AWS Management Console

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

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

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

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

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

  2. 附加下列值區政策。此原則會將條件式權限授與帳戶 B 管理員上載物件的權限。

    透過為example-s3-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:::example-s3-bucket1/*" }, { "Sid": "112", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::example-s3-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:::example-s3-bucket1/*" } ] }
    5. 選擇建立政策

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

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

  3. 在 [選取角色類型] 下,選取 [跨帳戶存取的角色],然後選擇 [提供 AWS 帳戶 您自己的存取權限] 旁邊的 [選取] 按鈕。

  4. 輸入帳戶 C 帳戶 ID。

    在本逐步解說中,您不需要使用者擁有多重要素驗證 (MFA) 即可擔任角色,因此請不要選取該選項。

  5. 選擇 [下一步] 以設定將與角色相關聯的權限。

  6. 選取您建立的存取帳戶-儲存貯體原則旁邊的核取方塊,然後選擇 [下一步]。

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

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

  8. 複查角色之後,請選擇建立角色

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

  9. 選擇角色名稱examplerole

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

  11. 選擇 [顯示原則文件],然後確認顯示的信任原則符合下列原則。

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

    { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountC-ID:root" }, "Action": "sts:AssumeRole" } ] }
  12. 請記下您建立的examplerole角色的 Amazon 資源名稱 (ARN)。

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

步驟 2:執行帳戶 B 任務

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

  • 使用指put-object AWS CLI 令,將物件上載至example-s3-bucket1

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

    注意下列事項:

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

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

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

步驟 3:執行帳戶 C 任務

在上述步驟中,帳戶 A 已建立角色examplerole,並使用帳戶 C 建立信任。此角色可讓帳戶 C 中的使用者存取帳戶 A。在此步驟中,帳戶 C 管理員會建立使用者 (Dave) 並委派他從帳戶 A 收到的sts:AssumeRole權限。此方法可讓 Dave 假設帳戶 A 附加至角色的存取權限,特別是 Dave 在他取得物件時可以存取帳戶 A。examplerole example-s3-bucket1

步驟 3.1:在帳戶 C 中創建用戶並委派假設權限 examplerole

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

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

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

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

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

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

    2. 選擇使用者名稱戴夫

    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. 透過新增另一個設定檔,將 Dave 的 AWS CLI 認證儲存到的組態檔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命令。

    您必須透過提供定義的AccountA-IDexamplerole置來更新指令中的 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. 將臨時安全登入資料儲存在設 AWS CLI 定檔下的TempCred設定檔中。

    [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 命令,以使用暫時認證存取物件。例如,此命令指定 head-object API 來擷取 HappyFace.jpg 物件的物件中繼資料。

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

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

    如果您嘗試任何其他動作(例如,),get-object-acl您將獲得拒絕權限,因為該角色不允許該操作。

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

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

步驟 4:清理

  1. 完成測試後,您可以執行以下操作來清理:

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

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

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

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

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

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

  3. 使用帳戶 C 登入資料登入 IAM 主控台。刪除AccountCadmin和用戶戴夫。

相關資源

如需與本逐步解說相關的詳細資訊,請參閱 IAM 使用者指南中的下列資源: