如何向 Amazon S3 中的对象添加 bucket-owner-full-control ACL?

3 分钟阅读
0

我正在尝试将 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 Object Ownership”(S3 对象所有权)设置为“Bucket Owner Enforced”(强制存储桶拥有者)的存储桶。在大多数情况下,不需要通过 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 批量操作(用于大规模批量操作)

**注意:**在向 S3 对象添加 bucket-owner-full-control 预装 ACL 时,请务必查看您的 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

要允许账户 A 中的 IAM 角色在不需要 ACL 的情况下进行访问,请在账户 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。否则,操作将失败,从而引发 Access Denied(访问被拒绝)错误。有关 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 终端节点策略。确保您的终端节点策略授予对 PutObjectCl 操作的访问权限,如下所示:

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

AWS 官方
AWS 官方已更新 2 年前