问题描述
以下链接中的 AWS 文档要求允许对私有子网中集群的 EMR 主安全组进行完全出站互联网访问。
然而,完全出站访问会带来风险。这种完全出站互联网访问背后的基本原理是什么?
解决方法
以下是我与 AWS 支持人员联系后可以收集的信息:
您的安全组上的出站规则仅适用于您的集群节点启动与外部 IP(即任何 IP 而不是 localhost/其自己的私有 IP)的新连接时。这就是为什么我们提供对出站连接的无限制访问的原因,因为它们是由节点本身发起的。
重要的是要了解,当您的集群启动时,它需要连接到 S3 以下载必要的存储库、上传/下载日志、集群信息等。此外,EMR 中的应用程序配置阶段包括成功配置许多内部服务/组件(例如资源管理器、NameNode、节点管理器、DataNode 等),它们都在集群本身内的不同随机端口上运行,因此有必要允许主从/核心节点之间的所有 TCP 通信安全组。此外,主节点通过 SSL 通信,用于大多数实例控制器通信和其他集群管理器组件,以配置必要的软件并交换心跳信号,因此需要打开 443 和 80 端口。
此外,Hadoop 与不同的应用程序对话,其中每个应用程序都运行在自己独特的端口以及不同的私有 IP 地址上,因为集群会添加或删除更多节点。因此,我们无法提供可以为集群操作打开的特定端口的列表,因为端口和协议要求确实会因 EMR 集群上配置的应用程序而异,如果节点不可用,EMR 集群上的任务可能会失败相互通信或与所需端口(包括临时端口范围)的任何其他外部依赖关系。
因此,请注意托管安全组出口规则的推荐配置为 0.0.0.0/0,尤其是在集群启动期间,因为限制它可能使 EMR 无法下载所需的应用程序,从而导致集群供应失败。
>但是,我了解您正在寻找最低推荐设置,以在“Amazon EMR 托管安全组”而不是 0.0.0.0/0(所有流量)上配置出站规则,因为这可能会带来安全风险。
强烈建议在集群启动期间不要进行任何更改。即使在启动集群之后,如果出站安全组规则配置不正确,也可能会产生问题。集群启动成功后,您可以更新安全组规则。但以下是我们在此之前需要考虑的几件事 -
不建议在集群启动期间进行任何更改:
- 允许来自主节点和从节点安全组的所有 TCP、UDP、ICMP v4 流量相互传输,以便它们能够成功地相互通信。
- 根据您的用例场景使用 EMR 时,EMR 节点将与 S3、Dynamo DB、VPC、KMS 等服务的端点通信,并与 AWS 端点通信,它需要出站 HTTP 和 HTTPS 连接。因此,您应该拥有 S3 端点、DynamoDB 端点、KMS 端点等,具体取决于附加到 VPC 的用例,然后在主管理和从管理安全组的出站规则中明确允许 HTTP 和 HTTPS 连接到这些端点。
- 在出站规则中,应允许所有流量到达您正在运行集群的区域的 s3 端点,以便从 s3 获取 EMR 所需的包。
- 如果您在 EMR 中启用调试,则应将该区域的 SQS 端点 CIDR 范围添加到出站规则中。
- 如果启用了 EMRFS 一致视图,则应将 DynamoDB 终端节点 CIDR 范围添加到出站出口规则。
- 除此之外,根据您的应用程序特定要求,您可以根据要求添加任何其他端口。
因此,一旦集群成功启动,您可以尝试根据您的用例场景限制出站规则,它看起来像 -
ElasticMapReduce-master 配置的出站规则:
Type Protocol Port Range Destination
HTTP TCP 80 0.0.0.0/0
HTTPS TCP 443 0.0.0.0/0
AllTraffic TCP 0 - 65535 ElasticMapReduce-master security group ID
AllTraffic TCP 0 - 65535 ElasticMapReduce-slave security group ID
ElasticMapReduce-slave 配置的出站规则:
Type Protocol Port Range Destination
HTTP TCP 80 0.0.0.0/0
HTTPS TCP 443 0.0.0.0/0
AllTraffic TCP 0 - 65535 ElasticMapReduce-master security group ID
AllTraffic TCP 0 - 65535 ElasticMapReduce-slave security group ID
注意:AllTraffic 包括所有 TCP、UDP、ICMP v4 到从节点安全组和主节点安全组。对于任何其他特定于应用程序的要求,您可以根据要求添加任何其他端口。
另请注意,准确指出 EMR 集群中需要哪些路由是一个非常困难的过程,因为有太多活动部件,这就是为什么不推荐这样做的原因。我们无法准确概述您对特定集群所需的规则,因为每个集群都因所使用的应用程序和集成而异。如果您绝对需要这样做,则需要在 EMR 子网中的所有 ENI 上启用 VPC 流日志,并使用 CloudWatch Logs Insights 或 Athena(如果您要推送到 S3)来检查它们。
我强烈建议请先在开发环境中测试更改安全组配置,然后再在生产环境中进行更改。
,该文档说,如果您不提供完整的出站访问权限,则最低限度是向“用于私有子网中服务访问的托管安全组的组 ID”提供 TCP 9443。
这意味着实例将需要与 Amazon EMR“服务”通信,很可能是为了建立可以接收命令以运行作业的连接。