Amazon Simple Storage Service
开发人员指南 (API Version 2006-03-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

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

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

存储桶拥有者可让其他 AWS 账户拥有上传对象的权限。这些对象归创建它们的账户所有。存储桶拥有者并不拥有不是自己创建的对象。因此,存储桶拥有者要能够授予对这些对象的访问权,对象拥有者必须首先使用对象 ACL 对该存储桶拥有者授予权限。然后该存储桶拥有者就可以通过存储桶策略委派这些权限。在此示例中,存储桶拥有者向其账户中的用户委派权限。

以下概括了演练步骤:

  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 命令行界面 (CLI) 和适用于 Windows PowerShell 的 AWS 工具),因此您无需编写任何代码。

步骤 0:准备演练

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

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

      1. 转到 http://www.amazonaws.cn/s3/,然后单击 Create an AWS Account

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

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

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

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

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

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

  2. 设置 AWS 命令行界面 (CLI) 或适用于 Windows PowerShell 的 AWS 工具。确保按如下方式保存管理员用户证书:

    • 如果使用 AWS CLI,请在配置文件中创建两个配置 AccountAadmin 和 AccountBadmin。

    • 如果使用适用于 Windows PowerShell 的 AWS 工具,请确保您将用于会话的证书存储为 AccountAadmin 和 AccountBadmin。

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

步骤 1:执行账户 A 任务

步骤 1.1:登录 AWS 管理控制台

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

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

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

    有关说明,请参阅如何创建 S3 存储桶? (在 Amazon Simple Storage Service 控制台用户指南 中)。

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

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

  3. 记下 Dave 证书。

  4. 在 Amazon S3 控制台中,请将以下存储桶策略附加到 examplebucket 存储桶。有关说明,请参阅如何添加 S3 存储桶策略? (在 Amazon Simple Storage Service 控制台用户指南 中)。按照这些步骤添加存储桶策略。

    该策略将向账户 B 授予 s3:PutObjects3:ListBucket 权限。该策略还对用户 Dave 授予 s3:GetObject 权限。

    Copy
    { "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws-cn:iam::AccountB-ID:root" }, "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws-cn:s3:::examplebucket/*" ] }, { "Sid": "Statement3", "Effect": "Allow", "Principal": { "AWS": "arn:aws-cn:iam::AccountA-ID:user/Dave" }, "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws-cn:s3:::examplebucket/*" ] } ] }

步骤 2:执行账户 B 任务

现在账户 B 有权对账户 A 的存储桶执行操作,账户 B 管理员将执行以下操作:

  • 将对象上传到账户 A 的存储桶。

  • 在对象 ACL 中添加授权,向账户 A (存储桶拥有者) 授予完全控制权限。

使用 AWS CLI

  1. 使用 put-object AWS CLI 命令上传对象。该命令中的 --body 参数指示要上传的源文件。例如,如果该文件在 Windows 计算机上的 C: 驱动器中,您应指定 c:\HappyFace.jpg--key 参数提供对象的键名称。

    Copy
    aws s3api put-object --bucket examplebucket --key HappyFace.jpg --body HappyFace.jpg --profile AccountBadmin
  2. 在对象 ACL 中添加一个授权,向存储桶拥有者授予对于对象的完全控制权。

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

使用适用于 Windows PowerShell 的 AWS 工具

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

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

    Copy
    Set-S3ACL -BucketName examplebucket -Key HappyFace.jpg -CannedACLName "bucket-owner-full-control" -StoredCreden

步骤 3:测试权限

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

使用 AWS CLI

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

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

    Copy
    aws s3api get-object --bucket examplebucket --key HappyFace.jpg Outputfile.jpg --profile UserDaveAccountA

使用适用于 Windows PowerShell 的 AWS 工具

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

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

    Copy
    Read-S3Object -BucketName examplebucket -Key HappyFace.jpg -file HappyFace.jpg -StoredCredentials UserDaveAccountA

步骤 4:清除

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

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

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

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

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

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