背景:
我正在尝试在 Elixir 中编写一个程序,通过在一组进程上运行分布式算法并记录某些统计数据来测试分布式算法。首先,我将在同一台机器上运行这些进程,但最终目的是让它们在不同的机器/VM 上运行。
问题:
我希望实现的算法要求之一是消息包括身份验证。也就是说,每当一个进程向另一个进程发送消息时,接收者应该能够验证该消息确实来自发送者,并且不是由另一个进程伪造的。以下片段应该有助于说明这个想法:
# 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 中更标准的使用。如果我走这条路,我相信我必须事先自己设置所有 key 和签名,我相信这可以使用 X509 Elixir package ,尽管我不确定这是否合适并且可能比必要的工作更多。
总之:
最佳答案
正如 Aleksei 和 Paweł 所指出的,如果您的集群中有某些东西,那么它已经是可信的。这与验证可能源自几乎任何地方的随机 Web 请求不同,您谈论的是源自受信任机器的本地网络内部的消息。如果某个邪恶的参与者正在您的一台服务器上运行,那么您需要担心的问题远比验证消息要大得多。
在集群内运行的 Elixir/Erlang 进程在安全方面几乎没有限制:例如,它们的状态可以被任何其他进程检查。为了让容错系统能够进行热代码重载,这种透明度的一部分是设计使然,并且是必要的,但是关于具体的方式和原因的对话过于细微,我无法做到公正。
如果您确实需要进行一些日志记录以拥有可审计的“书面记录”来验证哪个进程发送了哪个消息,我认为您必须推出自己的解决方案,该解决方案可能依赖于许多常用技术(例如 key + 签名、区 block 链等)。但请记住:无论如何,如果您要处理不同服务器之间的 Web 请求,就会出现这些问题!并且已经有用于在计算机之间建立安全连接的协议(protocol),因此我不建议在您的应用程序中重新发明这些网络协议(protocol)。
你的时间最好花在算法本身上,而不是试图重新发明安全轮子。您的应用程序应该专注于其他人正在做的独特事情(在您的案例中是算法)。如果您有多个相互连接的虚拟机相互传递消息,那么所有“安全”要求都伴随着定义对每台机器/子网的正确访问,并且无论您在它们上运行什么应用程序/语言,该要求都适用。
关于authentication - 如何在 Elixir 中的进程之间建立经过身份验证的链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65218079/