如何提供對 Amazon S3 儲存貯體中物件的跨帳戶存取?

上次更新日期: 2021 年 2 月 26 日

我想授權另一個 AWS 帳戶對存放在 Amazon Simple Storage Service (Amazon S3) 儲存貯體中物件的存取。如何提供對 Amazon S3 儲存貯體的跨帳戶存取?

簡短描述

使用以下其中一種方法授權對存放在 S3 儲存貯體中物件的跨帳戶存取:

  • 以資源為基礎的政策和 AWS Identity and Access Management (IAM) 政策,用於僅以程式設計方式存取 S3 儲存貯體
  • 以資源為基礎的存取控制清單 (ACL) 和 IAM 政策,用於僅以程式設計方式存取 S3 儲存貯體物件
  • 跨帳戶 IAM 角色,用於以程式設計和主控台方式存取 S3 儲存貯體物件

根據您要提供的存取類型,使用以下其中一種解決方案授權對存放在 S3 儲存貯體中物件的精細跨帳戶存取。在以下範例中,您向另一個 AWS 帳戶 (帳戶 B) 中的使用者授予存取權,以便使用者可以管理您的帳戶 (帳戶 A) 擁有的 S3 儲存貯體中的物件。

注意:確保更新政策,以包含您的帳戶 ID、儲存貯體名稱、ARN 等等。

解決方案

以資源為基礎的政策和 IAM 政策

注意:如果您執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,確保您使用的是 AWS CLI 的最新版本

使用儲存貯體政策管理跨帳戶控制並稽核 S3 物件的許可。如果您在儲存貯體層級套用儲存貯體政策,您可以定義誰可以存取 (Principal 元素)、他們可以存取哪些物件 (Resource 元素) 以及他們可以如何存取 (Action 元素)。在儲存貯體層級套用儲存貯體政策,允許您定義精細存取儲存貯體內部的不同物件。您還可以檢閱儲存貯體政策,以查看誰可以存取 S3 儲存貯體中的物件。

若要使用儲存貯體政策管理 S3 儲存貯體存取,請遵循以下步驟:

注意:使用您的帳戶取代帳戶變數。

1.    在帳戶 A 中建立 S3 儲存貯體

2.    在帳戶 B 中建立 IAM 角色或使用者

3.    利用此 IAM 政策,授予帳戶 B 中的 IAM 角色或使用者許可,以從特定 S3 儲存貯體下載 (GET Object) 和上傳 (PUT Object) 物件。此政策還授予帳戶 B 中的 IAM 角色或使用者許可,以呼叫 PUT Object acl,進而向儲存貯體擁有者授予物件許可:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::AccountABucketName/*"

        }
    ]
}

您還可以使用 AWS CLI 命令範例 create-policy 建立基於身分的 IAM 政策。

注意: 您可以透過定義 Resource 元素中的資料夾名稱,來限制對帳戶 A 中特定儲存貯體資料夾的存取,例如 "arn:aws:s3:::AccountABucketName/FolderName/*"。如需詳細資訊,請參閱如何使用 IAM 政策授予特定使用者對特定資料夾的存取權?

4.    設定帳戶 A 的儲存貯體政策,以向您在帳戶 B 中建立的 IAM 角色或使用者授予許可。使用此儲存貯體政策,向使用者授予對帳戶 A 擁有的儲存貯體中物件的 GetObject 和 PutObject 許可:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::AccountB:user/AccountBUserName"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::AccountABucketName/*"
            ]
        }
    ]
}

您還可以使用 AWS CLI 命令範例 put-bucket-policy 建立 Amazon S3 儲存貯體政策。

注意:您可以定義 Resource 元素中的特定 S3 儲存貯體資料夾,以便為更有限的存取提供精細存取,例如 "Resource": "arn:aws:s3:::AccountABucketName/FolderName/*"。透過使用具備條件的 s3:PutObject 許可,儲存貯體擁有者可完整控制其他帳戶上傳的物件。然後在 PutObject API 呼叫中傳遞使用特定標題,強制執行 ACL。如需詳細資訊,請參閱授予 s3:PutObject 許可,條件是要求你儲存貯體擁有者全盤掌控。.

以資源為基礎的存取控制清單 (ACL) 和 IAM 政策

僅當 ACL 比 IAM 和 S3 儲存貯體政策更能滿足您的需求時,才使用物件 ACL 管理特定案例的許可。如需詳細資訊,請參閱何時使用基於 ACL 的存取政策 (儲存貯體和物件 ACL)。Amazon S3 ACL 允許使用者僅定義以下許可集: READ、WRITE、READ_ACP、WRITE_ACP 和 FULL_CONTROL。您只能使用 AWS 帳戶或其中一個預先定義的 Amazon S3 群組作為 Amazon S3 ACL 的被授與者。為 AWS 帳戶指定電子郵件地址或正式使用者 ID 時,ACL 適用於被授與者 AWS 帳戶中的所有實體。您不能使用 ACL 來限制對個別 IAM 使用者或角色的存取。您不能將 ACL 套用於共用相同字首的不同物件。

注意:儲存貯體擁有者可能無法完全控制 ACL 被授與者上傳的物件。這是因為 ACL 不支援 ACL 授權的 S3 操作的條件。

若要使用儲存貯體和物件 ACL 來管理 S3 儲存貯體存取,請遵循以下步驟:

1.    在帳戶 B 中建立 IAM 角色或使用者。然後,授予該角色或使用者執行所需的 Amazon S3 操作的許可。呼叫 PutObject 和 GetObject 的使用者需要以資源為基礎的政策和 IAM 政策部分中列出的許可。

2.    將儲存貯體 ACL 設定為至少包含帳戶 B 的 WRITE 許可。這樣一來,即可確保帳戶 B 的 IAM 角色或使用者可以將物件 (呼叫 PutObject API) 上傳至帳戶 A 擁有的儲存貯體:

...
<AccessControlPolicy>
  <Owner>
    <ID> AccountACanonicalUserID </ID>
    <DisplayName> AccountADisplayName </DisplayName>
  </Owner>
  <AccessControlList>
...
    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
        <ID> AccountBCanonicalUserID </ID>
        <DisplayName> AccountBDisplayName </DisplayName>
      </Grantee>
      <Permission> WRITE </Permission>
    </Grant>
    ...
  </AccessControlList>
</AccessControlPolicy>

注意:若要查找您的 CanonicalUserID,請參閱查找 AWS 帳戶正式使用者 ID

3.    將物件 ACL 設定為至少包含帳戶 B 的 READ 許可。這樣一來,即可確保帳戶 B 的 IAM 角色或使用者可以從帳戶 A 擁有的儲存貯體下載物件 (呼叫 GetObject API):

...
<AccessControlPolicy>
  <Owner>
    <ID> AccountACanonicalUserID </ID>
    <DisplayName> AccountADisplayName </DisplayName>
  </Owner>
  <AccessControlList>
...
    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
        <ID> AccountBCanonicalUserID </ID>
        <DisplayName> AccountBDisplayName </DisplayName>
      </Grantee>
      <Permission> READ </Permission>
    </Grant>
    ...
  </AccessControlList>
</AccessControlPolicy>

ACL 許可因套用 ACL 的 S3 資源、儲存貯體或物件而異。如需詳細資訊,請參閱存取控制清單 (ACL) 概觀。您可以在建立儲存貯體或將物件上傳到現有儲存貯體時,設定儲存貯體和物件 ACL。如需詳細資訊,請參閱管理 ACL

跨帳戶 IAM 角色

並非所有 AWS 服務均支援以資源為基礎的政策。這意味著,在對多個服務提供跨帳戶存取時,您可以使用跨帳戶 IAM 角色來集中許可管理。使用跨帳戶 IAM 角色可簡化對存放在多個 S3 儲存貯體中的 S3 物件的跨帳戶存取佈建,從而無需管理 S3 儲存貯體的多個政策。此方法允許跨帳戶存取另一個 AWS 帳戶或 AWS 服務擁有或上傳的物件。如果您不使用跨帳戶 IAM 角色,則必須修改物件 ACL。如需詳細資訊,請參閱Amazon S3 如何授權物件操作請求

若要使用跨帳戶 IAM 角色來管理 S3 儲存貯體存取,請遵循以下步驟:

1.    在帳戶 A 中建立 IAM 角色。然後授予該角色執行所需 S3 操作的許可。在角色的信任政策中,授予帳戶 B 中的角色或使用者擔任帳戶 A 中的角色的許可:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::AccountB:user/AccountBUserName"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

您還可以使用 AWS CLI 命令範例 create-role 建立具有信任政策的角色。

以下存取政策允許擔任此角色的使用者以程式設計的方式下載和上傳物件,以及使用 Amazon S3 主控台。如需詳細資訊,請參閱如何使用 IAM 政策授予特定使用者對特定資料夾的存取權?

注意:如果只需要程式設計存取,則可以移除下列政策的前兩個陳述式:

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

您還可以使用 AWS CLI 命令範例 create-policy 建立基於身分的 IAM 政策。

2.    授予帳戶 B 中的 IAM 角色或使用者擔任您在帳戶 A 中建立的 IAM 角色的許可。

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::AccountA:role/AccountARole"
  }
}

您還可以使用 AWS CLI 命令範例 create-policy 建立基於身分的 IAM 政策。

3.    從帳戶 B 中的角色或使用者,擔任帳戶 A 中的角色,以便帳戶 B 中的 IAM 實體可以執行所需的 S3 操作。如需詳細資訊,請參閱切換到角色 (主控台)

注意:透過在帳戶 A 中擔任 IAM 角色,可由存取政策確定 Amazon S3 操作。IAM 角色可被視為帳戶 A 中本機 IAM 實體發出的 API 呼叫。不需要儲存貯體政策或跨帳戶存取的 ACL。如需詳細資訊,請參閱 Amazon S3 動作