AWS VPC Endpoint SecurityGroupEgress 规则

Tob*_*ins 4 amazon-web-services amazon-vpc

我正在尝试使用 AWS VPC 终端节点来访问 S3 资源,但没有运气。你能帮忙吗?

细节:

我在安全组中有一个 EC2 实例。它位于 VPC 和子网内,具有互联网端点和 0.0.0.0/0 的路由表条目。但是,我不希望这个特定的 EC2 实例能够与互联网通信,但我确实希望它能够与位于https://s3-eu-west-1.amazonaws.com的 S3 存储桶通信/XXXXX/YYYYYY.sh

作为回应,我重载了 securityGroup 上的默认允许出口规则,因此通过向端口 22 添加出口规则来拒绝出站连接。亚马逊文档告诉我,本地(私有)AWS 地址仍将被允许。考虑到这一点,我在我的 VPC 中添加了一个 VPC 终端节点,并使用 pl-6da54004 (com.amazonaws.eu-west-1.s3) :: vpce-9f47a1f6 更新了我的路由表。

完成此操作后,我无法从 EC2 实例中访问我的 S3 资源。我尝试 wget https://s3-eu-west-1.amazonaws.com/XXXXX/YYYYYY.sh没有运气。

你知道有什么问题吗?我的想法是:

  • 我的 ec2 实例似乎将 S3 域解析为 54.231.130.244,但这对于每个实例都不同。我是否需要为 S3 IP 范围添加 securityGroupEgress 规则或路由?如果是,范围是多少?
  • 也许我应该通过不同的域名访问我的 S3 资源,而不是解析为内部 IP 地址?

谢谢你,托比

Mic*_*bot 8

首先,介绍一下背景。VPC 实例的 DNS 解析器是一个内置于基础架构中的虚拟组件。它不受出站安全组规则的影响……但是当您为 VPC 配置 S3 终端节点时,S3 终端节点的主机名解析不会改变。

S3 的 VPC 终端节点的作用是几件不同的事情。了解这些东西是什么是了解它是否会满足您的需求的关键。tl; dr:在这种情况下,它会。

首先,您会注意到它们在路由表中被配置为“前缀列表”。VPC 终端节点采用一组预定义的 IPv4 网络前缀,并为每个包含相应前缀列表的路由表劫持到这些前缀的路由,以便您到任何这些网络的流量将遍历 VPC 终端节点而不是 Internet 网关和任何中间 NAT 实例。

从本质上讲,这开辟了一条从您的 VPC 到 AWS 服务的 IP 地址范围的新路径……但是,这些 IP 地址最初将您带到的位置与没有 VPC 终端节点时将您带到的位置相同。

您点击的第一个位置看起来很像 S3,但它与面向 Internet 的 S3 不同,因为它了解您的 VPC 终端节点的策略,因此您可以控制哪些存储桶和操作可访问。这些不会覆盖其他策略,它们会增强它们。

终端节点策略不会覆盖或替换 IAM 用户策略或 S3 存储桶策略。它是一个单独的策略,用于控制从端点到指定服务的访问。但是,所有类型的策略(IAM 用户策略、终端节点策略、S3 策略和 Amazon S3 ACL 策略(如果有))都必须授予必要的权限才能成功访问 Amazon S3。

http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-endpoints.html#vpc-endpoints-access

请注意,如果您不使用适当的策略限制存储桶访问,而是启用完全访问,则如果存储桶的策略允许,实例将能够访问 S3 区域中的任何存储桶,包括公共存储桶。

现在,棘手的部分。如果您的实例的安全组由于默认的“允许”规则已被删除而不允许出站访问 S3,您可以使用特制的安全组规则允许实例通过 VPC 终端节点访问 S3:

向安全组添加新的出站规则。对于“类型”,选择 HTTPS。对于目的地,选择“自定义 IP”。

该文档与我在控制台中看到的不一致:

目标列表显示可用 AWS 服务的前缀列表 ID 和名称。

http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-endpoints.html#vpc-endpoints-security

嗯...不,它没有。不适合我,至少,在撰写本文时不适合。

解决方案是选择“自定义 IP”,然后在 IP 地址框中键入 VPC 终端节点的前缀列表 ID,而不是 IP 地址块或安全组 ID pl-xxxxxxxx。您可以在 VPC 控制台中通过查看与 VPC 终端节点关联的子网之一中的目标来找到它。

  • 前缀列表仅针对每个服务和区域,它们独立于 VPC 终端节点和您的帐户而存在:您可以使用例如“aws ec2 describe-prefix-lists”来获取它们。该 ID 可以安全嵌入 - 例如,`com.amazonaws.us-west-1.s3` 始终为 `pl-6ba54002`。您可以使用 cloudformation 地图来避免将其作为参数传递。 (4认同)
  • 我已经向 AWS 支持人员确认,在 CloudFormation 中不可能一次完成这一切。不幸的是,无法通过 CloudFormation 获取前缀列表 ID,这是我想要做的,因为 AWS::EC2::VPCEndpoint 的返回值是端点本身的资源 ID,而不是前缀列表 ID。为了解决这个问题,我在我的 VPC 堆栈中使用了一个条件,如果它被传入,它只创建出口规则。所以我运行一次以使用端点设置 VPC,然后使用新的前缀列表参数再次手动运行它. (2认同)