访问策略指南 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

访问策略指南

Amazon S3 支持使用基于资源的策略和用户策略来管理对 Amazon S3 资源的访问。有关更多信息,请参阅管理对资源的访问。基于资源的策略包括存储桶策略、存储桶访问控制列表 (ACL) 和对象 ACL。本节介绍使用基于资源的访问策略管理对您的 Amazon S3 资源的访问的特定场景。

何时使用基于 ACL 的访问策略(存储桶和对象 ACL)

存储桶和对象都有可用于授予权限的关联 ACL。

预设情况下,当另一个 Amazon Web Services 账户 将对象上载到您的 S3 Bucket,该账户(对象编写者)拥有该对象,拥有对象的访问权限,并可以授予其他用户通过 ACL 访问该数据元的权限。您可以使用对象所有权来更改此原定设置行为,以便禁用 ACL,并且作为存储桶拥有者,您可以自动拥有存储桶中的每个对象。因此,数据的访问控制基于策略,例如 IAM 策略、S3 Bucket 策略、virtual private cloud (VPC) 终端节点策略和 Amazon Organizations 服务控制策略 (SCP)。

Amazon S3 中的大多数现代使用案例不再需要使用 ACL,我们建议您禁用 ACL,除非在需要单独控制每个对象的访问的异常情况下。使用对象所有权,您可以禁用 ACL 并依赖策略进行访问控制。禁用 ACL 时,您可以轻松通过不同的 Amazon Web Services 账户 上载的对象维护存储桶。作为存储桶拥有者,您拥有存储桶中的所有对象,并可以使用策略管理对它们的访问。有关更多信息,请参阅 为您的存储桶控制对象所有权和禁用 ACL。

重要

如果您的存储桶使用存储桶拥有者强制执行的 S3 对象所有权设置,则必须使用策略授予对存储桶及其中对象的访问权限。设置 ACL 或更新 ACL 的请求失败并返回 AccessControlListNotSupported 错误代码。仍然支持读取 ACL 的请求。

何时使用对象 ACL

下面是使用对象 ACL 管理权限的一些场景。

对象不归存储桶拥有者所有

对象 ACL 是管理对非存储桶拥有者所有的对象的访问权限的唯一方法。拥有存储桶的 Amazon Web Services 账户可以向其他 Amazon Web Services 账户授予权限来上载对象。存储桶拥有者不拥有这些对象。创建对象的 Amazon Web Services 账户必须使用对象 ACL 授予权限。

注意

存储桶拥有者不能对其不拥有的对象授予权限。例如,授予对象权限的存储桶策略仅适用于存储桶拥有者拥有的对象。但是,无论存储桶中的对象归谁所有,支付账单的存储桶拥有者都可以编写存储桶策略来拒绝对存储桶中任何对象的访问。存储桶拥有者还可以删除存储桶内的任何对象。

您需要在对象级别管理权限

假设权限因对象而异,您需要在对象级别管理权限。您可以只编写一条策略语句,向一个 Amazon Web Services 账户 授予对数百万具有特定键名前缀的对象的读取权限。例如,您可以授予对以键名前缀 logs 开头的对象的读取权限。但是,如果您的访问权限因对象而异,那么使用存储桶策略授予对各个对象的权限可能不太实际。此外,存储桶策略还有 20 KB 的大小限制。

在这种情况下,使用对象 ACL 可能是比较合适的选择。但是,对象 ACL 也有最多 100 个授权的限制。有关更多信息,请参阅访问控制列表 (ACL) 概述

对象 ACL 仅控制对象级权限

整个存储桶只有一个存储桶策略,但对象 ACL 是按对象指定的。

拥有存储桶的 Amazon Web Services 账户 可以授予其他 Amazon Web Services 账户 权限来管理访问策略。这样做允许该账户更改该策略中的任何内容。为更好地管理权限,您可以选择不授予如此广泛的权限,而只授予对对象子集的 READ-ACPWRITE-ACP 权限。这样可以限制该账户,使其只能通过更新各个对象 ACL 来管理对特定对象的权限。

如果您想使用 ACL 在对象级别管理权限,并且还想拥有写入存储桶的新对象,则可以应用 Object Ownership 的存储桶拥有者首选设置。具有存储桶拥有者首选设置的存储桶将继续接受和遵守存储桶和对象 ACL。有了这个设置,用 bucket-owner-full-control 标准的 ACL 编写的新对象将自动归存储桶所有者而不是对象编写者所有。所有其他 ACL 行为都保持不变。为了要求所有 Amazon S3 PUT 操作都包含 bucket-owner-full-control 标准的 ACL,您可以添加一个存储桶策略,该策略只允许使用该 ACL 上载对象。

使用 ACL 的替代方案

除对象 ACL 外,对象拥有者还有其他方法可以管理对象权限:

  • 如果拥有对象的 Amazon Web Services 账户还拥有存储桶,则可以编写存储桶策略来管理对象权限。

  • 如果拥有对象的 Amazon Web Services 账户要向其账户内的一个用户授予权限,则可以使用用户策略。

  • 如果您作为存储桶拥有者希望自动拥有并完全控制存储桶中的每个对象,则可以应用存储桶拥有者强制执行的对象所有权设置来禁用 ACL。因此,数据的访问控制基于策略。有关更多信息,请参阅为您的存储桶控制对象所有权和禁用 ACL。

何时使用存储桶 ACL

存储桶 ACL 的唯一建议的使用案例是向某些 Amazon Web Services(如 Amazon CloudFront awslogsdelivery 账户)授予权限。当您创建或更新分配并启用 CloudFront 日志记录时,CloudFront 会更新存储桶 (ACL),以提供 awslogsdelivery 账户 FULL_CONTROL 权限,从而将日志写入您的存储桶。有关更多信息,请参阅 Amazon CloudFront Developer Guide(Amazon CloudFront 开发人员指南)中的 Permissions required to configure standard logging and to access your log files(配置标准日志和访问日志文件所需的权限)。如果存储日志的存储桶使用存储桶拥有者强制执行的 S3 Object Ownership 设置来禁用 ACL,则 CloudFront 无法将日志写入存储桶。有关更多信息,请参阅为您的存储桶控制对象所有权和禁用 ACL。

何时使用存储桶策略

如果拥有存储桶的 Amazon Web Services 账户要向其账户中的用户授予权限,则使用存储桶策略或用户策略均可。但在以下情况下,您必须使用存储桶策略。

您想要管理所有 Amazon S3 权限的跨账户权限

您可以使用 ACL 向其他账户授予跨账户权限。但 ACL 只支持一组有限的权限,这些权限并不包括所有 Amazon S3 权限。有关更多信息,请参阅 我能授予哪些许可?。例如,您不能使用 ACL 授予对存储桶子资源的权限。有关更多信息,请参阅Amazon S3 中的 Identity and Access Management

存储桶和用户策略都支持授予所有 Amazon S3 操作的权限。(有关更多信息,请参阅 Amazon S3 操作。) 但是,用户策略用于管理账户中用户的权限。对于其他 Amazon Web Services 账户或其他账户中用户的跨账户权限,则必须使用存储桶策略。

何时使用用户策略

一般情况下,您都可以使用用户策略或存储桶策略来管理权限。您可以选择通过创建用户和通过将策略附加到用户(或用户组)单独管理权限来管理权限。或者,基于资源的策略(例如存储桶策略)可能会更适合您的场景。

使用 Amazon Identity and Access Management (IAM),您可以在 Amazon Web Services 账户 中创建多个用户并通过用户策略管理他们的权限。IAM 用户必须拥有两种权限:一种权限来自其父账户,另一种权限来自拥有该用户要访问的资源的 Amazon Web Services 账户。权限可通过以下方式授予:

  • 来自父账户的权限 – 父账户可以通过附加用户策略向其用户授予权限。

  • 来自资源拥有者的权限 – 资源拥有者可以向 IAM 用户(使用存储桶策略)或父账户(使用存储桶策略、存储桶 ACL 或对象 ACL)授予权限。

这类似于一个孩子想要玩别人的玩具。要玩别人的玩具,这个孩子必须征得家长和玩具主人的同意。

有关更多信息,请参阅存储桶策略和用户策略

授予权限

如果某 Amazon Web Services 账户拥有一项资源,它可以将这些权限授予其他 Amazon Web Services 账户。然后这个账户就可以将这些权限或其子集委托给该账户中的用户。这称为权限委托。但从另一账户接收权限的账户不能向其他 Amazon Web Services 账户跨账户委托权限。

我们建议您先阅读讲解如何管理对您的 Amazon S3 资源的访问的介绍性主题和相关指南。有关更多信息,请参阅Amazon S3 中的 Identity and Access Management。然后再通过以下主题了解有关特定访问策略选项的更多信息。