Amazon Simple Storage Service
开发人员指南 (API Version 2006-03-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

示例 2:存储桶拥有者授予跨账户存储桶权限

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

注意

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

以下概括了演练步骤:

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

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

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

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

对于此示例,您需要两个账户。下表显示我们如何引用这些账户和其中的管理员用户。根据 IAM 准则 (请参阅关于使用管理员用户来创建资源和授予权限),我们在本次演练中并不使用账户根凭证。而是在每个账户中创建一个管理员用户,在创建资源和向他们授予权限时使用这些凭证。

AWS 账户 ID 账户名称 账户中的管理员用户

1111-1111-1111

账户 A

AccountAadmin

2222-2222-2222

账户 B

AccountBadmin

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

步骤 0:准备演练

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

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

      1. 转到 http://www.amazonaws.cn/s3/,然后单击 Create an AWS Account

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

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

    2. 使用账户 A 证书登录 IAM 控制台以创建管理员用户:

      1. 创建用户 AccountAadmin 并记下安全证书。有关说明,请参阅 IAM 用户指南 中的在您的 AWS 账户中创建 IAM 用户

      2. 通过附加一个授予完全访问权限的用户策略来向 AccountAadmin 授予管理员权限。有关说明,请参阅 IAM 用户指南 中的使用策略

    3. 在 IAM 控制台中,记下 Dashboard (控制面板) 上的 IAM User Sign-In URL (IAM 用户登录 URL)。账户中的所有用户都必须使用此 URL 登录 AWS 管理控制台。

      有关更多信息,请参阅 IAM 用户指南 中的用户如何登录您的账户

    4. 使用账户 B 证书重复上一个步骤,然后创建管理员用户 AccountBadmin。

  2. 设置 AWS 命令行界面 (CLI) 或适用于 Windows PowerShell 的 AWS 工具。确保按如下方式保存管理员用户证书:

    • 如果使用 AWS CLI,请在配置文件中创建两个配置 AccountAadmin 和 AccountBadmin。

    • 如果使用适用于 Windows PowerShell 的 AWS 工具,请确保您将用于会话的证书存储为 AccountAadmin 和 AccountBadmin。

    有关说明,请参阅设置用于示例演练的工具

  3. 保存管理员用户证书,也称为配置文件。您可以对输入的每个命令使用配置文件名称而不是指定证书。有关更多信息,请参阅 设置用于示例演练的工具

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

      Copy
      [profile AccountAadmin] aws_access_key_id = access-key-ID aws_secret_access_key = secret-access-key region = us-east-1 [profile AccountBadmin] aws_access_key_id = access-key-ID aws_secret_access_key = secret-access-key region = us-east-1
    2. 如果使用适用于 Windows PowerShell 的 AWS 工具

      Copy
      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 任务

步骤 1.1:登录 AWS 管理控制台

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

步骤 1.2:创建存储桶

  1. 在 Amazon S3 控制台中创建一个存储桶。此练习假设该存储桶在美国东部 (弗吉尼亚北部) 区域创建,命名为 examplebucket

    有关说明,请参阅如何创建 S3 存储桶? (在 Amazon Simple Storage Service 控制台用户指南 中)。

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

    有关说明,请参阅 Amazon Simple Storage Service 入门指南 中的向存储桶添加对象

步骤 1.3:附加一个存储桶策略,向账户 B 授予跨账户权限

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

  1. 将以下存储桶策略附加到 examplebucket。该策略向账户 B 授予 s3:GetBucketLocations3:ListBucket 操作的权限。

    有关说明,请参阅如何添加 S3 存储桶策略? (在 Amazon Simple Storage Service 控制台用户指南 中)。

    Copy
    { "Version": "2012-10-17", "Statement": [ { "Sid": "Example permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws-cn:iam::AccountB-ID:root" }, "Action": [ "s3:GetBucketLocation", "s3:ListBucket" ], "Resource": [ "arn:aws-cn:s3:::examplebucket" ] } ] }
  2. 验证账户 B (及其管理员用户) 是否可以执行这些操作。

    • 使用 AWS CLI

      Copy
      aws s3 ls s3://examplebucket --profile AccountBadmin aws s3api get-bucket-location --bucket examplebucket --profile AccountBadmin
    • 使用适用于 Windows PowerShell 的 AWS 工具

      Copy
      get-s3object -BucketName example2bucket -StoredCredentials AccountBadmin get-s3bucketlocation -BucketName example2bucket -StoredCredentials AccountBadmin

步骤 2:执行账户 B 任务

现在账户 B 管理员创建用户 Dave,向 Dave 委托从账户 A 收到的权限。

步骤 2.1:登录 AWS 管理控制台

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

步骤 2.2:在账户 B 中创建用户 Dave

  1. 在 IAM 控制台中,创建用户 Dave。

    有关说明,请参阅 IAM 用户指南 中的创建 IAM 用户 (AWS 管理控制台)

  2. 记下 UserDave 证书。

步骤 2.3:向用户 Dave 委托权限

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

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

    Copy
    { "Version": "2012-10-17", "Statement": [ { "Sid": "Example", "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws-cn:s3:::examplebucket" ] } ] }

    有关说明,请参阅 IAM 用户指南 中的使用内联策略

步骤 2.4:测试权限

现在,账户 B 中的 Dave 可以列出账户 A 拥有的 examplebucket 的内容。您可以使用以下过程之一验证权限。

使用 AWS CLI 进行测试

  1. 将 UserDave 配置文件添加到 AWS CLI 配置文件。有关配置文件的更多信息,请参阅设置用于示例演练的工具

    Copy
    [profile UserDave] aws_access_key_id = access-key aws_secret_access_key = secret-access-key region = us-east-1
  2. 在命令提示符处,输入以下 AWS CLI 命令,验证 Dave 现在是否可以从账户 A 拥有的 examplebucket 获取对象列表。请注意,该命令指定了 UserDave 配置文件。

    Copy
    aws s3 ls s3://examplebucket --profile UserDave

    Dave 没有任何其他权限。因此,如果他尝试任何其他操作 (例如,以下获取存储桶位置的操作),则 Amazon S3 会返回权限被拒绝的信息。

    Copy
    aws s3api get-bucket-location --bucket examplebucket --profile UserDave

使用适用于 Windows PowerShell 的 AWS 工具进行测试

  1. 将 Dave 的证书存储为 AccountBDave。

    Copy
    set-awscredentials -AccessKey AccessKeyID -SecretKey SecretAccessKey -storeas AccountBDave
  2. 尝试列出存储桶的命令。

    Copy
    get-s3object -BucketName example2bucket -StoredCredentials AccountBDave

    Dave 没有任何其他权限。因此,如果他尝试任何其他操作 (例如,以下获取存储桶位置的操作),则 Amazon S3 会返回权限被拒绝的信息。

    Copy
    get-s3bucketlocation -BucketName example2bucket -StoredCredentials AccountBDave

步骤 3:额外练习 - 尝试显式拒绝

您可以通过 ACL、存储桶策略和用户策略授予权限。但是,如果通过存储桶策略或用户策略设置了显式拒绝,则显式拒绝优先于任何其他权限。为进行测试,我们更新存储桶策略,对账户 B 显式拒绝 s3:ListBucket 权限。该策略同时还授予了 s3:ListBucket 权限,但是显式拒绝处于优先地位,因此账户 B 或账户 B 中的用户无法列出 examplebucket 中的对象。

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

    Copy
    { "Version": "2012-10-17", "Statement": [ { "Sid": "Example permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws-cn:iam::AccountB-ID:root" }, "Action": [ "s3:GetBucketLocation", "s3:ListBucket" ], "Resource": [ "arn:aws-cn:s3:::examplebucket" ] }, { "Sid": "Deny permission", "Effect": "Deny", "Principal": { "AWS": "arn:aws-cn:iam::AccountB-ID:root" }, "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws-cn:s3:::examplebucket" ] } ] }
  2. 现在,如果您尝试使用 AccountBadmin 凭证获取存储桶列表,则您的访问会被拒绝。

    • 使用 AWS CLI:

      Copy
      aws s3 ls s3://examplebucket --profile AccountBadmin
    • 使用适用于 Windows PowerShell 的 AWS 工具:

      Copy
      get-s3object -BucketName example2bucket -StoredCredentials AccountBDave

步骤 4:清除

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

    1. 使用账户 A 证书登录 AWS 管理控制台 (AWS 管理控制台),执行以下操作:

      • 在 Amazon S3 控制台中,删除附加到 examplebucket 的存储桶策略。在存储桶 Properties (属性) 中,删除 Permissions (权限) 部分中的策略。

      • 如果该存储桶是为此练习而创建的,请在 Amazon S3 控制台中删除对象,然后删除存储桶。

      • 在 IAM 控制台中,删除 AccountAadmin 用户。

  2. 使用账户 B 证书登录 AWS 管理控制台 (AWS 管理控制台)。在 IAM 控制台中,删除用户 AccountBadmin。