如何提供对 Amazon S3 桶中对象的跨账户存取权限?

4 分钟阅读
0

我想授予其他 AWS 账户对 Amazon Simple Storage Service(Amazon S3)桶中对象的存取权限。

简述

在 Amazon S3 中,您可以授予其他 AWS 账户中的用户对您账户中所拥有对象的精细跨账户存取权限。

根据您想要提供的访问类型,使用以下解决方案之一授予对对象的跨账户存取权限:

  • AWS Identity and Access Management (AWS IAM) 策略和基于资源的桶策略,仅用于以编程方式访问 S3 桶对象
  • IAM 策略和基于资源的访问控制列表 (ACL),仅用于以编程方式访问 S3 桶对象
    注意:启用强制桶拥有者设置后,所有桶和对象 ACL 都将被停用。因此,您不能使用 ACL 授予跨账户存取权限。默认情况下,所有新创建的桶都启用了强制桶拥有者设置。要管理跨账户存取权限,最佳做法是使用 IAM 策略和桶策略,而不是 ACL。有关更多信息,请参阅控制对象的所有权和停用桶的 ACL
  • 跨账户 IAM 角色,用于以编程方式和通过控制台访问 S3 桶对象

如果请求者是 IAM 主体,则拥有该主体的账户必须通过 IAM 策略授予 S3 权限。根据您的用例,桶拥有者还必须通过桶策略或 ACL 授予权限。授予访问权限后,跨账户桶的编程访问权限与对账户桶的访问权限相同。

有关通过 Amazon S3 接入点或 AWS Key Management Service (AWS KMS) 进行跨账户存取,请参阅为什么跨账户用户在尝试访问由自定义 AWS KMS 密钥加密的 S3 对象时会遇到 “访问被拒绝” 错误?

对于必须作为跨账户对象访问的大型数据集,最佳做法是使用 S3 接入点。有关更多信息,请参阅使用跨账户 Amazon S3 接入点简化和扩展对共享数据集的访问管理

解决方法

IAM 策略和基于资源的桶策略

**注意:**如果在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请参阅排查 AWS CLI 错误。此外,确保您使用的是最新版本的 AWS CLI

要管理跨账户存取控制并审计 S3 对象的权限,请使用基于资源的桶策略。在桶级别应用桶策略来定义以下值:

  • 主体元素: 谁可以访问桶内的对象
  • 资源元素: 他们可以访问的对象
  • 操作元素: 他们如何访问桶内的对象

当您在桶级别应用桶策略时,您可以定义对桶内不同对象的精细访问权限。您还可以查看桶策略,了解谁可以访问 S3 桶中的对象。

要使用桶策略管理 S3 桶访问权限,请完成以下步骤:
**注意:**在以下步骤中,账户 A 是您的账户,账户 B 是您想要授予对象访问权限的账户。

  1. 在账户 A 中创建 S3 桶

  2. 在账户 B 中创建 IAM 角色或用户

  3. 向账户 B 中的 IAM 角色授予向特定桶下载 (GetObject) 对象和从特定桶上传 (PutObject) 对象的权限。另外,使用 IAM 策略向账户 B 中的 IAM 角色授予调用 PutObjectAcl 的权限,从而向桶拥有者授予对象权限:

    {    "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject",
                    "s3:PutObject",
                    "s3:PutObjectAcl"
                ],
                "Resource": "arn:aws:s3:::AccountABucketName/*"
    
            }
        ]
    }

    注意:更新政策以包括您的用户变量。您还可以限制对账户 A 中特定桶文件夹的访问权限。要限制对特定桶文件夹的访问权限,请在资源元素中定义文件夹名称,例如 "arn:aws:s3:::AccountABucketName/FolderName/*"。有关更多信息,请参阅如何向用户授予对我的 Amazon S3 桶中特定文件夹的访问权限?您还可以使用 AWS CLI 命令 create-policy 创建基于 IAM 身份的策略。

  4. 为账户 A 配置桶策略,向您在账户 B 中创建的 IAM 角色或用户授予权限。使用此桶策略向用户授予对账户 A 拥有的桶中对象的 GetObjectPutObject 的权限:

    {    "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::AccountB:user/AccountBUserName"
                },
                "Action": [
                    "s3:GetObject",
                    "s3:PutObject",
                    "s3:PutObjectAcl"
                ],
                "Resource": [
                    "arn:aws:s3:::AccountABucketName/*"
                ]
            }
        ]
    }

    您还可以使用 AWS CLI 命令 put-bucket-policy 创建 Amazon S3 桶策略。

注意:要限制对特定桶文件夹的访问权限,请在资源元素中定义文件夹名称,例如 "arn:aws:s3:::AccountABucketName/FolderName/*"。当您使用带条件的 s3:PutObject 权限时,桶拥有者可以完全控制其他账户上传的对象。PutObject API 调用通过特定标头强制使用 ACL。

IAM 策略和基于资源的 ACL

您还可以使用对象 ACL 来管理特定场景的权限。有关更多信息,请参阅何时使用基于 ACL 的访问策略(桶和对象 ACL)

Amazon S3 ACL 仅允许用户定义 READ、WRITE、READ_ACP、WRITE_ACP 和 FULL\ _CONTROL 权限集。您只能使用一个账户或一个预定义的 Amazon S3 组作为 Amazon S3 ACL 的被授权者。为账户指定电子邮件地址或规范用户 ID 后,ACL 即应用于被授权者账户中的所有身份。例如,您不能使用 ACL 限制个人 IAM 用户或角色的访问权限。您也不能将 ACL 应用于共享相同前缀的不同对象。

**注意:**桶拥有者可能无法完全控制 ACL 被授权者上传的对象。这是因为 ACL 不支持 ACL 授权的 S3 操作条件。

要使用桶和对象 ACL 来管理 S3 桶访问权限,请完成以下步骤:

  1. 在账户 B 中创建 IAM 角色或用户
  2. 向角色或用户授予执行所需的 Amazon S3 操作的权限。调用 PutObjectGetObject 的用户必须拥有基于资源的策略和 IAM 策略部分中列出的权限。
  3. 将桶 ACL 配置为至少包含账户 B 的 WRITE 权限。这样,可确保账户 B IAM 角色或用户可以将对象上传到账户 A 拥有的桶:
    ...<AccessControlPolicy>
      <Owner>
        <ID> AccountACanonicalUserID </ID>
        <DisplayName> AccountADisplayName </DisplayName>
      </Owner>
      <AccessControlList>
    ...
        <Grant>
          <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
            <ID> AccountBCanonicalUserID </ID>
            <DisplayName> AccountBDisplayName </DisplayName>
          </Grantee>
          <Permission> WRITE </Permission>
        </Grant>
        ...
      </AccessControlList>
    </AccessControlPolicy>
    **注意:**要查找您的 CanonicalUserID,请参阅查找 AWS 账户的规范用户 ID
  4. 将对象 ACL 配置为至少包含账户 B 的 READ 权限,这样,账户 B 中的 IAM 角色或用户即可从账户 A 拥有的桶下载对象:
    ...<AccessControlPolicy>
      <Owner>
        <ID> AccountACanonicalUserID </ID>
        <DisplayName> AccountADisplayName </DisplayName>
      </Owner>
      <AccessControlList>
    ...
        <Grant>
          <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
            <ID> AccountBCanonicalUserID </ID>
            <DisplayName> AccountBDisplayName </DisplayName>
          </Grantee>
          <Permission> READ </Permission>
        </Grant>
        ...
      </AccessControlList>
    </AccessControlPolicy>
    ACL 权限因应用 ACL 的 S3 资源、桶或对象而异。有关更多信息,请参阅访问控制列表(ACL)概述。当您创建桶或将对象上传到现有桶时,请配置桶和对象 ACL。有关更多信息,请参阅配置 ACL

跨账户 IAM 角色

并非所有 AWS 服务都支持基于资源的策略。当您提供对多个服务的跨账户存取权限时,请使用跨账户 IAM 角色来集中管理权限。此方法允许跨账户访问另一个账户或 AWS 服务拥有或上传的对象。如果您不使用跨账户 IAM 角色,则必须修改对象 ACL。有关更多信息,请参阅 Amazon S3 如何授权对象操作请求

要使用跨账户 IAM 角色管理 S3 桶访问权限,请完成以下步骤:

  1. 在账户 A 中创建 IAM 角色
  2. 向角色授予执行所需的 S3 操作的权限。在角色的信任策略中,向账户 B 中的角色或用户授予代入账户 A 中角色的权限:
    {  "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::AccountB:user/AccountBUserName"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }
    **注意:**IAM 角色必须具有信任策略,定义哪些主体可以代入角色以及角色何时可以代入主体。IAM 角色可以有多个权限策略,定义代入该角色的主体可以执行的权限以及其使用的资源。 
    您还可以运行 create-role AWS CLI 命令来创建具有信任策略的角色。
    通过以下访问策略,代入此角色的用户可通过 Amazon S3 控制台以编程方式下载和上传对象。有关更多信息,请参阅如何向用户授予对我的 Amazon S3 桶中特定文件夹的访问权限?
    **注意:**如果只需要编程访问权限,则可以删除策略中的前两个语句:
    {    "Version": "2012-10-17",
        "Statement": [
            {
                "Action": [
                    "s3:ListAllMyBuckets"
                ],
                "Effect": "Allow",
                "Resource": [
                    "arn:aws:s3:::*"
                ]
            },
            {
                "Action": [
                    "s3:ListBucket",
                    "s3:GetBucketLocation"
                ],
                "Effect": "Allow",
                "Resource": "arn:aws:s3:::AccountABucketName"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject",
                    "s3:PutObject"
                ],
                "Resource": "arn:aws:s3:::AccountABucketName/*"
            }
        ]
    }
    或者,运行 create-policy AWS CLI 命令来创建基于 IAM 身份的策略。
  3. 向账户 B 中的 IAM 角色或用户授予代入您在账户 A 中创建的 IAM 角色的权限。您必须添加以下示例策略并将其作为 IAM 用户或角色的权限策略:
    {  "Version": "2012-10-17",
      "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::AccountA:role/AccountARole"
      }
    }
    或者,运行 create-policy AWS CLI 命令来创建基于 IAM 身份的策略。
  4. 从账户 B 中的角色代入账户 A 中的角色,以便账户 B 中的 IAM 身份可以执行所需的 S3 操作。有关详细信息,请参阅切换到角色(控制台)
    **注意:**当您代入账户 A 中的 IAM 角色时,Amazon S3 会根据访问策略确定操作。IAM 角色与 API 调用作用相同,可调用账户 A 中的本地 IAM 身份。不需要用于跨账户存取的桶策略或 ACL。有关详细信息,请参阅 Amazon S3 操作

相关信息

Amazon S3 的操作、资源和条件键

桶策略示例

访问策略指南

在 Amazon RDS for Microsoft SQL Server 中设置跨账户本机备份和还原

用户和角色策略示例

AWS 官方
AWS 官方已更新 4 个月前