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

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

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

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

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

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

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

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

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

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

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

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

Amazon Web Services 账户 ID 账户名称 账户中的管理员

1111-1111-1111

账户 A

AccountAadmin

2222-2222-2222

账户 B

AccountBadmin

创建用户和授予权限的所有任务都在 Amazon Web Services Management Console中完成。为验证权限,演练中使用命令行工具、Amazon Command Line Interface (Amazon CLI) 和 Amazon Tools for Windows PowerShell,因此您无需编写任何代码。

步骤 0:准备演练

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

    1. 根据需要注册 Amazon Web Services 账户 。

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

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

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

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

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

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

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

  2. 设置 Amazon CLI 或 Tools for Windows PowerShell。请务必保存管理员凭证,如下所示:

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

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

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

步骤 1:执行账户 A 任务

对账户 A 执行以下步骤:

步骤 1.1:登录到控制台

使用账户 A 的 IAM 用户登录 URL,以 AccountAadmin 用户身份登录Amazon Web Services Management Console。此用户将创建一个存储桶并向其附加一个策略。

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

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

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

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

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

  3. 记下 Dave 的凭证。

  4. 在 Amazon S3 控制台中,将以下存储桶策略附加到 DOC-EXAMPLE-BUCKET1 存储桶。有关说明,请参阅使用 Amazon S3 控制台添加存储桶策略。按照这些步骤添加存储桶策略。有关如何查找账户 ID 的信息,请参阅查找您的 Amazon Web Services 账户 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(存储桶拥有者)授予完全控制权限。

使用 Amazon 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 的信息,请参阅 查找 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

  1. 使用 Tools for 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 拥有的对象。

使用 Amazon CLI

  1. 将用户 Dave 的凭证添加到 Amazon 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

使用 Tools for Windows PowerShell

  1. 将用户 Dave 的 Amazon 凭证以 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 凭证登录 Amazon Web Services Management Console,并执行以下操作:

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

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

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

  2. 使用账户 B 凭证登录 Amazon Web Services Management Console。在 IAM 控制台中,删除用户 AccountBadmin