要如何將 bucket-owner-full-control ACL 新增到 Amazon S3 中的物件?

上次更新日期:2021 年 12 月 10 日

我想要將 bucket-owner-full-control 存取控制清單 (ACL) 新增到 Amazon Simple Storage Service (Amazon S3) 中的現有物件。該如何進行?

簡短描述

根據預設,在其他 AWS 帳戶會將物件上傳到您的 Amazon S3 儲存貯體的跨帳戶情況下,物件仍會歸上傳方帳戶所擁有。在新增 bucket-owner-full-control ACL 時,儲存貯體擁有者可以完全控制由其他帳戶寫入的任何新物件。

如果物件寫入者未指定目標帳户在物件 ACL 層級的許可,則目標帳户只能刪除物件。

在新增 bucket-owner-full-control ACL 時,儲存貯體擁有者可以完全控制由其他 AWS 帳戶寫入的任何新物件。如果目標儲存貯體已啟用 S3 物件擁有權,則也必須要有此 ACL。在啟用 S3 物件擁有權後,新物件的擁有者便會更新為目標帳户。

重要提示:透過儲存貯體和物件 ACL 授予跨帳戶存取權並不適用於將 S3 物件擁有權設為「強制執行儲存貯體擁有者」的儲存貯體。在大多數情況下,ACL 不需要授予許可給物件和儲存貯體。而是使用 AWS Identity Access and Management (IAM) 政策和 S3 儲存貯體政策來授予許可給物件和儲存貯體。

至於現有物件,物件擁有者可以通過更新物件的 ACL,向儲存貯體擁有者授予完整的物件控制權。在寫入新物件時,可以在進行 PUTCOPY 操作期間指定 bucket-owner-full-control ACL。

如果帳戶 A 中的使用者要授予帳戶 B 中物件的 bucket-owner-full-control 標準 ACL,就必須授予以下許可:

  • 您在帳戶 A 中的 IAM 角色或使用者必須授予帳戶 B 中儲存貯體的存取權
  • 您在帳戶 B 中的儲存貯體政策必須授予帳戶 A 中 IAM 角色或使用者的存取權

您可以通過以下方式授予物件的 bucket-owner-full-control 存取權:

  • 標準 ACL
  • S3 批次操作 (適用於大規模批次操作)

注意:在將 bucket-owner-full-control 標準 ACL 新增到 S3 物件時,請務必檢閱 VPC 端點政策。

解決方案

您在帳戶 A 中的 IAM 角色或使用者必須授予帳戶 B 中儲存貯體的存取權

注意:如果 IAM 使用者或角色必須在上傳期間更新物件的 ACL,則使用者必須有其 IAM 政策中 s3:PutObjectAcl 的許可。

在帳戶 A 中建立 IAM 角色。請向角色/使用者授予對帳戶 B 中物件執行 PutObjectAcl 的許可。

以下範例政策會向帳戶 A 中的 IAM 角色授予存取權,使其能夠對帳戶 B 中的物件執行 GetObjectPutObjectPutObjectAcl 動作:

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

您在帳戶 B 中的儲存貯體政策必須授予帳戶 A 中 IAM 使用者或角色的存取權

儲存貯體政策會根據物件上傳期間的標準 ACL 要求而有所不同。例如,以下這兩個儲存貯體政策會以不同方式向帳戶 A 中的 IAM 使用者或角色授予存取權:

  • 政策 1:允許存取帳戶 A 中的 IAM 使用者或角色,而不必執行 Amazon S3 PUT 操作以納入 bucket-owner-full-control 標準 ACL。
  • 政策 2:強制執行所有 Amazon S3 PUT 操作以納入 bucket-owner-full-control 標準 ACL。

政策 1:允許存取帳戶 A 中的 IAM 使用者或角色,而不必執行 Amazon S3 PUT 操作以納入 bucket-owner-full-control 標準 ACL

若要允許不必擁有 ACL 就能存取帳戶 A 中的 IAM 角色,請在帳戶 B (物件所上傳到的位置) 中建立儲存貯體政策。此儲存貯體政策必須授予帳戶 A 中 IAM 角色或使用者的存取權。以下儲存貯體政策可讓帳戶 A 中的角色對帳戶 B 中的物件執行 GetObjectPutObjectPutObjectAcl 動作:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::AccountA:role/AccountARole"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::AccountB-Bucket/*"
            ]
        }
    ]
}

政策 2:強制執行所有 Amazon S3 PUT 操作以納入 bucket-owner-full-control 標準 ACL

以下儲存貯體政策會指定帳戶 A 中的使用者或角色可以將物件上傳到帳戶 B (物件所要上傳到的位置) 中的儲存貯體。只有當物件的 ACL 設定為「bucket-owner-full-control」時,才能執行上傳。例如:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Only allow writes to my bucket with bucket owner full control",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::AccountA:role/AccountARole"
                ]
            },
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::AccountB-Bucket/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}

注意:如果套用了前面的儲存貯體政策,使用者就必須在執行 PutObject 操作時將 bucket-owner-full-control 標準 ACL 納入。否則,操作將會失敗而導致拒絕存取錯誤。有關 Amazon S3 如何啟用其他 AWS 帳戶的物件擁有權的資訊,請參閲使用 S3 物件擁有權來控制所上傳物件的擁有權

提供 bucket-owner-full-control 存取權

標準 ACL

若要在物件上傳期間授予 bucket-owner-full-control 標準 ACL,請從帳户 A (物件擁有者的帳户) 執行 put-object 命令:

aws s3api put-object --bucket accountB-bucket --key example.txt --acl bucket-owner-full-control

若要在複製操作期間授予 bucket-owner-full-control 標準 ACL,請從帳户 A (物件擁有者的帳户) 執行 copy-object 命令:

aws s3api copy-object --copy-source accountA-bucket/example.txt --key example.txt --bucket accountB-bucket --acl bucket-owner-full-control

或者,您也可以從帳戶 A 執行 cp 命令,以授予 bucket-owner-full-control 標準 ACL:

aws s3 cp s3://accountA-bucket/test.txt s3://accountB-bucket/test2.txt --acl bucket-owner-full-control

若要對多個物件執行複製操作,物件擁有者 (帳户 A) 可以執行以下命令:

aws s3 cp s3://accountA-bucket/ s3://accountB-bucket/ --acl bucket-owner-full-control --recursive

如果物件存在於另一個帳戶 (帳戶 B) 的儲存貯體中,則物件擁有者可以使用以下命令授予儲存貯體擁有者存取權:

aws s3api put-object-acl --bucket accountB-bucket --key example.txt --acl bucket-owner-full-control

S3 批次操作

若要在大量 Amazon S3 物件上新增 bucket-owner-full-control 標準 ACL,請使用 S3 批次操作。S3 批次操作可以對您指定的物件清單執行單一操作。您甚至可以使用 S3 批次操作,在大量物件上設定 ACL。S3 批次操作既支援自訂 ACL,也支援 Amazon S3 所提供、已預先定義一組存取權的標準 ACL。

注意:替換存取控制清單 (ACL) 操作將會為資訊清單中列出的每個物件替換 Amazon S3 ACL。

其他考量

VPC 端點政策所允許的存取權

如果 IAM 角色使用透過 Virtual Private Cloud (VPC) 端點所傳送的執行個體將物件上傳到 S3,則請查看 VPC 端點政策。例如,如果使用 VPC 中的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體將物件上傳到 S3,則必須檢閱 VPC 端點政策。請確定您的端點政策會授予 PutObjectAcl 動作的存取權,如下所示:

{
    "Statement": [
        {
            "Sid": "Access-to-specific-bucket-only",
            "Principal": "*",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::AccountB-Bucket/*"
        }
    ]
}

此文章是否有幫助?


您是否需要帳單或技術支援?