

# Amazon S3 如何对请求授权
<a name="how-s3-evaluates-access-control"></a>

当 Amazon S3 收到请求（例如，存储桶或对象操作）时，它首先验证请求者是否拥有必要的权限。Amazon S3 对所有相关访问策略、用户策略和基于资源的策略（存储桶策略、存储桶访问控制列表（ACL）、对象 ACL）进行评估，以决定是否对该请求进行授权。

**注意**  
如果 Amazon S3 权限检查未能找到有效的权限，将返回拒绝访问（403 禁止）错误。有关更多信息，请参阅[排查 Amazon S3 中的拒绝访问（403 Forbidden）错误](https://docs.aws.amazon.com/AmazonS3/latest/userguide/troubleshoot-403-errors.html)。

为了确定请求者是否拥有执行特定操作的权限，Amazon S3 会在收到请求时按顺序执行以下操作：

1. 在运行时将所有相关访问策略（用户策略、存储桶策略、ACL）转换为一组策略以进行评估。

1. 通过以下步骤评估生成的策略集。在每个步骤中，Amazon S3 都会基于特定上下文机构来评估上下文中的策略子集。

   1. **用户上下文** – 在用户上下文中，用户所属的父账户是上下文机构。

      Amazon S3 对父账户拥有的策略子集进行评估。该子集包括父账户附加到该用户的用户策略。如果父账户也拥有请求中的资源（存储桶或对象），则 Amazon S3 还会同时评估相应资源策略（存储桶策略、存储桶 ACL 和对象 ACL）。

      用户必须从父账户获得执行该操作的权限。

      只有在 AWS 账户中的用户发出请求的情况下，此步骤才适用。如果请求是使用 AWS 账户 的根用户凭证发出的，则 Amazon S3 跳过此步骤。

   1. **存储桶上下文** – 在存储桶上下文中，Amazon S3 评估拥有该存储桶的 AWS 账户 所拥有的策略。

      如果请求是针对存储桶操作发出的，则请求者必须拥有来自存储桶拥有者的权限。如果请求是针对对象发出的，则 Amazon S3 会评估由存储桶拥有者拥有的所有策略，以检查存储桶拥有者是否未显式拒绝对该对象的访问。如果设置了显式拒绝，则 Amazon S3 不对请求授权。

   1. **对象上下文** – 如果请求是针对对象发出的，则 Amazon S3 对由对象拥有者拥有的策略子集进行评估。

以下是说明 Amazon S3 如何授权请求的一些示例场景。

**Example – 请求者是 IAM 主体**  
如果请求者是 IAM 主体，则 Amazon S3 必须确定主体所属的父 AWS 账户是否为主体授予了所需的权限以执行该操作。此外，如果请求是要执行存储桶操作（例如，请求列出存储桶内容），则 Amazon S3 必须验证存储桶拥有者是否已为请求者授予执行该操作的权限。要对资源执行特定的操作，IAM 主体需要来自所属的父 AWS 账户以及拥有该资源的 AWS 账户的权限。

 

**Example – 请求者是 IAM 主体 - 如果请求针对的是存储桶拥有者未拥有的对象的操作。**  
如果请求是要针对存储桶拥有者未拥有的对象执行某一操作，则除了确保请求者拥有来自对象拥有者的权限外，Amazon S3 还必须检查存储桶策略，以确保存储桶拥有者未对该对象设置显式拒绝。存储桶拥有者（支付账单者）可以显式拒绝对存储桶中的对象的访问，而不论谁拥有该对象。存储桶拥有者还可以删除存储桶中的任何对象。  
默认情况下，当另一个 AWS 账户将对象上传到您的 S3 通用存储桶时，该账户（对象写入者）拥有该对象，拥有此对象的访问权限，并可以通过访问控制列表（ACL）授予其他用户访问该对象的权限。您可以使用对象所有权来更改此默认行为，以便禁用 ACL，并且作为存储桶拥有者，您可以自动拥有通用存储桶中的每个对象。因此，数据的访问控制基于策略，例如 IAM 用户策略、S3 存储桶策略、虚拟私有云（VPC）端点策略和 AWS Organizations 服务控制策略（SCP）。有关更多信息，请参阅 [为您的存储桶控制对象所有权和禁用 ACL。](about-object-ownership.md)。

有关 Amazon S3 如何评估访问策略以授权或拒绝存储桶操作和对象操作请求的更多信息，请参阅以下主题：

**Topics**
+ [

# Amazon S3 如何对存储桶操作请求进行授权
](access-control-auth-workflow-bucket-operation.md)
+ [

# Amazon S3 如何授权对象操作的请求
](access-control-auth-workflow-object-operation.md)

# Amazon S3 如何对存储桶操作请求进行授权
<a name="access-control-auth-workflow-bucket-operation"></a>

当 Amazon S3 收到存储桶操作请求时，Amazon S3 会将所有相关的权限转换为一组策略，以在运行时评估。相关权限包括基于资源的权限（例如，存储桶策略和存储桶访问控制列表）和用户策略（如果请求来自 IAM 主体）。然后，Amazon S3 将通过一系列步骤根据特定上下文（用户上下文或存储桶上下文）来评估生成的策略集：

1. **用户上下文** – 如果请求者是 IAM 主体，则主体必须具有来自所属的父 AWS 账户 的权限。在此步骤中，Amazon S3 将评估由父账户 (也称为上下文机构) 拥有的一个策略子集。该策略子集包括父账户附加到主体的用户策略。如果父账户也拥有请求中的资源（在本例中为存储桶），则 Amazon S3 还会同时评估相应资源策略（存储桶策略和存储桶 ACL）。无论何时发出存储桶操作请求，服务器访问日志都会记录请求者的规范 ID。有关更多信息，请参阅 [使用服务器访问日志记录来记录请求](ServerLogs.md)。

1. **存储桶上下文** – 请求者必须拥有来自存储桶拥有者的权限才能执行特定存储桶操作。在此步骤中，Amazon S3 对由拥有该存储桶的 AWS 账户拥有的策略子集进行评估。

   存储桶拥有者可通过使用存储桶策略或存储桶 ACL 来授予权限。如果拥有存储桶的 AWS 账户也是 IAM 主体的父账户，则该账户可以在用户策略中配置存储桶权限。

 下面是基于上下文对存储桶操作进行评估的图解说明。

![\[图中显示了对存储桶操作进行基于上下文的评估。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/AccessControlAuthorizationFlowBucketResource.png)


下面的示例演示了评估逻辑。

## 示例 1：由存储桶拥有者请求的存储桶操作
<a name="example1-policy-eval-logic"></a>

 在此示例中，存储桶拥有者使用 AWS 账户 的根用户凭证发送存储桶操作请求。

![\[图中显示了由存储桶拥有者请求的存储桶操作。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/example10-policy-eval-logic.png)


 Amazon S3 通过以下方式执行上下文评估：

1.  由于请求是通过使用 AWS 账户 的根用户凭证发出的，因此不评估用户上下文。

1.  在存储桶上下文中，Amazon S3 检查存储桶策略以确定请求者是否拥有执行该操作的权限。Amazon S3 对该请求进行授权。

## 示例 2：由不是存储桶拥有者的 AWS 账户请求的存储桶操作
<a name="example2-policy-eval-logic"></a>

在此示例中，使用 AWS 账户 1111-1111-1111 的根用户凭证发出请求，请求执行由 AWS 账户 2222-2222-2222 拥有的存储桶操作。该请求不涉及任何 IAM 用户。

![\[图中显示了由不是存储桶拥有者的 AWS 账户请求的存储桶操作。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/example20-policy-eval-logic.png)


在此示例中，Amazon S3 通过以下方式评估上下文：

1. 由于请求是通过使用 AWS 账户 的根用户凭证发出的，因此不评估用户上下文。

1. 在存储桶上下文中，Amazon S3 检查存储桶策略。如果存储桶拥有者（AWS 账户 2222-2222-2222）尚未授权 AWS 账户 1111-1111-1111 执行请求的操作，则 Amazon S3 拒绝该请求。否则，Amazon S3 授权该请求并执行该操作。

## 示例 3：IAM 主体请求的存储桶操作，其父 AWS 账户也是存储桶拥有者
<a name="example3-policy-eval-logic"></a>

 在此示例中，请求由 AWS 账户 1111-1111-1111 中的 IAM 用户 Jill 发送，该账户同时也拥有该存储桶。

![\[图中显示了由 IAM 主体和存储桶拥有者请求的存储桶操作。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/example30-policy-eval-logic.png)


 Amazon S3 执行以下上下文评估：

1.  由于请求来自 IAM 主体，因此，在用户上下文中，Amazon S3 评估属于父 AWS 账户的所有策略以确定 Jill 是否有权执行该操作。

    在该示例中，主体所属的父 AWS 账户 1111-1111-1111 也是存储桶拥有者。因此，除用户策略外，Amazon S3 还要评估同一上下文中的存储桶策略和存储桶 ACL，因为它们属于同一账户。

1. 由于 Amazon S3 已将存储桶策略和存储桶 ACL 作为用户上下文的一部分进行了评估，因此它不会评估存储桶上下文。

## 示例 4：IAM 主体请求的存储桶操作，其父 AWS 账户不是存储桶拥有者
<a name="example4-policy-eval-logic"></a>

在此示例中，请求是由父 AWS 账户是 1111-1111-1111 的 IAM 用户 Jill 发送的，但存储桶由另一个 AWS 账户 2222-2222-2222 拥有。

![\[图中显示了由不是存储桶拥有者的 IAM 主体请求的存储桶操作。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/example40-policy-eval-logic.png)


Jill 将需要来自父 AWS 账户和存储桶拥有者双方的权限。Amazon S3 通过以下方式评估上下文：

1. 由于请求来自 IAM 主体，因此，Amazon S3 查看账户编写的策略以验证 Jill 是否具有所需的权限，从而对用户上下文进行评估。如果 Jill 拥有权限，则 Amazon S3 会进一步评估存储桶上下文。如果 Jill 没有权限，则会拒绝该请求。

1.  在存储桶上下文中，Amazon S3 验证存储桶拥有者 2222-2222-2222 是否已授予 Jill（或她的父 AWS 账户）执行所请求的操作的权限。如果其拥有该权限，则 Amazon S3 会授权该请求并执行该操作。否则，Amazon S3 拒绝该请求。

# Amazon S3 如何授权对象操作的请求
<a name="access-control-auth-workflow-object-operation"></a>

当 Amazon S3 接收对象操作的请求时，它会将所有相关权限转换为一组策略在运行时进行评估，这些相关权限包括：基于资源的权限（对象访问控制列表（ACL）、存储桶策略、存储桶 ACL）和 IAM 用户策略。然后它会通过一系列步骤评估生成的策略集。在每个步骤中，它会在三个特定上下文（用户上下文、存储桶上下文和对象上下文）中评估一个策略子集：

1. **用户上下文** – 如果请求者是 IAM 主体，则主体必须具有来自所属的父 AWS 账户 的权限。在此步骤中，Amazon S3 会评估由父账户 (也称为上下文机构) 拥有的一个策略子集。该策略子集包括父账户附加到主体的用户策略。如果父账户也拥有请求中的资源（存储桶或对象），则 Amazon S3 会同时评估相应资源策略（存储桶策略、存储桶 ACL 和对象 ACL）。
**注意**  
如果父 AWS 账户拥有资源（存储桶或对象），则该账户可以使用用户策略或资源策略为其 IAM 主体授予资源权限。

1. **存储桶上下文** – 在此上下文中，Amazon S3 评估拥有该存储桶的 AWS 账户所拥有的策略。

   如果拥有请求中的对象的 AWS 账户与存储桶拥有者不同，则 Amazon S3 会检查策略，查看存储桶拥有者是否已显式拒绝对该对象的访问。如果对该对象设置了显式拒绝，则 Amazon S3 不对请求授权。

1. **对象上下文** – 请求者必须拥有来自对象拥有者的权限才能执行特定对象操作。在此步骤中，Amazon S3 将评估对象 ACL。
**注意**  
如果存储桶和对象拥有者相同，则可以在存储桶策略中授予对该对象的访问权限，并会在存储桶上下文中对此进行评估。如果拥有者不同，则对象拥有者必须使用对象 ACL 授予权限。如果拥有对象的 AWS 账户 也是 IAM 主体所属的父账户，则该账户可以在用户策略中配置对象权限，将在用户上下文中对其进行评估。有关使用这些备选访问策略的更多信息，请参阅 [演练：使用策略管理针对 Amazon S3 资源的访问权限](example-walkthroughs-managing-access.md)。  
如果您作为存储桶拥有者想拥有存储桶中的所有对象，并使用存储桶策略或基于 IAM 的策略来管理对这些对象的访问，则可以应用对象所有权的强制存储桶拥有者设置。使用此设置，您作为存储桶拥有者自动拥有并完全控制存储桶中的每个对象。无法编辑存储桶和对象 ACL，也不再考虑访问。有关更多信息，请参阅 [为您的存储桶控制对象所有权和禁用 ACL。](about-object-ownership.md)。

 下面是基于上下文来评估对象操作的图解说明。

![\[图中显示了对于对象操作进行基于上下文的评估。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/AccessControlAuthorizationFlowObjectResource.png)


## 对象操作请求示例
<a name="access-control-auth-workflow-object-operation-example1"></a>

在此示例中，IAM 用户 Jill（其父 AWS 账户是 1111-1111-1111）针对 AWS 账户 3333-3333-3333 拥有的对象发送对象操作请求（例如，`GetObject`），该对象位于由 AWS 账户 2222-2222-2222 拥有的存储桶中。

![\[图中显示了对象操作请求。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/example50-policy-eval-logic.png)


Jill 需要从父 AWS 账户、存储桶拥有者和对象拥有者获得权限。Amazon S3 通过以下方式评估上下文：

1. 由于请求来自 IAM 主体，因此，Amazon S3 评估用户上下文以验证父 AWS 账户 1111-1111-1111 是否为 Jill 授予了权限以执行请求的操作。如果她拥有该权限，则 Amazon S3 评估存储桶上下文。否则，Amazon S3 拒绝该请求。

1. 在存储桶上下文中，存储桶拥有者（AWS 账户 2222-2222-2222）是上下文机构。Amazon S3 对存储桶策略进行评估以确定存储桶拥有者是否显式拒绝了 Jill 对该对象的访问。

1. 在对象上下文中，上下文机构是 AWS 账户 3333-3333-3333，即对象拥有者。Amazon S3 评估对象 ACL 以确定 Jill 是否拥有访问该对象的权限。如果她拥有该权限，则 Amazon S3 对该请求进行授权。