禁用所有新桶的 ACL 并强制执行 Object Ownership
建议禁用 Amazon S3 桶上的 ACL。可以通过为 S3 Object Ownership 应用桶所有者强制设置来实现这一点。应用此设置时,ACL 将被禁用,并且您自动拥有并完全控制桶中的所有对象。您可以通过使用 AWS Identity and Access Management(IAM)策略或 AWS Organizations 服务控制策略(SCP)来要求在禁用 ACL 的情况下创建所有新桶,如下一节所述。
要在不禁用 ACL 的情况下强制对新对象的 Object Ownership,您可以应用桶拥有者首选设置。当您应用此设置时,我们强烈建议您更新桶策略,要求对桶中的所有 PUT 请求使用 bucket-owner-full-control
标准 ACL。还应更新客户端以将 bucket-owner-full-control
标准 ACL 从其他账户发送至桶。
禁用所有新桶的 ACL(强制执行桶拥有者)
下面的例子 IAM policy 拒绝特定 IAM 用户或角色的 s3:CreateBucket
权限,除非 Object Ownership 应用了桶拥有者强制设置。Condition
块中的键值对指定 s3:x-amz-object-ownership
为其密钥,并将 BucketOwnerEnforced
设为其值。换句话说,只有在 IAM 用户为 Object Ownership 设置桶拥有者强制设置并禁用 ACL 时,才能创建桶。您还可以将此策略用作 AWS 企业的边界的 SCP。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "RequireBucketOwnerFullControl", "Action": "s3:CreateBucket", "Effect": "Deny", "Resource": "*", "Condition": { "StringNotEquals": { "s3:x-amz-object-ownership": "BucketOwnerEnforced" } } } ] }
要求 Amazon S3 PUT 操作使用桶拥有者完全控制的标准 ACL(首选桶拥有者)
通过将桶拥有者首选设置为 Object Ownership,您作为桶拥有者,拥有并完全控制其他账户使用 bucket-owner-full-control
标准的 ACL 向桶写入的新对象。但是,如果其他账户在没有 bucket-owner-full-control
标准 ACL 的情况下将对象写入桶,对象写入器将保持完全控制访问权限。作为桶拥有者,只有指定了 bucket-owner-full-control
标准的 ACL,才能实现允许写入的桶策略。
注意
如果在桶拥有者强制设置的情况下禁用了 ACL,则作为桶拥有者,您将自动拥有并完全控制桶中的所有对象。您无需使用此部分来更新桶策略来强制执行桶拥有者的对象所有权。
以下桶策略指定只有当对象的 ACL 设置为 111122223333
时,账户
才能将对象上传到 DOC-EXAMPLE-BUCKET
。请务必将 bucket-owner-full-control
替换为您的账户,111122223333
替换为桶的名称。DOC-EXAMPLE-BUCKET
{ "Version": "2012-10-17", "Statement": [ { "Sid": "
Only allow writes to my bucket with bucket owner full control
", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333
:user/ExampleUser
" ] }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET
/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } } ] }
以下是一个复制操作示例,其中包括使用 AWS Command Line Interface (AWS CLI) 的 bucket-owner-full-control
标准 ACL。
aws s3 cp
file.txt
s3://DOC-EXAMPLE-BUCKET
--acl bucket-owner-full-control
桶策略生效之后,如果客户端不包含 bucket-owner-full-control
标准 ACL,则操作将失败,上传者将收到以下错误:
调用 PutObject 操作时发生错误 (AccessDenied):访问被拒绝
。
注意
如果客户端在上传后需要访问对象,则必须向上传账户授予其他权限。有关授予账户对资源的访问权限的信息,请参阅 示例演练:管理对 Amazon S3 资源的访问。