範例 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角色可讓數種案例委派資源的存取權,而跨帳戶存取是其中一個關鍵案例。在此範例中,值區擁有者帳戶 A 使用IAM角色暫時將物件存取權委派給另一個帳戶 C 中的使用者 AWS 帳戶,即您建立的每個IAM角色都附加了下列兩個原則:

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

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

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

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

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

有關IAM角色的詳細資訊,請參閱《IAM使用者指南》中的〈IAM角色〉。

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

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

  2. 帳戶系統管理員建立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:準備演練

注意

您可能想要開啟文字編輯器,並在執行這些步驟時寫下部分資訊。特別是,您需要帳戶IDs、規範使用者IDs、每個帳戶的IAM使用者登入URLs才能連線到主控台,以及使IAM用者的 Amazon 資源名稱 (ARNs) 以及角色。

  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

使用用IAM戶登錄URL帳戶 A,首先以用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. 選取您建立的存取帳戶-儲存貯體原則旁邊的核取方塊,然後選擇 [下一步]。

    即會出現 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 令,將物件上載至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: 磁碟機上,您可以指定c:\HappyFace.jpg

步驟 3:執行帳戶 C 任務

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

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

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

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

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

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

  4. 為 Dave IAM 使用者建立內嵌原則,以將sts:AssumeRole權限委派給帳戶 A 中examplerole角色的 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. 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命令。

    您必須透過提供定義的AccountA-ID位置來更新指令中examplerole的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 命令,以使用暫時認證存取物件。例如,指令會指定API要擷取物件之物件中繼資料的標頭HappyFace.jpg物件。

    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 中建立的IAM使用者。如需 step-by-step 指示,請參閱使用指南中的刪除IAM使用者

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

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

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

相關資源

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