访问策略指南
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 是管理对非桶拥有者所有的对象的访问权限的唯一方法。拥有桶的 AWS 账户可以向其他 AWS 账户授予权限来上载对象。桶拥有者不拥有这些对象。创建对象的 AWS 账户必须使用对象 ACL 授予权限。
注意
桶拥有者不能对其不拥有的对象授予权限。例如,授予对象权限的桶策略仅适用于桶拥有者拥有的对象。但是,无论桶中的对象归谁所有,支付账单的桶拥有者都可以编写桶策略来拒绝对桶中任何对象的访问。桶拥有者还可以删除桶内的任何对象。
您需要在对象级别管理权限
假设权限因对象而异,您需要在对象级别管理权限。您可以只编写一条策略语句,向一个 AWS 账户 授予对数百万具有特定键名前缀的对象的读取权限。例如,您可以授予对以键名前缀 logs
开头的对象的读取权限。但是,如果您的访问权限因对象而异,那么使用桶策略授予对各个对象的权限可能不太实际。此外,桶策略还有 20 KB 的大小限制。
在这种情况下,使用对象 ACL 可能是比较合适的选择。但是,对象 ACL 也有最多 100 个授权的限制。有关更多信息,请参阅访问控制列表 (ACL) 概述。
对象 ACL 仅控制对象级权限
整个桶只有一个桶策略,但对象 ACL 是按对象指定的。
拥有桶的 AWS 账户 可以授予其他 AWS 账户 权限来管理访问策略。这样做允许该账户更改该策略中的任何内容。为更好地管理权限,您可以选择不授予如此广泛的权限,而只授予对对象子集的 READ-ACP
和 WRITE-ACP
权限。这样可以限制该账户,使其只能通过更新各个对象 ACL 来管理对特定对象的权限。
如果您想使用 ACL 在对象级别管理权限,并且还想拥有写入桶的新对象,则可以应用 Object Ownership 的桶拥有者首选设置。具有桶拥有者首选设置的桶将继续接受和遵守桶和对象 ACL。有了这个设置,用 bucket-owner-full-control
标准的 ACL 编写的新对象将自动归桶所有者而不是对象写入器所有。所有其他 ACL 行为都保持不变。为了要求所有 Amazon S3 PUT 操作都包含 bucket-owner-full-control
标准的 ACL,您可以添加一个桶策略,该策略只允许使用该 ACL 上载对象。
使用 ACL 的替代方案
除对象 ACL 外,对象拥有者还有其他方法可以管理对象权限:
-
如果拥有对象的 AWS 账户还拥有桶,则可以编写桶策略来管理对象权限。
-
如果拥有对象的 AWS 账户要向其账户内的一个用户授予权限,则可以使用用户策略。
-
如果您作为桶拥有者希望自动拥有并完全控制桶中的每个对象,则可以应用桶拥有者强制执行的对象所有权设置来禁用 ACL。因此,数据的访问控制基于策略。有关更多信息,请参阅为您的桶控制对象所有权和禁用 ACL。。
何时使用桶 ACL
桶 ACL 的唯一建议的使用案例是向某些 AWS 服务(如 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。。
何时使用桶策略
如果拥有桶的 AWS 账户要向其账户中的用户授予权限,则使用桶策略或用户策略均可。但在以下情况下,您必须使用桶策略。
您想要管理所有 Amazon S3 权限的跨账户权限
您可以使用 ACL 向其他账户授予跨账户权限。但 ACL 只支持一组有限的权限,这些权限并不包括所有 Amazon S3 权限。有关更多信息,请参阅 我能授予哪些许可?。例如,您不能使用 ACL 授予对桶子资源的权限。有关更多信息,请参阅Amazon S3 中的 Identity and Access Management。
桶和用户策略都支持授予所有 Amazon S3 操作的权限。(有关更多信息,请参阅 Amazon S3 操作。) 但是,用户策略用于管理账户中用户的权限。对于其他 AWS 账户或其他账户中用户的跨账户权限,则必须使用桶策略。
何时使用用户策略
一般情况下,您都可以使用用户策略或桶策略来管理权限。您可以选择通过创建用户和通过将策略附加到用户(或用户组)单独管理权限来管理权限。或者,基于资源的策略(例如桶策略)可能会更适合您的场景。
使用 AWS Identity and Access Management (IAM),您可以在 AWS 账户 中创建多个用户并通过用户策略管理他们的权限。IAM 用户必须拥有两种权限:一种权限来自其父账户,另一种权限来自拥有该用户要访问的资源的 AWS 账户。权限可通过以下方式授予:
-
来自父账户的权限 – 父账户可以通过附加用户策略向其用户授予权限。
-
来自资源拥有者的权限 – 资源拥有者可以向 IAM 用户(使用桶策略)或父账户(使用桶策略、桶 ACL 或对象 ACL)授予权限。
这类似于一个孩子想要玩别人的玩具。要玩别人的玩具,这个孩子必须征得家长和玩具主人的同意。
有关更多信息,请参阅桶策略和用户策略。
授予权限
如果某 AWS 账户拥有一项资源,它可以将这些权限授予其他 AWS 账户。然后这个账户就可以将这些权限或其子集委托给该账户中的用户。这称为权限委托。但从另一账户接收权限的账户不能向其他 AWS 账户跨账户委托权限。
相关主题
我们建议您先阅读讲解如何管理对您的 Amazon S3 资源的访问的介绍性主题和相关指南。有关更多信息,请参阅Amazon S3 中的 Identity and Access Management。然后再通过以下主题了解有关特定访问策略选项的更多信息。