如何提供 Amazon S3 儲存貯體物件的跨帳户存取權?

上次更新日期:2022 年 8 月 3 日

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

簡短描述

在 Amazon S3 中,您可以向另一個 AWS 帳戶 (帳戶 B) 中的使用者授與精細跨帳戶存取權,使其可存取您帳戶 (帳戶 A) 擁有的物件。

根據您要提供的存取類型,請使用下列解決方案之一以授與對物件的跨帳戶存取權:

  • AWS Identity and Access Management (IAM) 政策和以資源為基礎的儲存貯體政策,用於僅以程式設計方式存取 S3 儲存貯體物件
  • IAM 政策和以資源為基礎的存取控制清單 (ACL),用於僅以程式設計方式存取 S3 儲存貯體物件
    注意:啟用 Bucket owner enforced (強制執行儲存貯體擁有者) 設定後,將停用所有儲存貯體和物件 ACL。因此,您不能使用 ACL 授與跨帳戶存取權。依預設,所有新建立的儲存貯體均啟用了 Bucket owner enforced (強制執行儲存貯體擁有者) 設定。最佳實務是使用 IAM 政策和儲存貯體政策 (而不是 ACL) 管理對儲存貯體和物件的跨帳戶存取。如需詳細資訊,請參閱:控制物件的擁有權並停用儲存貯體的 ACL
  • 跨帳戶 IAM 角色,用於以程式設計方式和主控台存取 S3 儲存貯體物件

如果申請者是 IAM 主體,則擁有主體的 AWS 帳戶必須通過 IAM 政策授與 S3 許可。根據您的特定使用案例,儲存貯體擁有者也必須透過儲存貯體政策或 ACL 授與許可。授與存取權後,以程式跨帳戶存取儲存貯體就會和存取相同帳戶的儲存貯體一樣,並無二致。

解決方案

IAM 政策和以資源為基礎的儲存貯體政策

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

使用以資源為基礎的儲存貯體政策管理跨帳戶存取控制和稽核 S3 物件的許可。如果您在儲存貯體層級套用儲存貯體政策,則可以定義以下項目:

  • 誰可以存取儲存貯體中的物件 (使用主體元素)
  • 他們可以存取哪些物件 (使用資源元素)
  • 他們如何存取儲存貯體中的物件 (使用動作元素)

在儲存貯體層級套用儲存貯體政策,允許您定義精細存取儲存貯體內部的不同物件。您還可以查看儲存貯體政策,瞭解哪些人可以存取 S3 儲存貯體中的物件。

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

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

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

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

3.    授與帳戶 B 中的 IAM 角色向特定儲存貯體下載 (GET 物件) 和上傳 (PUT 物件) 物件的許可。使用以下 IAM 政策還可以授與帳戶 B 中的 IAM 角色呼叫 PutObjectAcl 的許可,將物件許可授與儲存貯體擁有者:

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

        }
    ]
}

注意:請確保更新政策以包含您的使用者變數 (如帳戶 ID、儲存貯體名稱和 ARN)。此外,您還可以限制對帳戶 A 中特定儲存貯體資料夾的存取權。若要限制對特定儲存貯體資料夾的存取,請在資源元素中定義資料夾名稱,例如 "arn:aws:s3:::AccountABucketName/FolderName/*"。如需詳細資訊,請參閱:如何使用 IAM 政策授與特定使用者對特定資料夾的存取權?

您也可以使用 AWS CLI 命令範例 create-policy 建立基於 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 儲存貯體政策。

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

IAM 策略和以資源為基礎的 ACL

如果 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 角色來集中許可管理。對於存放在多個 S3 儲存貯體中的 S3 物件,使用跨帳戶 IAM 角色可簡化對這些物件的跨帳戶存取佈建。因此,您無需管理 S3 儲存貯體的多個策略。此方法允許跨帳戶存取另一個 AWS 帳戶或 AWS 服務擁有或上傳的物件。如果您不使用跨帳戶 IAM 角色,則必須修改物件 ACL。如需詳細資訊,請參閱 Amazon S3 如何授權物件操作請求

若要使用跨帳戶 IAM 角色管理 S3 儲存貯體存取,請按照下列步驟操作:

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

注意:IAM 角色需搭配信任政策使用,以政策定義哪些主體可以擔任角色,以及擔任角色的條件。IAM 角色可以具有多個許可政策 (內嵌和附加),這些政策需定義主體擔任角色時可以執行哪些許可動作,以及能對哪些資源執行。

{
  "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 角色。

注意:以下範例政策必須新增為 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 動作