在 Amazon S3 中使用对象 ACL 的使用案例有哪些?

上次更新时间:2021 年 12 月 21 日

我想使用访问控制列表 (ACL) 委派对我的 Amazon Simple Storage Service (Amazon S3) 对象的访问权限。使用对象或存储桶 ACL 的使用案例有哪些?

解决方法

Amazon S3 访问控制列表 (ACL) 允许您管理对 S3 存储桶和对象的访问权限。每个 S3 存储桶和对象都有一个 ACL 作为子资源附上。ACL 定义了授予哪些 AWS 账户或组访问权限以及访问类型。当您针对资源提交请求时,Amazon S3 会检查相应的 ACL,以确认您具有所需的访问权限。

授予对象或存储桶访问权限的大多数使用案例不再需要 ACL。但是,在某些情况下,使用 ACL 可能更合适。例如,以下是您可能需要使用 ACL 来管理存储桶或对象访问的一些使用案例:

  • 对象 ACL 是授予对不属于存储桶拥有者的对象的访问权限的唯一方法。原定设置情况下,当另一个 AWS 账户将对象上载到 S3 存储桶时,该账户(对象编写者)将拥有该对象。此外,对象编写者可以访问该对象,并且可以使用 ACL 授予其他用户访问该对象的权限。
  • 当您需要在对象级别管理权限时,可以使用对象 ACL。例如,如果需要委派对整个文件夹的访问权限,可以使用存储桶策略。但是,如果访问权限因对象而异,则使用存储桶策略向单个对象授予权限可能不切实际。因此,对象 ACL 可能更适合于管理对象访问。
  • 如果您希望拥有由其他 AWS 账户写入您的存储桶的新对象(并且您的 ACL 未被禁用),请应用存储桶拥有者首选设置。借助此设置,使用存储桶拥有者完全控制 ACL 写入的新对象将自动归存储桶拥有者(而不是对象编写者)所有。所有其他 ACL 行为保持不变。
    注意:禁用 ACL,请使用存储桶拥有者为 S3 对象所有权强制执行的设置。禁用 ACL 后,您可以使用存储桶策略轻松维护包含不同 AWS 账户上载的对象(跨账户)的存储桶。如果您的存储桶使用存储桶拥有者为 S3 对象所有权强制执行的设置,则设置或更新 ACL 的请求将失败,并返回 AccessControlListNotSupported 错误代码。但是,仍然支持读取 ACL 的请求。
  • 存储桶 ACL 可用于向 AWS 服务(如 Amazon CloudFront)授予权限,以便对您的存储桶执行特定操作。例如,当您创建或更新 CloudFront 分配并启用 CloudFront 日志记录时,CloudFront 会更新存储桶 ACL。此更新将授予 awslogsdelivery 账户将日志写入存储桶的 FULL_CONTROL 权限。 有关更多信息,请参阅配置标准日志记录和访问日志文件所需的权限

将 ACL 应用于对象

示例 1

如果要将对象上载到其他 AWS 账户中的存储桶,请使用存储桶拥有者完全控制标准 ACL:

aws s3api put-object --bucket destination_bucket --key dir-1/myfile --body dir-1/myfile --acl bucket-owner-full-control

存储桶拥有者完全控制标准 ACL 提供对存储桶拥有者账户的访问权限。

注意:Amazon S3 支持一组预定义的 ACL,称为标准 ACL(如本例中使用的存储桶拥有者完全控制 ACL)。

示例 2

对象上载者还可以添加 ACL 以向其他 AWS 账户授予读取权限:

aws s3api put-object --bucket destination_mybucket --key dir/myfile --body dir/myfile --grant-read emailaddress=user1@amazon.com,id=canonical-id-of-account

注意:您只能使用以下 AWS 区域的电子邮件地址指定被授权人:弗吉尼亚北部、加利福尼亚北部、俄勒冈、新加坡、悉尼、东京、爱尔兰和圣保罗。

示例 3

您还可以更新现有对象的 ACL:

aws s3api put-object-acl --bucket destination_bucket --key dir/myfile --acl bucket-owner-full-control

示例 4

Amazon S3 有一组预定义的组。您可以使用对象 ACL 向属于这些预定义组的用户授予权限。

例如,您可以通过授予对已验证用户组的访问权限,将对象访问权限授予任何经过身份验证的 AWS 用户:

aws s3api put-object --bucket destination_mybucket --key dir/myfile --body dir/myfile --grant-read uri=http://acs.amazonaws.com/groups/global/AuthenticatedUsers

注意:在授予对已验证用户组的访问权限之前,请在账户和存储桶级别禁用 ACL 的阻止公有访问设置。否则,您将收到访问被拒绝错误。要排查与 ACL 相关的访问被拒绝错误,请参阅具有权限将对象添加到我的 Amazon S3 存储桶内的用户会收到 Access Denied 错误消息。为什么?