

# S3 Access Grants 的概念
<a name="access-grants-concepts"></a>

**S3 访问权限管控工作流程**  
S3 访问权限管控工作流程为：

1. 创建 S3 访问权限管控实例。请参阅[使用 S3 访问权限管控实例](access-grants-instance.md)。

1. 在 S3 访问权限管控实例中，在 Amazon S3 数据中注册位置，并将这些位置映射到 AWS Identity and Access Management（IAM）角色。请参阅[注册位置](access-grants-location-register.md)。

1. 为被授权者创建授权，这会向被授权者授予访问 S3 资源的权限。请参阅[在 S3 访问权限管控中处理授权](access-grants-grant.md)。

1. 被授权者从 S3 访问权限管控请求临时凭证。请参阅[通过 S3 Access Grants 请求访问 Amazon S3 数据](access-grants-credentials.md)。

1. 被授权者使用这些临时凭证来访问 S3 数据。请参阅[使用 S3 访问权限管控提供的凭证访问 S3 数据](access-grants-get-data.md)。

有关更多信息，请参阅 [开始使用 S3 Access Grants](access-grants-get-started.md)。

 **S3 Access Grants 实例**   
*S3 访问权限管控实例* 是各个*授权* 的逻辑容器。创建 S3 访问权限管控实例时，您必须指定 AWS 区域。您 AWS 账户中的每个 AWS 区域都可具有一个 S3 访问权限管控实例。有关更多信息，请参阅 [使用 S3 访问权限管控实例](access-grants-instance.md)。  
如果您想使用 S3 访问权限管控向公司目录中的用户和组身份授予访问权限，还必须将 S3 访问权限管控实例与 AWS IAM Identity Center 实例关联。有关更多信息，请参阅 [S3 Access Grants 和公司目录身份](access-grants-directory-ids.md)。  
新创建的 S3 访问权限管控实例为空。您必须在实例中注册一个位置，该位置可以是 S3 默认路径 (`s3://`)、存储桶或存储桶内的前缀。在您注册至少一个位置后，您可以创建访问权限管控，来授予访问该已注册位置中的数据的权限。

 **位置**   
S3 访问权限管控*位置* 将存储桶或前缀映射到 AWS Identity and Access Management（IAM）角色。S3 访问权限管控代入此 IAM 角色，来向访问该特定位置的被授权者提供临时凭证。您必须先在 S3 访问权限管控实例中注册至少一个位置，然后才能创建访问权限管控。  
我们建议您注册默认位置 (`s3://`) 并将其映射到 IAM 角色。默认 S3 路径 (`s3://`) 处的位置涵盖了对您账户的 AWS 区域中所有 S3 存储桶的访问权限。创建访问权限管控时，您可以将授予范围缩小到默认位置内的存储桶、前缀或对象。  
更复杂的访问管理用例可能要求您注册比默认位置更多的位置。此类用例的一些示例为：  
+ 假设 *amzn-s3-demo-bucket* 是 S3 访问权限管控实例中的一个注册位置，并且有一个 IAM 角色映射到该位置，但拒绝该 IAM 角色访问存储桶中的特定前缀。在这种情况下，您可以将 IAM 角色无权访问的前缀注册为单独的位置，并将该位置映射到具有必要访问权限的其它 IAM 角色。
+ 假设您要创建的授权将访问权限仅限制为虚拟私有云（VPC）端点中的用户。在这种情况下，您可以为存储桶注册一个位置，IAM 角色在该位置限制对 VPC 端点的访问。稍后，当被授权者向 S3 访问权限管控索取凭证时，S3 访问权限管控将代入该位置的 IAM 角色来提供临时凭证。除非调用方位于 VPC 端点内，否则此凭证将拒绝访问特定存储桶。除在授权中指定的常规 READ、WRITE 或 READWRITE 权限外，还会应用此拒绝权限。
如果您的用例要求您在 S3 访问权限管控实例中注册多个位置，则可以注册以下任意位置：  
+ 默认 S3 位置 (`s3://`)
+ 一个存储桶（例如 *amzn-s3-demo-bucket*）或多个存储桶
+ 一个存储桶和一个前缀（例如 `amzn-s3-demo-bucket/prefix*`）或多个前缀
有关您可以在 S3 访问权限管控实例中注册的最大位置数，请参阅 [S3 Access Grants 限制](access-grants-limitations.md)。有关注册 S3 访问权限管控位置的更多信息，请参阅[注册位置](access-grants-location-register.md)。  
在 S3 访问权限管控实例中注册第一个位置后，您的实例中仍没有任何单个访问权限管控。因此，尚未授予对任何 S3 数据的访问权限。现在，您可以创建访问权限管控来授予访问权限。有关创建授权的更多信息，请参阅[在 S3 访问权限管控中处理授权](access-grants-grant.md)。

 **授权**   
S3 访问权限管控实例中的单个*授权* 可让特定身份（IAM 主体或公司目录中的用户或组）在 S3 访问权限管控实例中注册的位置内获得访问权限。  
创建授权时，您不必授予对整个已注册位置的访问权限。您可以缩小某个位置内授权的访问权限范围。如果注册位置是默认 S3 路径 (`s3://`)，则需要将授权的范围缩小到存储桶、存储桶内的前缀或特定对象。如果授权的注册位置是存储桶或前缀，则可以授予对整个存储桶或前缀的访问权限，也可以选择将授权范围缩小到前缀、子前缀或对象。  
在授权中，还将授权的访问权限级别设置为 READ、WRITE 或 READWRITE。假设您拥有授权，用于向公司目录组 `01234567-89ab-cdef-0123-456789abcdef` 授予对存储桶 `s3://amzn-s3-demo-bucket/projects/items/*` 的 READ 访问权限。对于名为 *amzn-s3-demo-bucket* 的存储桶中对象键名称以前缀 `projects/items/` 开头的每个对象，该组中的用户都可以具有 READ 访问权限。  
有关您可以在 S3 访问权限管控实例中创建的最大授权数量，请参阅 [S3 Access Grants 限制](access-grants-limitations.md)。有关创建授权的更多信息，请参阅[创建授权](access-grants-grant-create.md)。

 **S3 Access Grants 临时凭证**   
创建授权后，利用在授权中指定的身份的获授权应用程序可以请求*即时访问凭证*。为此，应用程序调用 [GetDataAccess](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetDataAccess.html) S3 API 操作。被授权者可以使用此 API 操作来请求访问您与他们共享的 S3 数据。  
S3 Access Grants 实例根据其拥有的授权来评估 `GetDataAccess` 请求。如果对于请求者存在匹配的授权，则 S3 访问权限管控将代入与匹配授权的已注册位置关联的 IAM 角色。S3 访问权限管控将临时凭证的权限范围限定为仅访问由授权的范围指定的 S3 存储桶、前缀或对象。  
虽然临时访问凭证的到期时间默认为 1 小时，但可以将到期时间设置为介于 15 分钟和 12 小时之间的任意值。请参阅 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API 参考中的最长持续时间会话。

## 工作原理
<a name="access-grants-concepts-how"></a>

在下图中，范围为 `s3://` 的默认 Amazon S3 位置已注册到 IAM 角色 `s3ag-location-role`。当通过 S3 Access Grants 获取凭证时，此 IAM 角色有权在账户内执行 Amazon S3 操作。

在此位置，为两个 IAM 用户创建两个单独的访问授权。向 IAM 用户 Bob 授予对 `DOC-BUCKET-EXAMPLE` 存储桶中的 `bob/` 前缀的 `READ` 和 `WRITE` 访问权限。仅向另一个 IAM 角色 Alice 授予对 `DOC-BUCKET-EXAMPLE` 桶中 `alice/` 前缀的 `READ` 访问权限。为 Bob 定义了用于访问 `DOC-BUCKET-EXAMPLE` 存储桶中的前缀 `bob/` 的授权（蓝色）。为 Alice 定义了用于访问 `DOC-BUCKET-EXAMPLE` 存储桶中的前缀 `alice/` 的授权（绿色）。

当 Bob 需要对数据进行 `READ` 访问时，与其授权所在位置关联的 IAM 角色会调用 S3 Access Grants [GetDataAccess](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetDataAccess.html) API 操作。如果 Bob 尝试对任何以 `s3://DOC-BUCKET-EXAMPLE/bob/*` 开头的 S3 前缀或对象进行 `READ` 访问，则 `GetDataAccess` 请求将返回一组具有对 `s3://DOC-BUCKET-EXAMPLE/bob/*` 的访问权限的临时 IAM 会话凭证。同样，Bob 可以对任何以 `s3://DOC-BUCKET-EXAMPLE/bob/*` 开头的 S3 前缀或对象进行 `WRITE` 访问，因为该授权也允许这样做。

同样，Alice 可以对任何以 `s3://DOC-BUCKET-EXAMPLE/alice/` 开头的项进行 `READ` 访问。但是，如果她尝试对 `s3://` 中的任何存储桶、前缀或对象进行任何 `WRITE` 访问，她将收到“拒绝访问（403 禁止）”错误，因为没有允许她对任何数据进行 `WRITE` 访问的授权。此外，如果 Alice 请求对 `s3://DOC-BUCKET-EXAMPLE/alice/` 外部的数据进行任何级别的访问（`READ` 或 `WRITE`），她将再次收到“拒绝访问”错误。

![\[S3 Access Grants 的工作原理\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/s3ag-how-it-works.png)


此模式可以扩展到大量的用户和存储桶，并简化对这些权限的管理。您可以添加和删除单个离散授权，而不是在每次需要添加或删除单个用户前缀访问关系时编辑可能很大的 S3 存储桶策略。