示例 3:存储桶拥有者授予不属于自己的对象的权限 - Amazon Simple Storage Service
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

欢迎使用新的 Amazon S3 用户指南! Amazon S3 用户指南结合了以下三个已停用的指南中的信息和说明:Amazon S3 开发人员指南Amazon S3 控制台用户指南Amazon S3 入门指南

示例 3:存储桶拥有者授予不属于自己的对象的权限

此示例的情况是,存储桶拥有者要授予对象访问权限,但并不是该存储桶中所有对象都归该存储桶拥有者所有。存储桶拥有者如何能够授予不属于自己的对象的权限? 在此示例中,存储桶拥有者想要向其账户中的用户授予权限。

存储桶拥有者可让其他 AWS 账户拥有上传对象的权限。这些对象归创建它们的账户所有。存储桶拥有者并不拥有非自己创建的对象。因此,存储桶拥有者要能够授予对这些对象的访问权,对象拥有者必须首先使用对象 ACL 对该存储桶拥有者授予权限。有关更多信息,请参阅 Amazon S3 存储桶和对象所有权

在此示例中,存储桶拥有者向其账户中的用户委派权限。下面概括介绍演练步骤:

  1. 账户 A 管理员用户使用两条语句来附加存储桶策略。

    • 向账户 B 授予跨账户上传对象的权限。

    • 允许用户使用自己的账户访问存储桶中的对象。

  2. 账户 B 管理员用户将对象上传至账户 A 拥有的存储桶。

  3. 账户 B 管理员将更新对象 ACL,在其中添加授权,以向存储桶拥有者授予对于该对象的完全控制权限。

  4. 账户 A 中的用户将通过访问存储桶中的对象 (而不管谁拥有它们) 来验证权限。

对于此示例,您需要两个账户。下表显示我们如何引用这些账户和这些账户中的管理员用户。根据推荐的 IAM 指南,在本演练中,请您不要使用账户根凭证。有关更多信息,请参阅 关于使用管理员用户来创建资源和授予权限。而是在每个账户中创建一个管理员,在创建资源和向他们授予权限时使用这些凭证。

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

1111-1111-1111

账户 A

AccountAadmin

2222-2222-2222

账户 B

AccountBadmin

创建用户和授予权限的所有任务都在 AWS 管理控制台中完成。为验证权限,演练使用命令行工具 (AWS 命令行界面 (AWS CLI) 和适用于 Windows PowerShell 的 AWS 工具),因此您无需编写任何代码。

步骤 0:准备演练

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

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

      1. 打开 Amazon S3 主页,然后选择 Create an AWS Account (创建 AWS 账户)

      2. 按照屏幕上的说明进行操作。账户激活可用时,AWS 会通过电子邮件向您发送通知。

    2. 使用账户 A 凭证登录 IAM 控制台,然后执行以下操作以创建管理员用户:

      • 创建用户 AccountAadmin 并记下安全凭证。有关添加用户的更多信息,请参阅 IAM 用户指南中的在您的 AWS 账户中创建 IAM 用户

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

      • 在 IAM 控制台 Dashboard (控制面板) 中,记下 IAM User Sign-In URL (IAM 用户登录 URL)。此账户中的用户在登录 AWS 管理控制台时必须使用此 URL。有关更多信息,请参阅 IAM 用户指南中的用户如何登录您的账户

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

  2. 设置 AWS CLI 或适用于 Windows PowerShell 的工具。请务必保存管理员凭证,如下所示:

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

    • 如果使用适用于 Windows PowerShell 的工具,请确保将用于会话的凭证存储为 AccountAadminAccountBadmin

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

步骤 1:执行账户 A 任务

对账户 A 执行以下步骤:

步骤 1.1:登录到控制台

使用账户 A 的 IAM 用户登录 URL,以 AccountAadmin 用户身份登录 AWS 管理控制台。此用户将创建一个存储桶并向其附加一个策略。

步骤 1.2:创建存储桶和用户,并添加一条授予用户权限的存储桶策略

  1. 在 Amazon S3 控制台中创建一个存储桶。此练习假设该存储桶在美国东部(弗吉尼亚北部)区域创建,名称为 DOC-EXAMPLE-BUCKET1

    有关说明,请参阅创建存储桶

  2. 在 IAM 控制台中,创建用户 Dave

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

  3. 记下 Dave 的凭证。

  4. 在 Amazon S3 控制台中,将以下存储桶策略附加到 DOC-EXAMPLE-BUCKET1 存储桶。有关说明,请参阅 使用 Amazon S3 控制台添加存储桶策略。按照这些步骤添加存储桶策略。有关如何查找账户 ID 的信息,请参阅查找您的 AWS 账户 ID

    该策略将向账户 B 授予 s3:PutObjects3: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(存储桶拥有者)授予完全控制权限。

使用 AWS CLI

  1. 使用 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
  2. 在对象 ACL 中添加一个授权,向存储桶拥有者授予对于对象的完全控制权。有关如何查找规范用户 ID 的信息,请参阅 查找 AWS 账户的规范用户 ID

    aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET1 --key HappyFace.jpg --grant-full-control id="AccountA-CanonicalUserID" --profile AccountBadmin

使用适用于 Windows PowerShell 的工具

  1. 使用适用于 Windows PowerShell 命令的 Write-S3Object 工具上传对象。

    Write-S3Object -BucketName DOC-EXAMPLE-BUCKET1 -key HappyFace.jpg -file HappyFace.jpg -StoredCredentials AccountBadmin
  2. 在对象 ACL 中添加一个授权,向存储桶拥有者授予对于对象的完全控制权。

    Set-S3ACL -BucketName DOC-EXAMPLE-BUCKET1 -Key HappyFace.jpg -CannedACLName "bucket-owner-full-control" -StoredCreden

步骤 3:测试权限

现在验证账户 A 中的用户 Dave 是否能够访问账户 B 拥有的对象。

使用 AWS CLI

  1. 将用户 Dave 的凭证添加到 AWS CLI 配置文件并创建新的配置 UserDaveAccountA。有关更多信息,请参阅 设置用于示例演练的工具

    [profile UserDaveAccountA] aws_access_key_id = access-key aws_secret_access_key = secret-access-key region = us-east-1
  2. 运行 get-objectCLI 命令,下载 HappyFace.jpg,并将它保存在本地。您可以通过添加参数 --profile 为用户 Dave 提供凭证。

    aws s3api get-object --bucket DOC-EXAMPLE-BUCKET1 --key HappyFace.jpg Outputfile.jpg --profile UserDaveAccountA

使用适用于 Windows PowerShell 的工具

  1. 将用户 Dave 的 AWS 凭证以 UserDaveAccountA 保存到持久存储。

    Set-AWSCredentials -AccessKey UserDave-AccessKey -SecretKey UserDave-SecretAccessKey -storeas UserDaveAccountA
  2. 运行 Read-S3Object 命令,下载 HappyFace.jpg 对象,并将它保存在本地。您可以通过添加参数 -StoredCredentials 为用户 Dave 提供凭证。

    Read-S3Object -BucketName DOC-EXAMPLE-BUCKET1 -Key HappyFace.jpg -file HappyFace.jpg -StoredCredentials UserDaveAccountA

步骤 4:清除

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

    1. 使用账户 A 凭证登录 AWS 管理控制台,然后执行以下操作:

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

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

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

  2. 使用账户 B 凭证登录 AWS 管理控制台。在 IAM 控制台中,删除用户 AccountBadmin