禁用 ACL 的先决条件 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

禁用 ACL 的先决条件

如果您的存储桶 ACL 授予 Amazon Web Services 账户 以外的访问权限,在禁用 ACL 之前,您必须将存储桶 ACL 权限迁移到存储桶策略中,然后将存储桶 ACL 重置为默认私有 ACL。如果不迁移这些存储桶 ACL,应用存储桶所有者强制设置来禁用 ACL 的请求将失败,并返回 InvalidBucketAclWithObjectOwnership 错误代码。我们还建议您查看对象 ACL 权限并将其迁移到存储桶策略中。有关其他所建议的先决条件的更多信息,请参阅 禁用 ACL 的先决条件

您现有的每个存储桶和对象 ACL 在 IAM policy 中都有等效的。下面的存储桶策略示例向您演示存储桶和对象 ACL 的 READWRITE 权限如何映射到 IAM 权限。有关如何将每个 ACL 转换为 IAM 权限的更多信息,请参阅 ACL 权限和访问策略权限的映射

要查看 ACL 权限并将其迁移至存储桶策略,请参阅以下主题。

存储桶策略示例

这些示例存储桶策略将为您显示如何针对第三方 Amazon Web Services 账户 将 READWRITE 存储桶和对象 ACL 权限迁移至存储桶策略,对于策略,READ_ACPWRITE_ACP ACL 相关性较小,这是因为其授予 ACL 相关的权限(s3:GetBucketAcls3:GetObjectAcls3:PutBucketAcls3:PutObjectAcl)。

例 — 存储桶的 READ ACL

如果您的存储桶具有授予 Amazon Web Services 账户 111122223333 权限的 READ ACL,以列出存储桶内容,则您可以编写授予存储桶 s3:ListBuckets3:ListBucketVersionss3: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:::DOC-EXAMPLE-BUCKET" } ] }
例 — 存储桶中每个对象的 READ ACL

如果您的存储桶中每个对象都有授予 Amazon Web Services 账户 111122223333 访问权限的 READ ACL,则您可以编写存储桶策略,以便为存储桶中的每个对象授予此账户的 s3:GetObjects3: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:::DOC-EXAMPLE-BUCKET/*" } ] }

此示例资源元素授予对特定对象的访问权限。

"Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/OBJECT-KEY"
例 — 授予将对象写入存储桶的权限的写入 ACL

如果您的存储桶具有授予 Amazon Web Services 账户 111122223333 权限的写入 ACL,以将对象写入存储桶,则您可以编写授予存储桶 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:::DOC-EXAMPLE-BUCKET/*" } ] }

使用 S3 控制台查看和迁移 ACL 权限

查看桶的 ACL 权限
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. Buckets (存储桶) 列表中,请选择存储桶名称。

  3. 请选择 Permissions 选项卡。

  4. Access control list (ACL)(访问控制列表)中,查看您的存储桶 ACL 权限。

查看对象的 ACL 权限
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. Bucket(桶)列表中,选择包含对象的桶名称。

  3. Objects (对象) 列表中,请选择对象名称。

  4. 请选择 Permissions 选项卡。

  5. Access control list (ACL)(访问控制列表)中,查看您的对象 ACL 权限。

要迁移 ACL 权限并更新存储桶 ACL
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. Buckets (存储桶) 列表中,请选择存储桶名称。

  3. Permissions(权限)标签页中,在 Bucket policy(存储桶策略)下,请选择 Edit(编辑)。

  4. Policy(策略)框中添加或更新存储桶策略。

    有关示例存储桶策略,请参阅 存储桶策略示例示例演练

  5. 选择保存更改

  6. 更新存储桶 ACL以移除授予其他组或 Amazon Web Services 账户 的 ACL。

  7. 为对象所有权应用存储桶所有者强制设置

使用 Amazon CLI 查看和迁移 ACL 权限

  1. 要返回存储桶的存储桶 ACL,请使用 get-bucket-acl Amazon CLI 命令:

    aws s3api get-bucket-acl --bucket DOC-EXAMPLE-BUCKET

    例如,此存储桶 ACL 授予 WRITEREAD 访问第三方账户。在此 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,请参阅 示例演练

  2. 将存储桶 ACL 权限迁移到存储桶策略:

    此示例存储桶策略为第三方账户授予 s3:PutObjects3:ListBucket 权限。在存储桶策略中,第三方账户由 Amazon Web Services 账户 ID (111122223333) 识别。

    aws s3api put-bucket-policy --bucket DOC-EXAMPLE-BUCKET --policy 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:::DOC-EXAMPLE-BUCKET", "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" } ] }

    有关更多示例存储桶策略,请参阅 存储桶策略示例示例演练

  3. 要返回特定对象的 ACL,请使用 get-object-acl Amazon CLI 命令。

    aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key EXAMPLE-OBJECT-KEY
  4. 如果需要,请将对象 ACL 权限迁移到存储桶策略中。

    此示例资源元素授予对存储桶策略中特定对象的访问权限。

    "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/EXAMPLE-OBJECT-KEY"
  5. 将存储桶的 ACL 重置为原定设置的 ACL。

    aws s3api put-bucket-acl --bucket DOC-EXAMPLE-BUCKET --acl private
  6. 为对象所有权应用存储桶所有者强制设置

示例演练

以下示例向您演示如何针对特定使用案例将 ACL 权限迁移到存储桶策略。

为服务器访问日志记录授予 S3 日志交付组的访问权

如果要应用存储桶所有者强制设置对服务器访问日志目标桶禁用 ACL,必须将 S3 日志下发组的存储桶 ACL 权限迁移到存储桶策略中的录入服务主体 (logging.s3.amazonaws.com)。有关日志交付权限的更多信息,请参阅 日志传输的权限

此存储桶 ACL 授予 WRITEREAD_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 权限迁移到存储桶策略中的日志录入服务主体
  1. 将以下存储桶策略添加到目标存储桶,替换示例值。

    aws s3api put-bucket-policy --bucket DOC-EXAMPLE-BUCKET --policy file://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:::DOC-EXAMPLE-BUCKET/EXAMPLE-LOGGING-PREFIX*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::SOURCE-BUCKET-NAME" }, "StringEquals": { "aws:SourceAccount": "SOURCE-AWS-ACCOUNT-ID" } } } ] }
  2. 将目标存储桶的 ACL 重置为原定设置的 ACL。

    aws s3api put-bucket-acl --bucket DOC-EXAMPLE-BUCKET --acl private
  3. 为目标存储桶的对象所有权应用存储桶所有者强制设置

授予存储桶中对象的公共读取访问权限。

如果您的对象 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 权限迁移到存储桶策略
  1. 要向存储桶中的所有对象授予公有读取权限,请添加以下存储桶策略,替换示例值。

    aws s3api put-bucket-policy --bucket DOC-EXAMPLE-BUCKET --policy file://policy.json policy.json: { "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ] } ] }

    要授予对存储桶策略中特定对象的公共访问权限,请使用以下 Resource 元素的格式。

    "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/OBJECT-KEY"

    要使用特定的前缀授予对所有对象的公共访问权,请使用以下 Resource 元素的格式。

    "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/PREFIX/*"
  2. 为对象所有权应用存储桶所有者强制设置

授予 Amazon ElastiCache for Redis 对 Amazon S3 存储桶的访问权限

您可以将 Redis 的 ElastiCache 备份导出到 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" } ] }
将用于 Redis 的 ElastiCache 的存储桶 ACL 权限迁移到存储桶策略
  1. 将以下存储桶策略添加到存储桶,替换示例值。

    aws s3api put-bucket-policy --bucket DOC-EXAMPLE-BUCKET --policy file://policy.json policy.json: "Id": "Policy15397346", "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:::DOC-EXAMPLE-BUCKET", "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ] } ] }
  2. 将存储桶的 ACL 重置为原定设置的 ACL:

    aws s3api put-bucket-acl --bucket DOC-EXAMPLE-BUCKET --acl private
  3. 为对象所有权应用存储桶所有者强制设置