

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

本演练将介绍用户许可在 Amazon S3 中的使用方式。在该示例中，您创建一个具有文件夹的存储桶。然后，在您的 Amazon Web Services 账户 中创建 Amazon 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.amazonaws.cn/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>

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

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

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

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

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

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

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

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

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

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/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.amazonaws.cn/iam/)将两个 IAM 用户（Alice 和 Bob）添加到您的 Amazon Web Services 账户。有关分步说明，请参阅《IAM 用户指南》**中的[在您的 Amazon Web Services 账户中创建 IAM 用户](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)。

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

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

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

有关创建管理组的分步说明，请参阅 *IAM 用户指南*中的[创建第一个 IAM 管理员用户和组](https://docs.amazonaws.cn/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 用户凭证登录到 Amazon Web Services 管理控制台。

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/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` 组。在将该托管式策略附加到一个用户或组时，您为该用户或组授予权限以获取父 Amazon Web Services 账户拥有的存储桶列表。

1. 登录 Amazon Web Services 管理控制台，单击 [https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/) 打开 IAM 控制台。
**注意**  
由于您要授予用户权限，请使用您的 Amazon Web Services 账户凭证登录，而不是以 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.amazonaws.cn/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.amazonaws.cn/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.amazonaws.cn/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.amazonaws.cn/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.amazonaws.cn/AmazonS3/latest/API/RESTBucketGETlocation.html) 请求以查找部署了该存储桶的 Amazon Web Services 区域。然后，控制台使用该存储桶的区域特定端点以发送 [GET Bucket (List Objects)](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTBucketGET.html)请求。因此，如果用户要使用控制台，您必须授予 `s3:GetBucketLocation` 操作权限，如以下策略语句中所示。

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

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

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

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

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

   有关分步说明，请参阅《IAM 用户指南》**中的[编辑 IAM 策略](https://docs.amazonaws.cn/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)）登录 Amazon Web Services 管理控制台。

      通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/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.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-vs-inline.html)。

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

   使用 Amazon Web Services 账户凭证，而不是 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)）登录 Amazon Web Services 管理控制台。

   1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/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. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

   使用 Amazon Web Services 账户凭证，而不是 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)）登录 Amazon Web Services 管理控制台。

   1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/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. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

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

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

   有关说明，请参阅《IAM 用户指南》**中的[编辑客户托管策略](https://docs.amazonaws.cn/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.amazonaws.cn/iam/)并移除用户 Alice 和 Bob。有关分步说明，请参阅《IAM 用户指南》**中的[删除 IAM 用户](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_users_manage.html#id_users_deleting)。

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

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