

# 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 拒绝该请求。