

# Amazon S3 基于身份的策略
<a name="security_iam_id-based-policy-examples"></a>

默认情况下，用户和角色没有创建或修改 Amazon S3 资源的权限。要授予用户对所需资源执行操作的权限，IAM 管理员可以创建 IAM 策略。

要了解如何使用这些示例 JSON 策略文档创建基于 IAM 身份的策略，请参阅《IAM 用户指南》**中的[创建 IAM 策略（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)。

有关 Amazon S3 定义的操作和资源类型的详细信息，包括每种资源类型的 ARN 格式，请参阅《Service Authorization Reference》**中的 [Actions, resources, and condition keys for Amazon S3](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazons3.html)。

有关按 S3 资源类型对 S3 API 操作的权限的更多信息，请参阅 [Amazon S3 API 操作所需的权限](using-with-s3-policy-actions.md)。

**Topics**
+ [

## 策略最佳实践
](#security_iam_service-with-iam-policy-best-practices)
+ [

# 使用用户策略控制对存储桶的访问
](walkthrough1.md)
+ [

# Amazon S3 基于身份的策略示例
](example-policies-s3.md)

## 策略最佳实践
<a name="security_iam_service-with-iam-policy-best-practices"></a>

基于身份的策略确定某个人是否可以创建、访问或删除您账户中的 Amazon S3 资源。这些操作可能会使 AWS 账户产生成本。创建或编辑基于身份的策略时，请遵循以下指南和建议：
+ **AWS 托管式策略及转向最低权限许可入门**：要开始向用户和工作负载授予权限，请使用 *AWS 托管式策略*来为许多常见使用场景授予权限。您可以在 AWS 账户 中找到这些策略。建议通过定义特定于您的使用场景的 AWS 客户托管式策略来进一步减少权限。有关更多信息，请参阅《IAM 用户指南》**中的 [AWS 托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)或[工作职能的 AWS 托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)。
+ **应用最低权限**：在使用 IAM 策略设置权限时，请仅授予执行任务所需的权限。为此，您可以定义在特定条件下可以对特定资源执行的操作，也称为*最低权限许可*。有关使用 IAM 应用权限的更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的策略和权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)。
+ **使用 IAM 策略中的条件进一步限制访问权限**：您可以向策略添加条件来限制对操作和资源的访问。例如，您可以编写策略条件来指定必须使用 SSL 发送所有请求。如果通过特定 AWS 服务（例如 CloudFormation）使用服务操作，您还可以使用条件来授予对服务操作的访问权限。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM JSON 策略元素：条件](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)。
+ **使用 IAM Access Analyzer 验证您的 IAM 策略，以确保权限的安全性和功能性**：IAM Access Analyzer 会验证新策略和现有策略，以确保策略符合 IAM 策略语言（JSON）和 IAM 最佳实践。IAM Access Analyzer 提供 100 多项策略检查和可操作的建议，以帮助您制定安全且功能性强的策略。有关更多信息，请参阅《IAM 用户指南》**中的[使用 IAM Access Analyzer 验证策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)。
+ **需要多重身份验证（MFA）**：如果您所处的场景要求您的 AWS 账户 中有 IAM 用户或根用户，请启用 MFA 来提高安全性。若要在调用 API 操作时需要 MFA，请将 MFA 条件添加到您的策略中。有关更多信息，请参阅《IAM 用户指南》**中的[使用 MFA 保护 API 访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html)。

有关 IAM 中的最佳实操的更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

# 使用用户策略控制对存储桶的访问
<a name="walkthrough1"></a>

本演练将介绍用户许可在 Amazon S3 中的使用方式。在该示例中，您创建一个具有文件夹的存储桶。然后，在您的 AWS 账户 中创建 AWS Identity and Access Management IAM 用户，并为这些用户授予对 Amazon S3 存储桶以及其中文件夹的增量权限。

**Topics**
+ [

## 存储桶和文件夹基础知识
](#walkthrough-background1)
+ [

## 演练摘要
](#walkthrough-scenario)
+ [

## 准备演练
](#walkthrough-what-you-need)
+ [

## 步骤 1：创建存储桶
](#walkthrough1-create-bucket)
+ [

## 步骤 2：创建 IAM 用户和组
](#walkthrough1-add-users)
+ [

## 步骤 3：确认 IAM 用户没有任何权限
](#walkthrough1-verify-no-user-permissions)
+ [

## 步骤 4：授予组级权限
](#walkthrough-group-policy)
+ [

## 步骤 5：授予 IAM 用户 Alice 特定的权限
](#walkthrough-grant-user1-permissions)
+ [

## 步骤 6：授予 IAM 用户 Bob 特定的权限
](#walkthrough1-grant-permissions-step5)
+ [

## 步骤 7：确保 Private 文件夹的安全
](#walkthrough-secure-private-folder-explicit-deny)
+ [

## 步骤 8：清除
](#walkthrough-cleanup)
+ [

## 相关资源
](#RelatedResources-walkthrough1)

## 存储桶和文件夹基础知识
<a name="walkthrough-background1"></a>

Amazon S3 数据模型是一种扁平结构：您创建一个存储桶，存储桶存储对象。没有子存储桶或子文件夹层次结构，但您可以模拟文件夹层次结构。Amazon S3 控制台等工具可以显示存储桶中这些逻辑文件夹和子文件夹的视图。

控制台显示名为 `companybucket` 的存储桶具有三个文件夹（`Private`、`Development` 和 `Finance`）和一个对象（`s3-dg.pdf`）。控制台使用对象名称 (键) 来创建文件夹和子文件夹的逻辑层次结构。考虑以下示例：
+ 在创建 `Development` 文件夹时，控制台使用 `Development/` 键创建一个对象。请注意尾部斜杠 (`/`) 分隔符。
+ 在上传 `Projects1.xls` 文件夹中名为 `Development` 的对象时，控制台上传该对象并为其分配 `Development/Projects1.xls` 键。

  在该键值中，`Development` 是[前缀](https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#keyprefix)，`/` 是分隔符。Amazon S3 API 在运行时支持前缀和分隔符。例如，您可以使用特定的前缀和分隔符，从存储桶获取所有对象的列表。在控制台上，在打开 `Development` 文件夹时，控制台列出该文件夹中的对象。在以下示例中，`Development` 文件夹包含一个对象。

  当控制台列出 `Development` 存储桶中的 `companybucket` 文件夹时，它向 Amazon S3 发送一个请求，在请求中指定 `Development` 前缀和 `/` 分隔符。控制台的反应方式与计算机文件系统内的文件夹列表的反应方式相似。上一个示例显示，存储桶 `companybucket` 拥有一个带键值 `Development/Projects1.xls` 的对象。

控制台使用对象键来推断逻辑层次结构。Amazon S3 没有物理层次结构。Amazon S3 只拥有包含平面文件结构中的对象的存储桶。使用 Amazon S3 API 创建对象时，您可以使用暗指逻辑层次结构的对象键。在创建对象的逻辑层次结构时，您可以管理对单个文件夹的访问，如本演练中所示。

在开始之前，请确保您熟悉*根级* 存储桶内容概念。假设 `companybucket` 存储桶具有以下对象：
+ `Private/privDoc1.txt`
+ `Private/privDoc2.zip`
+ `Development/project1.xls`
+ `Development/project2.xls`
+ `Finance/Tax2011/document1.pdf`
+ `Finance/Tax2011/document2.pdf`
+ `s3-dg.pdf`

这些对象键创建一个逻辑层次结构，将 `Private`、`Development` 和 `Finance` 作为根级文件夹并将 `s3-dg.pdf` 作为根级对象。在 Amazon S3 控制台上选择存储桶名称时，将显示根级项目。控制台将顶级前缀（`Private/`、`Development/` 和 `Finance/`）显示为根级文件夹。`s3-dg.pdf` 对象键没有前缀，因此，它显示为根级项目。



## 演练摘要
<a name="walkthrough-scenario"></a>

在本演练中，您创建一个包含三个文件夹（`Private`、`Development` 和 `Finance`）的存储桶。

您拥有两个用户，Alice 和 Bob。您希望 Alice 仅访问 `Development` 文件夹，并希望 Bob 仅访问 `Finance` 文件夹。您希望将 `Private` 文件夹内容保密。在本演练中，您创建 IAM 用户（该示例使用用户名 Alice 和 Bob）并为其授予所需的权限以管理访问。

IAM 还支持创建用户组以及授予适用于组中所有用户的组级许可。这将帮助您更好地管理权限。在该练习中，Alice 和 Bob 需要具有一些相同的权限。因此，您还创建一个名为 `Consultants` 的组，然后将 Alice 和 Bob 添加到该组中。您先将一个组策略附加到该组以授予权限。然后，您将策略附加到特定用户以添加用户特定的权限。

**注意**  
本演练将 `companybucket` 作为存储桶名称，将 Alice 和 Bob 作为 IAM 用户并将 `Consultants` 作为组名称。由于 Amazon S3 要求存储桶名称全局唯一，因此，您必须将存储桶名称替换为您创建的名称。

## 准备演练
<a name="walkthrough-what-you-need"></a>

 在该示例中，您使用 AWS 账户 凭证来创建 IAM 用户。一开始，这些用户没有权限。您逐步为这些用户授予权限以执行特定的 Amazon S3 操作。为了测试这些权限，您使用每个用户的凭证登录到控制台。由于您不停地以 AWS 账户拥有者身份授予许可，并以 IAM 用户身份测试这些许可，因此需要登录和注销，每次都要使用不同的凭证。您可以使用一个浏览器执行该测试，但如果使用两个不同的浏览器，则可以加快该过程的速度。使用您的 AWS 账户 凭证通过一个浏览器连接到 AWS 管理控制台，并使用 IAM 用户凭证通过另一个浏览器进行连接。

 要使用 AWS 账户 凭证登录 AWS 管理控制台，请转到 [https://console.aws.amazon.com/](https://console.aws.amazon.com/)。IAM 用户无法使用相同的链接登录。IAM 用户必须使用支持 IAM 的登录页面。作为账户所有者，您可以向您的用户提供此链接。

有关 IAM 的更多信息，请参阅 *IAM 用户指南*中的 [AWS 管理控制台 登录页面](https://docs.aws.amazon.com/IAM/latest/UserGuide/console.html)。

### 向 IAM 用户提供登录链接的步骤
<a name="walkthrough-sign-in-user-credentials"></a>

1. 登录 AWS 管理控制台，单击 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在 **Navigation (导航)** 窗格中，请选择 **IAM Dashboard (IAM 控制面板)**。

1. 记下 **IAM users sign in link: (IAM 用户登录链接：)** 下的 URL。向 IAM 用户提供此链接，允许他们使用 IAM 用户名称和密码登录控制台。

## 步骤 1：创建存储桶
<a name="walkthrough1-create-bucket"></a>

在该步骤中，您使用 AWS 账户 凭证登录到 Amazon S3 控制台，创建一个存储桶，在该存储桶中添加文件夹，然后在每个文件夹中上传一个或两个示例文档。

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 创建存储桶。

   如需分步指导，请参阅 [创建通用存储桶](create-bucket-overview.md)。

1. 将一个文档上传到存储桶。

   该练习假定您在该存储桶的根级别具有 `s3-dg.pdf` 文档。如果您上传其他文档，请使用其文件名替代 `s3-dg.pdf`。

1. 将三个名为 `Private`、`Finance` 和 `Development` 的文件夹添加到存储桶中。

   有关创建文件夹的分步说明，请参阅 *Amazon Simple Storage Service 用户指南*中的 [使用文件夹在 Amazon S3 控制台中整理对象](using-folders.md)>。

1. 将一个或两个文档上传到每个文件夹。

   对于该练习，假设您在每个文件夹中上传了几个文档，从而导致存储桶包含具有以下键的对象：
   + `Private/privDoc1.txt`
   + `Private/privDoc2.zip`
   + `Development/project1.xls`
   + `Development/project2.xls`
   + `Finance/Tax2011/document1.pdf`
   + `Finance/Tax2011/document2.pdf`
   + `s3-dg.pdf`

   

   如需分步指导，请参阅 [上传对象](upload-objects.md)。

## 步骤 2：创建 IAM 用户和组
<a name="walkthrough1-add-users"></a>

现在使用 [IAM 控制台](https://console.aws.amazon.com/iam/)将两个 IAM 用户（Alice 和 Bob）添加到您的 AWS 账户。有关分步说明，请参阅《IAM 用户指南》**中的[在您的 AWS 账户中创建 IAM 用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)。

还要创建一个名为 `Consultants` 的管理组。然后，将这两个用户都添加到该组中。有关分步说明，请参阅[创建 IAM 用户组](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups_create.html)。

**警告**  
添加用户和组时，请不要为这些用户附加任何授予权限的策略。起初，这些用户没有任何权限。在以下部分中，您逐步授予权限。首先，您必须确保已为这些 IAM 用户分配密码。您使用这些用户凭证测试 Amazon S3 操作，并验证这些权限是否可按预期工作。

有关创建新的 IAM 用户的分步说明，请参阅《IAM 用户指南》**中的[在您的 AWS 账户中创建 IAM 用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html)。在为本演练创建用户时，请选择 **AWS 管理控制台访问**并清除[编程访问](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys)。

有关创建管理组的分步说明，请参阅 *IAM 用户指南*中的[创建第一个 IAM 管理员用户和组](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.html)。



## 步骤 3：确认 IAM 用户没有任何权限
<a name="walkthrough1-verify-no-user-permissions"></a>

如果您使用两个浏览器，现在可以使用第二个浏览器通过 IAM 用户凭证之一登录控制台。

1. 通过使用 IAM 用户登录链接（请参阅[向 IAM 用户提供登录链接的步骤](#walkthrough-sign-in-user-credentials)），使用任一 IAM 用户凭证登录到 AWS 管理控制台。

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

    验证是否有告知您访问已被拒绝的控制台消息。

现在，您可以开始为用户授予增量权限。首先，您附加一个组策略，以授予两个用户必须具有的权限。

## 步骤 4：授予组级权限
<a name="walkthrough-group-policy"></a>

您希望用户能够执行以下操作：
+ 列出父账户拥有的所有存储桶。要执行此操作，Bob 和 Alice 必须拥有执行 `s3:ListAllMyBuckets` 操作的权限。
+ 列出 `companybucket` 存储桶中的根级项目、文件夹和对象。要执行此操作，Bob 和 Alice 必须拥有在 `companybucket` 存储桶上执行 `s3:ListBucket` 操作的权限。

首先，您创建一个授予这些权限的策略，然后将其附加到 `Consultants` 组。

### 步骤 4.1：授予列出所有存储桶的权限
<a name="walkthrough1-grant-permissions-step1"></a>

在该步骤中，您创建一个托管策略，它为用户授予最低权限，以使他们能够列出父账户拥有的所有存储桶。然后，您将该策略附加到 `Consultants` 组。在将该托管式策略附加到一个用户或组时，您为该用户或组授予权限以获取父 AWS 账户拥有的存储桶列表。

1. 登录 AWS 管理控制台，单击 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。
**注意**  
由于您要授予用户权限，请使用您的 AWS 账户凭证登录，而不是以 IAM 用户身份登录。

1. 创建托管策略。

   1. 在左侧导航窗格中，请选择**策略**，然后选择**创建策略**。

   1. 请选择 **JSON** 选项卡。

   1. 复制以下访问策略，并将其粘贴到策略文本字段中。

------
#### [ JSON ]

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Sid": "AllowGroupToSeeBucketListInTheConsole",
            "Action": ["s3:ListAllMyBuckets"],
            "Effect": "Allow",
            "Resource": ["arn:aws:s3:::*"]
          }
        ]
      }
      ```

------

      策略是一个 JSON 文档。在文档中，`Statement` 是一个对象数组，其中每个对象均使用名称/值对的集合来描述权限。之前的策略描述了一个特定的权限。`Action` 指定访问权限的类型。在策略中，`s3:ListAllMyBuckets` 是预定义的 Amazon S3 操作。此操作涵盖了 Amazon S3 GET Service 操作，它可以返回已验证发件人拥有的所有存储桶的列表。`Effect` 元素值确定是允许还是拒绝特定的权限。

   1. 选择 **Review Policy（查看策略）**。在下一页上，在**名称**字段中输入 `AllowGroupToSeeBucketListInTheConsole`，然后选择**创建策略**。
**注意**  
**摘要**条目显示一条消息，以指出该策略不授予任何权限。对于本演练，您可以安全地忽略此消息。

1. 将您创建的 `AllowGroupToSeeBucketListInTheConsole` 托管策略附加到 `Consultants` 组。

   有关附加托管式策略的分步说明，请参阅**《IAM 用户指南》中的[添加和删除 IAM 身份权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#attach-managed-policy-console)。

   您可以将策略文档附加到 IAM 控制台中的 IAM 用户和组。由于您希望两个用户都能够列出存储桶，因此，您将该策略附加到组。

1. 测试权限。

   1. 使用 IAM 用户登录链接（请参阅 [向 IAM 用户提供登录链接的步骤](#walkthrough-sign-in-user-credentials)），通过任何 IAM 用户凭证登录控制台。

   1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

      控制台现在应该会列出所有的存储桶，但不会列出任何存储桶中的对象。

### 步骤 4.2：允许用户列出存储桶的根级内容
<a name="walkthrough1-grant-permissions-step2"></a>

接下来，您允许 `Consultants` 组中的所有用户列出根级 `companybucket` 存储桶项目。当用户在 Amazon S3 控制台上选择 company 存储桶时，用户可以看到该存储桶中的根级项目。

**注意**  
该示例使用 `companybucket` 以进行说明。您必须使用创建的存储桶的名称。

要了解在您选择存储桶名称时控制台向 Amazon S3 发送的请求、Amazon S3 返回的响应，以及控制台如何解释该响应，请更详细地介绍该过程。

当您选择存储桶名称时，控制台会向 Amazon S3 发送 [GET Bucket (List Objects)](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)请求。该请求包括以下参数：
+ 将空字符串作为值的 `prefix` 参数。
+ 将 `delimiter` 作为值的 `/` 参数。

以下是一个示例请求。

```
GET ?prefix=&delimiter=/ HTTP/1.1 
Host: companybucket.s3.amazonaws.com
Date: Wed, 01 Aug  2012 12:00:00 GMT
Authorization: AWS AKIAIOSFODNN7EXAMPLE:xQE0diMbLRepdf3YB+FIEXAMPLE=
```

Amazon S3 将返回包含以下 `<ListBucketResult/>` 元素的响应。

```
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <Name>companybucket</Name>
  <Prefix></Prefix>
  <Delimiter>/</Delimiter>
   ...
  <Contents>
    <Key>s3-dg.pdf</Key>
    ...
  </Contents>
  <CommonPrefixes>
    <Prefix>Development/</Prefix>
  </CommonPrefixes>
  <CommonPrefixes>
    <Prefix>Finance/</Prefix>
  </CommonPrefixes>
  <CommonPrefixes>
    <Prefix>Private/</Prefix>
  </CommonPrefixes>
</ListBucketResult>
```

键 `s3-dg.pdf` 对象不包含斜杠 (`/`) 分隔符，并且 Amazon S3 在 `<Contents>` 元素中返回该键。但是，示例存储桶中的所有其他键都包含 `/` 分隔符。Amazon S3 将组合这些密钥，并在指定的 `<CommonPrefixes>` 分隔符首次出现时，为每个不同前缀值 `Development/`、`Finance/` 和 `Private/`（它们是这些密钥开头的子字符串）返回 `/` 元素。

控制台将解释该结果并将根级项目显示为三个文件夹和一个对象键。

如果 Bob 或 Alice 打开 **Development (开发)** 文件夹，控制台将向 Amazon S3 发送 [GET Bucket (List Objects)](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html) 请求，并将 `prefix` 和 `delimiter` 参数设置为以下值：
+ 具有 `prefix` 值的 `Development/` 参数。
+ 具有“`delimiter`”值的 `/` 参数。

作为响应，Amazon S3 将返回对象密钥，该密钥以指定的前缀开头。

```
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <Name>companybucket</Name>
  <Prefix>Development</Prefix>
  <Delimiter>/</Delimiter>
   ...
  <Contents>
    <Key>Project1.xls</Key>
    ...
  </Contents>
  <Contents>
    <Key>Project2.xls</Key>
    ...
  </Contents> 
</ListBucketResult>
```

控制台显示这些对象键。

现在，我们返回以授予用户权限，以便列出根级存储桶项目。要列出存储桶内容，用户需要调用 `s3:ListBucket` 操作的权限，如下面的策略语句中所述。为了确保他们仅看到根级内容，您添加一个条件以要求用户必须在请求中指定空 `prefix`，即不允许他们双击任何根级文件夹。最后，您添加一个条件以要求用户请求包含值为“`delimiter`”的 `/` 参数，从而要求进行文件夹样式的访问。

```
{
  "Sid": "AllowRootLevelListingOfCompanyBucket",
  "Action": ["s3:ListBucket"],
  "Effect": "Allow",
  "Resource": ["arn:aws:s3:::companybucket"],
  "Condition":{ 
         "StringEquals":{
             "s3:prefix":[""], "s3:delimiter":["/"]
                        }
              }
}
```

在 Amazon S3 控制台上选择一个存储桶时，控制台先发送 [GET Bucket location](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETlocation.html) 请求以查找部署了该存储桶的 AWS 区域。然后，控制台使用该存储桶的区域特定端点以发送 [GET Bucket (List Objects)](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)请求。因此，如果用户要使用控制台，您必须授予 `s3:GetBucketLocation` 操作权限，如以下策略语句中所示。

```
{
   "Sid": "RequiredByS3Console",
   "Action": ["s3:GetBucketLocation"],
   "Effect": "Allow",
   "Resource": ["arn:aws:s3:::*"]
}
```

**允许用户列出根级存储桶内容的步骤**

1. 登录 AWS 管理控制台，单击 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

   使用 AWS 账户凭证，而不是 IAM 用户的凭证登录控制台。

1. 将附加到 `AllowGroupToSeeBucketListInTheConsole` 组的现有 `Consultants` 托管策略替换为以下策略，这还会允许执行 `s3:ListBucket` 操作。记得将策略 `Resource` 中的 *`companybucket`* 替换为您的存储桶的名称。

   有关分步说明，请参阅《IAM 用户指南》**中的[编辑 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-edit.html)。在按照分步说明进行操作时，请务必执行将更改应用于策略附加到的所有主体实体的步骤。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	                  
     "Statement": [
        {
          "Sid": "AllowGroupToSeeBucketListAndAlsoAllowGetBucketLocationRequiredForListBucket",
          "Action": [ "s3:ListAllMyBuckets", "s3:GetBucketLocation" ],
          "Effect": "Allow",
          "Resource": [ "arn:aws:s3:::*"  ]
        },
        {
          "Sid": "AllowRootLevelListingOfCompanyBucket",
          "Action": ["s3:ListBucket"],
          "Effect": "Allow",
          "Resource": ["arn:aws:s3:::companybucket"],
          "Condition":{ 
                "StringEquals":{
                       "s3:prefix":[""], "s3:delimiter":["/"]
                              }
                      }
        }
     ] 
   }
   ```

------

1. 测试更新的权限。

   1. 使用 IAM 用户登录链接（请参阅[向 IAM 用户提供登录链接的步骤](#walkthrough-sign-in-user-credentials)）登录 AWS 管理控制台。

      通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

   1. 请选择您创建的存储桶，控制台将显示根级存储桶项目。如果您选择存储桶中的任何文件夹，则无法看到文件夹内容，因为您尚未授予这些权限。

当用户使用 Amazon S3 控制台时，此测试会成功。在控制台上选择一个存储桶时，控制台实施发送一个请求，其中包含将空字符串作为值的 `prefix` 参数以及将“`delimiter`”作为值的 `/` 参数。

### 步骤 4.3：组策略总结
<a name="walkthrough-group-policy-summary"></a>

您所添加的组策略的实际结果是授予 IAM 用户 Alice 和 Bob 以下最低许可：
+ 列出父账户拥有的所有存储桶。
+ 查看 `companybucket` 存储桶中的根级项目。

不过，用户仍然只能执行很少的操作。接下来，您授予用户特定的权限，如下所示：
+ 允许 Alice 在 `Development` 文件夹中获取和放置对象。
+ 允许 Bob 在 `Finance` 文件夹中获取和放置对象。

对于用户特定的权限，您需要将策略附加到特定的用户，而不是附加到组。在以下部分中，您为 Alice 授予权限以在 `Development` 文件夹中工作。您可以重复这些步骤，以便为 Bob 授予类似权限以在 `Finance` 文件夹中工作。

## 步骤 5：授予 IAM 用户 Alice 特定的权限
<a name="walkthrough-grant-user1-permissions"></a>

现在，您为 Alice 授予额外的权限，以便她可以查看 `Development` 文件夹内容以及在该文件夹中获取和放置对象。

### 步骤 5.1：授予 IAM 用户 Alice 列出 development 文件夹内容的权限
<a name="walkthrough-grant-user1-permissions-listbucket"></a>

要让 Alice 列出 `Development` 文件夹内容，您必须将一个策略应用于用户 Alice 以授予对 `s3:ListBucket` 存储桶执行 `companybucket` 操作的权限，但前提是请求包含 `Development/` 前缀。您希望仅将该策略应用于 Alice 用户，因此，您使用一个内联策略。有关内联策略的更多信息，请参阅《IAM 用户指南**》中的 [托管式策略与内联策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html)。

1. 登录 AWS 管理控制台，单击 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

   使用 AWS 账户凭证，而不是 IAM 用户的凭证登录控制台。

1. 创建一个内联策略，以便为 Alice 用户授予权限以列出 `Development` 文件夹内容。

   1. 在左侧导航窗格中，请选择**用户**。

   1. 请选择用户名 **Alice**。

   1. 在用户详细信息页面上，请选择**权限**选项卡，然后选择**添加内联策略**。

   1. 请选择 **JSON** 选项卡。

   1. 复制以下策略，并将其粘贴到策略文本字段中。

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	   
          "Statement": [
          {
            "Sid": "AllowListBucketIfSpecificPrefixIsIncludedInRequest",
            "Action": ["s3:ListBucket"],
            "Effect": "Allow",
            "Resource": ["arn:aws:s3:::companybucket"],
            "Condition": { "StringLike": {"s3:prefix": ["Development/*"] }
             }
          }
        ]
      }
      ```

------

   1. 选择 **Review Policy（查看策略）**。在下一页上，在**名称**字段中输入一个名称，然后选择**创建策略**。

1. 测试对 Alice 的权限的更改：

   1. 使用 IAM 用户登录链接（请参阅[向 IAM 用户提供登录链接的步骤](#walkthrough-sign-in-user-credentials)）登录 AWS 管理控制台。

   1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

   1. 在 Amazon S3 控制台中，验证 Alice 能否查看存储桶中 `Development/` 文件夹中的对象列表。

      当用户单击 `/Development` 文件夹以查看其中的对象列表时，Amazon S3 控制台会向 Amazon S3 发送 `ListObjects` 请求并使用前缀 `/Development`。由于用户已被授予许可，可以查看使用前缀 `Development` 和分隔符 `/` 的对象列表，因此 Amazon S3 将返回使用密钥前缀 `Development/` 的对象列表，并且控制台将显示该列表。

### 步骤 5.2：授予 IAM 用户 Alice 在 development 文件夹中获取和放置对象的权限
<a name="walkthrough-grant-user1-permissions-get-put-object"></a>

要让 Alice 在 `Development` 文件夹中获取和放置对象，她需要具有调用 `s3:GetObject` 和 `s3:PutObject` 操作的权限。以下策略语句授予这些权限，但前提是请求包含值为 `prefix` 的 `Development/` 参数。

```
{
    "Sid":"AllowUserToReadWriteObjectData",
    "Action":["s3:GetObject", "s3:PutObject"],
    "Effect":"Allow",
    "Resource":["arn:aws:s3:::companybucket/Development/*"]
 }
```



1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

   使用 AWS 账户凭证，而不是 IAM 用户的凭证登录控制台。

1. 编辑您在上一步中创建的内联策略。

   1. 在左侧导航窗格中，请选择**用户**。

   1. 请选择 Alice 用户名。

   1. 在用户详细信息页面上，请选择**权限**选项卡，然后展开**内联策略**部分。

   1. 在上一步中创建的策略名称旁边，请选择**编辑策略**。

   1. 复制以下策略，并将其粘贴到策略文本字段中，从而替换现有的策略。

------
#### [ JSON ]

****  

      ```
      {
           "Version":"2012-10-17",		 	 	 
           "Statement":[
            {
               "Sid":"AllowListBucketIfSpecificPrefixIsIncludedInRequest",
               "Action":["s3:ListBucket"],
               "Effect":"Allow",
               "Resource":["arn:aws:s3:::companybucket"],
               "Condition":{
                  "StringLike":{"s3:prefix":["Development/*"]
                  }
               }
            },
            {
              "Sid":"AllowUserToReadWriteObjectDataInDevelopmentFolder", 
              "Action":["s3:GetObject", "s3:PutObject"],
              "Effect":"Allow",
              "Resource":["arn:aws:s3:::companybucket/Development/*"]
            }
         ]
      }
      ```

------

1. 测试更新的策略：

   1. 使用 IAM 用户登录链接（请参阅[向 IAM 用户提供登录链接的步骤](#walkthrough-sign-in-user-credentials)）登录 AWS 管理控制台。

   1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

   1. 在 Amazon S3 控制台中，验证 Alice 现在能否在 `Development` 文件夹中添加和下载对象。

### 步骤 5.3：显式拒绝 IAM 用户 Alice 对存储桶中其他任何文件夹的权限
<a name="walkthrough-grant-user1-explicit-deny-other-access"></a>

用户 Alice 现在可以列出 `companybucket` 存储桶中的根级内容。她还可以在 `Development` 文件夹中获取和放置对象。如果您确实想要严格控制访问权限，可以显式拒绝 Alice 对存储桶中其他任何文件夹的访问。若存在任何其他策略（存储桶策略或 ACL），而且它们授予了 Alice 访问存储桶中任何其他文件夹的权限，此显式拒绝将覆盖这些权限。

您可以向用户 Alice 策略添加以下声明：要求 Alice 发送到 Amazon S3 的所有请求均包含 `prefix` 参数，该参数的值可为 `Development/*` 或空字符串。



```
{
   "Sid": "ExplicitlyDenyAnyRequestsForAllOtherFoldersExceptDevelopment",
   "Action": ["s3:ListBucket"],
   "Effect": "Deny",
   "Resource": ["arn:aws:s3:::companybucket"],
   "Condition":{  "StringNotLike": {"s3:prefix":["Development/*",""] },
                  "Null"         : {"s3:prefix":false }
    }
}
```

在 `Condition` 块中具有两个条件表达式。这些条件表达式的结果将使用逻辑 `AND` 合并在一起。如果两种条件均为真，组合条件的结果才为真。由于该策略中的 `Effect` 为 `Deny`，因此，在 `Condition` 计算结果为 true 时，用户无法执行指定的 `Action`。
+ `Null` 条件表达式确保来自 Alice 的请求包含 `prefix` 参数。

  `prefix` 参数要求类似文件夹的访问权限。如果您发送的请求没有包含 `prefix` 参数，Amazon S3 将返回所有的对象密钥。

  如果请求包含具有空值的 `prefix` 参数，则表达式的计算结果为 true，因此，整个 `Condition` 的计算结果为 true。您必须允许将空字符串作为 `prefix` 参数的值。在前面讨论的内容中，回顾了采用与前面讨论中控制台相同的方式，通过允许空字符串使 Alice 能够检索根级存储桶项目。有关更多信息，请参阅 [步骤 4.2：允许用户列出存储桶的根级内容](#walkthrough1-grant-permissions-step2)。
+ `StringNotLike` 条件表达式确保在指定了 `prefix` 参数值并且不是 `Development/*` 时，请求失败。

执行上一节中的步骤，并再次更新为 Alice 用户创建的内联策略。

复制以下策略，并将其粘贴到策略文本字段中，从而替换现有的策略。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"AllowListBucketIfSpecificPrefixIsIncludedInRequest",
         "Action":["s3:ListBucket"],
         "Effect":"Allow",
         "Resource":["arn:aws:s3:::companybucket"],
         "Condition":{
            "StringLike":{"s3:prefix":["Development/*"]
            }
         }
      },
      {
        "Sid":"AllowUserToReadWriteObjectDataInDevelopmentFolder", 
        "Action":["s3:GetObject", "s3:PutObject"],
        "Effect":"Allow",
        "Resource":["arn:aws:s3:::companybucket/Development/*"]
      },
      {
         "Sid": "ExplicitlyDenyAnyRequestsForAllOtherFoldersExceptDevelopment",
         "Action": ["s3:ListBucket"],
         "Effect": "Deny",
         "Resource": ["arn:aws:s3:::companybucket"],
         "Condition":{  "StringNotLike": {"s3:prefix":["Development/*",""] },
                        "Null"         : {"s3:prefix":false }
          }
      }
   ]
}
```

------

## 步骤 6：授予 IAM 用户 Bob 特定的权限
<a name="walkthrough1-grant-permissions-step5"></a>

现在，您希望为 Bob 授予 `Finance` 文件夹的权限。执行您之前为 Alice 授予权限时使用的步骤，但将 `Development` 文件夹替换为 `Finance` 文件夹。如需分步指导，请参阅 [步骤 5：授予 IAM 用户 Alice 特定的权限](#walkthrough-grant-user1-permissions)。

## 步骤 7：确保 Private 文件夹的安全
<a name="walkthrough-secure-private-folder-explicit-deny"></a>

在此示例中，您有两个用户。您已授予了所需最低组级权限，仅当确实需要单个用户级别的权限时才授予用户级权限。此方法有助于最大程度地降低管理权限的工作量。随着用户数的增加，管理权限工作将变得极为繁重。例如，您不希望该示例中的任何用户访问 `Private` 文件夹内容。您如何确保不会意外地为用户授予 `Private` 文件夹的权限？ 您可以添加一个策略，显式拒绝对该文件夹的访问。显式拒绝将覆盖任何其他权限。

要确保 `Private` 文件夹保密，您可以将以下两个拒绝语句添加到组策略中：
+ 添加以下声明以显式拒绝对 `Private` 文件夹 (`companybucket/Private/*`) 中的资源执行任何操作。

  ```
  {
    "Sid": "ExplictDenyAccessToPrivateFolderToEveryoneInTheGroup",
    "Action": ["s3:*"],
    "Effect": "Deny",
    "Resource":["arn:aws:s3:::companybucket/Private/*"]
  }
  ```
+ 若请求指定了 `Private/` 前缀，您也可以拒绝列出对象操作所需的权限。在控制台上，如果 Bob 或 Alice 打开 `Private` 文件夹，该策略导致 Amazon S3 返回错误响应。

  ```
  {
    "Sid": "DenyListBucketOnPrivateFolder",
    "Action": ["s3:ListBucket"],
    "Effect": "Deny",
    "Resource": ["arn:aws:s3:::*"],
    "Condition":{
        "StringLike":{"s3:prefix":["Private/"]}
     }
  }
  ```

将 `Consultants` 组策略替换为包含上述拒绝语句的更新策略。在应用更新的策略后，组中的任何用户都无法访问存储桶中的 `Private` 文件夹。

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

   使用 AWS 账户凭证，而不是 IAM 用户的凭证登录控制台。

1. 将附加到 `AllowGroupToSeeBucketListInTheConsole` 组的现有 `Consultants` 托管策略替换为以下策略。记得将策略中的 *`companybucket`* 替换为您的存储桶的名称。

   有关说明，请参阅《IAM 用户指南》**中的[编辑客户托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-edit.html#edit-managed-policy-console)。按照说明操作时，请确保按照指示操作，以便将您的更改应用到策略附加到的所有主体实体。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "AllowGroupToSeeBucketListAndAlsoAllowGetBucketLocationRequiredForListBucket",
         "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
         "Effect": "Allow",
         "Resource": ["arn:aws:s3:::*"]
       },
       {
         "Sid": "AllowRootLevelListingOfCompanyBucket",
         "Action": ["s3:ListBucket"],
         "Effect": "Allow",
         "Resource": ["arn:aws:s3:::companybucket"],
         "Condition":{
             "StringEquals":{"s3:prefix":[""]}
          }
       },
       {
         "Sid": "RequireFolderStyleList",
         "Action": ["s3:ListBucket"],
         "Effect": "Deny",
         "Resource": ["arn:aws:s3:::*"],
         "Condition":{
             "StringNotEquals":{"s3:delimiter":"/"}
          }
        },
       {
         "Sid": "ExplictDenyAccessToPrivateFolderToEveryoneInTheGroup",
         "Action": ["s3:*"],
         "Effect": "Deny",
         "Resource":["arn:aws:s3:::companybucket/Private/*"]
       },
       {
         "Sid": "DenyListBucketOnPrivateFolder",
         "Action": ["s3:ListBucket"],
         "Effect": "Deny",
         "Resource": ["arn:aws:s3:::*"],
         "Condition":{
             "StringLike":{"s3:prefix":["Private/"]}
          }
       }
     ]
   }
   ```

------



## 步骤 8：清除
<a name="walkthrough-cleanup"></a>

要进行清除，请打开 [IAM 控制台](https://console.aws.amazon.com/iam/)并移除用户 Alice 和 Bob。有关分步说明，请参阅《IAM 用户指南》**中的[删除 IAM 用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_manage.html#id_users_deleting)。

为了确保不再对您收取存储费用，您还应删除为该练习创建的对象和存储桶。

## 相关资源
<a name="RelatedResources-walkthrough1"></a>
+ 《IAM 用户指南》中的 [管理 IAM policy](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage.html)**

# Amazon S3 基于身份的策略示例
<a name="example-policies-s3"></a>

本节介绍用于控制对 Amazon S3 的访问权限的几个基于 AWS Identity and Access Management（IAM）身份的策略示例。有关*存储桶策略*（基于资源的策略）的示例，请参阅 [Amazon S3 的存储桶策略](bucket-policies.md)。有关 IAM 策略语言的信息，请参阅[Amazon S3 中的策略和权限](access-policy-language-overview.md)。

如果以编程方式使用以下示例策略，它们将正常工作。不过，要在 Amazon S3 控制台中使用这些策略，您必须授予控制台所需的额外权限。有关使用策略（例如与 Amazon S3 控制台一起使用的策略）的信息，请参阅 [使用用户策略控制对存储桶的访问](walkthrough1.md)。

有关按 S3 资源类型对 S3 API 操作的权限的更多信息，请参阅 [Amazon S3 API 操作所需的权限](using-with-s3-policy-actions.md)。

**Topics**
+ [

## 允许 IAM 用户访问某个存储桶
](#iam-policy-ex0)
+ [

## 允许每个 IAM 用户访问存储桶中的文件夹
](#iam-policy-ex1)
+ [

## 允许组在 Amazon S3 中拥有共享的文件夹
](#iam-policy-ex2)
+ [

## 允许所有用户读取存储桶的某个部分中的对象
](#iam-policy-ex3)
+ [

## 允许合作伙伴将文件放置到存储桶的特定部分中
](#iam-policy-ex4)
+ [

## 限制对特定 AWS 账户中 Amazon S3 存储桶的访问
](#iam-policy-ex6)
+ [

## 限制企业单位内对 Amazon S3 存储桶的访问
](#iam-policy-ex7)
+ [

## 限制对企业内 Amazon S3 存储桶的访问
](#iam-policy-ex8)
+ [

## 为 AWS 账户授予检索 PublicAccessBlock 配置的权限
](#using-with-s3-actions-related-to-accountss)
+ [

## 将存储桶的创建限制在一个区域
](#condition-key-bucket-ops-1)

## 允许 IAM 用户访问某个存储桶
<a name="iam-policy-ex0"></a>

在本例中，您想要向您 AWS 账户中的一位 IAM 用户授予访问其中一个存储桶 *amzn-s3-demo-bucket1* 的权限，并使该用户能够添加、更新和删除对象。

除了授予该用户 `s3:PutObject`、`s3:GetObject` 和 `s3:DeleteObject` 权限外，此策略还授予 `s3:ListAllMyBuckets`、`s3:GetBucketLocation` 和 `s3:ListBucket` 权限。这些是控制台所需的其他权限。此外，`s3:PutObjectAcl` 和 `s3:GetObjectAcl` 操作需要能够在控制台中复制、剪切和粘贴对象。有关向用户授予权限并使用控制台测试这些权限的示例演练，请参阅 [使用用户策略控制对存储桶的访问](walkthrough1.md)。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action": "s3:ListAllMyBuckets",
         "Resource":"*"
      },
      {
         "Effect":"Allow",
         "Action":["s3:ListBucket","s3:GetBucketLocation"],
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1"
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:PutObject",
            "s3:PutObjectAcl",
            "s3:GetObject",
            "s3:GetObjectAcl",
            "s3:DeleteObject"
         ],
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/*"
      }
   ]
}
```

------

## 允许每个 IAM 用户访问存储桶中的文件夹
<a name="iam-policy-ex1"></a>

在本示例中，您需要两个 IAM 用户（Mary 和 Carlos）具有访问存储桶 *amzn-s3-demo-bucket1* 的权限，以便他们可以添加、更新和删除对象。但是，您想要限制每个用户对存储桶中单个前缀（文件夹）的访问权限。您可以使用与其用户名匹配的名称创建文件夹。

```
amzn-s3-demo-bucket1
   Mary/
   Carlos/
```

要授予每个用户仅可以访问其文件夹的权限，您可以为每个用户编写策略，然后分别附加它。例如，您可以将以下策略附加到用户 Mary，以允许她对 `amzn-s3-demo-bucket1/Mary` 文件夹拥有特定的 Amazon S3 权限。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:GetObjectVersion",
            "s3:DeleteObject",
            "s3:DeleteObjectVersion"
         ],
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/Mary/*"
      }
   ]
}
```

------

然后，您可以将类似策略附加到用户 Carlos，同时在 `Resource` 值中指定文件夹 `Carlos`。

您可以编写一个使用策略变量的策略，然后将该策略附加到一个组，而不是将策略附加到单个用户。首先，您必须创建一个组，并将 Mary 和 Carlos 添加到该组中。以下示例策略允许在 `amzn-s3-demo-bucket1/${aws:username}` 文件夹中具有一组 Amazon S3 权限。评估策略后，策略变量 `${aws:username}` 将替换为请求者的用户名。例如，如果 Mary 发送了一个请求以放置对象，只有当 Mary 将对象上传到 `amzn-s3-demo-bucket1/Mary` 文件夹后，才允许该操作。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:PutObject",
            "s3:GetObject",
            "s3:GetObjectVersion",
            "s3:DeleteObject",
            "s3:DeleteObjectVersion"
         ],
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/${aws:username}/*"
      }
   ]
}
```

------

**注意**  
当使用策略变量时，您必须在策略中明确指定版本 `2012-10-17`。IAM 策略语言的默认版本 2008-10-17 不支持策略变量。

 如果需要在 Amazon S3 控制台上测试之前的策略，控制台需要其他权限，如以下策略所示。有关控制台如何使用这些权限的信息，请参阅 [使用用户策略控制对存储桶的访问](walkthrough1.md)。

------
#### [ JSON ]

****  

```
{
 "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowGroupToSeeBucketListInTheConsole",
      "Action": [ 
      	"s3:ListAllMyBuckets", 
      	"s3:GetBucketLocation" 
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::*"  
    },
    {
      "Sid": "AllowRootLevelListingOfTheBucket",
      "Action": "s3:ListBucket",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1",
      "Condition": { 
            "StringEquals": {
                    "s3:prefix": [""], "s3:delimiter": ["/"]
                           }
                 }
    },
    {
      "Sid": "AllowListBucketOfASpecificUserPrefix",
      "Action": "s3:ListBucket",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1",
      "Condition": {  "StringLike": {"s3:prefix": ["${aws:username}/*"] }
       }
    },
      {
     "Sid": "AllowUserSpecificActionsOnlyInTheSpecificUserPrefix",
         "Effect": "Allow",
         "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:GetObjectVersion",
            "s3:DeleteObject",
            "s3:DeleteObjectVersion"
         ],
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/${aws:username}/*"
      }
  ]
}
```

------

**注意**  
在 2012-10-17 版本的策略中，策略变量以 `$` 开始。如果您的对象键（对象名称）包括 `$`，则语法中的此更改可能会产生冲突。  
为避免此冲突，请通过使用 `${$}` 指定 `$` 字符。例如，要在策略中包括对象键 `my$file`，请将其指定为 `my${$}file`。

尽管 IAM 用户名称是友好、用户可读的标识符，但是它们无需全局唯一。例如，如果用户 Carlos 离开了企业，而另一个 Carlos 加入进来，则新 Carlos 可以访问原 Carlos 的信息。

您可以基于 IAM 用户 ID 创建文件夹，而不是使用用户名。每个 IAM 用户 ID 都是唯一的。在这种情况下，您必须修改之前的策略，以使用 `${aws:userid}` 策略变量。有关用户标识符的更多信息，请参阅 *IAM 用户指南*中的 [IAM 标识符](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html)。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:GetObjectVersion",
            "s3:DeleteObject",
            "s3:DeleteObjectVersion"
         ],
         "Resource": "arn:aws:s3:::amzn-s3-demo-bucket1/home/${aws:userid}/*"
      }
   ]
}
```

------

### 允许非 IAM 用户（移动应用程序用户）访问存储桶中的文件夹
<a name="non-iam-mobile-app-user-access"></a>

假设您要开发一个移动应用程序，一个将用户数据存储在 S3 存储桶中的游戏。对于每个应用用户，您都需要在您的存储桶中创建一个文件夹。您还需要限制每个用户对其自己的文件夹的访问权限。但是，在有人下载您的应用程序并开始玩此游戏之前，您不能创建文件夹，因为您没有用户 ID。

这种情况下，您可以要求用户使用公共身份提供商 (如 Login with Amazon、Facebook、或 Google) 登录到您的应用程序。在用户通过某个提供商登录到您的应用程序后，他们具有一个用户 ID，可用于在运行时创建用户特定的文件夹。

然后，您可以使用 AWS Security Token Service 中的 Web 联合身份验证将来自身份提供商的信息与您的应用相集成，为每个用户获取临时安全凭证。然后，您可以创建 IAM 策略，以便允许该应用访问存储桶和执行操作，如创建用户特定文件夹和上传数据。有关 Web 身份联合验证的更多信息，请参阅《IAM 用户指南》**中的[关于 Web 身份联合验证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html)。

## 允许组在 Amazon S3 中拥有共享的文件夹
<a name="iam-policy-ex2"></a>

将以下策略附加到组将授予该组中的每个人访问 Amazon S3 中的以下文件夹的权限：`amzn-s3-demo-bucket1/share/marketing`。组成员仅允许访问策略中显示的特定 Amazon S3 权限，仅适用于指定文件夹中的对象。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:PutObject",
            "s3:GetObject",
            "s3:GetObjectVersion",
            "s3:DeleteObject",
            "s3:DeleteObjectVersion"
         ],
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/share/marketing/*"
      }
   ]
}
```

------

## 允许所有用户读取存储桶的某个部分中的对象
<a name="iam-policy-ex3"></a>

在该示例中，您创建一个名为 `AllUsers` 的组，其中包含 AWS 账户拥有的所有 IAM 用户。然后，您将附加向该组提供对 `GetObject` 和 `GetObjectVersion` 的访问权限的策略，但仅适用于 `amzn-s3-demo-bucket1/readonly` 文件夹中的对象。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetObject",
            "s3:GetObjectVersion"
         ],
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/readonly/*"
      }
   ]
}
```

------

## 允许合作伙伴将文件放置到存储桶的特定部分中
<a name="iam-policy-ex4"></a>

在本示例中，您将创建代表合作伙伴公司的名为 `AnyCompany` 的组。您将为需要访问权限的合作伙伴公司中的特定人员或应用程序创建 IAM 用户，然后将该用户放入组中。

然后，您附加策略，此策略向组提供对存储桶中以下文件夹的 `PutObject` 访问权限：

`amzn-s3-demo-bucket1/uploads/anycompany` 

您需要阻止 `AnyCompany` 组对存储桶执行任何其他操作，因此添加了一条语句，除了对 AWS 账户中的任何 Amazon S3 资源执行 `PutObject` 外，该语句显式拒绝执行任何其他 Amazon S3 操作的权限。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":"s3:PutObject",
         "Resource":"arn:aws:s3:::amzn-s3-demo-bucket1/uploads/anycompany/*"
      },
      {
         "Effect":"Deny",
         "Action":"s3:*",
         "NotResource":"arn:aws:s3:::amzn-s3-demo-bucket1/uploads/anycompany/*"
      }
   ]
}
```

------

## 限制对特定 AWS 账户中 Amazon S3 存储桶的访问
<a name="iam-policy-ex6"></a>

如果您想确保您的 Amazon S3 主体只能访问受信任 AWS 账户中的资源，您可以限制访问权限。例如，[基于身份的 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)使用 `Deny` 影响来阻止对 Amazon S3 操作的访问，除非正在访问的 Amazon S3 资源在账户 `222222222222` 中。为了防止 AWS 账户中的 IAM 主体访问账户外的 Amazon S3 对象，请附加以下 IAM 策略：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DenyS3AccessOutsideMyBoundary",
      "Effect": "Deny",
      "Action": [
        "s3:*"
      ],
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:ResourceAccount": [
            "222222222222"
          ]
        }
      }
    }
  ]
}
```

------

**注意**  
此策略不会取代现有的 IAM 访问控制，因为它不授予任何访问权限。相反，无论通过其他 IAM 策略授予什么权限，此策略都可以作为其他 IAM 权限的额外防护机制。

请确保将策略中的账户 ID `222222222222` 替换为您自己的 AWS 账户。要在仍保持此限制的同时将策略应用于多个账户，请将账户 ID 替换为 `aws:PrincipalAccount` 条件键。该条件要求主体和资源必须在同一账户中。

## 限制企业单位内对 Amazon S3 存储桶的访问
<a name="iam-policy-ex7"></a>

如果在 AWS Organizations 中设置了[企业单位（OU）](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_ous.html)，则可能需要将 Amazon S3 存储桶访问限制为企业的特定部分。在本示例中，我们将使用 `aws:ResourceOrgPaths` 键以限制 Amazon S3 存储桶对企业中 OU 的访问。在本例中，[OU ID](https://docs.aws.amazon.com/organizations/latest/APIReference/API_OrganizationalUnit.html) 为 `ou-acroot-exampleou`。确保用自己的 OU ID 替换自己的策略中的此值。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
     {
       "Sid": "AllowS3AccessOutsideMyBoundary",
       "Effect": "Allow",
       "Action": [
         "s3:*"
       ],
       "Resource": "*",
       "Condition": {
         "ForAllValues:StringLike": {
           "aws:ResourceOrgPaths": [
             "o-acorg/r-acroot/ou-acroot-exampleou/"
           ] 
         }
       }
     }
   ]
 }
```

------

**注意**  
该策略不授予任何访问权限。相反，此策略充当其他 IAM 权限的后盾，阻止主体访问 OU 定义边界之外的 Amazon S3 对象。

该策略拒绝对 Amazon S3 操作的访问，除非正在访问的 Amazon S3 对象位于您企业的 `ou-acroot-exampleou` OU 中。[IAM 策略条件](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)要求 `aws:ResourceOrgPaths`（多值条件键）包含列出的任何 OU 路径。该策略使用 `ForAllValues:StringNotLike` 运算符将 `aws:ResourceOrgPaths` 的值与列出的 OU 进行比较，而不进行区分大小写的匹配。

## 限制对企业内 Amazon S3 存储桶的访问
<a name="iam-policy-ex8"></a>

要限制对组织内 Amazon S3 对象的访问，请将 IAM 策略附加到组织的根，并将其应用于组织中的所有账户。如果要求您的 IAM 主体遵守此规则，请使用[服务控制策略 (SCP)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)。如果您选择使用 SCP，请确保先全面[测试 SCP](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html#scp-warning-testing-effect)，然后将策略附加到企业的根。

在以下示例策略中，将拒绝对 Amazon S3 操作的访问，除非正在访问的 Amazon S3 对象与访问该对象的 IAM 主体位于同一企业中：

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
     {
       "Sid": "DenyS3AccessOutsideMyBoundary",
       "Effect": "Deny",
       "Action": [
         "s3:*"
       ],
       "Resource": "arn:aws:s3:::*/*",
       "Condition": {
         "StringNotEquals": {
           "aws:ResourceOrgID": "${aws:PrincipalOrgID}"
         }
       }
     }
   ]
 }
```

------

**注意**  
该策略不授予任何访问权限。相反，此策略充当其他 IAM 权限的后盾，阻止主体访问企业外部的任何 Amazon S3 对象。此策略还适用于在策略生效后创建的 Amazon S3 资源。

本例中的 [IAM 策略条件](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)要求 `aws:ResourceOrgID` 和 `aws:PrincipalOrgID` 彼此相等。有了这一要求，提出请求的主体和正在访问的资源必须位于同一企业中。

## 为 AWS 账户授予检索 PublicAccessBlock 配置的权限
<a name="using-with-s3-actions-related-to-accountss"></a>

以下基于身份的策略示例向用户授予 `s3:GetAccountPublicAccessBlock` 权限。对于这些权限，请将 `Resource` 值设置为 `"*"`。有关资源 ARN 的更多信息，请参阅[Amazon S3 的策略资源](security_iam_service-with-iam.md#security_iam_service-with-iam-id-based-policies-resources)。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"statement1",
         "Effect":"Allow",
         "Action":[
            "s3:GetAccountPublicAccessBlock" 
         ],
         "Resource":[
            "*"
         ]
       }
    ]
}
```

------

## 将存储桶的创建限制在一个区域
<a name="condition-key-bucket-ops-1"></a>

假定 AWS 账户管理员想要授予其用户（Dave）仅在南美洲（圣保罗）区域创建存储桶的权限。账户管理员可附加以下用户策略，授予附带条件的 `s3:CreateBucket` 权限，如下所示。`Condition` 块中的键值对指定 `s3:LocationConstraint` 键，并将 `sa-east-1` 区域作为值。

**注意**  
在该示例中，存储桶拥有者为其用户之一授予权限，因此可以使用存储桶策略或用户策略。此示例显示了用户策略。

有关 Amazon S3 区域的列表，请参阅《AWS 一般参考》**中的[区域和端点](https://docs.aws.amazon.com/general/latest/gr/s3.html)。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Sid": "statement1",
         "Effect": "Allow",
         "Action": "s3:CreateBucket",
         "Resource": "arn:aws:s3:::*",
         "Condition": {
             "StringLike": {
                 "s3:LocationConstraint": "sa-east-1"
             }
         }
       }
    ]
}
```

------

**添加显式拒绝**  
前面的策略限制用户只能在 `sa-east-1` 区域中创建存储桶。但是，别的策略可能授予此用户在其他区域中创建存储桶的权限。例如，如果用户属于某个组，该组可能附加了一个策略，以允许该组中的所有用户在另一个区域中创建存储桶。要确保此用户不会获得在其它任何区域创建存储桶的权限，可在上述策略中添加一个显式拒绝语句。

`Deny` 语句使用 `StringNotLike` 条件。也即，如果位置约束不是 `sa-east-1`，则创建存储桶的请求将被拒绝。显式拒绝不允许用户在其它任何区域创建存储桶，无论该用户获得了哪种其它权限。以下策略包含显式拒绝语句。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"statement1",
         "Effect":"Allow",
         "Action": "s3:CreateBucket",
         "Resource": "arn:aws:s3:::*",
         "Condition": {
             "StringLike": {
                 "s3:LocationConstraint": "sa-east-1"
             }
         }
       },
      {
         "Sid":"statement2",
         "Effect":"Deny",
         "Action": "s3:CreateBucket",
         "Resource": "arn:aws:s3:::*",
         "Condition": {
             "StringNotLike": {
                 "s3:LocationConstraint": "sa-east-1"
             }
         }
       }
    ]
}
```

------

**使用 AWS CLI 测试策略**  
可使用以下 `create-bucket` AWS CLI 命令测试此策略。此示例使用 `bucketconfig.txt` 文件来指定位置约束。记下 Windows 文件路径。您需要更新相应的存储桶名称和路径。必须使用 `--profile` 参数提供用户凭证。有关设置和使用 AWS CLI 的更多信息，请参阅《Amazon S3 API 参考》**中的 [Developing with Amazon S3 using the AWS CLI](https://docs.aws.amazon.com/AmazonS3/latest/API/setup-aws-cli.html)。

```
aws s3api create-bucket --bucket examplebucket --profile AccountADave --create-bucket-configuration file://c:/Users/someUser/bucketconfig.txt
```

`bucketconfig.txt` 文件指定一些配置，如下所示。

```
{"LocationConstraint": "sa-east-1"}
```