範例 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 角色暫時將物件存取跨帳戶委派給另一個 AWS 帳戶帳戶帳戶 C 中的使用者。您建立的每個 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 帳戶 ID 帳戶稱為 帳戶中的管理員使用者

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,AccountBadmin請在 組態檔案中建立設定檔AccountAadmin和 。

    • 如果使用 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. 建立儲存貯體。此練習採用儲存貯體名稱 amzn-s3-demo-bucket1

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

  2. 連接下列儲存貯體政策。該政策會將上傳物件許可的條件式許可授予帳戶 B 管理員。

    提供您自己的 amzn-s3-demo-bucket1AccountB-IDCanonicalUserId-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 角色以允許帳戶 C 在帳戶 A 中進行跨帳戶存取

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 (檢閱) 頁面,讓您可以在建立角色之前確認角色的設定。此頁面上要注意的一個極重要項目是可傳送給需要使用此角色之使用者的連結。使用連結的使用者會直接前往已填寫「帳戶 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 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: 磁碟機上,則您可以指定 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。

    如需逐步說明,請參閱《IAM 使用者指南》中的建立 IAM 使用者 (AWS Management Console)

  3. 記下 Dave 的憑證。Dave 需要這些憑證,才能採用 examplerole 角色。

  4. 建立 Dave IAM 使用者的內嵌政策,將帳戶 A 中 sts:AssumeRole 角色的 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命令。

    您必須提供定義 exampleroleAccountA-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 命令,以使用暫時登入資料存取物件。例如,此命令指定 head-object 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 主控台中,移除您在帳戶 A 中建立的 examplerole。如需逐步說明,請參閱《IAM 使用者指南》中的刪除 IAM 使用者

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

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

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

相關資源

如需關於此逐步解說的詳細資訊,請參閱《IAM 使用者指南》中的下列資源: