示例 2:存储桶拥有者授予跨账户存储桶权限
一个 Amazon Web Services 账户(例如账户 A)可以将访问自身资源(如存储桶和对象)的权限授予另一个 Amazon Web Services 账户(账户 B)。账户 B 随后可以将这些权限委托给其账户中的用户。在此示例情景中,存储桶拥有者向另一个账户授予执行特定存储桶操作的跨账户权限。
注意
账户 A 还可以使用存储桶策略直接向账户 B 中的用户授予权限。但是该用户仍需要来自用户所属的父账户 (账户 B) 的权限,即使账户 B 没有来自账户 A 的权限也是如此。该用户只要同时拥有来自资源拥有者和父账户的权限,便能够访问资源。
下面概括介绍演练步骤:

-
账户 A 管理员用户附加一个存储桶策略,该策略向账户 B 授予执行特定存储桶操作的跨账户权限。
请注意,账户 B 中的管理员用户将自动继承这些权限。
-
账户 B 管理员用户将用户策略附加到用户,委托从账户 A 收到的权限。
-
账户 B 中的用户随后通过访问账户 A 拥有的存储桶中的对象来验证权限。
对于此示例,您需要两个账户。下表显示我们如何引用这些账户和其中的管理员用户。根据 IAM 准则 (请参阅 关于使用管理员用户来创建资源和授予权限),我们在本次演练中并不使用账户根凭证。而是在每个账户中创建一个管理员用户,在创建资源和向他们授予权限时使用这些凭证。
Amazon Web Services 账户 ID | 账户名称 | 账户中的管理员用户 |
---|---|---|
|
账户 A |
AccountAadmin |
|
账户 B |
AccountBadmin |
创建用户和授予权限的所有任务都在 Amazon Web Services Management Console 中完成。为验证权限,演练中使用命令行工具、Amazon Command Line Interface (CLI) 和 Amazon Tools for Windows PowerShell,因此您无需编写任何代码。
步骤 0:准备演练
-
确保您有两个 Amazon Web Services 账户并且每个账户都有一个管理员用户,如前面部分的表中所示。
-
根据需要注册 Amazon Web Services 账户。
-
转到 https://aws.amazon.com/s3/
,然后单击 Create an Amazon Account (创建 Amazon 账户)。 -
按照屏幕上的说明进行操作。
账户激活且可用时,Amazon 会通过电子邮件向您发送通知。
-
-
使用账户 A 凭证登录 IAM 控制台
以创建管理员用户: -
创建用户 AccountAadmin 并记下安全凭证。有关说明,请参阅 IAM 用户指南中的在您的 Amazon Web Services 账户中创建 IAM 用户。
-
通过附加一个授予完全访问权限的用户策略来向 AccountAadmin 授予管理员权限。有关说明,请参阅 IAM 用户指南中的使用策略。
-
-
在 IAM 控制台中,记下 Dashboard (控制面板) 上的 IAM User Sign-In URL (IAM 用户登录 URL)。账户中的所有用户都必须使用此 URL 登录 Amazon Web Services Management Console。
有关更多信息,请参阅 IAM 用户指南中的用户如何登录您的账户。
-
使用账户 B 凭证重复上一个步骤,然后创建管理员用户 AccountBadmin。
-
-
设置 Amazon Command Line Interface (CLI) 或 Amazon Tools for Windows PowerShell。请务必保存管理员用户凭证,如下所示:
-
如果使用 Amazon CLI,请在配置文件中创建两个配置 AccountAadmin 和 AccountBadmin。
-
如果使用 Amazon Tools for Windows PowerShell,请确保将用于会话的凭证存储为 AccountAadmin 和 AccountBadmin。
有关说明,请参阅 设置用于示例演练的工具。
-
-
保存管理员用户凭证,也称为配置文件。您可以对输入的每个命令使用配置文件名称而不是指定凭证。有关更多信息,请参阅设置用于示例演练的工具。
-
在 Amazon CLI 凭证文件中为两个账户中的每个管理员用户添加配置文件。
[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 -
如果您正在使用 Amazon Tools for Windows PowerShell
set-awscredentials –AccessKey
AcctA-access-key-ID
–SecretKeyAcctA-secret-access-key
–storeas AccountAadmin set-awscredentials –AccessKeyAcctB-access-key-ID
–SecretKeyAcctB-secret-access-key
–storeas AccountBadmin
-
步骤 1:执行账户 A 任务
步骤 1.1:登录到 Amazon Web Services Management Console
首先使用账户 A 的 IAM 用户登录 URL,以 AccountAadmin 用户身份登录 Amazon Web Services Management Console。此用户将创建一个存储桶并向其附加一个策略。
步骤 1.2:创建存储桶
-
在 Amazon S3 控制台中创建一个存储桶。此练习假设该存储桶在美国东部(弗吉尼亚北部)区域创建,命名为
DOC-EXAMPLE-BUCKET
。有关说明,请参阅 创建存储桶。
-
向存储桶上传示例对象。
有关说明,请转到 步骤 2:将对象上传到存储桶。
步骤 1.3:附加一个存储桶策略,向账户 B 授予跨账户权限
该存储桶策略向账户 B 授予 s3:GetLifecycleConfiguration
和 s3:ListBucket
权限。假设您仍使用 AccountAadmin 用户凭证登录控制台。
-
将以下存储桶策略附加到
DOC-EXAMPLE-BUCKET
。该策略向账户 B 授予s3:GetLifecycleConfiguration
和s3: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:::DOC-EXAMPLE-BUCKET
" ] } ] } -
验证账户 B (及其管理员用户) 是否可以执行这些操作。
-
使用 Amazon CLI
aws s3 ls s3://
DOC-EXAMPLE-BUCKET
--profile AccountBadmin aws s3api get-bucket-lifecycle-configuration --bucketDOC-EXAMPLE-BUCKET
--profile AccountBadmin -
使用 Amazon Tools for Windows PowerShell
get-s3object -BucketName DOC-EXAMPLE-BUCKET -StoredCredentials AccountBadmin get-s3bucketlifecycleconfiguration -BucketName DOC-EXAMPLE-BUCKET -StoredCredentials AccountBadmin
-
步骤 2:执行账户 B 任务
现在账户 B 管理员创建用户 Dave,并委派从账户 A 收到的权限。
步骤 2.1:登录到 Amazon Web Services Management Console
首先使用账户 B 的 IAM 用户登录 URL,以 AccountBadmin 用户身份登录 Amazon Web Services Management Console。
步骤 2.2:在账户 B 中创建用户 Dave
在 IAM 控制台中,创建用户 Dave。
有关说明,请参阅 IAM 用户指南中的创建 IAM 用户 (Amazon Web Services Management Console)。
步骤 2.3:向用户 Dave 授予权限
使用以下策略为用户 Dave 创建一个内联策略。您需要通过提供存储桶名称来更新策略。
假设您使用 AccountBadmin 用户凭证登录控制台。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Example", "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::
DOC-EXAMPLE-BUCKET
" ] } ] }
有关说明,请参阅 IAM 用户指南中的使用内联策略。
步骤 2.4:测试权限
现在,账户 B 中的 Dave 可以列出账户 A 拥有的 DOC-EXAMPLE-BUCKET
的内容。您可以使用以下过程之一验证权限。
使用 Amazon CLI 进行测试
-
将 UserDave 配置文件添加到 Amazon CLI 配置文件。有关配置文件的更多信息,请参阅设置用于示例演练的工具。
[profile UserDave] aws_access_key_id =
access-key
aws_secret_access_key =secret-access-key
region =us-east-1
-
在命令提示符处,输入以下 Amazon CLI 命令,验证 Dave 现在是否可以从账户 A 拥有的
DOC-EXAMPLE-BUCKET
获取对象列表。请注意,该命令指定了 UserDave 配置文件。aws s3 ls s3://
--profile UserDaveDOC-EXAMPLE-BUCKET
Dave 没有任何其他权限。因此,如果他尝试任何其他操作(例如,下面的获取存储桶生命周期配置操作),则 Amazon S3 会返回权限被拒绝的消息。
aws s3api get-bucket-lifecycle-configuration --bucket
DOC-EXAMPLE-BUCKET
--profile UserDave
使用 Amazon Tools for Windows PowerShell 进行测试
-
将 Dave 的凭证存储为 AccountBDave。
set-awscredentials -AccessKey AccessKeyID -SecretKey SecretAccessKey -storeas AccountBDave
-
尝试列出存储桶的命令。
get-s3object -BucketName DOC-EXAMPLE-BUCKET -StoredCredentials AccountBDave
Dave 没有任何其他权限。因此,如果他尝试任何其他操作(例如,下面的获取存储桶生命周期配置操作),则 Amazon S3 会返回权限被拒绝的消息。
get-s3bucketlifecycleconfiguration -BucketName DOC-EXAMPLE-BUCKET -StoredCredentials AccountBDave
步骤 3:(可选)尝试显式拒绝
您可以通过 ACL、存储桶策略和用户策略授予权限。但是,如果通过存储桶策略或用户策略设置了显式拒绝,则显式拒绝优先于任何其他权限。为进行测试,我们更新存储桶策略,对账户 B 显式拒绝 s3:ListBucket
权限。该策略同时还授予了 s3:ListBucket
权限,但是显式拒绝处于优先地位,因此账户 B 或账户 B 中的用户无法列出 DOC-EXAMPLE-BUCKET
中的对象。
-
使用账户 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:::DOC-EXAMPLE-BUCKET
" ] }, { "Sid": "Deny permission", "Effect": "Deny", "Principal": { "AWS": "arn:aws:iam::AccountB-ID
:root" }, "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET
" ] } ] } -
现在,如果您尝试使用 AccountBadmin 凭证获取存储桶列表,则您的访问会被拒绝。
-
使用 Amazon CLI:
aws s3 ls s3://
DOC-EXAMPLE-BUCKET
--profile AccountBadmin -
使用 Amazon Tools for Windows PowerShell:
get-s3object -BucketName DOC-EXAMPLE-BUCKET -StoredCredentials AccountBDave
-
步骤 4:清除
-
完成测试之后,您可以执行以下操作来进行清理。
-
使用账户 A 凭证登录 Amazon Web Services Management Console(Amazon Web Services Management Console
),执行以下操作: -
在 Amazon S3 控制台中,删除附加到
DOC-EXAMPLE-BUCKET
的存储桶策略。在存储桶 Properties (属性) 中,删除 Permissions (权限) 部分中的策略。 -
如果该存储桶是为此练习而创建的,请在 Amazon S3 控制台中删除对象,然后删除存储桶。
-
在 IAM 控制台中,删除 AccountAadmin 用户。
-
-
-
使用账户 B 凭证登录 Amazon Web Services Management Console(Amazon Web Services Management Console
)。在 IAM 控制台中,删除用户 AccountBadmin。