使用 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 连接端点。