【问题标题】:Why does EMR in private subnet need full outbound internet access为什么私有子网中的 EMR 需要完整的出站 Internet 访问权限
【发布时间】:2021-05-12 19:50:31
【问题描述】:

以下链接上的 AWS 文档要求允许在私有子网中的集群的 EMR 主安全组上完全出站互联网访问。

https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-man-sec-groups.html#emr-sg-elasticmapreduce-master-private

但是,完全出站访问会带来风险。这种完整的出站互联网访问背后的基本原理是什么?

【问题讨论】:

  • 通常,系统需要访问 Internet 才能下载配置、驱动程序等。通常,您可以信任自己的系统具有 出站 访问权限,但最好阻止 入站访问。您是否有特别担心的风险?
  • 嗨@JohnRotenstein 感谢您的回复。没有特别的问题,但拥有完整的出站权限违反了客户的安全策略。我对开放此出站访问的理解是确保此服务正常工作,也许它在内部使用了一些其他 AWS 服务,这些服务表面上并不明显。我试图将其与 20 年 11 月的 Kinesis 事件联系起来,该事件最终缩小到 Kinesis 在内部依赖 Cognito 服务。
  • @JohnRotenstein 我的理解是,如果我查看文档,我们不需要在 VPC 中为此设置 IGW。 emr 服务执行此操作,还是我们需要 nat 或中转网关进行引导?我认为 emr 服务可以做到这一点。
  • @Akjpunia 我的理解是,如果我查看文档,我们在 VPC 中不需要 IGW。 emr 服务执行此操作,还是我们需要 nat 或中转网关进行引导?我认为 emr 服务可以做到这一点。

标签: amazon-web-services amazon-emr aws-security-group private-subnet


【解决方案1】:

以下是与 AWS 支持建立联系后我可以收集到的信息:

您的安全组上的出站规则仅适用于您的集群节点启动到外部 IP 的新连接(即任何 IP 而不是 localhost/它自己的私有 IP)。这就是为什么我们提供对出站连接的无限制访问的原因,因为它们是由节点本身发起的。

重要的是要了解,当您的集群启动时,它需要连接到 S3 以下载必要的 repos、上传/下载日志、集群信息等。此外,EMR 中的应用程序配置阶段包括成功配置许多内部服务/组件(如资源管理器、NameNode、节点管理器、DataNode等),它们都运行在集群本身不同的随机端口上,因此需要允许主从/核心节点之间的所有TCP通信安全团体。此外,主节点通过 SSL 进行大多数实例控制器通信和其他集群管理器组件以配置必要的软件并交换心跳信号,因此需要打开 443 和 80 端口。

此外,当集群添加或删除更多节点时,Hadoop 与不同的应用程序进行通信,每个应用程序都在自己的唯一端口以及不同的私有 IP 地址上运行。因此,我们无法提供可以为集群操作打开的特定端口列表,因为端口和协议要求会根据 EMR 集群上配置的应用程序而有所不同,并且如果节点无法运行,EMR 集群上的任务可能会失败相互通信或对所需端口(包括临时端口范围)的任何其他外部依赖项进行通信。

因此,请注意托管安全组出口规则的推荐配置为 0.0.0.0/0,尤其是在集群启动期间,因为限制它可能使 EMR 无法下载所需的应用程序,从而导致集群配置失败。

但是,我了解到您正在寻找最低推荐设置来配置“Amazon EMR 托管安全组”上的出站规则,而不是 0.0.0.0/0(所有流量),因为这可能会带来安全风险。

强烈建议不要在集群启动期间进行任何更改。即使在启动集群之后,如果未正确配置出站安全组规则,也可能会产生问题。您可以在集群启动成功后更新安全组规则。但以下是我们在这样做之前需要考虑的几件事 -

不建议在集群启动期间进行任何更改:

  1. 允许来自主节点和从节点安全组的所有 TCP、UDP、ICMP v4 流量相互发送,以便它们能够相互成功通信。
  2. 根据您的用例场景使用 EMR 时,EMR 节点将与 S3、Dynamo DB、VPC、KMS 端点等服务的端点对话,并与 AWS 端点对话,它需要出站 HTTP 和 HTTPS 连接。因此,您应该拥有 S3 终端节点、DynamoDB 终端节点、KMS 终端节点等,具体取决于附加到 VPC 的用例,然后在主和从托管安全组的出站规则中明确允许 HTTP 和 HTTPS 连接到这些终端节点。
  3. 在出站规则中,应允许所有流量流向您正在运行集群的区域的 s3 端点,以便从 s3 获取 EMR 所需的包。
  4. 如果您在 EMR 中启用调试,则应将该区域的 SQS 端点 CIDR 范围添加到出站规则中。
  5. 如果启用了 EMRFS 一致视图,则应将 DynamoDB 终端节点 CIDR 范围添加到出站出口规则中。
  6. 除此之外,根据您的应用程序特定要求,您可以根据要求添加任何其他端口。

因此,一旦集群成功启动,您可以尝试根据您的用例场景限制出站规则,它可能看起来像 -

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 包括 All TCP、UDP、ICMP v4 到从节点安全组和主节点安全组。对于任何其他应用程序特定要求,您可以根据要求添加任何其他端口。

另外请注意,准确定位 EMR 集群中需要哪些路由是一个非常困难的过程,因为移动部件太多,因此不建议这样做。我们无法准确概述您对特定集群所需的规则是什么,因为每个集群都因所使用的应用程序和集成而异。如果您绝对需要这样做,则需要在 EMR 子网中的所有 ENI 上启用 VPC 流日志,并使用 CloudWatch Logs Insights 或 Athena 浏览它们(如果您要推送到 S3)。

我强烈建议您先在开发环境中测试更改安全组配置,然后再在生产环境中进行。

【讨论】:

    【解决方案2】:

    该文档说,如果您不提供完整的出站访问,则最低要求是为“私有子网中服务访问的托管安全组的组 ID”提供 TCP 9443。

    这意味着实例将需要与 Amazon EMR“服务”进行通信,很可能是为了建立一个可以接收命令以运行作业的连接。

    【讨论】:

      猜你喜欢
      • 2018-09-15
      • 2011-01-23
      • 2015-01-26
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      • 1970-01-01
      相关资源
      最近更新 更多