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.

示例 4:存储桶拥有者针对不属于自己的对象授予跨账户权限

在此示例场景中,您拥有一个存储桶,并且启用了其他 AWS 账户以上传对象。也就是说,您的存储桶中可以有其他 AWS 账户所拥有的对象。

现在,假设作为存储桶拥有者,您需要向另一个账户中的用户授予对象 (无论拥有者是谁) 的跨账户权限。例如,该用户可以是需要访问对象元数据的账单应用程序。存在两个核心问题:

  • 存储桶拥有者对其他 AWS 账户创建的对象不拥有权限。因此,存储桶拥有者若要针对不属于自己的对象授予权限,必须先由对象拥有者,也就是创建对象的 AWS 账户向存储桶拥有者授予权限。然后,存储桶拥有者才能委托这些权限。

  • 存储桶拥有者账户可以向自己账户中的用户委托权限 (请参阅示例 3:存储桶拥有者向其用户授予不属于自己的对象的权限 ),但不能向其他 AWS 账户委托权限,因为跨账户委托不受支持。

在这种情况下,存储桶拥有者可以创建具有对象访问权限的 AWS Identity and Access Management (IAM) 角色,然后向另一个 AWS 账户授予临时担任该角色的权限,使它可以访问存储桶中的对象。

背景:跨账户权限和使用 IAM 角色

IAM 角色可实现多种资源委托访问权限方案,跨账户访问是重要方案之一。在此示例中,存储桶拥有者 (账户 A) 使用一个 IAM 角色临时将跨账户对象访问权限委托给另一个 AWS 账户 (账户 C) 中的用户。您创建的每个 IAM 角色都附加了两个策略:

  • 一个信任策略,用于标识可以担任角色的其他 AWS 账户。

  • 一个访问策略,用于定义在某个用户担任角色时允许的权限,例如 s3:GetObject。有关可以在策略中指定的权限的列表,请参阅在策略中指定权限

然后,信任策略中标识的 AWS 账户向其用户授予担任角色的权限。该用户即可执行以下操作以访问对象:

  • 担任角色,然后在响应中获取临时安全凭证。

  • 使用临时安全凭证访问存储桶中的对象。

有关 IAM 角色的更多信息,请转到 IAM 用户指南 中的 IAM 角色

下面概括介绍演练步骤:

  1. 账户 A 管理员用户附加一个存储桶策略,向账户 B 授予上传对象的条件权限。

  2. 账户 A 管理员创建一个 IAM 角色,与账户 C 建立信任,以便该账户中的用户可以访问账户 A。附加到该角色的访问策略限制账户 C 中的用户访问账户 A 时可以执行的操作。

  3. 账户 B 管理员将一个对象上传到账户 A 拥有的存储桶,从而向存储桶拥有者授予完全控制权限。

  4. 账户 C 管理员创建一个用户,附加一个用户策略允许该用户担任该角色。

  5. 账户 C 中的用户首先担任角色,这会向该用户返回临时安全凭证。该用户随后使用这些临时凭证访问存储桶中的对象。

对于此示例,您需要三个账户。下表显示我们如何引用这些账户和这些账户中的管理员用户。根据 IAM 准则 (请参阅关于使用管理员用户来创建资源和授予权限),我们在本次演练中并不使用账户根凭证。而是在每个账户中创建一个管理员用户,在创建资源和向他们授予权限时使用这些凭证

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

1111-1111-1111

账户 A

AccountAadmin

2222-2222-2222

账户 B

AccountBadmin

3333-3333-3333

账户 C

AccountCadmin

步骤 0:准备演练

注意

在演练这些步骤时,您可能需要打开文本编辑器,记下某些信息。具体而言,您需要账户 ID、规范用户 ID、供每个账户连接到控制台的 IAM 用户登录 URL,以及 IAM 用户和角色的 Amazon 资源名称 (ARN)。

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

    1. 根据需要注册 AWS 账户。我们将这些账户称为账户 A、账户 B 和账户 C。

      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 和账户 C 中创建管理员用户。

  2. 对于账户 C,记下账户 ID。

    在账户 A 中创建 IAM 角色时,信任策略通过指定账户 ID 向账户 C 授予担任该角色的权限。您可以查找账户信息,如下所示:

    1. 转到 http://www.amazonaws.cn/,然后在 My Account/Console 下拉菜单中选择 Security Credentials

    2. 使用相应的账户证书登录。

    3. 单击 Account Identifiers (账户标识符),然后记下 AWS Account ID (AWS 账户 ID)Canonical User ID (规范用户 ID)

  3. 创建存储桶策略时,您需要以下信息。请记下这些值:

    • 账户 A 的规范用户 ID – 账户 A 管理员向账户 B 管理员授予条件上传对象权限时,条件指定必须获取对象完全控制权的账户 A 用户的规范用户 ID。

      注意

      规范用户 ID 是 Amazon S3 独有的概念。它是 64 字符模糊版本的账户 ID。

    • 账户 B 管理员的用户 ARN – 您可以在 IAM 控制台中查找该用户 ARN。您需要选择用户,在 Summary (摘要) 选项卡中查找用户的 ARN。

      在存储桶策略中,向 AccountBadmin 授予上传对象的权限,使用 ARN 指定用户。下面是一个示例 ARN 值:

      Copy
      arn:aws-cn:iam::AccountB-ID:user/AccountBadmin
  4. 设置 AWS 命令行界面 (CLI) 或适用于 Windows PowerShell 的 AWS 工具。请务必保存管理员用户证书,如下所示:

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

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

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

步骤 1:执行账户 A 任务

在此示例中,账户 A 是存储桶拥有者。因此,账户 A 中的用户 AccountAadmin 将创建一个存储桶,附加向账户 B 管理员授予上传对象权限的存储桶策略,然后创建一个 IAM 角色,向账户 C 授予担任该角色的权限,以便它可以访问存储桶中的对象。

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

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

步骤 1.2:创建一个存储桶并附加一个存储桶策略

在 Amazon S3 控制台中,执行以下操作:

  1. 创建存储桶。此练习假设存储桶名称是 examplebucket

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

  2. 附加以下存储桶策略,向账户 B 管理员授予上传对象的条件权限。

    您需要通过提供自己的 examplebucketAccountB-IDCanonicalUserId-of-AWSaccountA-BucketOwner 值来更新策略。

    Copy
    { "Version": "2012-10-17", "Statement": [ { "Sid": "111", "Effect": "Allow", "Principal": { "AWS": "arn:aws-cn:iam::AccountB-ID:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws-cn:s3:::examplebucket/*" }, { "Sid": "112", "Effect": "Deny", "Principal": { "AWS": "arn:aws-cn:iam::AccountB-ID:user/AccountBadmin" }, "Action": "s3:PutObject", "Resource": "arn:aws-cn:s3:::examplebucket/*", "Condition": { "StringNotEquals": { "s3:x-amz-grant-full-control": "id=CanonicalUserId-of-AWSaccountA-BucketOwner" } } } ] }

步骤 1.3:在账户 A 中创建一个 IAM 角色以允许账户 C 进行跨账户访问

在 IAM 控制台中创建一个 IAM 角色 (“examplerole”),授予账户 C 担任该角色的权限。请务必仍以账户 A 管理员身份登录,因为该角色必须在账户 A 中创建。

  1. 创建角色之前,准备好定义角色所需权限的托管策略。您可在以后的步骤中将此策略附加到角色。

    1. 在左侧的导航窗格中,单击 Policies (策略),然后单击 Create Policy (创建策略)

    2. Create Your Own Policy (创建您自己的策略) 旁,单击 Select (选择)

    3. Policy Name 字段中输入 access-accountA-bucket

    4. 复制下面的访问策略,然后将其粘贴到 Policy Document 字段中。该访问策略授予该角色 s3:GetObject 权限,这样,账户 C 用户在担任该角色时只能执行 s3:GetObject 操作。

      Copy
      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws-cn:s3:::examplebucket/*" } ] }
    5. 单击 Create Policy (创建策略)

      新策略会显示在托管策略列表中。

  2. 在左侧的导航窗格中,单击 Roles (角色),然后单击 Create New Role (创建新角色)

  3. 输入 examplerole 作为角色名称,然后单击 Next Step (下一步)

  4. Select Role Type 下,选择 Role for Cross-Account Access,然后单击 Provide access between AWS accounts you own 旁的 Select 按钮。

  5. 输入账户 C 的账户 ID。

    对于此演练,您不必要求用户经过 Multi-Factor Authentication (MFA) 来承担角色,因此请不要选择该选项。

  6. 单击 Next Step (下一步) 设置与该角色关联的权限。

  7. 选中您创建的 access-accountA-bucket 策略旁的框,然后单击 Next Step

    “Review (审核)”页面随即出现,使您可以在创建角色之前确认其设置。此页面上有一项极为重要,需要注意,即您可发送给需要使用此角色的用户的链接。单击该链接的用户会直接转到已填写 Account ID (账户 ID) 和 Role Name (角色名称) 字段的 Switch Role (切换角色) 页面。稍后您可以在任何跨账户角色的 Role Summary (角色摘要) 页面上看到此链接。

  8. 检查角色完毕后,单击 创建角色

    examplerole 角色显示在角色列表中。

  9. 单击角色名称 examplerole

  10. 选择 Trust Relationships 选项卡。

  11. 单击 Show policy document 并验证所示信任策略是否与以下策略相符。

    以下信任策略通过允许账户 C 执行 sts:AssumeRole 操作,与它建立信任。有关更多信息,请参阅 AWS Security Token Service API Reference 中的 AssumeRole

    Copy
    { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws-cn:iam::AccountC-ID:root" }, "Action": "sts:AssumeRole" } ] }
  12. 记下您创建的 examplerole 角色的 Amazon 资源名称 (ARN)。

    稍后在以下步骤中,您附加一个用户策略以允许 IAM 用户担任此角色,并通过 ARN 值标识角色。

步骤 2:执行账户 B 任务

账户 A 拥有的 examplebucket 需要其他账户拥有的对象。在此步骤中,账户 B 管理员使用命令行工具上传对象。

  • 使用 put-object AWS CLI 命令将一个对象上传到 examplebucket

    Copy
    aws s3api put-object --bucket examplebucket --key HappyFace.jpg --body HappyFace.jpg --grant-full-control id="canonicalUserId-ofTheBucketOwner" --profile AccountBadmin

    请注意以下几点:

    • --Profile 参数指定 AccountBadmin 配置文件,因此该对象由账户 B 拥有。

    • 参数 grant-full-control 根据存储桶策略的要求向存储桶拥有者授予对象的完全控制权限。

    • --body 参数标识要上传的源文件。例如,如果该文件在 Windows 计算机上的 C: 驱动器中,您应指定 c:\HappyFace.jpg

步骤 3:执行账户 C 任务

在前面的步骤中,账户 A 已创建一个角色 examplerole,与账户 C 建立了信任。这使账户 C 中的用户可以访问账户 A。在此步骤中,账户 C 管理员创建一个用户 (Dave),向他委托从账户 A 收到的 sts:AssumeRole 权限。这使 Dave 可以担任 examplerole 并临时获取对账户 A 的访问权限。账户 A 附加到该角色的访问策略将限制 Dave 在访问账户 A 时可以执行的操作,具体而言,就是获取 examplebucket 中的对象。

步骤 3.1:在账户 C 中创建一个用户并委托担任 examplerole 的权限

  1. 首先使用账户 C 的 IAM 用户登录 URL,以 AccountCadmin 用户身份登录 AWS 管理控制台。

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

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

  3. 记下 Dave 证书。Dave 需要这些证书才能担任 examplerole 角色。

  4. 为 IAM 用户 Dave 创建一个内联策略,向 Dave 委托担任账户 A 中的 examplerole 角色的 sts:AssumeRole 权限。

    1. 在左侧导航窗格中,单击 Users

    2. 单击用户名 Dave。

    3. 在用户详细信息页面上,选择 Permissions 选项卡,然后展开 Inline Policies 部分。

    4. 选择 click here (或 Create User Policy)。

    5. 单击 Custom Policy (自定义策略),然后单击 Select (选择)

    6. Policy Name 字段中为策略输入一个名称。

    7. 将以下策略复制到 Policy Document 字段中。

      您需要通过提供账户 A ID 来更新策略。

      Copy
      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["sts:AssumeRole"], "Resource": "arn:aws-cn:iam::AccountA-ID:role/examplerole" } ] }
    8. 单击 Apply Policy

  5. 通过添加另一个配置文件 AccountCDave 将 Dave 的证书保存到 AWS CLI 的配置文件。

    Copy
    [profile AccountCDave] aws_access_key_id = UserDaveAccessKeyID aws_secret_access_key = UserDaveSecretAccessKey region = us-west-2

步骤 3.2:担任角色 (examplerole) 并访问对象

现在 Dave 可以访问账户 A 拥有的存储桶中的对象,如下所示:

  • Dave 首先使用自己的凭证担任 examplerole。这会返回临时凭证。

  • Dave 随后使用临时凭证访问账户 A 的存储桶中的对象。

  1. 在命令提示符处,使用 AccountCDave 配置文件执行以下 AWS CLI assume-role 命令。

    您需要通过提供账户 A 的 ID (其中定义了 examplerole) 在命令中更新 ARN 值。

    Copy
    aws sts assume-role --role-arn arn:aws-cn:iam::accountA-ID:role/examplerole --profile AccountCDave --role-session-name test

    在响应中,AWS 安全令牌服务 (STS) 返回临时安全证书 (访问密钥 ID、秘密访问密钥和安全令牌)。

  2. 将临时安全证书保存在 AWS CLI 配置文件中的 TempCred 配置文件下。

    Copy
    [profile TempCred] aws_access_key_id = temp-access-key-ID aws_secret_access_key = temp-secret-access-key aws_security_token = security-token region = us-west-2
  3. 在命令提示符处,使用临时证书执行以下 AWS CLI 命令以访问对象。例如,该命令指定 head-object API 以检索 HappyFace.jpg 对象的对象元数据。

    Copy
    aws s3api get-object --bucket examplebucket --key HappyFace.jpg SaveFileAs.jpg --profile TempCred

    因为附加到 examplerole 的访问策略允许执行这些操作,所以 Amazon S3 会处理请求。您可以对存储桶中的任何其他对象尝试任何其他操作。

    如果您尝试任何其他操作 (例如 get-object-acl),则系统会拒绝权限,因为不允许角色执行该操作。

    Copy
    aws s3api get-object-acl --bucket examplebucket --key HappyFace.jpg --profile TempCred

    我们使用用户 Dave 担任角色,并使用临时证书访问对象。它还可以是账户 C 中访问 examplebucket 中的对象的应用程序。应用程序可以获取临时安全证书,账户 C 可以向应用程序委托担任 examplerole 的权限。

步骤 4:清除

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

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

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

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

      • 在 IAM 控制台中,删除您在账户 A 中创建的 examplerole

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

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

  3. 使用账户 C 证书登录 AWS 管理控制台 (AWS 管理控制台)。在 IAM 控制台中,删除用户 AccountCadmin 和用户 Dave。

相关资源