【发布时间】:2021-03-20 21:43:31
【问题描述】:
背景:
我正在尝试在 Elixir 中编写一个程序,通过在一组进程上运行分布式算法并记录某些统计数据来测试分布式算法。首先,我将在同一台机器上运行这些进程,但最终目的是让它们在不同的机器/VM 上运行。
问题:
我希望实现的算法要求之一是消息包括身份验证。也就是说,每当一个进程向另一个进程发送消息时,接收者应该能够验证该消息确实来自发送者,并且不是由另一个进程伪造的。下面的 sn-ps 应该有助于说明这个想法:
# Sender
a = authenticate(self, receiver, msg)
send(receiver, {msg, self, a})
# Receiver
if verify(msg, sender, a) do
deliver(msg)
end
到目前为止的想法:
我已经广泛搜索了 Elixir 进程之间经过身份验证的通信的任何文档,但没有找到任何东西。也许在某种程度上,这已经在幕后为我完成了,但到目前为止我还无法验证这一点。如果是这样,我想知道当进程不在同一台机器上运行时它是否仍然正确。
我已经研究过使用 SSL/TLS 函数 provided by Erlang 的可能性,但由于我在这方面的知识有限,我不确定这将如何适用于我运行一组进程的情况,而不是在客户端-服务器系统和 HTTPS 中更标准的使用。如果我走这条路,我相信我必须事先自己设置所有密钥和签名,我相信这可以使用X509 Elixir package,尽管我不确定这是否合适并且可能比是必须的。
总结:
- 是否有标准/预先存在的方式来实现 Elixir 中进程之间的经过身份验证的通信?
- 如果是,它是否适合在不同机器/VM 之间进行通信的进程?
- 如果以上任何一项都不是,我自己可以实现这一目标的最简单方法是什么?
【问题讨论】:
-
你为什么不首先信任来自同一个 ErlangVM/集群运行的其他 erlang 进程的消息?
-
@AlekseiMatiushkin 的观点是正确的,我认为。一旦你将 ErlangVM 连接到集群中,它们就可以相互访问。特别是可以在一个上执行任意代码。我想说你应该确保虚拟机本身之间的连接是安全的(例如通过加密通道),而不是试图在进程之间的消息级别上强制执行。
-
感谢您的回复。 @PawełObrok Aleksei 问题的答案是,我可能会故意设置一些行为不端的流程。这是我想做的测试的一部分。我知道这有点奇怪。在我的情况下,执行任意代码的可能性实际上不会成为问题 - 我只需要确保消息经过身份验证。您是否建议可以通过连接虚拟机的方式简单地实现身份验证?如果是这样,我可能不得不调查一下。
-
在我的测试中可能会设置一些恶意行为的进程 假定的身份验证如何帮助避免恶意进程?通常这将由您放置在系统前面的任何代理/负载均衡器处理,即内部是受信任的,外部不是,并且客户端通常进行身份验证,例如使用证书。这对算法没有影响,因为在任何现实世界的场景中,它都是在边界处处理的,可能使用专用的硬件/网络应用程序。因此,无论您尝试建模什么都是幻想,永远没有人会那样运行它。
-
@UnslanderMonica 正如我在问题中所展示的那样,如果一个进程确实发送了一条具有不同名称的消息,则验证步骤将失败并且不会被接受。我知道这不是标准的,我从未声称它是标准的。但是,我希望测试的算法的正确性完全依赖于此。在我的情况下,说“这对算法没有影响”根本不正确。我没有对外部的负载平衡器或客户端做任何事情。我觉得你可能误解了我的情况,坦率地说这是一种幻想是没有帮助的。
标签: authentication ssl erlang elixir distributed-system