禁用 ACL 的先决条件
如果您的存储桶 ACL 授予 AWS 账户 以外的访问权限,在禁用 ACL 之前,您必须将存储桶 ACL 权限迁移到存储桶策略中,然后将存储桶 ACL 重置为默认私有 ACL。如果不迁移这些存储桶 ACL,则应用强制存储桶拥有者设置来禁用 ACL 的请求将失败,并返回 InvalidBucketAclWithObjectOwnership 错误代码。我们还建议您查看对象 ACL 权限并将其迁移到存储桶策略中。有关其他所建议的先决条件的更多信息,请参阅 禁用 ACL 的先决条件。
您现有的每个存储桶和对象 ACL 在 IAM 策略中都有等效的。下面的存储桶策略示例向您演示存储桶和对象 ACL 的 READ
和 WRITE
权限如何映射到 IAM 权限。有关如何将每个 ACL 转换为 IAM 权限的更多信息,请参阅 ACL 权限和访问策略权限的映射。
要查看 ACL 权限并将其迁移至存储桶策略,请参阅以下主题。
存储桶策略示例
这些示例存储桶策略将为您显示如何针对第三方 AWS 账户 将 READ
和 WRITE
存储桶和对象 ACL 权限迁移至存储桶策略,对于策略,READ_ACP
和 WRITE_ACP
ACL 相关性较小,这是因为其授予 ACL 相关的权限(s3:GetBucketAcl
、s3:GetObjectAcl
、s3:PutBucketAcl
和s3:PutObjectAcl
)。
例 – 存储桶的 READ
ACL
如果您的存储桶具有 READ
ACL 来向 AWS 账户
授予列出存储桶内容的权限,则您可以编写授予对存储桶的 111122223333
s3:ListBucket
、s3:ListBucketVersions
、s3:ListBucketMultipartUploads
权限的存储桶策略。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Permission to list the objects in a bucket", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::
111122223333
:root" ] }, "Action": [ "s3:ListBucket", "s3:ListBucketVersions", "s3:ListBucketMultipartUploads" ], "Resource": "arn:aws:s3:::" } ] }
amzn-s3-demo-bucket
例 – 存储桶中每个对象的 READ
ACL
如果存储桶中的每个对象都有向 AWS 账户
授予访问权限的 111122223333
READ
ACL,则您可以编写存储桶策略,以便为存储桶中的每个对象授予对此账户的 s3:GetObject
和 s3:GetObjectVersion
权限。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Read permission for every object in a bucket", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::
111122223333
:root" ] }, "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": "arn:aws:s3:::/*" } ] }
amzn-s3-demo-bucket
此示例资源元素授予对特定对象的访问权限。
"Resource": "arn:aws:s3:::
/
amzn-s3-demo-bucket
OBJECT-KEY
"
例 – 授予将对象写入存储桶的权限的 WRITE
ACL
如果您的存储桶具有 WRITE
ACL 以向 AWS 账户
授予将对象写入存储桶的权限,则您可以编写授予对存储桶的 111122223333
s3:PutObject
权限的存储桶策略。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Permission to write objects to a bucket", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::
111122223333
:root" ] }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::/*" } ] }
amzn-s3-demo-bucket
使用 S3 控制台查看和迁移 ACL 权限
查看存储桶的 ACL 权限
登录到AWS Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/
。 -
在 Buckets(存储桶)列表中,请选择存储桶名称。
-
选择 Permissions(权限)选项卡。
-
在 Access control list(ACL)(访问控制列表)中,查看您的存储桶 ACL 权限。
查看对象的 ACL 权限
登录到AWS Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/
。 -
在 Bucket(存储桶)列表中,选择包含对象的存储桶名称。
-
在 Objects(对象)列表中,请选择对象名称。
-
选择 Permissions(权限)选项卡。
-
在 Access control list (ACL)(访问控制列表)中,查看您的对象 ACL 权限。
要迁移 ACL 权限并更新存储桶 ACL
登录到AWS Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/
。 -
在 Buckets(存储桶)列表中,请选择存储桶名称。
-
在 Permissions(权限)标签页中,在 Bucket policy(存储桶策略)下,请选择 Edit(编辑)。
-
在 Policy(策略)框中添加或更新存储桶策略。
-
选择 Save changes(保存更改)。
-
更新存储桶 ACL以移除授予其他组或 AWS 账户 的 ACL。
-
为对象所有权应用强制存储桶拥有者设置。
使用 AWS CLI 查看和迁移 ACL 权限
-
要返回存储桶的存储桶 ACL,请使用 get-bucket-acl
AWS CLI 命令: aws s3api get-bucket-acl --bucket
amzn-s3-demo-bucket
例如,此存储桶 ACL 授予
WRITE
和READ
访问第三方账户。在此 ACL 中,第三方账户由 canonical user ID(规范的用户 ID)识别。要应用强制存储桶拥有者设置并禁用 ACL,您必须将第三方账户的这些权限迁移到存储桶策略。{ "Owner": { "DisplayName": "
DOC-EXAMPLE-ACCOUNT-OWNER
", "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID
" }, "Grants": [ { "Grantee": { "DisplayName": "DOC-EXAMPLE-ACCOUNT-OWNER
", "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID
", "Type": "CanonicalUser" }, "Permission": "FULL_CONTROL" }, { "Grantee": { "DisplayName": "THIRD-PARTY-EXAMPLE-ACCOUNT
", "ID": "72806de9d1ae8b171cca9e2494a8d1335dfced4ThirdPartyAccountCanonicalUserID
", "Type": "CanonicalUser" }, "Permission": "READ" }, { "Grantee": { "DisplayName": "THIRD-PARTY-EXAMPLE-ACCOUNT
", "ID": "72806de9d1ae8b171cca9e2494a8d1335dfced4ThirdPartyAccountCanonicalUserID
", "Type": "CanonicalUser" }, "Permission": "WRITE" } ] }有关其他示例 ACL,请参阅 示例演练。
-
将存储桶 ACL 权限迁移到存储桶策略:
此示例存储桶策略为第三方账户授予
s3:PutObject
和s3:ListBucket
权限。在存储桶策略中,第三方账户由 AWS 账户 ID(
)标识。111122223333
aws s3api put-bucket-policy --bucket
--policyamzn-s3-demo-bucket
file://policy.json
policy.json: { "Version": "2012-10-17", "Statement": [ { "Sid": "PolicyForCrossAccountAllowUpload", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333
:root" ] }, "Action": [ "s3:PutObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::
", "arn:aws:s3:::amzn-s3-demo-bucket
/*" } ] }amzn-s3-demo-bucket
-
要返回特定对象的 ACL,请使用 get-object-acl
AWS CLI 命令。 aws s3api get-object-acl --bucket
amzn-s3-demo-bucket
--keyEXAMPLE-OBJECT-KEY
-
如果需要,请将对象 ACL 权限迁移到存储桶策略中。
此示例资源元素授予对存储桶策略中特定对象的访问权限。
"Resource": "arn:aws:s3:::
amzn-s3-demo-bucket
/EXAMPLE-OBJECT-KEY
" -
将存储桶的 ACL 重置为默认的 ACL。
aws s3api put-bucket-acl --bucket
amzn-s3-demo-bucket
--acl private -
为对象所有权应用强制存储桶拥有者设置。
示例演练
以下示例向您演示如何针对特定使用案例将 ACL 权限迁移到存储桶策略。
为服务器访问日志记录授予对 S3 日志传输组的访问权限
如果要应用强制存储桶拥有者设置以便对服务器访问日志记录目标存储桶(也称作目标存储桶)禁用 ACL,必须将 S3 日志传输组的存储桶 ACL 权限迁移到存储桶策略中的日志记录服务主体(logging.s3.amazonaws.com
)。有关日志交付权限的更多信息,请参阅 日志传输的权限。
此存储桶 ACL 授予 WRITE
和 READ_ACP
访问 S3 日志传输组的权限:
{ "Owner": { "DisplayName": "
DOC-EXAMPLE-ACCOUNT-OWNER
", "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID
" }, "Grants": [ { "Grantee": { "Type": "CanonicalUser", "DisplayName": "DOC-EXAMPLE-ACCOUNT-OWNER
", "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID
" }, "Permission": "FULL_CONTROL" }, { "Grantee": { "Type": "Group", "URI": "http://acs.amazonaws.com/groups/s3/LogDelivery" }, "Permission": "WRITE" }, { "Grantee": { "Type": "Group", "URI": "http://acs.amazonaws.com/groups/s3/LogDelivery" }, "Permission": "READ_ACP" } ] }
将 S3 日志传输组的存储桶 ACL 权限迁移到存储桶策略中的日志录入服务主体
-
将以下存储桶策略添加到目标存储桶,并替换示例值。
aws s3api put-bucket-policy --bucket
amzn-s3-demo-bucket
--policyfile://policy.json
policy.json: { { "Version": "2012-10-17", "Statement": [ { "Sid": "S3ServerAccessLogsPolicy", "Effect": "Allow", "Principal": { "Service": "logging.s3.amazonaws.com" }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::
/amzn-s3-demo-bucket
EXAMPLE-LOGGING-PREFIX
*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::SOURCE-BUCKET-NAME
" }, "StringEquals": { "aws:SourceAccount": "SOURCE-AWS-ACCOUNT-ID
" } } } ] } -
将目标存储桶的 ACL 重置为默认 ACL。
aws s3api put-bucket-acl --bucket
amzn-s3-demo-bucket
--acl private -
为目标存储桶的对象所有权应用强制存储桶拥有者设置。
授予存储桶中对象的公共读取访问权限。
如果您的对象 ACL 授予对存储桶中所有对象的公共读取访问权限,则可以将这些 ACL 权限迁移到存储桶策略。
此对象 ACL 授予对存储桶中对象的公共读取访问权限:
{ "Owner": { "DisplayName": "
DOC-EXAMPLE-ACCOUNT-OWNER
", "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID
" }, "Grants": [ { "Grantee": { "DisplayName": "DOC-EXAMPLE-ACCOUNT-OWNER
", "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID
", "Type": "CanonicalUser" }, "Permission": "FULL_CONTROL" }, { "Grantee": { "Type": "Group", "URI": "http://acs.amazonaws.com/groups/global/AllUsers" }, "Permission": "READ" } ] }
要将公共读取 ACL 权限迁移到存储桶策略
-
要向存储桶中的所有对象授予公有读取权限,请添加以下存储桶策略,替换示例值。
aws s3api put-bucket-policy --bucket
amzn-s3-demo-bucket
--policy file://policy.json
policy.json: { "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket
/*" ] } ] }要授予对存储桶策略中特定对象的公共访问权限,请使用以下
Resource
元素的格式。"Resource": "arn:aws:s3:::
amzn-s3-demo-bucket
/OBJECT-KEY
"要使用特定的前缀授予对所有对象的公共访问权,请使用以下
Resource
元素的格式。"Resource": "arn:aws:s3:::
amzn-s3-demo-bucket
/PREFIX/
*" -
为对象所有权应用强制存储桶拥有者设置。
授予 Amazon ElastiCache(Redis OSS)对 Amazon S3 存储桶的访问权限
您可以将 ElastiCache(Redis OSS)备份导出到 S3 存储桶中,这样您就可以从 ElastiCache 外部访问备份。要将备份导出到 S3 存储桶,您必须授予 ElastiCache 权限,以便将快照复制到存储桶。如果您已在存储桶 ACL 中授予了对 ElastiCache 的权限,则必须在应用强制存储桶拥有者设置以禁用 ACL 之前将这些权限迁移到存储桶策略。有关更多信息,请参阅 Amazon ElastiCache User Guide(Amazon ElastiCache 用户指南)中的 Grant ElastiCache access to your Amazon S3 存储桶(授予 ElastiCache 访问 Amazon S3 存储桶的权限)。
以下示例显示了向 ElastiCache 授予权限的存储桶 ACL 权限。
{ "Owner": { "DisplayName": "
DOC-EXAMPLE-ACCOUNT-OWNER
", "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID
" }, "Grants": [ { "Grantee": { "DisplayName": "DOC-EXAMPLE-ACCOUNT-OWNER
", "ID": "852b113e7a2f25102679df27bb0ae12b3f85be6BucketOwnerCanonicalUserID
", "Type": "CanonicalUser" }, "Permission": "FULL_CONTROL" }, { "Grantee": { "DisplayName": "aws-scs-s3-readonly", "ID": "540804c33a284a299d2547575ce1010f2312ef3da9b3a053c8bc45bf233e4353", "Type": "CanonicalUser" }, "Permission": "READ" }, { "Grantee": { "DisplayName": "aws-scs-s3-readonly", "ID": "540804c33a284a299d2547575ce1010f2312ef3da9b3a053c8bc45bf233e4353", "Type": "CanonicalUser" }, "Permission": "WRITE" }, { "Grantee": { "DisplayName": "aws-scs-s3-readonly", "ID": "540804c33a284a299d2547575ce1010f2312ef3da9b3a053c8bc45bf233e4353", "Type": "CanonicalUser" }, "Permission": "READ_ACP" } ] }
将用于 ElastiCache(Redis OSS)的存储桶 ACL 权限迁移到存储桶策略
-
将以下存储桶策略添加到存储桶,替换示例值。
aws s3api put-bucket-policy --bucket
amzn-s3-demo-bucket
--policy file://policy.json
policy.json: { "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt15399483", "Effect": "Allow", "Principal": { "Service": "Region
.elasticache-snapshot.amazonaws.com" }, "Action": [ "s3:PutObject", "s3:GetObject", "s3:ListBucket", "s3:GetBucketAcl", "s3:ListMultipartUploadParts", "s3:ListBucketMultipartUploads" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket
", "arn:aws:s3:::amzn-s3-demo-bucket
/*" ] } ] } -
将存储桶的 ACL 重置为默认的 ACL:
aws s3api put-bucket-acl --bucket
amzn-s3-demo-bucket
--acl private -
为对象所有权应用强制存储桶拥有者设置。