使用 Direct Connect 对 AWS 账户进行跨账户访问
Cross account access for AWS accounts using Direct Connect
我已经使用 AWS 多年,但我对一些高级网络概念不是很了解。
所以,我们有多个 AWS 账户。 None 他们有 public 互联网访问权限,但我们使用 Direct Connect 进行本地到 AWS 连接。
我在账户 A 中有一个 S3 存储桶。
我在账户 A 中创建了一个 IAM 用户以及一个 access/secret 密钥,并授予该 IAM 用户 s3:PutObject 对 S3 存储桶的权限。
我编写了一个简单的 Python 脚本来从本地列出此存储桶中的对象,它按预期工作。
然后我在账户 B 中的 EC2 实例 运行 上执行相同的 Python 脚本,我得到 "botocore.exceptions.ClientError: An error occured (AccessDenied) when calling the ListObjects operation: Access Denied".
我是否需要为账户 B 中的 S3 创建 VPC 端点?跨账户 IAM 角色在这里发挥作用吗?
您的情况是:
- 您在
Account-A
中有一个 Amazon S3 Bucket-A
- 您在
Account-A
中有一个 IAM 用户 (User-A
)
- 您在
Account-B
中有一个 Amazon EC2 实例 运行
- 您希望从该 EC2 实例访问
Bucket-A
- 您似乎还可以让 EC2 实例访问 Amazon S3 端点以进行 API 调用
假设该实例能够到达 Amazon S3(这似乎是真的,因为错误消息指的是权限,这可能来自 S3),有两种方法可以验证访问 Bucket-A
:
选项 1:使用账户 A 中的 IAM 用户
从 EC2 实例调用 Bucket-A
时,使用在 Bucket-A 中创建的 IAM 凭据。请求来自 Account-B
中的 Amazon EC2 实例并不重要。事实上,Amazon S3 甚至不知道这一点。 API 呼叫可以来自 Internet 上的任何地方(包括您的家用计算机或手机 phone)。重要的是调用时提供的一组凭据。
如果您使用 AWS Command-Line Interface (CLI) 拨打电话,则可以使用 aws configure --profile user_a
(或任何名称)将 User-A
凭据保存为配置文件,然后输入来自 Account-A
中 IAM 用户的凭证。然后,使用 aws s3 ls --profile user_a
访问 Amazon S3。使用这样的配置文件可以让您在凭据之间切换。
选项 2:使用存储桶策略
Amazon S3 还可以在存储桶上指定存储桶策略,该策略可以授予对存储桶的访问权限。因此,如果 EC2 实例使用来自 Account-B
的凭据,您可以添加一个存储桶策略,以授予来自这些 Account-B
凭据的访问权限。
假设 Amazon EC2 实例是使用名为 role-b
的 IAM 角色启动的,那么您可以使用这样的存储桶策略:
{
"Version": "2008-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<Account-B>:role/role-b"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket-a/*"
}
]
}
免责声明: 以上所有假设您的 VPC 端点/Amazon S3 访问点上没有任何奇怪的策略,或者 VPC 正在与 Amazon S3 连接端点。
我已经使用 AWS 多年,但我对一些高级网络概念不是很了解。
所以,我们有多个 AWS 账户。 None 他们有 public 互联网访问权限,但我们使用 Direct Connect 进行本地到 AWS 连接。
我在账户 A 中有一个 S3 存储桶。 我在账户 A 中创建了一个 IAM 用户以及一个 access/secret 密钥,并授予该 IAM 用户 s3:PutObject 对 S3 存储桶的权限。
我编写了一个简单的 Python 脚本来从本地列出此存储桶中的对象,它按预期工作。
然后我在账户 B 中的 EC2 实例 运行 上执行相同的 Python 脚本,我得到 "botocore.exceptions.ClientError: An error occured (AccessDenied) when calling the ListObjects operation: Access Denied".
我是否需要为账户 B 中的 S3 创建 VPC 端点?跨账户 IAM 角色在这里发挥作用吗?
您的情况是:
- 您在
Account-A
中有一个 Amazon S3 - 您在
Account-A
中有一个 IAM 用户 ( - 您在
Account-B
中有一个 Amazon EC2 实例 运行
- 您希望从该 EC2 实例访问
Bucket-A
- 您似乎还可以让 EC2 实例访问 Amazon S3 端点以进行 API 调用
Bucket-A
User-A
)
假设该实例能够到达 Amazon S3(这似乎是真的,因为错误消息指的是权限,这可能来自 S3),有两种方法可以验证访问 Bucket-A
:
选项 1:使用账户 A 中的 IAM 用户
从 EC2 实例调用 Bucket-A
时,使用在 Bucket-A 中创建的 IAM 凭据。请求来自 Account-B
中的 Amazon EC2 实例并不重要。事实上,Amazon S3 甚至不知道这一点。 API 呼叫可以来自 Internet 上的任何地方(包括您的家用计算机或手机 phone)。重要的是调用时提供的一组凭据。
如果您使用 AWS Command-Line Interface (CLI) 拨打电话,则可以使用 aws configure --profile user_a
(或任何名称)将 User-A
凭据保存为配置文件,然后输入来自 Account-A
中 IAM 用户的凭证。然后,使用 aws s3 ls --profile user_a
访问 Amazon S3。使用这样的配置文件可以让您在凭据之间切换。
选项 2:使用存储桶策略
Amazon S3 还可以在存储桶上指定存储桶策略,该策略可以授予对存储桶的访问权限。因此,如果 EC2 实例使用来自 Account-B
的凭据,您可以添加一个存储桶策略,以授予来自这些 Account-B
凭据的访问权限。
假设 Amazon EC2 实例是使用名为 role-b
的 IAM 角色启动的,那么您可以使用这样的存储桶策略:
{
"Version": "2008-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<Account-B>:role/role-b"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket-a/*"
}
]
}
免责声明: 以上所有假设您的 VPC 端点/Amazon S3 访问点上没有任何奇怪的策略,或者 VPC 正在与 Amazon S3 连接端点。