跳至内容

如何通过仅限于 VPC 的 S3 接入点访问另一个账户中的存储桶?

3 分钟阅读
0

我的 AWS Identity and Access Management(AWS IAM) 实体和 Amazon Simple Storage Service (Amazon S3) 存储桶位于不同的 AWS 账户中。我想通过 Amazon S3 接入点授予 IAM 实体跨账户访问存储桶的权限。接入点仅限于 Amazon Virtual Private Cloud (Amazon VPC)。

简短描述

您可以通过仅限于 Amazon VPC 的 S3 接入点授权某 AWS 账户中的 IAM 角色或用户对另一个 AWS 账户的 Amazon S3 存储桶的访问权限。

假设 IAM 实体在账户 A 中,S3 存储桶在账户 B 中。要通过仅限于 Amazon VPC 的 S3 接入点授予 IAM 实体访问存储桶的权限,请完成以下步骤:

  1. 在账户 B 中创建一个 Amazon S3 接入点并将其附加到存储桶。
  2. 在账户 A 中创建 Amazon S3 VPC 网关端点。
  3. 将策略附加到接入点、存储桶和 IAM 实体。

**注意:**账户 A 中的 IAM 身份必须与账户 B 中的 S3 存储桶位于同一 AWS 区域中。

解决方法

在账户 B 中创建一个 Amazon S3 接入点并将其附加到存储桶

要创建一个 Amazon S3 接入点并将其附加到账户 B 中的存储桶,请完成以下步骤:

  1. 打开 Amazon S3 控制台
  2. 在导航窗格中,选择接入点
  3. 选择创建接入点
  4. 接入点名称中,输入接入点的名称。有关如何命名接入点的更多信息,请参阅 Amazon S3 接入点的命名规则
  5. 对于存储桶名称选择选择此账户中的存储桶,然后输入要附加接入点的存储桶名称。
  6. 对于网络来源,选择**虚拟私有云 (VPC) **。
  7. 对于 VPC ID,请输入其他 AWS 账户(账户 A)的 VPC ID。
  8. 在**“阻止此接入点的公共访问设置”**下,选择要应用于该接入点的阻止公共访问设置。
    **注意:**创建接入点后,您无法更改接入点的屏蔽公共访问设置。
  9. 接入点策略留空。
  10. 选择创建接入点

在账户 A 中创建 Amazon S3 VPC 网关端点

要在账户 A 中创建 S3 VPC 网关端点以授予对账户 B 中的 Amazon S3 存储桶的访问权限,请完成以下步骤:

  1. 打开 Amazon VPC 控制台
  2. 在导航窗格中,选择端点
  3. 选择创建端点
  4. 对于服务类别,选择 AWS 服务
  5. 对于服务,添加筛选条件类型 = 网关,然后选择 ** com.amazonaws.<region>.s3**。
  6. 对于 VPC,选择用于在账户 B 中创建接入点的 VPC。
  7. 对于路由表,选择需要端点使用的路由表。
  8. 对于策略,选择完全访问权限,以允许所有主体在 VPC 端点上对所有资源执行所有操作。或者,选择自定义,并使用您自己的策略来允许所需的 S3 操作。

例如,以下 VPC 端点策略允许对所有存储桶执行所有 S3 操作:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:*"
    }
  ]
}

**注意:**网关端点不允许从其他 AWS 区域进行访问。

将策略附加到接入点、存储桶和 IAM 实体

要授予账户 A 中的 IAM 实体通过接入点访问账户 B 中的存储桶的权限,必须将策略附加到以下各项:

  • 接入点
  • S3 存储桶
  • IAM 实体

接入点策略

要向账户 A 中的 IAM 实体授予对账户 B 中 S3 接入点的权限,请将以下策略附加到您的接入点:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DelegateControlToAccessPoint",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::AccountA-ID:user/user1",
          "arn:aws:iam::AccountA-ID:role/role01"
        ]
      },
      "Action": [
        "s3:ListBucket",
        "s3:PutObject",
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:us-east-2:AccountB-ID:accesspoint/my-acess-point/object/*",
        "arn:aws:s3:us-east-2:AccountB-ID:accesspoint/my-access-point"
      ]
    }
  ]
}

存储桶策略

要向账户 A 中的 IAM 实体授予通过接入点访问账户 B 中存储桶的权限,请将以下策略附加到您的存储桶:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowCrossAccountAccess",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::AccountA-ID:user/user1",
          "arn:aws:iam::AccountA-ID:role/role01"
        ]
      },
      "Action": [
        "s3:GetObject",
        "s3:ListBucket",
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::my-bucket",
        "arn:aws:s3:::my-bucket/*"
      ],
      "Condition": {
        "StringEquals": {
          "s3:DataAccessPointArn": "arn:aws:s3:us-east-2:AccountB-ID:accesspoint/my-access-point"
        }
      }
    }
  ]
}

IAM 策略

要向账户 A 中的 IAM 实体授予对账户 B 中的存储桶和接入点的权限,请将以下策略附加到您的 IAM 实体:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowCrossAccountAccessToBucketAndAP",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:PutObject",
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:us-east-2:AccountB-ID:accesspoint/my-access-point",
        "arn:aws:s3:us-east-2:AccountB-ID:accesspoint/my-access-point/object/*",
        "arn:aws:s3:::my-bucket",
        "arn:aws:s3:::my-bucket/*"
      ]
    }
  ]
}

通过接入点对存储桶执行 S3 操作的 AWS CLI 示例命令

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

要通过接入点列出对象,请运行 ls 命令:

aws s3 ls arn:aws:s3:us-east-2:AccountB-ID:accesspoint/my-access-point

要通过接入点上传文件,请运行 cp 命令:

aws s3 cp file.txt s3://arn:aws:s3:us-east-2:AccountB-ID:accesspoint/my-access-point

也可以使用 cp 命令通过接入点下载文件:

aws s3 cp s3://arn:aws:s3:us-east-2:AccountB-ID:accesspoint/my-access-point file.txt

**注意:**该请求必须来自与存储桶位于同一 VPC 和相同区域的 Amazon Elastic Compute Cloud (Amazon EC2) 实例。

AWS 官方已更新 1 年前