禁用 ACL 的先决条件 - Amazon Simple Storage Service

禁用 ACL 的先决条件

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

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

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

存储桶策略示例

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

例 – 存储桶的 READ ACL

如果您的存储桶具有 READ ACL 来向 AWS 账户 111122223333 授予列出存储桶内容的权限,则您可以编写授予对存储桶的 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:::amzn-s3-demo-bucket" } ] }
例 – 存储桶中每个对象的 READ ACL

如果存储桶中的每个对象都有向 AWS 账户 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:::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 权限
  1. 登录到AWS Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

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

  3. 选择 Permissions(权限)选项卡。

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

查看对象的 ACL 权限
  1. 登录到AWS 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. 登录到AWS Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

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

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

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

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

  5. 选择 Save changes(保存更改)

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

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

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

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

    aws s3api get-bucket-acl --bucket amzn-s3-demo-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 权限。在存储桶策略中,第三方账户由 AWS 账户 ID(111122223333)标识。

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

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

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

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

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

    "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/EXAMPLE-OBJECT-KEY"
  5. 将存储桶的 ACL 重置为默认的 ACL。

    aws s3api put-bucket-acl --bucket amzn-s3-demo-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 amzn-s3-demo-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:::amzn-s3-demo-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 amzn-s3-demo-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 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/*"
  2. 为对象所有权应用强制存储桶拥有者设置

授予 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 权限迁移到存储桶策略
  1. 将以下存储桶策略添加到存储桶,替换示例值。

    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/*" ] } ] }
  2. 将存储桶的 ACL 重置为默认的 ACL:

    aws s3api put-bucket-acl --bucket amzn-s3-demo-bucket --acl private
  3. 为对象所有权应用强制存储桶拥有者设置