示例 2:存储桶拥有者授予跨账户存储桶权限
重要
向 IAM 角色授予权限是比向各个用户授予权限更好的做法。若要了解如何执行此操作,请参阅了解跨账户权限和使用 IAM 角色。
一个 AWS 账户(例如账户 A)可以将访问自身资源(如存储桶和对象)的权限授予另一个 AWS 账户(账户 B)。账户 B 随后可以将这些权限委托给其账户中的用户。在此示例情景中,存储桶拥有者向另一个账户授予执行特定存储桶操作的跨账户权限。
注意
账户 A 还可以使用存储桶策略直接向账户 B 中的用户授予权限。但是,该用户仍需要来自用户所属的父账户(账户 B)的权限,即使账户 B 没有来自账户 A 的权限也是如此。该用户只要同时拥有来自资源拥有者和父账户的权限,便能够访问资源。
下面概括介绍演练步骤:
-
账户 A 管理员用户附加一个存储桶策略,该策略向账户 B 授予执行特定存储桶操作的跨账户权限。
请注意,账户 B 中的管理员用户将自动继承这些权限。
-
账户 B 管理员用户将用户策略附加到用户,委托从账户 A 收到的权限。
-
账户 B 中的用户随后通过访问账户 A 拥有的存储桶中的对象来验证权限。
对于此示例,您需要两个账户。下表显示我们如何引用这些账户和其中的管理员用户。根据 IAM 准则(请参阅关于使用管理员用户来创建资源和授予权限),我们在本次演练中并不使用根用户凭证。而是在每个账户中创建一个管理员用户,并在创建资源和向他们授予权限时使用这些凭证。
AWS 账户 ID | 账户名称 | 账户中的管理员用户 |
---|---|---|
|
账户 A |
AccountAadmin |
|
账户 B |
AccountBadmin |
创建用户和授予权限的所有任务都在 AWS Management Console 中完成。为验证权限,演练中使用命令行工具、AWS Command Line Interface (CLI) 和 AWS Tools for Windows PowerShell,因此您无需编写任何代码。
准备演练
-
确保您有两个 AWS 账户并且每个账户都有一个管理员用户,如前面部分的表中所示。
-
根据需要注册 AWS 账户。
-
使用账户 A 凭证登录 IAM 控制台
以创建管理员用户: -
创建用户
AccountAadmin
并记下安全凭证。有关说明,请参阅《IAM 用户指南》中的在您的 AWS 账户 中创建 IAM 用户。 -
通过附加一个授予完全访问权限的用户策略来向 AccountAadmin 授予管理员权限。有关说明,请参阅 IAM 用户指南中的使用策略。
-
-
在 IAM 控制台中,记下控制面板上的 IAM 用户登录 URL。账户中的所有用户都必须使用此 URL 登录 AWS Management Console。
有关更多信息,请参阅 IAM 用户指南中的用户如何登录您的账户。
-
使用账户 B 凭证重复上一个步骤,然后创建管理员用户
AccountBadmin
。
-
-
设置 AWS Command Line Interface(AWS CLI)或 AWS Tools for Windows PowerShell。请务必保存管理员用户凭证,如下所示:
-
如果使用 AWS CLI,请在配置文件中创建两个配置文件:
AccountAadmin
和AccountBadmin
。 -
如果使用 AWS Tools for Windows PowerShell,请确保将用于会话的凭证存储为
AccountAadmin
和AccountBadmin
。
有关说明,请参阅 设置用于演练的工具。
-
-
保存管理员用户凭证,也称为配置文件。您可以对输入的每个命令使用配置文件名称而不是指定凭证。有关更多信息,请参阅 设置用于演练的工具。
-
在 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 -
如果使用的是 AWS 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:登录到 AWS Management Console
首先使用账户 A 的 IAM 用户登录 URL,以 AccountAadmin 用户身份登录 AWS Management Console。此用户将创建一个存储桶并向其附加一个策略。
步骤 1.2:创建存储桶
-
在 Amazon S3 控制台中创建一个存储桶。此练习假设该存储桶在美国东部(弗吉尼亚州北部)AWS 区域中创建,命名为
。amzn-s3-demo-bucket
有关说明,请参阅 创建桶。
-
向存储桶上传示例对象。
有关说明,请转到 步骤 2:将对象上传到存储桶。
步骤 1.3:附加一个存储桶策略,向账户 B 授予跨账户权限
该存储桶策略向账户 B 授予 s3:GetLifecycleConfiguration
和 s3:ListBucket
权限。假设您仍使用 AccountAadmin 用户凭证登录控制台。
-
将以下存储桶策略附加到
。该策略向账户 B 授予amzn-s3-demo-bucket
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:::amzn-s3-demo-bucket
" ] } ] } -
验证账户 B(及其管理员用户)是否可以执行这些操作。
-
使用 AWS CLI 进行验证
aws s3 ls s3://
amzn-s3-demo-bucket
--profile AccountBadmin aws s3api get-bucket-lifecycle-configuration --bucketamzn-s3-demo-bucket
--profile AccountBadmin -
使用 AWS Tools for Windows PowerShell 进行验证
get-s3object -BucketName
amzn-s3-demo-bucket
-StoredCredentials AccountBadmin get-s3bucketlifecycleconfiguration -BucketNameamzn-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 测试权限
-
将
UserDave
配置文件添加到 AWS CLI 配置文件。有关配置文件的更多信息,请参阅设置用于演练的工具。[profile UserDave] aws_access_key_id =
access-key
aws_secret_access_key =secret-access-key
region =us-east-1
-
在命令提示符处,输入以下 AWS CLI 命令,验证 Dave 现在是否可以从账户 A 拥有的
获取对象列表。请注意,该命令指定了amzn-s3-demo-bucket
UserDave
配置文件。aws s3 ls s3://
--profile UserDaveamzn-s3-demo-bucket
Dave 没有任何其它权限。因此,如果他尝试任何其它操作(例如,下面的
get-bucket-lifecycle
配置操作),则 Amazon S3 会返回权限被拒绝的消息。aws s3api get-bucket-lifecycle-configuration --bucket
amzn-s3-demo-bucket
--profile UserDave
使用 AWS Tools for Windows PowerShell 测试权限
-
将 Dave 的凭证存储为
AccountBDave
。set-awscredentials -AccessKey AccessKeyID -SecretKey SecretAccessKey -storeas AccountBDave
-
尝试列出存储桶的命令。
get-s3object -BucketName
amzn-s3-demo-bucket
-StoredCredentials AccountBDaveDave 没有任何其它权限。因此,如果他尝试任何其它操作(例如,下面的
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
-
使用账户 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
" ] } ] } -
现在,如果您尝试使用
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 凭证登录 AWS Management Console(AWS Management Console
),执行以下操作: -
在 Amazon S3 控制台中,删除附加到
的存储桶策略。在存储桶 Properties(属性)中,删除 Permissions(权限)部分中的策略。amzn-s3-demo-bucket
-
如果该存储桶是为此练习而创建的,请在 Amazon S3 控制台中删除对象,然后删除存储桶。
-
在 IAM 控制台
中,移除 AccountAadmin
用户。
-
-
-
使用账户 B 凭证登录 IAM 控制台
。删除用户 AccountBadmin
。有关分步说明,请参阅《IAM 用户指南》中的删除 IAM 用户。