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

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

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

存储桶拥有者可让其他 AWS 账户上载对象。预设情况下,存储桶所有者不拥有 AWS 账户 写入存储桶的对象。对象归将它们写入 S3 存储桶的账户所有。如果存储桶拥有者不拥有存储桶中的对象,对象所有者必须首先使用对象 ACL 授予存储桶拥有者权限。然后,存储桶拥有者可以向他们不拥有的对象授予权限,有关详细信息,请参阅 Amazon S3 存储桶和对象所有权

如果存储桶拥有者对存储桶的 S3 Object Ownership 应用了存储桶拥有者强制设置,则存储桶拥有者将拥有存储桶中的所有对象,包括另一个 AWS 账户 所编写的对象。这将解决存储桶拥有者所有对象的问题。然后,您可以将权限委派给自己账户中的用户或其他 AWS 账户。

注意

预设情况下,当另一个 AWS 账户 将对象上载到您的 S3 存储桶,该账户(对象编写者)拥有该对象,拥有对象的访问权限,并可以授予其他用户通过 ACL 访问该数据元的权限。您可以使用对象所有权来更改此原定设置行为,以便禁用 ACL,并且作为存储桶拥有者,您可以自动拥有存储桶中的每个对象。因此,数据的访问控制基于策略,例如 IAM policy、S3 存储桶策略、虚拟私有云(VPC)端点策略和 AWS Organizations 服务控制策略(SCP)。

Amazon S3 中的大多数现代使用案例不再需要使用 ACL,我们建议您禁用 ACL,除非在需要单独控制每个对象的访问的异常情况下。使用对象所有权,您可以禁用 ACL 并依赖策略进行访问控制。禁用 ACL 时,您可以轻松通过不同的 AWS 账户 上载的对象维护存储桶。作为存储桶拥有者,您拥有存储桶中的所有对象,并可以使用策略管理对它们的访问。有关更多信息,请参阅为您的存储桶控制对象所有权和禁用 ACL。

在此示例中,我们假设存储桶拥有者尚未对 Object Ownership 应用存储桶拥有者强制执行的设置。存储桶拥有者向其账户中的用户委派权限。下面概括介绍演练步骤:

  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 Management Console 中完成。为验证权限,演练中使用命令行工具、AWS Command Line Interface (AWS CLI) 和 AWS Tools for Windows PowerShell,因此您无需编写任何代码。

步骤 0:准备演练

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

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

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

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

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

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

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

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

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

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

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

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

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

步骤 1:执行账户 A 任务

对账户 A 执行以下步骤:

步骤 1.1:登录到控制台

使用账户 A 的 IAM 用户登录 URL,以 AccountAadmin 用户身份登录 AWS 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 的信息,请参阅查找您的 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

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

使用 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-object CLI 命令,下载 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 的 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 Management Console,并执行以下操作:

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

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

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

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