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