S3 Access Grants 跨账户访问 - Amazon Simple Storage Service

S3 Access Grants 跨账户访问

利用 S3 Access Grants,您可以授予 Amazon S3 对以下内容的数据访问权限:

  • 您账户中的 AWS Identity and Access Management(IAM)身份

  • 其它 AWS 账户中的 IAM 身份

  • 您的 AWS IAM Identity Center 实例中的目录用户或组

首先,为另一个账户配置跨账户访问。这包括使用资源策略授予对 S3 Access Grants 实例的访问权限。然后,使用授权来授予对您的 S3 数据(存储桶、前缀或对象)的访问权限。

配置跨账户访问后,另一个账户可以从 S3 Access Grants 中请求对您的 Amazon S3 数据的临时访问凭证。下图显示了通过 S3 Access Grants 进行跨账户 S3 访问的用户流程:

S3 Access Grants 跨账户访问用户流程
  1. 第二个账户(B)中的用户或应用程序向账户(A)中存储 Amazon S3 数据的 S3 Access Grants 实例请求凭证。有关更多信息,请参阅 通过 S3 Access Grants 请求访问 Amazon S3 数据

  2. 如果某个授权向第二个账户授予访问您的 Amazon S3 数据的权限,则您的账户(A)中的 S3 Access Grants 实例会返回临时凭证。有关访问授权的更多信息,请参阅在 S3 访问权限管控中处理授权

  3. 第二个账户(B)中的用户或应用程序使用 S3 Access Grants 出售的凭证访问您的账户(A)中的 S3 数据。

配置 S3 Access Grants 跨账户访问

要通过 S3 Access Grants 授予跨账户 S3 访问权限,请执行以下步骤:

  • 步骤 1:在您的账户(例如,账户 ID 111122223333)中配置在其中存储 S3 数据的 S3 Access Grants 实例。

  • 步骤 2:为您的账户 111122223333 中的 S3 Access Grants 实例配置资源策略,来向第二个账户(例如,账户 ID 444455556666)授予访问权限。

  • 步骤 3:为第二个账户 444455556666 中的 IAM 主体配置 IAM 权限,以便从您的账户 111122223333 中的 S3 Access Grants 实例请求凭证。

  • 步骤 4:在您的账户 111122223333 中创建授权,来向第二个账户 444455556666 中的 IAM 主体授予访问您账户 111122223333 中某些 S3 数据的权限。

步骤 1:在您的账户中配置 S3 Access Grants 实例

首先,您的账户 111122223333 中必须有 S3 Access Grants 实例,才能管理对 Amazon S3 数据的访问权限。您必须在存储您要共享的 S3 数据的每个 AWS 区域中创建一个 S3 Access Grants 实例。如果您要在多个 AWS 区域中共享数据,请为每个 AWS 区域重复每个配置步骤。如果您在存储 S3 数据的 AWS 区域中已经有一个 S3 Access Grants 实例,请继续下一步。如果您尚未配置 S3 Access Grants 实例,请参阅使用 S3 访问权限管控实例来完成此步骤。

步骤 2:配置 S3 Access Grants 实例的资源策略来授予跨账户访问权限

在您的账户 111122223333 中创建 S3 Access Grants 实例来进行跨账户访问后,请为您的账户 111122223333 中的 S3 Access Grants 实例配置基于资源的策略,来授予跨账户访问权限。S3 Access Grants 实例本身支持基于资源的策略。有了正确的基于资源的策略,您就可以向其它 AWS 账户中的 AWS Identity and Access Management(IAM)用户或角色授予对 S3 Access Grants 实例的访问权限。跨账户访问仅授予以下权限(操作):

  • s3:GetAccessGrantsInstanceForPrefix – 用户、角色或应用程序可以检索包含特定前缀的 S3 Access Grants 实例。

  • s3:ListAccessGrants

  • s3:ListAccessLocations

  • s3:ListCallerAccessGrants

  • s3:GetDataAccess – 用户、角色或应用程序可以根据通过 S3 Access Grants 向您授予的访问权限请求临时凭证。使用这些凭证可访问您已获得访问权限的 S3 数据。

您可以选择将其中哪些权限包含在资源策略中。S3 Access Grants 实例上的此资源策略是基于资源的普通策略,支持 IAM 策略语言支持的所有内容。在同一个策略中,例如,您可以使用 aws:PrincipalArn 条件向您的账户 111122223333 中的特定 IAM 身份授予访问权限,而不必使用 S3 Access Grants 执行此操作。相反,在您的 S3 Access Grants 实例中,您可以为您账户中的单个 IAM 身份以及其它账户创建授权。通过使用 S3 Access Grants 管理每个访问授权,您可以扩展权限。

如果您已经使用 AWS Resource Access Manager(AWS RAM),您可以使用它与其它账户或在您的组织内共享您的 s3:AccessGrants 资源。有关更多信息,请参阅使用共享的 AWS 资源。如果您不使用 AWS RAM,也可以使用 S3 Access Grants API 操作或 AWS Command Line Interface(AWS CLI)来添加资源策略。

我们建议您使用 AWS Resource Access Manager(AWS RAM)控制台与其它账户或在您的组织内共享您的 s3:AccessGrants 资源。要跨账户共享 S3 Access Grants,请执行以下操作:

要配置 S3 Access Grants 实例资源策略,请执行以下操作:
  1. 登录到AWS Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 从 AWS 区域选择器中选择 AWS 区域。

  3. 从左侧导航窗格中,选择 Access Grants

  4. 在 Access Grants 实例页面的此账户中的实例部分,选择共享实例。这会将您重定向至 AWS RAM 控制台。

  5. 选择创建资源共享

  6. 按照 AWS RAM 步骤创建资源共享。有关更多信息,请参阅 Creating a resource share in AWS RAM

要安装 AWS CLI,请参阅 AWS Command Line Interface 用户指南中的安装 AWS CLI

您可以使用 put-access-grants-instance-resource-policy CLI 命令添加资源策略。

如果您想将您的账户 111122223333 中对于 S3 Access Grants 的跨账户访问权限授予第二个账户 444455556666,则您的账户 111122223333 中 S3 Access Grants 实例的资源策略应向第二个账户 444455556666 授予执行以下操作的权限:

  • s3:ListAccessGrants

  • s3:ListAccessGrantsLocations

  • s3:GetDataAccess

  • s3:GetAccessGrantsInstanceForPrefix

在 S3 Access Grants 实例资源策略中,将 S3 Access Grants 实例的 ARN 指定为 Resource,而将第二个账户 444455556666 指定为 Principal。要使用以下示例,请将用户输入占位符 替换为您自己的信息。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "444455556666" }, "Action": [ "s3:ListAccessGrants", "s3:ListAccessGrantsLocations", "s3:GetDataAccess", "s3:GetAccessGrantsInstanceForPrefix" ], "Resource": "arn:aws:s3:us-east-2:111122223333:access-grants/default" } ] }

要添加或更新 S3 Access Grants 实例资源策略,可以使用以下命令。当您使用以下示例命令时,请将 user input placeholders 替换为您自己的信息。

例 添加或更新 S3 Access Grants 实例资源策略
aws s3control put-access-grants-instance-resource-policy \ --account-id 111122223333 \ --policy file://resourcePolicy.json \ --region us-east-2 { "Policy": "{\n \"Version\": \"2012-10-17\",\n \"Statement\": [{\n \"Effect\": \"Allow\",\n \"Principal\": {\n \"AWS\": \"444455556666\"\n },\n \"Action\": [\n \"s3:ListAccessGrants\",\n \"s3:ListAccessGrantsLocations\",\n \"s3:GetDataAccess\",\n \"s3:GetAccessGrantsInstanceForPrefix\",\n \"s3:ListCallerAccessGrants"\n ],\n \"Resource\": \"arn:aws:s3:us-east-2:111122223333:access-grants/default\"\n }\n ]\n }\n", "CreatedAt": "2023-06-16T00:07:47.473000+00:00" }
例 获取 S3 Access Grants 资源策略

您也可以使用 CLI 来获取或删除 S3 Access Grants 实例的资源策略。

要获取 S3 Access Grants 资源策略,请使用以下示例命令。要使用此示例命令,请将 user input placeholders 替换为您自己的信息。

aws s3control get-access-grants-instance-resource-policy \ --account-id 111122223333 \ --region us-east-2 { "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"arn:aws:iam::111122223333:root\"},\"Action\":[\"s3:ListAccessGrants\",\"s3:ListAccessGrantsLocations\",\"s3:GetDataAccess\",\"s3:GetAccessGrantsInstanceForPrefix\",\"s3:ListCallerAccessGrants\"],\"Resource\":\"arn:aws: s3:us-east-2:111122223333:access-grants/default\"}]}", "CreatedAt": "2023-06-16T00:07:47.473000+00:00" }
例 删除 S3 Access Grants 资源策略

要删除 S3 Access Grants 资源策略,请使用以下示例命令。要使用此示例命令,请将 user input placeholders 替换为您自己的信息。

aws s3control delete-access-grants-instance-resource-policy \ --account-id 111122223333 \ --region us-east-2 // No response body

您可以使用 PutAccessGrantsInstanceResourcePolicy API 添加资源策略。

如果您想将您的账户 111122223333 中对于 S3 Access Grants 的跨账户访问权限授予第二个账户 444455556666,则您的账户 111122223333 中 S3 Access Grants 实例的资源策略应向第二个账户 444455556666 授予执行以下操作的权限:

  • s3:ListAccessGrants

  • s3:ListAccessGrantsLocations

  • s3:GetDataAccess

  • s3:GetAccessGrantsInstanceForPrefix

在 S3 Access Grants 实例资源策略中,将 S3 Access Grants 实例的 ARN 指定为 Resource,而将第二个账户 444455556666 指定为 Principal。要使用以下示例,请将用户输入占位符 替换为您自己的信息。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "444455556666" }, "Action": [ "s3:ListAccessGrants", "s3:ListAccessGrantsLocations", "s3:GetDataAccess", "s3:GetAccessGrantsInstanceForPrefix" ], "Resource": "arn:aws:s3:us-east-2:111122223333:access-grants/default" } ] }

然后,您可以使用 PutAccessGrantsInstanceResourcePolicy API 来配置策略。

有关 REST API 支持更新、获取或删除 S3 Access Grants 实例的资源策略的信息,请参阅《Amazon Simple Storage Service API 参考》中的以下部分:

本节为您提供 AWS SDK 示例,说明如何配置 S3 Access Grants 资源策略来向第二个 AWS 账户授予访问您的某些 S3 数据的权限。

Java

添加、更新、获取或删除资源策略以管理对 S3 Access Grants 实例的跨账户访问。

例 添加或更新 S3 Access Grants 实例资源策略

如果您想将您的账户 111122223333 中对于 S3 Access Grants 的跨账户访问权限授予第二个账户 444455556666,则您的账户 111122223333 中 S3 Access Grants 实例的资源策略应向第二个账户 444455556666 授予执行以下操作的权限:

  • s3:ListAccessGrants

  • s3:ListAccessGrantsLocations

  • s3:GetDataAccess

  • s3:GetAccessGrantsInstanceForPrefix

在 S3 Access Grants 实例资源策略中,将 S3 Access Grants 实例的 ARN 指定为 Resource,而将第二个账户 444455556666 指定为 Principal。要使用以下示例,请将用户输入占位符 替换为您自己的信息。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "444455556666" }, "Action": [ "s3:ListAccessGrants", "s3:ListAccessGrantsLocations", "s3:GetDataAccess", "s3:GetAccessGrantsInstanceForPrefix" ], "Resource": "arn:aws:s3:us-east-2:111122223333:access-grants/default" } ] }

要添加或更新 S3 Access Grants 实例资源策略,请使用以下代码示例:

public void putAccessGrantsInstanceResourcePolicy() { PutAccessGrantsInstanceResourcePolicyRequest putRequest = PutAccessGrantsInstanceResourcePolicyRequest.builder() .accountId(111122223333) .policy(RESOURCE_POLICY) .build(); PutAccessGrantsInstanceResourcePolicyResponse putResponse = s3Control.putAccessGrantsInstanceResourcePolicy(putRequest); LOGGER.info("PutAccessGrantsInstanceResourcePolicyResponse: " + putResponse); }

响应:

PutAccessGrantsInstanceResourcePolicyResponse( Policy={ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "AWS": "444455556666" }, "Action": [ "s3:ListAccessGrants", "s3:ListAccessGrantsLocations", "s3:GetDataAccess", "s3:GetAccessGrantsInstanceForPrefix", "s3:ListCallerAccessGrants" ], "Resource": "arn:aws:s3:us-east-2:111122223333:access-grants/default" }] } )
例 获取 S3 Access Grants 资源策略

要获取 S3 Access Grants 资源策略,请使用以下代码示例。要使用以下示例命令,请将 user input placeholders 替换为您自己的信息。

public void getAccessGrantsInstanceResourcePolicy() { GetAccessGrantsInstanceResourcePolicyRequest getRequest = GetAccessGrantsInstanceResourcePolicyRequest.builder() .accountId(111122223333) .build(); GetAccessGrantsInstanceResourcePolicyResponse getResponse = s3Control.getAccessGrantsInstanceResourcePolicy(getRequest); LOGGER.info("GetAccessGrantsInstanceResourcePolicyResponse: " + getResponse); }

响应:

GetAccessGrantsInstanceResourcePolicyResponse( Policy={"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::444455556666:root"},"Action":["s3:ListAccessGrants","s3:ListAccessGrantsLocations","s3:GetDataAccess","s3:GetAccessGrantsInstanceForPrefix","s3:ListCallerAccessGrants"],"Resource":"arn:aws:s3:us-east-2:111122223333:access-grants/default"}]}, CreatedAt=2023-06-15T22:54:44.319Z )
例 删除 S3 Access Grants 资源策略

要删除 S3 Access Grants 资源策略,请使用以下代码示例。要使用以下示例命令,请将 user input placeholders 替换为您自己的信息。

public void deleteAccessGrantsInstanceResourcePolicy() { DeleteAccessGrantsInstanceResourcePolicyRequest deleteRequest = DeleteAccessGrantsInstanceResourcePolicyRequest.builder() .accountId(111122223333) .build(); DeleteAccessGrantsInstanceResourcePolicyResponse deleteResponse = s3Control.putAccessGrantsInstanceResourcePolicy(deleteRequest); LOGGER.info("DeleteAccessGrantsInstanceResourcePolicyResponse: " + deleteResponse); }

响应:

DeleteAccessGrantsInstanceResourcePolicyResponse()

步骤 3:向第二个账户中的 IAM 身份授予在您的账户中调用 S3 Access Grants 实例的权限

在 Amazon S3 数据的拥有者为账户 111122223333 中的 S3 Access Grants 实例配置跨账户策略后,第二个账户 444455556666 的拥有者必须为其 IAM 用户或角色创建基于身份的策略,并且拥有者必须向他们授予访问 S3 Access Grants 实例的权限。在基于身份的策略中,包括以下一项或多项操作,具体取决于在 S3 Access Grants 实例资源策略中授予的权限以及您要授予的权限:

  • s3:ListAccessGrants

  • s3:ListAccessGrantsLocations

  • s3:GetDataAccess

  • s3:GetAccessGrantsInstanceForPrefix

  • s3:ListCallerAccessGrants

按照 AWS 跨账户访问模式,第二个账户 444455556666 中的 IAM 用户或角色必须显式拥有此类权限中的一个或多个。例如,授予 s3:GetDataAccess 权限,以便 IAM 用户或角色可以在账户 111122223333 中调用 S3 Access Grants 实例来请求凭证。

要使用此示例命令,请将 user input placeholders 替换为您自己的信息。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetDataAccess", ], "Resource": "arn:aws:s3:us-east-2:111122223333:access-grants/default" } ] }

有关编辑基于 IAM 身份的策略的信息,请参阅《AWS Identity and Access Management 指南》中的 Editing IAM policies

步骤 4:在您的账户的 S3 Access Grants 实例中创建授权,来向第二个账户中的 IAM 身份授予访问您的某些 S3 数据的权限

对于最后的配置步骤,您可以在您账户 111122223333 中的 S3 Access Grants 实例中创建一个授权,来向第二个账户 444455556666 中的 IAM 身份授予访问您的账户中某些 S3 数据的权限。您可以使用 Amazon S3 控制台、CLI、API 和 SDK 实现此目的。有关更多信息,请参阅 创建授权

在授权中,指定第二个账户中 IAM 身份的 AWS ARN,并指定 S3 数据中您要授予访问权限的具体位置(存储桶、前缀或对象)。此位置必须已在 S3 Access Grants 实例中注册。有关更多信息,请参阅 注册位置。您可以选择指定子前缀。例如,如果您授予访问权限的位置是存储桶,并且您想进一步限制对该存储桶中特定对象的访问权限,则在 S3SubPrefix 字段中传递对象键名称。或者,如果您想使用以特定前缀(例如 2024-03-research-results/)开头的键名称来限制对存储桶中对象的访问权限,则传递 S3SubPrefix=2024-03-research-results/

以下是用于为第二个账户中的身份创建访问授权的 CLI 命令示例。请参阅创建授权了解更多信息。要使用此示例命令,请将 user input placeholders 替换为您自己的信息。

aws s3control create-access-grant \ --account-id 111122223333 \ --access-grants-location-id default \ --access-grants-location-configuration S3SubPrefix=prefixA* \ --permission READ \ --grantee GranteeType=IAM,GranteeIdentifier=arn:aws:iam::444455556666:role/data-consumer-1

配置跨账户访问后,第二个账户中的用户或角色可以执行以下操作: