示例 3:桶拥有者授予不属于自己的对象的权限
重要
向 IAM 角色授予权限是比向各个用户授予权限更好的做法。若要了解如何执行此操作,请参阅 背景:跨账户权限和使用 IAM 角色。
此示例的情况是,桶拥有者要授予对象访问权限,但并不是该桶中所有对象都归该桶拥有者所有。在此示例中,桶拥有者想要向其账户中的用户授予权限。
桶拥有者可让其他 Amazon Web Services 账户上载对象。预设情况下,桶所有者不拥有 Amazon Web Services 账户 写入桶的对象。对象归将它们写入 S3 桶的账户所有。如果桶拥有者不拥有桶中的对象,对象所有者必须首先使用对象 ACL 授予桶拥有者权限。然后,桶拥有者可以向他们不拥有的对象授予权限,有关详细信息,请参阅 Amazon S3 桶和对象所有权。
如果桶拥有者对桶的 S3 Object Ownership 应用了桶拥有者强制设置,则桶拥有者将拥有桶中的所有对象,包括另一个 Amazon Web Services 账户 所编写的对象。这将解决桶拥有者所有对象的问题。然后,您可以将权限委派给自己账户中的用户或其他 Amazon Web Services 账户。
注意
S3 对象所有权是 Amazon S3 桶级别的设置,您可以使用该设置来控制上传到桶的对象的所有权和禁用或启用 ACL。原定设置情况下,对象所有权设为强制桶拥有者设置,并且所有 ACL 均处于禁用状态。禁用 ACL 后,桶拥有者拥有桶中的所有对象,并使用访问管理策略来专门管理对这些对象的访问权限。
Amazon S3 中的大多数现代使用案例不再需要使用 ACL。我们建议您将 ACL 保持为禁用状态,除非有需要单独控制每个对象的访问权限的特殊情况。禁用 ACL 后,您可以使用策略来控制对桶中所有对象的访问权限,无论是谁将对象上传到您的桶。有关更多信息,请参阅为您的桶控制对象所有权和禁用 ACL。。
在此示例中,我们假设桶拥有者尚未对 Object Ownership 应用桶拥有者强制执行的设置。桶拥有者向其账户中的用户委派权限。下面概括介绍演练步骤:

-
账户 A 管理员用户使用两条语句来附加桶策略。
-
向账户 B 授予跨账户上传对象的权限。
允许用户使用自己的账户访问桶中的对象。
-
-
账户 B 管理员用户将对象上传至账户 A 拥有的桶。
-
账户 B 管理员将更新对象 ACL,在其中添加授权,以向桶拥有者授予对于该对象的完全控制权限。
-
账户 A 中的用户将通过访问桶中的对象(而不管谁拥有它们)来验证权限。
对于此示例,您需要两个账户。下表显示我们如何引用这些账户和这些账户中的管理员用户。根据建议的 IAM 指南,在本演练中,请不要使用账户根用户凭证。有关更多信息,请参阅关于使用管理员用户来创建资源和授予权限。而是在每个账户中创建一个管理员,在创建资源和向他们授予权限时使用这些凭证。
Amazon Web Services 账户 ID | 账户名称 | 账户中的管理员 |
---|---|---|
|
账户 A |
AccountAadmin |
|
账户 B |
AccountBadmin |
创建用户和授予权限的所有任务都在 Amazon Web Services Management Console 中完成。为验证权限,演练中使用命令行工具、Amazon Command Line Interface (Amazon CLI) 和 Amazon Tools for Windows PowerShell,因此您无需编写任何代码。
步骤 0:准备演练
-
确保您有两个 Amazon Web Services 账户,并且每个账户都有一个管理员,如前面部分的表中所示。
-
根据需要注册 Amazon Web Services 账户。
-
使用账户 A 凭证登录 IAM 控制台
,然后执行以下操作以创建管理员用户: -
创建用户 AccountAadmin 并记下安全凭证。有关添加用户的更多信息,请参阅 IAM 用户指南中的在您的 Amazon Web Services 账户中创建 IAM 用户。
-
通过附加一个授予完全访问权限的用户策略来向 AccountAadmin 授予管理员权限。有关说明,请参阅《IAM 用户指南》中的管理 IAM policy。
-
在 IAM 控制台 Dashboard (控制面板) 中,记下 IAM User Sign-In URL (IAM 用户登录 URL)。此账户中的用户必须在登录 Amazon Web Services Management Console 时使用此 URL。有关更多信息,请参阅 IAM 用户指南中的用户如何登录您的账户。
-
-
使用账户 B 凭证重复上一个步骤,然后创建管理员用户 AccountBadmin。
-
-
设置 Amazon CLI 或 Tools for Windows PowerShell。请务必保存管理员凭证,如下所示:
-
如果使用 Amazon CLI,请在配置文件中创建两个配置文件
AccountAadmin
和AccountBadmin
。 如果使用 Tools for Windows PowerShell,请确保将用于会话的凭证存储为
AccountAadmin
和AccountBadmin
。
有关说明,请参阅 设置用于示例演练的工具。
-
步骤 1:执行账户 A 任务
对账户 A 执行以下步骤:
步骤 1.1:登录到控制台
使用账户 A 的 IAM 用户登录 URL,以 AccountAadmin 用户身份登录 Amazon Web Services Management Console。此用户将创建一个桶并向其附加一个策略。
步骤 1.2:创建桶和用户,并添加一条授予用户权限的桶策略
-
在 Amazon S3 控制台中创建一个桶。此练习假设该桶在美国东部(弗吉尼亚北部)区域创建,名称为
。DOC-EXAMPLE-BUCKET1
有关说明,请参阅 创建桶。
-
在 IAM 控制台中,创建用户 Dave。
有关说明,请参阅 IAM 用户指南中的创建 IAM 用户(控制台)。
-
记下 Dave 的凭证。
-
在 Amazon S3 控制台中,将以下桶策略附加到
桶。有关说明,请参阅 使用 Amazon S3 控制台添加桶策略。按照这些步骤添加桶策略。有关如何查找账户 ID 的信息,请参阅查找您的 Amazon Web Services 账户 ID。DOC-EXAMPLE-BUCKET1
该策略将向账户 B 授予
s3:PutObject
和s3:ListBucket
权限。该策略还对用户 Dave 授予s3:GetObject
权限。{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::
AccountB-ID
:root" }, "Action": [ "s3:PutObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET1
/*", "arn:aws:s3:::DOC-EXAMPLE-BUCKET1
" ] }, { "Sid": "Statement3", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AccountA-ID
:user/Dave" }, "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET1
/*" ] } ] }
步骤 2:执行账户 B 任务
现在账户 B 有权对账户 A 的桶执行操作,账户 B 管理员将执行以下操作:
-
将对象上传到账户 A 的桶。
在对象 ACL 中添加授权,向账户 A(桶拥有者)授予完全控制权限。
使用 Amazon CLI
-
使用
put-object
CLI 命令上传对象。该命令中的 --body
参数指示要上传的源文件。例如,如果该文件在 Windows 计算机上的C:
驱动器中,您应指定c:\HappyFace.jpg
。--key
参数提供对象的键名。aws s3api put-object --bucket
DOC-EXAMPLE-BUCKET1
--key HappyFace.jpg --body HappyFace.jpg --profile AccountBadmin -
在对象 ACL 中添加一个授权,向桶拥有者授予对于对象的完全控制权。有关如何查找规范用户 ID 的信息,请参阅 查找 Amazon Web Services 账户的规范用户 ID。
aws s3api put-object-acl --bucket
DOC-EXAMPLE-BUCKET1
--key HappyFace.jpg --grant-full-control id="AccountA-CanonicalUserID" --profile AccountBadmin
使用 Tools for Windows PowerShell
-
使用 Tools for Windows PowerShell 命令的
Write-S3Object
工具上传对象。Write-S3Object -BucketName
DOC-EXAMPLE-BUCKET1
-key HappyFace.jpg -file HappyFace.jpg -StoredCredentials AccountBadmin -
在对象 ACL 中添加一个授权,向桶拥有者授予对于对象的完全控制权。
Set-S3ACL -BucketName
DOC-EXAMPLE-BUCKET1
-Key HappyFace.jpg -CannedACLName "bucket-owner-full-control" -StoredCreden
步骤 3:测试权限
现在验证账户 A 中的用户 Dave 是否能够访问账户 B 拥有的对象。
使用 Amazon CLI
-
将用户 Dave 的凭证添加到 Amazon CLI 配置文件,并创建新的配置文件
UserDaveAccountA
。有关更多信息,请参阅设置用于示例演练的工具。[profile UserDaveAccountA] aws_access_key_id =
access-key
aws_secret_access_key =secret-access-key
region =us-east-1
-
运行
get-object
CLI 命令,下载HappyFace.jpg
,并将它保存在本地。您可以通过添加参数--profile
为用户 Dave 提供凭证。aws s3api get-object --bucket
DOC-EXAMPLE-BUCKET1
--key HappyFace.jpgOutputfile.jpg
--profile UserDaveAccountA
使用 Tools for Windows PowerShell
-
将用户 Dave 的 Amazon 凭证以
UserDaveAccountA
的身份保存到持久存储。Set-AWSCredentials -AccessKey
UserDave-AccessKey
-SecretKeyUserDave-SecretAccessKey
-storeas UserDaveAccountA -
运行
Read-S3Object
命令,下载HappyFace.jpg
对象,并将它保存在本地。您可以通过添加参数-StoredCredentials
为用户 Dave 提供凭证。Read-S3Object -BucketName
DOC-EXAMPLE-BUCKET1
-Key HappyFace.jpg -file HappyFace.jpg -StoredCredentials UserDaveAccountA
步骤 4:清除
-
完成测试之后,您可以执行以下操作来进行清理。
-
使用账户 A 凭证登录 Amazon Web Services Management Console
,并执行以下操作: -
在 Amazon S3 控制台中,删除附加到
DOC-EXAMPLE-BUCKET1
的桶策略。在桶 Properties(属性)中,删除 Permissions(权限)部分中的策略。 -
如果该桶是为此练习而创建的,请在 Amazon S3 控制台中删除对象,然后删除桶。
-
在 IAM 控制台中,删除 AccountAadmin 用户。
-
-
-
使用账户 B 凭证登录 Amazon Web Services Management Console
。在 IAM 控制台中,删除用户 AccountBadmin。