

# 示例 2：存储桶拥有者授予跨账户存储桶权限
<a name="example-walkthroughs-managing-access-example2"></a>

**重要**  
向 IAM 角色授予权限是比向各个用户授予权限更好的做法。若要了解如何执行此操作，请参阅[了解跨账户权限和使用 IAM 角色](example-walkthroughs-managing-access-example4.md#access-policies-walkthrough-example4-overview)。

**Topics**
+ [准备演练](#cross-acct-access-step0)
+ [步骤 1：执行账户 A 任务](#access-policies-walkthrough-cross-account-permissions-acctA-tasks)
+ [步骤 2：执行账户 B 任务](#access-policies-walkthrough-cross-account-permissions-acctB-tasks)
+ [步骤 3：（可选）尝试显式拒绝](#access-policies-walkthrough-example2-explicit-deny)
+ [步骤 4：清除](#access-policies-walkthrough-example2-cleanup-step)

一个 AWS 账户（例如账户 A）可以将访问自身资源（如存储桶和对象）的权限授予另一个 AWS 账户（账户 B）。账户 B 随后可以将这些权限委托给其账户中的用户。在此示例情景中，存储桶拥有者向另一个账户授予执行特定存储桶操作的跨账户权限。

**注意**  
账户 A 还可以使用存储桶策略直接向账户 B 中的用户授予权限。但是，该用户仍需要来自用户所属的父账户（账户 B）的权限，即使账户 B 没有来自账户 A 的权限也是如此。该用户只要同时拥有来自资源拥有者和父账户的权限，便能够访问资源。

下面概括介绍演练步骤：

![\[AWS 账户向其它 AWS 账户授予访问其资源的权限。\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/images/access-policy-ex2.png)


1. 账户 A 管理员用户附加一个存储桶策略，该策略向账户 B 授予执行特定存储桶操作的跨账户权限。

   请注意，账户 B 中的管理员用户将自动继承这些权限。

1. 账户 B 管理员用户将用户策略附加到用户，委托从账户 A 收到的权限。

1. 账户 B 中的用户随后通过访问账户 A 拥有的存储桶中的对象来验证权限。

对于此示例，您需要两个账户。下表显示我们如何引用这些账户和其中的管理员用户。根据 IAM 准则（请参阅[关于使用管理员用户来创建资源和授予权限](example-walkthroughs-managing-access.md#about-using-root-credentials)），我们在本次演练中并不使用根用户凭证。而是在每个账户中创建一个管理员用户，并在创建资源和向他们授予权限时使用这些凭证。


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

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

## 准备演练
<a name="cross-acct-access-step0"></a>

1. 确保您有两个 AWS 账户并且每个账户都有一个管理员用户，如前面部分的表中所示。

   1. 根据需要注册 AWS 账户。

   1. 使用账户 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 用户指南*中的[使用策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage.html)。

   1. 在 IAM 控制台中，记下**控制面板**上的 **IAM 用户登录 URL**。账户中的所有用户都必须使用此 URL 登录 AWS 管理控制台。

      有关更多信息，请参阅 *IAM 用户指南*中的[用户如何登录您的账户](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_how-users-sign-in.html)。

   1. 使用账户 B 凭证重复上一个步骤，然后创建管理员用户 **AccountBadmin**。

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

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

1. 保存管理员用户凭证，也称为配置文件。您可以对输入的每个命令使用配置文件名称而不是指定凭证。有关更多信息，请参阅 [设置用于演练的工具](policy-eval-walkthrough-download-awscli.md)。

   1. 在 AWS CLI 凭证文件中为两个账户中的每个管理员用户 `AccountAadmin` 和 `AccountBadmin` 添加配置文件。

      ```
      [AccountAadmin]
      aws_access_key_id = access-key-ID
      aws_secret_access_key = secret-access-key
      region = us-east-1
      
      [AccountBadmin]
      aws_access_key_id = access-key-ID
      aws_secret_access_key = secret-access-key
      region = us-east-1
      ```

   1. 如果使用的是 AWS Tools for Windows PowerShell，请运行以下命令。

      ```
      set-awscredentials –AccessKey AcctA-access-key-ID –SecretKey AcctA-secret-access-key –storeas AccountAadmin
      set-awscredentials –AccessKey AcctB-access-key-ID –SecretKey AcctB-secret-access-key –storeas AccountBadmin
      ```

## 步骤 1：执行账户 A 任务
<a name="access-policies-walkthrough-cross-account-permissions-acctA-tasks"></a>

### 步骤 1.1：登录到 AWS 管理控制台
<a name="access-policies-walkthrough-cross-account-permissions-acctA-tasks-sign-in"></a>

首先使用账户 A 的 IAM 用户登录 URL，以 **AccountAadmin** 用户身份登录 AWS 管理控制台。此用户将创建一个存储桶并向其附加一个策略。

### 步骤 1.2：创建存储桶
<a name="access-policies-walkthrough-example2a-create-bucket"></a>

1. 在 Amazon S3 控制台中创建一个存储桶。此练习假设该存储桶在美国东部（弗吉尼亚州北部）AWS 区域中创建，命名为 `amzn-s3-demo-bucket`。

   有关说明，请参阅 [创建通用存储桶](create-bucket-overview.md)。

1. 向存储桶上传示例对象。

   有关说明，请转到 [步骤 2：将对象上传到存储桶](GetStartedWithS3.md#uploading-an-object-bucket)。

### 步骤 1.3：附加一个存储桶策略，向账户 B 授予跨账户权限
<a name="access-policies-walkthrough-example2a"></a>

该存储桶策略向账户 B 授予 `s3:GetLifecycleConfiguration` 和 `s3:ListBucket` 权限。假设您仍使用 **AccountAadmin** 用户凭证登录控制台。

1. 将以下存储桶策略附加到 `amzn-s3-demo-bucket`。该策略向账户 B 授予 `s3:GetLifecycleConfiguration` 和 `s3:ListBucket` 操作的权限。

   有关说明，请参阅[使用 Amazon S3 控制台添加存储桶策略](add-bucket-policy.md)。

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

****  

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
         {
            "Sid": "Example permissions",
            "Effect": "Allow",
            "Principal": {
               "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": [
               "s3:GetLifecycleConfiguration",
               "s3:ListBucket"
            ],
            "Resource": [
               "arn:aws:s3:::amzn-s3-demo-bucket"
            ]
         }
      ]
   }
   ```

------

1. 验证账户 B（及其管理员用户）是否可以执行这些操作。
   + 使用 AWS CLI 进行验证

     ```
     aws s3 ls s3://amzn-s3-demo-bucket --profile AccountBadmin
     aws s3api get-bucket-lifecycle-configuration --bucket amzn-s3-demo-bucket --profile AccountBadmin
     ```
   + 使用 AWS Tools for Windows PowerShell 进行验证

     ```
     get-s3object -BucketName amzn-s3-demo-bucket -StoredCredentials AccountBadmin 
     get-s3bucketlifecycleconfiguration -BucketName amzn-s3-demo-bucket -StoredCredentials AccountBadmin
     ```

## 步骤 2：执行账户 B 任务
<a name="access-policies-walkthrough-cross-account-permissions-acctB-tasks"></a>

现在账户 B 管理员创建用户 Dave，并委派从账户 A 收到的权限。

### 步骤 2.1：登录到 AWS 管理控制台
<a name="access-policies-walkthrough-cross-account-permissions-acctB-tasks-sign-in"></a>

首先使用账户 B 的 IAM 用户登录 URL，以 **AccountBadmin** 用户身份登录 AWS 管理控制台。

### 步骤 2.2：在账户 B 中创建用户 Dave
<a name="access-policies-walkthrough-example2b-create-user"></a>

在 [IAM 控制台](https://console.aws.amazon.com/iam/)中，创建用户 **Dave**。

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

### 步骤 2.3：向用户 Dave 授予权限
<a name="access-policies-walkthrough-example2-delegate-perm-userdave"></a>

使用以下策略为用户 Dave 创建一个内联策略。您需要通过提供存储桶名称来更新策略。

假设您使用 **AccountBadmin** 用户凭证登录控制台。

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Sid": "Example",
         "Effect": "Allow",
         "Action": [
            "s3:ListBucket"
         ],
         "Resource": [
            "arn:aws:s3:::amzn-s3-demo-bucket"
         ]
      }
   ]
}
```

------

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

### 步骤 2.4：测试权限
<a name="access-policies-walkthrough-example2b-user-dave-access"></a>

现在，账户 B 中的 Dave 可以列出账户 A 拥有的 `amzn-s3-demo-bucket` 的内容。您可以使用以下过程之一验证权限。

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

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

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

1. 在命令提示符处，输入以下 AWS CLI 命令，验证 Dave 现在是否可以从账户 A 拥有的 `amzn-s3-demo-bucket` 获取对象列表。请注意，该命令指定了 `UserDave` 配置文件。

   ```
   aws s3 ls s3://amzn-s3-demo-bucket --profile UserDave
   ```

   Dave 没有任何其它权限。因此，如果他尝试任何其它操作（例如，下面的 `get-bucket-lifecycle` 配置操作），则 Amazon S3 会返回权限被拒绝的消息。

   ```
   aws s3api get-bucket-lifecycle-configuration --bucket amzn-s3-demo-bucket --profile UserDave
   ```

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

1. 将 Dave 的凭证存储为 `AccountBDave`。

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

1. 尝试列出存储桶的命令。

   ```
   get-s3object -BucketName amzn-s3-demo-bucket -StoredCredentials AccountBDave
   ```

   Dave 没有任何其它权限。因此，如果他尝试任何其它操作（例如，下面的 `get-s3bucketlifecycleconfiguration` 操作），则 Amazon S3 会返回权限被拒绝的消息。

   ```
   get-s3bucketlifecycleconfiguration -BucketName amzn-s3-demo-bucket -StoredCredentials AccountBDave
   ```

## 步骤 3：（可选）尝试显式拒绝
<a name="access-policies-walkthrough-example2-explicit-deny"></a>

您可以使用访问控制列表（ACL）、存储桶策略或用户策略授予权限。但是，如果通过存储桶策略或用户策略设置了显式拒绝，则显式拒绝优先于任何其它权限。为进行测试，请更新存储桶策略，对账户 B 显式拒绝 `s3:ListBucket` 权限。该策略还授予了 `s3:ListBucket` 权限。但是，显式拒绝处于优先地位，因此账户 B 或账户 B 中的用户无法列出 `amzn-s3-demo-bucket` 中的对象。

1. 使用账户 A 中的用户 `AccountAadmin` 的凭证，将存储桶策略替换为以下内容。

1. 现在，如果您尝试使用 `AccountBadmin` 凭证获取存储桶列表，则您的访问会被拒绝。
   + 使用 AWS CLI，运行以下命令：

     ```
     aws s3 ls s3://amzn-s3-demo-bucket --profile AccountBadmin
     ```
   + 使用 AWS Tools for Windows PowerShell，运行以下命令：

     ```
     get-s3object -BucketName amzn-s3-demo-bucket -StoredCredentials AccountBDave
     ```

## 步骤 4：清除
<a name="access-policies-walkthrough-example2-cleanup-step"></a>

1. 完成测试之后，您可以执行以下操作来进行清理：

   1. 使用账户 A 凭证登录 AWS 管理控制台（[AWS 管理控制台](https://console.aws.amazon.com/)），执行以下操作：
     + 在 Amazon S3 控制台中，移除附加到 `amzn-s3-demo-bucket` 的存储桶策略。在存储桶 **Properties（属性）**中，删除 **Permissions（权限）**部分中的策略。
     + 如果该存储桶是为此练习而创建的，请在 Amazon S3 控制台中删除对象，然后删除存储桶。
     + 在 [IAM 控制台](https://console.aws.amazon.com/iam/)中，移除 `AccountAadmin` 用户。

1. 使用账户 B 凭证登录 [IAM 控制台](https://console.aws.amazon.com/iam/)。删除用户 `AccountBadmin`。有关分步说明，请参阅《IAM 用户指南》**中的[删除 IAM 用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_manage.html#id_users_deleting)。