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

3 分钟阅读
0

我在不同的 AWS 账户中有一个 AWS Identity and Access Management(IAM)实体和存储桶。我想使用仅限于 Amazon Virtual Private Cloud(Amazon VPC)的 Amazon Simple Storage Service(Amazon S3)接入点授予 IAM 实体对存储桶的跨账户存取权限。

解决方法

要使用仅限于 Amazon VPC 的 S3 接入点授予 AWS 账户(账户 A)中的 IAM 角色或用户访问另一个 AWS 账户(账户 B)中的 Amazon S3 存储桶的权限,请执行以下操作:

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

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

  1. 打开 Amazon S3 控制台
  2. 在导航窗格中,选择 Access Points(接入点)。
  3. 选择 Create access point(创建接入点)。
  4. Access point name(接入点名称)中,输入接入点的名称。有关更多信息,请参阅命名 Amazon S3 接入点的规则
  5. Bucket name(存储桶名称)中,输入您要附加接入点的账户 B 中的存储桶的名称。
  6. Network Origin(网络源)选择 Virtual Private Cloud (VPC) [虚拟私有云(VPC)]。
  7. 对于 VPC ID,输入第一个 AWS 账户(账户 A)的 VPC ID。
  8. Block Public Access settings for this Access Point(此接入点的阻止公共访问设置)下,选择要应用于接入点的阻止公共访问设置。 
    注意:Amazon S3 目前不支持在接入点创建后更改接入点的阻止公共访问设置。
  9. Access Point policy(接入点策略)留空。
  10. 选择 Create access point(创建接入点)。

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

在初始 AWS 账户(账户 A)中创建 S3 网关 VPC 端点,该端点与您授予跨账户存取权限的存储桶位于同一区域。

  1. 打开 Amazon VPC 控制台
  2. 在导航窗格中,选择 Endpoints(端点)。
  3. 选择 Create endpoint(创建端点)。
  4. 对于 Service category(服务类别),选择 AWS services(AWS 服务)。
  5. 对于 Services(服务),添加筛选条件 Type: Gateway(类型:网关)并选择用于创建接入点的相同区域。
  6. 对于 VPC,选择用于创建接入点的相同 VPC。
  7. 对于 Route tables(路由表),选择端点要使用的路由表。
  8. 选择 Full access(完全访问)策略。或者,选择 Custom(自定义)并确保策略允许所需的 S3 操作。

注意:网关端点不允许来自其他 AWS 区域的访问。以下是允许对所有存储桶执行所有 S3 操作的 VPC 端点策略示例:

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

附加接入点、存储桶和 IAM policy

要允许初始 AWS 账户(账户 A)的 IAM 实体通过接入点跨账户存取另一个 AWS 账户(账户 B)的存储桶,您必须从接入点、存储通和 IAM policy 授予权限。以下是为每个实体授予所需权限的策略。

接入点策略

{
 "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"
  ]
 }]
}

注意:此策略向来自源 AWS 账户(账户 A)的 IAM 用户或角色授予访问目标 AWS 账户(账户 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"
   }
  }
 }]
}

注意:此策略使用接入点向源 AWS 账户(账户 A)的 IAM 用户授予访问存储桶(账户 B)的权限。

IAM policy: 

{
 "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/*"
  ]
 }]
}

注意:附加到源 AWS 账户(账户 A)的 IAM 角色或用户的此 IAM policy 向目标 AWS 账户(账户 B)的存储桶和接入点授予权限。

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

**注意:**如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

列出:

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

上传:

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

下载:

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 官方
AWS 官方已更新 1 年前