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

访问策略指南

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

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

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

S3 对象所有权是 Amazon S3 存储桶级别的设置,您可以使用该设置来控制上传到存储桶的对象的所有权和禁用或启用 ACL。默认情况下,对象所有权设为强制存储桶拥有者设置,并且所有 ACL 均处于禁用状态。禁用 ACL 后,存储桶拥有者拥有存储桶中的所有对象,并使用访问管理策略来专门管理对这些对象的访问权限。

Amazon S3 中的大多数现代使用案例不再需要使用 ACL。我们建议您将 ACL 保持为禁用状态,除非有需要单独控制每个对象的访问权限的特殊情况。禁用 ACL 后,您可以使用策略来控制对存储桶中所有对象的访问权限,无论是谁将对象上传到您的存储桶。有关更多信息,请参阅为您的存储桶控制对象所有权和禁用 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 在对象级别管理权限,并且还想拥有写入存储桶的新对象,则可以应用对象所有权的首选存储桶拥有者设置。具有首选存储桶拥有者设置的存储桶将继续接受和遵守存储桶和对象 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 对象所有权的强制存储桶拥有者设置来禁用 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。然后再通过以下主题了解有关特定访问策略选项的更多信息。