【问题标题】:Cross account access for AWS accounts using Direct Connect使用 Direct Connect 对 AWS 账户进行跨账户访问
【发布时间】:2020-05-17 12:21:30
【问题描述】:

我已经与 AWS 合作多年,但我对一些高级网络概念不是很了解。

所以,我们有多个 AWS 账户。他们都没有公共互联网访问权限,但我们使用 Direct Connect 进行本地到 AWS 的连接。

我在账户 A 中有一个 S3 存储桶。 我在账户 A 中创建了一个 IAM 用户以及一个访问/密钥,并授予该 IAM 用户 s3:PutObject 对 S3 存储桶的权限。

我编写了一个简单的 Python 脚本来从本地列出此存储桶中的对象,它按预期工作。

然后我在账户 B 中运行的 EC2 实例上执行相同的 Python 脚本,我得到 “botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling ListObjects operation: Access Denied”。

我需要在账户 B 中为 S3 创建 VPC 端点吗?跨账户 IAM 角色是否在这里发挥作用?

【问题讨论】:

  • 您在帐户 B 中使用什么凭据?如果您使用来自 EC2 实例的权限,那么您需要代入具有所需权限的跨账户角色。从技术上讲,您可以使用账户 B 中的 EC2 实例在账户 A 中创建的访问/密钥,但不建议这样做。如果您在存储桶上有一个存储桶策略限制访问,除非您在 VPC 内,那么事情会变得有点复杂。
  • @JasonWadsworth 我没有在账户 B 中使用 EC2 实例角色。我在账户 A 中使用属于 IAM 用户的访问/密钥。通过此设置,我的访问被拒绝。除非您在 VPC 内,否则存储桶上没有限制访问的存储桶策略。
  • 您的存储桶策略是否设置为阻止公共访问?
  • docs.aws.amazon.com/AmazonS3/latest/user-guide/…。可能是您的问题是“仅限此账户的授权用户 – 访问权限与此账户中的 IAM 用户和角色以及 AWS 服务主体隔离,因为有一项授予公共访问权限的策略。”
  • 因为您使用的是来自账户 A 的凭证,所以是的,假设您没有限制访问特定 VPC 的存储桶策略。

标签: amazon-web-services amazon-s3 amazon-iam amazon-vpc


【解决方案1】:

你的情况是:

  • 您在 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 上的任何地方(包括您的家用计算机或手机)。重要的是拨打电话时提供的一组凭据。

如果您使用AWS Command-Line Interface (CLI) 拨打电话,则可以使用aws configure --profile user_a(或任何名称)将User-A 凭证保存为配置文件,然后在@987654333 中输入来自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 终端节点连接。

【讨论】:

  • 所以,这就是我仍然感到困惑的原因。当我从本地机器运行上述 Python 脚本时,我可以连接。我尝试从 Account-B 中的 EC2 实例运行完全相同的脚本(使用相同的访问/密钥),但访问被拒绝。再次重申,账户 A 和 B 都没有 IGW。他们使用 Direct Connect 连接。我需要查看 VPC 端点、S3 接入点等。
  • 互联网网关连接到 VPC,而不是帐户。您是否能够使用这些凭证从 EC2 实例中使用 AWS CLI?如果是这样,请尝试aws s3 ls 并查看所需的存储桶是否出现在列表中。这将表明正在使用的凭证是否与您期望的 AWS 账户相关联。
  • 我们能够将问题追溯到 VPC 端点上的奇怪策略。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 2020-01-20
相关资源
最近更新 更多