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

禁用 ACL 的先决条件

Amazon S3 中的存储桶访问控制列表(ACL)是一种机制,可让您为 S3 存储桶中的单个对象定义精细权限,并指定哪些 AWS 账户或组可以访问和修改这些对象。Amazon S3 中的大多数现代使用案例不再需要使用 ACL。我们建议您使用 AWS Identity and Access Management(IAM)和存储桶策略来管理访问权限,并将 ACL 保持为禁用状态,除非有需要单独控制每个对象的访问权限的特殊情况。

如果您在存储桶上启用了 ACL,则在禁用 ACL 之前,请完成以下先决条件:

查看存储桶和对象 ACL 并迁移 ACL 权限

禁用 ACL 时,存储桶和对象 ACL 授予的权限不再影响访问。在禁用 ACL 之前,请查看存储桶和对象 ACL。

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

在禁用 ACL 之前:

  • 如果存储桶 ACL 授予您 AWS 账户之外的访问权限,首先必须将存储桶 ACL 权限迁移到存储桶策略中。

  • 接下来,将存储桶 ACL 重置为默认的私有 ACL。

  • 我们还建议您查看对象级 ACL 权限并将其迁移到存储桶策略中。

如果存储桶 ACL 向账户以外的其他人授予读取或写入权限,在可以禁用 ACL 之前,必须将这些权限迁移到存储桶策略。迁移这些权限后,可以将对象所有权设置为强制存储桶拥有者设置。如果您不迁移在账户之外授予读取或写入访问权限的存储桶 ACL,则应用强制存储桶拥有者设置的请求将失败,并返回 InvalidBucketAclWithObjectOwnership 错误代码。

如果您的存储桶 ACL 授予 AWS 账户 以外的访问权限,在禁用 ACL 之前,您必须将存储桶 ACL 权限迁移到存储桶策略中,然后将存储桶 ACL 重置为默认私有 ACL。如果不迁移和重置,则应用强制存储桶拥有者设置来禁用 ACL 的请求将失败,并返回 InvalidBucketAclWithObjectOwnership 错误代码。我们还建议您查看对象 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. 选择保存更改

  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 进行授权的请求

要识别需要 ACL 进行授权的 Amazon S3 请求,您可以使用 Amazon S3 服务器访问日志或 AWS CloudTrail 中的 aclRequired 值。如果请求需要 ACL 进行授权,或者如果您具有指定 ACL 的 PUT 请求,则字符串为 Yes。如果不需要 ACL,或者您正在设置 bucket-owner-full-control 标准 ACL,或者如果您的存储桶策略允许请求,则 Amazon S3 服务器访问日志中的 aclRequired 值字符串为“-”,但 CloudTrail 中不存在该值字符串。有关预期 aclRequired 值的更多信息,请参阅常见 Amazon S3 请求的 aclRequired 值

如果您的 PutBucketAclPutObjectAcl 请求的标头授予基于 ACL 的权限(bucket-owner-full-control 标准 ACL 除外),则必须先删除这些标头,然后才能禁用 ACL。否则,您的请求将失败。

对于需要 ACL 进行授权的所有其他请求,请将这些 ACL 权限迁移到存储桶策略。然后,在启用强制存储桶拥有者设置之前,删除所有存储桶 ACL。

注意

请勿删除对象 ACL。否则,依赖于对象 ACL 获取权限的应用程序将失去访问权限。

如果您发现没有请求需要 ACL 进行授权,则可以继续禁用 ACL。有关识别请求的更多信息,请参阅使用 Amazon S3 服务器访问日志来确定请求使用 CloudTrail 识别 Amazon S3 请求

查看和更新使用 ACL 相关条件密钥的存储桶策略

应用强制存储桶拥有者设置以禁用 ACL 后,只有在请求使用存储桶拥有者完全控制 ACL 或未指定 ACL 的情况下,才能将新对象上传到存储桶。在禁用 ACL 之前,请查看存储桶策略以了解 ACL 相关的条件密钥。

如果您的存储桶策略使用 ACL 相关的条件密钥来要求 bucket-owner-full-control 储存的 ACL(例如,s3:x-amz-acl),您无需更新存储桶策略。以下存储桶策略使用 s3:x-amz-acl 以要求 bucket-owner-full-control 储存的 ACL 用于 S3 PutObject 请求。这项策略仍旧要求对象编写者指定 bucket-owner-full-control 标准的 ACL。但是,禁用 ACL 的存储桶仍然接受此 ACL,因此请求将继续成功,无需客户端更改。

{ "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" } } } ] }

但是,如果您的存储桶策略使用的是要求不同 ACL 的 ACL 相关条件密钥,则必须移除此条件密钥。此示例存储桶策略要求 public-read ACL 用于 S3 PutObject 请求,因此必须在禁用 ACL 之前进行更新。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Only allow writes to my bucket with public read access", "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": "public-read" } } } ] }

使用案例示例

以下示例向您演示如何针对特定使用案例将 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. 为对象所有权应用强制存储桶拥有者设置