

# 示例 1：存储桶拥有者向其用户授予存储桶权限
<a name="example-walkthroughs-managing-access-example1"></a>

**重要**  
向 IAM 角色授予权限比向各个用户授予权限更好。有关如何向 IAM 角色授予权限的更多信息，请参阅[了解跨账户权限和使用 IAM 角色](example-walkthroughs-managing-access-example4.md#access-policies-walkthrough-example4-overview)。

**Topics**
+ [准备演练](#grant-permissions-to-user-in-your-account-step0)
+ [步骤 1：在账户 A 中创建资源并授予权限](#grant-permissions-to-user-in-your-account-step1)
+ [步骤 2：测试权限](#grant-permissions-to-user-in-your-account-test)

在本演练中，一个 AWS 账户拥有存储桶，该账户中包含一个 IAM 用户。默认情况下，该用户没有权限。要让该用户执行任何任务，父账户必须向该用户授予权限。存储桶拥有者和父账父相同。因此，要向用户授予存储桶权限，AWS 账户可以使用存储桶策略和/或用户策略。存储桶拥有者将使用存储桶策略授予一些权限，使用用户策略授予其他权限。

以下是演练的步骤概括：

![\[图中显示了授予权限的 AWS 账户。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/access-policy-ex1.png)


1. 账户管理员创建存储桶策略，向用户授予一组权限。

1. 账户管理员将用户策略附加到用户，授予其他权限。

1. 然后，用户尝试使用通过存储桶策略和用户策略授予的权限。

对于此示例，您需要一个 AWS 账户。您将创建一个管理员用户（请参阅 [关于使用管理员用户来创建资源和授予权限](example-walkthroughs-managing-access.md#about-using-root-credentials)），而不是使用账户的根用户凭证。我们按下表所示引用 AWS 账户和管理员用户：


| 账户 ID | 账户名称 | 账户中的管理员用户 | 
| --- | --- | --- | 
|  *1111-1111-1111*  |  账户 A  |  AccountAadmin  | 

**注意**  
本示例中的管理员用户是 **AccountAadmin**，它代表账户 A，而不是 **AccountAdmin**。

创建用户和授予权限的所有任务都在 AWS 管理控制台 中完成。为验证权限，演练中使用命令行工具、AWS Command Line Interface (AWS CLI) 和 AWS Tools for Windows PowerShell，因此您无需编写任何代码。

## 准备演练
<a name="grant-permissions-to-user-in-your-account-step0"></a>

1. 确保您有一个 AWS 账户并且它的一个用户拥有管理员权限。

   1. 根据需要注册 AWS 账户。我们将此账户称为账户 A。

      1.  转到 [https://aws.amazon.com/s3](https://aws.amazon.com/s3)，然后单击**创建 AWS 账户**。

      1. 按照屏幕上的说明进行操作。

         AWS账户激活且可用时， 会通过电子邮件向您发送通知。

   1. 在账户 A 中，创建一个管理员用户 **AccountAadmin**。使用账户 A 凭证登录 [IAM 控制台](https://console.aws.amazon.com/iam/home?#home)，然后执行以下操作：

      1. 创建用户 **AccountAadmin** 并记下用户安全凭证。

         有关说明，请参阅《IAM 用户指南》**中的[在您的 AWS 账户中创建 IAM 用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html)。

      1. 通过附加一个授予完全访问权限的用户策略来向 **AccountAadmin** 授予管理员权限。

         有关说明，请参阅* IAM 用户指南*中的[管理 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage.html)。

      1. 记下 **AccountAadmin** 的 **IAM 用户登录 URL**。您在登录 AWS 管理控制台时需要使用此 URL。有关如何查找登录 URL 的更多信息，请参阅《IAM 用户指南》**中的 [Sign in to the AWS 管理控制台 as an IAM user](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_how-users-sign-in.html)。记下每个账户的 URL。

1. 设置 AWS CLI 或 AWS Tools for Windows PowerShell。请务必保存管理员用户凭证，如下所示：
   + 如果使用 AWS CLI，请在配置文件中创建配置文件 `AccountAadmin`。
   + 如果使用 AWS Tools for Windows PowerShell，请确保将用于会话的凭证存储为 `AccountAadmin`。

   有关说明，请参阅[设置用于演练的工具](policy-eval-walkthrough-download-awscli.md)。

## 步骤 1：在账户 A 中创建资源并授予权限
<a name="grant-permissions-to-user-in-your-account-step1"></a>

使用账户 A 中用户 `AccountAadmin` 的凭证和专用的 IAM 用户登录 URL 登录 AWS 管理控制台，然后执行以下操作：

1. 创建资源（一个存储桶和一个 IAM 用户）

   1. 在 Amazon S3 控制台中创建一个存储桶。记下创建存储桶的 AWS 区域。有关说明，请参阅[创建通用存储桶](create-bucket-overview.md)。

   1. 在 [IAM 控制台](https://console.aws.amazon.com/iam/)中，执行以下操作：

      1. 创建一个名为 Dave 的用户。

         有关分步说明，请参阅《IAM 用户指南》**中的[创建 IAM 用户（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)。

      1. 记下 `UserDave` 凭证。

      1. 记下用户 Dave 的 Amazon 资源名称（ARN）。在 [IAM 控制台](https://console.aws.amazon.com/iam/)中，选择该用户，**摘要**选项卡会提供用户 ARN。

1. 授予权限 

   因为存储桶拥有者和用户所属的父账户相同，所以 AWS 账户可以使用存储桶策略和/或用户策略向用户授予权限。在此示例中，您同时使用这两种方法。如果对象也由同一个账户拥有，则存储桶拥有者可以在存储桶策略（或 IAM 策略）中授予对象权限。

   1. 在 Amazon S3 控制台中，将以下存储桶策略附加到 *awsexamplebucket1*。

      该策略包含两个语句。
      + 第一个语句向 Dave 授予存储桶操作权限 `s3:GetBucketLocation` 和 `s3:ListBucket`。
      + 第二个语句授予 `s3:GetObject` 权限。因为账户 A 还拥有对象，所以账户管理员能够授予 `s3:GetObject` 权限。

      在 `Principal` 语句中，Dave 通过其用户 ARN 进行标识。有关策略元素的更多信息，请参阅 [Amazon S3 中的策略和权限](access-policy-language-overview.md)。

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

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "statement1",
                  "Effect": "Allow",
                  "Principal": {
                      "AWS": "arn:aws:iam::111122223333:user/Dave"
                  },
                  "Action": [
                      "s3:GetBucketLocation",
                      "s3:ListBucket"
                  ],
                  "Resource": [
                      "arn:aws:s3:::awsexamplebucket1"
                  ]
              },
              {
                  "Sid": "statement2",
                  "Effect": "Allow",
                  "Principal": {
                      "AWS": "arn:aws:iam::111122223333:user/Dave"
                  },
                  "Action": [
                      "s3:GetObject"
                  ],
                  "Resource": [
                      "arn:aws:s3:::awsexamplebucket1/*"
                  ]
              }
          ]
      }
      ```

------

   1. 使用以下策略为用户 Dave 创建一个内联策略。该策略向 Dave 授予 `s3:PutObject` 权限。您需要通过提供存储桶名称来更新策略。

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

****  

      ```
      {
         "Version":"2012-10-17",		 	 	 
         "Statement": [
            {
               "Sid": "PermissionForObjectOperations",
               "Effect": "Allow",
               "Action": [
                  "s3:PutObject"
               ],
               "Resource": [
                  "arn:aws:s3:::awsexamplebucket1/*"
               ]
            }
         ]
      }
      ```

------

      有关说明，请参阅**《IAM 用户指南》中的[管理 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_inline-using.html)。请注意，您需要使用账户 A 凭证登录控制台。

## 步骤 2：测试权限
<a name="grant-permissions-to-user-in-your-account-test"></a>

使用 Dave 的凭证验证权限是否发挥作用。您可以使用以下两个过程之一。

**使用 AWS CLI 测试权限**

1. 通过添加以下 `UserDaveAccountA` 配置文件更新 AWS CLI 配置文件。有关更多信息，请参阅 [设置用于演练的工具](policy-eval-walkthrough-download-awscli.md)。

   ```
   [profile UserDaveAccountA]
   aws_access_key_id = access-key
   aws_secret_access_key = secret-access-key
   region = us-east-1
   ```

1. 验证 Dave 是否可以执行在用户策略中授权的操作。使用以下 AWS CLI `put-object` 命令上传示例对象。

   该命令中的 `--body` 参数指示要上传的源文件。例如，如果文件处于 Windows 计算机上 C: 驱动器的根目录中，则指定 `c:\HappyFace.jpg`。`--key` 参数提供对象的键名。

   ```
   aws s3api put-object --bucket awsexamplebucket1 --key HappyFace.jpg --body HappyFace.jpg --profile UserDaveAccountA
   ```

   运行以下 AWS CLI 命令以获取对象。

   ```
   aws s3api get-object --bucket awsexamplebucket1 --key HappyFace.jpg OutputFile.jpg --profile UserDaveAccountA
   ```

**使用 AWS Tools for Windows PowerShell 测试权限**

1. 将 Dave 的凭证存储为 `AccountADave`。您随后使用这些凭证对对象执行 `PUT` 和 `GET` 操作。

   ```
   set-awscredentials -AccessKey AccessKeyID -SecretKey SecretAccessKey -storeas AccountADave
   ```

1. 通过用户 Dave 的已存储凭证，使用 AWS Tools for Windows PowerShell `Write-S3Object` 命令上传示例对象。

   ```
   Write-S3Object -bucketname awsexamplebucket1 -key HappyFace.jpg -file HappyFace.jpg -StoredCredentials AccountADave
   ```

   下载之前上传的对象。

   ```
   Read-S3Object -bucketname awsexamplebucket1 -key HappyFace.jpg -file Output.jpg -StoredCredentials AccountADave
   ```