示例 2:存储桶拥有者授予跨账户存储桶权限 - Amazon Simple Storage Service

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

重要

向 IAM 角色授予权限是比向各个用户授予权限更好的做法。若要了解如何执行此操作,请参阅了解跨账户权限和使用 IAM 角色

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

注意

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

下面概括介绍演练步骤:

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

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

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

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

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

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

1111-1111-1111

账户 A

AccountAadmin

2222-2222-2222

账户 B

AccountBadmin

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

准备演练

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

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

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

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

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

    3. 在 IAM 控制台中,记下控制面板上的 IAM 用户登录 URL。账户中的所有用户都必须使用此 URL 登录 AWS Management Console。

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

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

  2. 设置 AWS Command Line Interface(AWS CLI)或 AWS Tools for Windows PowerShell。请务必保存管理员用户凭证,如下所示:

    • 如果使用 AWS CLI,请在配置文件中创建两个配置文件:AccountAadminAccountBadmin

    • 如果使用 AWS Tools for Windows PowerShell,请确保将用于会话的凭证存储为 AccountAadminAccountBadmin

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

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

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

      [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
    2. 如果使用的是 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 任务

步骤 1.1:登录到 AWS Management Console

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

步骤 1.2:创建存储桶

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

    有关说明,请参阅 创建桶

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

    有关说明,请转到 步骤 2:将对象上传到存储桶

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

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

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

    有关说明,请参阅 使用 Amazon S3 控制台添加存储桶策略

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Example permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:root" }, "Action": [ "s3:GetLifecycleConfiguration", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket" ] } ] }
  2. 验证账户 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 任务

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

步骤 2.1:登录到 AWS Management Console

首先使用账户 B 的 IAM 用户登录 URL,以 AccountBadmin 用户身份登录 AWS Management Console。

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

IAM 控制台中,创建用户 Dave

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

步骤 2.3:向用户 Dave 授予权限

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

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

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

有关说明,请参阅《IAM 用户指南》中的管理 IAM 策略

步骤 2.4:测试权限

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

使用 AWS CLI 测试权限
  1. UserDave 配置文件添加到 AWS CLI 配置文件。有关配置文件的更多信息,请参阅设置用于演练的工具

    [profile UserDave] aws_access_key_id = access-key aws_secret_access_key = secret-access-key region = us-east-1
  2. 在命令提示符处,输入以下 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
  2. 尝试列出存储桶的命令。

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

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

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

步骤 3:(可选)尝试显式拒绝

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

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

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Example permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:root" }, "Action": [ "s3:GetLifecycleConfiguration", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket" ] }, { "Sid": "Deny permission", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::AccountB-ID:root" }, "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket" ] } ] }
  2. 现在,如果您尝试使用 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:清除

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

    1. 使用账户 A 凭证登录 AWS Management Console(AWS Management Console),执行以下操作:

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

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

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

  2. 使用账户 B 凭证登录 IAM 控制台。删除用户 AccountBadmin。有关分步说明,请参阅《IAM 用户指南》中的删除 IAM 用户