2017-08-13 34 views
4

我正在测试Erlang并且有几个与分发安全相关的问题。 (这里有很多混合的信息)这些类型的问题带有许多与情况有关的意见,并取决于您处理的数据类型的个人舒适度。为了这个问题,我们假设它是一个简单的聊天服务器,用户可以在这里连接并聊天。如何在私有子网后面保护Erlang群集

示例图:enter image description here

群集将与弹性负载平衡引导所有连接到这些节点(和从)一专用子网VPC后面。弹性负载平衡将是通向这些节点的唯一直接路径(将无法通过名称@ privatesubnet连接到节点)。

我的问题是:

在此基础上自问自答:Distributed erlang security how to?

有两种不同类型的可发生的内部沟通。要么使用内置功能直接连接节点,要么使用自定义协议通过TCP连接执行所有操作。第一个是最简单的,但我认为它带有一些安全问题,我想知道是基于上面的图表是否足够好(呃,好的,处理敏感信息时不够好,但总是可以有更好的方式去做所有事情......)

你如何保护和私人子网后面的Erlang集群?我想隐藏节点,并手动连接它们,当然在它们上使用cookie。这种方法有缺陷吗?而且由于使用TCP的自定义协议将是最佳选择,因此对性能有何种影响?我想知道潜在的安全漏洞(正如我所说的,关于如何做到这一点,有很多混杂的信息)。

我会对以这种方式使用Erlang的人有兴趣!

回答

1

在AWS上,您的EC2节点位于私有子网中,您可以安全地避免与节点的不必要连接。您可以通过尝试连接(以任何方式)连接到运行代码的计算机来验证这一点:如果您使用的是私有子网,您将无法这样做,因为实例在子网之外甚至都不可寻址。

您的负载均衡器不应该转发Erlang节点流量。

您可以使用一些安全组规则做比上述更好的一点。配置您的节点以使用some range of ports。然后创建一个“erlang”组,允许从“erlang”组连接到该端口范围,否则拒绝连接。最后,将该安全组分配给所有Erlang运行的实例。这可以防止不需要与Erlang交谈的实例能够这样做。

+0

当你说:“你可以使用一些安全组规则做比上述更好的一点。”你的意思是保持群集公开面向子网?使用ELB(或可能的路由53私有区域),是将这些实例保留在私有子网中,是否有更好的方法?另外,如何在不使用ELB的情况下将流量路由回所连接的客户端?使用NAT网关?谢谢! – Mike5050

+0

不,请保留私人子网,但_add_ SGs。这样,如果子网中的非erlang实例受到损害,则无法访问群集。这是一个特例,但它是一个很好的纪律IMO。如果您需要连接到群集以进行调试,请访问专用子网(VPN或SSH跳转框)并允许私有IP访问“erlang”SG。 –

+0

没关系!你是什​​么意思:“你的负载均衡器不应该转发Erlang节点流量。”谢谢!这有很大帮助。 – Mike5050

1

我认为你在那里有一个非常“经典”的设置。

你不会从互联网连接到集群 - ELB的“外部”。假设“私人”子网共享其他内容,则只能通过EPMD连接某些IP(或范围)。

在任何情况下,一些机器必须通过EPMD“可信”连接,而其他一些机器只能建立到其他某个端口的连接......否则任何运行你的Erlang群集的东西都是无用的。

需要思考的是:您可能想要(并且确实必须)连接到群集,以便从互联网或其他地方执行一些“管理任务”。我已经通过SSH看到了这一点; Erlang支持即装即用。

最后一个字做的一切了一个自定义协议一个TCP连接时,请不要,你会最终达到实现你自己的东西,几乎没有什么二郎优惠,以及它在真正真棒。最后,你会有相同的限制。

+0

当你说“你可以只允许某些IP(或范围)通过EPMD连接”。你的意思是添加一个网关并限制通过防火墙访问? (白名单)我的其他想法之一还包括管理任务和外部应用程序,这些应用程序连接到集群并执行一些正常ELB连接无法执行的操作(如检索/删除/验证敏感信息)。所以还需要有一些需要信任的IP。 Erlang的主要担忧是禁止用户直接连接到节点。 – Mike5050