示例 1:存储桶拥有者向其用户授予存储桶权限
重要
向 IAM 角色授予权限比向各个用户授予权限更好。有关如何向 IAM 角色授予权限的更多信息,请参阅了解跨账户权限和使用 IAM 角色。
在本演练中,一个 Amazon Web Services 账户拥有存储桶,该账户中包含一个 IAM 用户。默认情况下,该用户没有权限。要让该用户执行任何任务,父账户必须向该用户授予权限。存储桶拥有者和父账父相同。因此,要向用户授予存储桶权限,Amazon Web Services 账户可以使用存储桶策略和/或用户策略。存储桶拥有者将使用存储桶策略授予一些权限,使用用户策略授予其他权限。
以下是演练的步骤概括:
-
账户管理员创建存储桶策略,向用户授予一组权限。
-
账户管理员将用户策略附加到用户,授予其他权限。
-
然后,用户尝试使用通过存储桶策略和用户策略授予的权限。
对于此示例,您需要一个 Amazon Web Services 账户。您将创建一个管理员用户(请参阅 关于使用管理员用户来创建资源和授予权限),而不是使用账户的根用户凭证。我们按下表所示引用 Amazon Web Services 账户和管理员用户:
账户 ID | 账户名称 | 账户中的管理员用户 |
---|---|---|
|
账户 A |
AccountAadmin |
注意
本示例中的管理员用户是 AccountAadmin,它代表账户 A,而不是 AccountAdmin。
创建用户和授予权限的所有任务都在 Amazon Web Services Management Console 中完成。为验证权限,演练中使用命令行工具、Amazon Command Line Interface (Amazon CLI) 和 Amazon Tools for Windows PowerShell,因此您无需编写任何代码。
准备演练
-
确保您有一个 Amazon Web Services 账户并且它的一个用户拥有管理员权限。
-
根据需要注册 Amazon Web Services 账户。我们将此账户称为账户 A。
-
转到 https://aws.amazon.com/s3
,然后单击创建 Amazon 账户。 -
按照屏幕上的说明进行操作。
账户激活且可用时,Amazon 会通过电子邮件向您发送通知。
-
-
在账户 A 中,创建一个管理员用户
AccountAadmin
。使用账户 A 凭证登录 IAM 控制台,然后执行以下操作: -
创建用户
AccountAadmin
并记下用户安全凭证。有关说明,请参阅《IAM 用户指南》中的在您的 Amazon Web Services 账户中创建 IAM 用户。
-
通过附加一个授予完全访问权限的用户策略来向 AccountAadmin 授予管理员权限。
有关说明,请参阅《IAM 用户指南》中的管理 IAM 策略。
-
记下 AccountAadmin 的 IAM 用户登录 URL。您在登录 Amazon Web Services Management Console时需要使用此 URL。有关如何查找登录 URL 的更多信息,请参阅《IAM 用户指南》中的 Sign in to the Amazon Web Services Management Console as an IAM user。记下每个账户的 URL。
-
-
-
设置 Amazon CLI 或 Amazon Tools for Windows PowerShell。请务必保存管理员用户凭证,如下所示:
-
如果使用 Amazon CLI,请在配置文件中创建配置文件
AccountAadmin
。 -
如果使用 Amazon Tools for Windows PowerShell,请确保将用于会话的凭证存储为
AccountAadmin
。
有关说明,请参阅 设置用于演练的工具。
-
步骤 1:在账户 A 中创建资源并授予权限
使用账户 A 中用户 AccountAadmin
的凭证和专用的 IAM 用户登录 URL 登录 Amazon Web Services Management Console,然后执行以下操作:
-
创建资源(一个存储桶和一个 IAM 用户)
-
在 Amazon S3 控制台中创建一个存储桶。记下创建存储桶的 Amazon Web Services 区域。有关说明,请参阅 创建桶。
-
在 IAM 控制台
中,执行以下操作: -
创建一个名为 Dave 的用户。
有关分步说明,请参阅《IAM 用户指南》中的创建 IAM 用户(控制台)。
-
记下
UserDave
凭证。 -
记下用户 Dave 的 Amazon 资源名称(ARN)。在 IAM 控制台
中,选择该用户,摘要选项卡会提供用户 ARN。
-
-
-
授予权限
因为存储桶拥有者和用户所属的父账户相同,所以 Amazon Web Services 账户可以使用存储桶策略和/或用户策略向用户授予权限。在此示例中,您同时使用这两种方法。如果对象也由同一个账户拥有,则存储桶拥有者可以在存储桶策略(或 IAM 策略)中授予对象权限。
-
在 Amazon S3 控制台中,将以下存储桶策略附加到
awsexamplebucket1
。该策略包含两个语句。
-
第一个语句向 Dave 授予存储桶操作权限
s3:GetBucketLocation
和s3:ListBucket
。 -
第二个语句授予
s3:GetObject
权限。因为账户 A 还拥有对象,所以账户管理员能够授予s3:GetObject
权限。
在
Principal
语句中,Dave 通过其用户 ARN 进行标识。有关策略元素的更多信息,请参阅 Amazon S3 中的策略和权限。{ "Version": "2012-10-17", "Statement": [ { "Sid": "statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
AccountA-ID
:user/Dave" }, "Action": [ "s3:GetBucketLocation", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::awsexamplebucket1
" ] }, { "Sid": "statement2", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountA-ID
:user/Dave" }, "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::awsexamplebucket1
/*" ] } ] } -
-
使用以下策略为用户 Dave 创建一个内联策略。该策略向 Dave 授予
s3:PutObject
权限。您需要通过提供存储桶名称来更新策略。{ "Version": "2012-10-17", "Statement": [ { "Sid": "PermissionForObjectOperations", "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws:s3:::
awsexamplebucket1
/*" ] } ] }有关说明,请参阅《IAM 用户指南》中的管理 IAM 策略。请注意,您需要使用账户 A 凭证登录控制台。
-
步骤 2:测试权限
使用 Dave 的凭证验证权限是否发挥作用。您可以使用以下两个过程之一。
使用 Amazon CLI 测试权限
-
通过添加以下
UserDaveAccountA
配置文件更新 Amazon CLI 配置文件。有关更多信息,请参阅 设置用于演练的工具。[profile UserDaveAccountA] aws_access_key_id =
access-key
aws_secret_access_key =secret-access-key
region =us-east-1
-
验证 Dave 是否可以执行在用户策略中授权的操作。使用以下 Amazon CLI
put-object
命令上传示例对象。该命令中的
--body
参数指示要上传的源文件。例如,如果文件处于 Windows 计算机上 C: 驱动器的根目录中,则指定c:\HappyFace.jpg
。--key
参数提供对象的键名。aws s3api put-object --bucket
awsexamplebucket1
--keyHappyFace.jpg
--bodyHappyFace.jpg
--profile UserDaveAccountA运行以下 Amazon CLI 命令以获取对象。
aws s3api get-object --bucket awsexamplebucket1 --key
HappyFace.jpg
OutputFile.jpg
--profile UserDaveAccountA
使用 Amazon Tools for Windows PowerShell 测试权限
-
将 Dave 的凭证存储为
AccountADave
。您随后使用这些凭证对对象执行PUT
和GET
操作。set-awscredentials -AccessKey
AccessKeyID
-SecretKeySecretAccessKey
-storeas AccountADave -
通过用户 Dave 的已存储凭证,使用 Amazon Tools for Windows PowerShell
Write-S3Object
命令上传示例对象。Write-S3Object -bucketname
awsexamplebucket1
-keyHappyFace.jpg
-fileHappyFace.jpg
-StoredCredentials AccountADave下载之前上传的对象。
Read-S3Object -bucketname
awsexamplebucket1
-keyHappyFace.jpg
-fileOutput.jpg
-StoredCredentials AccountADave