Amazon S3 如何对请求授权
当 Amazon S3 收到请求(例如,存储桶或对象操作)时,它首先验证请求者是否拥有必要的权限。Amazon S3 对所有相关访问策略、用户策略和基于资源的策略(存储桶策略、存储桶访问控制列表(ACL)、对象 ACL)进行评估,以决定是否对该请求进行授权。
注意
如果 Amazon S3 权限检查未能找到有效的权限,将返回拒绝访问(403 禁止)错误。有关更多信息,请参阅排查 Amazon S3 中的拒绝访问(403 禁止)错误。
为了确定请求者是否拥有执行特定操作的权限,Amazon S3 会在收到请求时按顺序执行以下操作:
-
在运行时将所有相关访问策略(用户策略、存储桶策略、ACL)转换为一组策略以进行评估。
-
通过以下步骤评估生成的策略集。在每个步骤中,Amazon S3 都会基于特定上下文机构来评估上下文中的策略子集。
-
用户上下文 – 在用户上下文中,用户所属的父账户是上下文机构。
Amazon S3 对父账户拥有的策略子集进行评估。该子集包括父账户附加到该用户的用户策略。如果父账户也拥有请求中的资源(存储桶或对象),则 Amazon S3 还会同时评估相应资源策略(存储桶策略、存储桶 ACL 和对象 ACL)。
用户必须从父账户获得执行该操作的权限。
只有在 AWS 账户中的用户发出请求的情况下,此步骤才适用。如果请求是使用 AWS 账户 的根用户凭证发出的,则 Amazon S3 跳过此步骤。
-
存储桶上下文 – 在存储桶上下文中,Amazon S3 评估拥有该存储桶的 AWS 账户 所拥有的策略。
如果请求是针对存储桶操作发出的,则请求者必须拥有来自存储桶拥有者的权限。如果请求是针对对象发出的,则 Amazon S3 会评估由存储桶拥有者拥有的所有策略,以检查存储桶拥有者是否未显式拒绝对该对象的访问。如果设置了显式拒绝,则 Amazon S3 不对请求授权。
-
对象上下文 – 如果请求是针对对象发出的,则 Amazon S3 对由对象拥有者拥有的策略子集进行评估。
-
以下是说明 Amazon S3 如何授权请求的一些示例场景。
例 – 请求者是 IAM 主体
如果请求者是 IAM 主体,则 Amazon S3 必须确定主体所属的父 AWS 账户是否为主体授予了所需的权限以执行该操作。此外,如果请求是要执行存储桶操作(例如,请求列出存储桶内容),则 Amazon S3 必须验证存储桶拥有者是否已为请求者授予执行该操作的权限。要对资源执行特定的操作,IAM 主体需要来自所属的父 AWS 账户以及拥有该资源的 AWS 账户的权限。
例 – 请求者是 IAM 主体 - 如果请求针对的是存储桶拥有者未拥有的对象的操作。
如果请求是要针对存储桶拥有者未拥有的对象执行某一操作,则除了确保请求者拥有来自对象拥有者的权限外,Amazon S3 还必须检查存储桶策略,以确保存储桶拥有者未对该对象设置显式拒绝。存储桶拥有者(支付账单者)可以显式拒绝对存储桶中的对象的访问,而不论谁拥有该对象。存储桶拥有者还可以删除存储桶中的任何对象。
默认情况下,当另一个 AWS 账户将对象上传到您的 S3 存储桶时,该账户(对象编写者)拥有该对象,拥有此对象的访问权限,并可以通过访问控制列表(ACL)授予其他用户访问该对象的权限。您可以使用对象所有权来更改此默认行为,以便禁用 ACL,并且作为存储桶拥有者,您可以自动拥有存储桶中的每个对象。因此,数据的访问控制基于策略,例如 IAM 用户策略、S3 存储桶策略、虚拟私有云(VPC)端点策略和 AWS Organizations 服务控制策略(SCP)。有关更多信息,请参阅 为您的存储桶控制对象所有权和禁用 ACL。。
有关 Amazon S3 如何评估访问策略以授权或拒绝存储桶操作和对象操作请求的更多信息,请参阅以下主题: