Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Authentication 如何在Elixir中的进程之间设置经过身份验证的链接? 背景:_Authentication_Ssl_Erlang_Elixir_Distributed System - Fatal编程技术网

Authentication 如何在Elixir中的进程之间设置经过身份验证的链接? 背景:

Authentication 如何在Elixir中的进程之间设置经过身份验证的链接? 背景:,authentication,ssl,erlang,elixir,distributed-system,Authentication,Ssl,Erlang,Elixir,Distributed System,我试图用Elixir编写一个程序,通过在一组进程上运行分布式算法并记录某些统计数据来测试分布式算法。首先,我将在同一台机器上运行这些进程,但最终的目的是让它们在不同的机器/虚拟机上运行 问题: 我希望实现的算法的一个要求是消息包括身份验证。也就是说,每当一个进程向另一个进程发送消息时,接收方应该能够验证该消息确实来自发送方,并且不是由另一个进程伪造的。以下片段有助于说明这一想法: # Sender a = authenticate(self, receiver, msg) send(receiv

我试图用Elixir编写一个程序,通过在一组进程上运行分布式算法并记录某些统计数据来测试分布式算法。首先,我将在同一台机器上运行这些进程,但最终的目的是让它们在不同的机器/虚拟机上运行

问题: 我希望实现的算法的一个要求是消息包括身份验证。也就是说,每当一个进程向另一个进程发送消息时,接收方应该能够验证该消息确实来自发送方,并且不是由另一个进程伪造的。以下片段有助于说明这一想法:

# Sender
a = authenticate(self, receiver, msg)
send(receiver, {msg, self, a})
迄今为止的想法: 我已经搜索了很多关于Elixir进程之间经过身份验证的通信的文档,但没有找到任何东西。也许在某种程度上,这已经在幕后为我做了,但到目前为止,我还不能证实这一点。如果是这样,我想知道当进程不在同一台机器上运行时,它是否仍然正确

我已经研究了使用SSL/TLS功能的可能性,但由于我在这方面的知识有限,我不确定这将如何应用于我运行一组进程的情况,而不是在客户机-服务器系统和HTTPS中更标准的使用。如果我走这条路,我相信我必须事先自己设置所有的密钥和签名,我相信可以使用,尽管我不确定这是否合适,可能需要做的工作比需要的更多

总之: 在Elixir中,是否有一种标准/预先存在的方法来实现流程之间的认证通信? 如果是,它是否适用于单独机器/虚拟机之间的进程通信? 如果以上任何一项都没有,我自己能做到这一点的最简单方法是什么?
正如Aleksei和Paweł指出的那样,如果集群中有某个东西,那么它已经被信任了。这与验证可能在任何地方发出的随机web请求不同,您所说的是来自受信任机器的本地网络内部的消息。如果某个邪恶的参与者正在您的服务器上运行,那么您需要担心的问题远不止验证消息

在集群内运行的Elixir/Erlang进程在安全性方面几乎没有限制:例如,任何其他进程都可以检查它们的状态。为了使容错系统能够执行热代码重新加载,这种透明性在设计上是必要的,但关于具体的“如何”和“为什么”的讨论过于微妙,我无法公正地进行

如果您真的需要做一些日志记录,以便有一个可审核的书面记录来验证哪个进程发送了哪个消息,我认为您必须推出自己的解决方案,该解决方案可能依赖于一些常用技术,如密钥+签名、块链等。。但请记住:如果您处理不同服务器之间的web请求,这些问题都会出现!而且已经有了在计算机之间建立安全连接的协议,所以我不建议在应用程序中重新发明这些网络协议


你最好把时间花在算法本身上,而不是试图在安全性上重新发明轮子。你的应用程序应该专注于独一无二的东西,没有其他人在你的情况下做算法。如果您有多个相互连接的虚拟机相互传递消息,那么所有的安全要求都伴随着定义对每台机器/子网的正确访问,并且无论您在它们上运行什么应用程序/语言,该要求都适用。

正如Aleksei和Paweł指出的那样,如果集群中有什么东西,它已经被信任了。这与验证可能在任何地方发出的随机web请求不同,您所说的是来自受信任机器的本地网络内部的消息。如果某个邪恶的参与者正在您的服务器上运行,那么您需要担心的问题远不止验证消息

在集群内运行的Elixir/Erlang进程在安全性方面几乎没有限制:例如,任何其他进程都可以检查它们的状态。为了使容错系统能够执行热代码重新加载,这种透明性在设计上是必要的,但关于具体的“如何”和“为什么”的讨论过于微妙,我无法公正地进行

如果您真的需要做一些日志记录,以便有一个可审核的书面记录来验证哪个进程发送了哪个消息,我认为您必须推出自己的解决方案,该解决方案可能依赖于一些常用技术,如密钥+签名、块链等。。但请记住:如果你与我们打交道,这些问题会出现 b无论如何,不同服务器之间的请求!而且已经有了在计算机之间建立安全连接的协议,所以我不建议在应用程序中重新发明这些网络协议


你最好把时间花在算法本身上,而不是试图在安全性上重新发明轮子。你的应用程序应该专注于独一无二的东西,没有其他人在你的情况下做算法。如果您有多个相互连接的虚拟机相互传递消息,那么所有的安全要求都伴随着定义对每台机器/子网的正确访问,并且无论您在它们上运行的是什么应用程序/语言,该要求都适用。

我越是了解您想要实现的目标,我越确信您所需要的就是调用过程的足迹

对于同步调用,您已经将第二个参数作为封装外形

对于异步消息,您可以将调用方信息添加到消息本身。比如,不发送普通的:foo消息,而是发送{:foo,pid}或者更复杂的{:foo,{pid,timestamp,ip,}并让被调用方验证这些消息


无论如何,这是安全的:集群将确保这些消息来自受信任的来源,而您的内部验证可能会确保该来源在您的内部规则内有效。

我越了解您试图实现的目标,我就越确信您需要的是调用过程的足迹

对于同步调用,您已经将第二个参数作为封装外形

对于异步消息,您可以将调用方信息添加到消息本身。例如,不发送普通的:foo消息,而是发送{:foo,pid}或更复杂的{:foo,{pid,timestamp,ip,},并让被调用方验证这些信息


这是绝对安全的:集群将确保这些消息来自受信任的源,而您的内部验证可能会确保源在您的内部规则范围内有效。

为什么您不首先信任来自同一ErlangVM/集群运行的其他erlang进程的消息?@AlekseiMatiushkin's point i是的,我认为。一旦您将ErlangVM连接到集群中,它们就可以彼此进行大量访问。特别是,可以从一个集群到另一个集群执行任意代码。我认为您应该确保VM之间的连接本身是安全的,例如通过加密通道进行的,而不是在级别上强制执行进程之间的消息。感谢这两个响应。@PawełObrok Aleksei的问题的答案是,我可能会故意设置一些进程,使其行为不端。这是我想做的测试的一部分。我知道这有点奇怪。在我的情况下,执行任意代码的可能性实际上不会是一个问题-我只需要确定这一点消息是经过身份验证的。您是否建议仅通过连接虚拟机的方式即可实现身份验证?如果是,我可能必须对此进行研究。作为测试的一部分,我可能会设置假定的恶意行为的流程。假定的身份验证如何帮助避免恶意流程?通常情况下,这将由b处理y无论您在系统前面放置了什么样的代理/负载平衡器,即内部是可信的,外部是不可信的,客户端通常会进行身份验证,例如使用证书。这对算法没有影响,因为在任何实际场景中,它都是在边界处处理的,可能使用专用的硬件/网络应用程序。因此,无论您不信任什么试图建模是一种幻想,没有人会以这种方式运行它。@UnslanderMonica,正如我在问题中所展示的,其想法是,如果一个进程确实发送了一条带有另一个进程名称的消息,验证步骤将失败,它将不会被接受。我理解这不是标准的,我从未声称它是。但是,正确的我想测试的算法完全依赖于此。在我的情况下,说这对算法没有影响是完全不正确的。我没有对负载平衡器或来自外部的客户端做任何事情。我觉得你可能误解了我的情况,坦率地说这是一种幻想是没有帮助的。你为什么不相信来自其他erl的消息ang进程首先由同一个ErlangVM/集群运行?@AlekseiMatiushkin的观点是正确的,我认为。一旦将ErlangVM连接到集群中,它们之间就有很多访问权限。特别是,可以从一个集群到另一个集群执行任意代码。我认为您应该确保VM之间的连接它本身是安全地完成的,例如通过加密通道,而不是试图在进程之间的消息级别强制执行它。感谢这两个响应。@PawełObrok Aleksei的问题的答案是,我可能会故意设置一些进程以使其行为不正常。这是我想做的测试的一部分。我知道这有点奇怪。可能
在我的例子中,执行任意代码的灵活性实际上不会成为问题——我只需要确保消息经过身份验证。您是否建议仅通过连接虚拟机的方式即可实现身份验证?如果是这样的话,我可能必须对此进行调查。作为我的测试的一部分,我可能会设置一些被认为是邪恶行为的过程。假设的身份验证如何帮助避免邪恶的过程?通常,这将由您在系统前面放置的任何代理/负载平衡器来处理,即内部受信任,外部不受信任,客户端通常使用证书进行身份验证。这对算法没有影响,因为在任何实际场景中,它都是在边界处处理的,可能是专用硬件/网络应用程序。因此,无论您试图建模的是什么,都是幻想,没有人会以这种方式运行它。@UnslanderMonica,正如我在问题中所展示的,其想法是,如果某个进程确实发送了另一个名称的消息,验证步骤将失败,并且不会被接受。我知道这不是标准,我也从未声称这是标准。然而,我希望测试的算法的正确性完全依赖于此。在我的例子中,说这对算法没有影响是完全不正确的。我不会从外部使用负载平衡器或客户端。我觉得你可能误解了我的处境,坦率地说,把它称为幻想是没有帮助的。非常感谢你的详细回答。作为测试的一部分,我可能会设置一些被认为是邪恶行为的过程,但我想我可以限制它们这样做的方式。不幸的是,我想确保算法及其性能的准确表示,如果不考虑它,我想知道我的结果是否真实。我当然不想重新发明任何协议。非常感谢您提供的详细答案。作为测试的一部分,我可能会设置一些被认为是邪恶行为的过程,但我想我可以限制它们这样做的方式。不幸的是,我想确保算法及其性能的准确表示,如果不考虑它,我想知道我的结果是否真实。我当然不想重新发明任何协议。再次感谢你。我将处理异步消息,我确实打算将调用方信息添加到这些消息中。我的问题更多的是关于如何进行你提到的验证。因此,如果我得到一条消息{:foo,pid},我不确定如何验证这不是来自一个不同的进程,它只是在消息中包含另一个进程的pid。我知道我可以避免这种情况的发生,但我想完全避免这种情况的发生。如果我误解了,很抱歉。好吧,在受信任的集群中,防御我们自己的可能性太少了。如果您的一个进程想要伪造另一个进程,那么实际上没有办法阻止它。即使是通过10因子身份验证的SSL。再次感谢您。我将处理异步消息,我确实打算将调用方信息添加到这些消息中。我的问题更多的是关于如何进行你提到的验证。因此,如果我得到一条消息{:foo,pid},我不确定如何验证这不是来自一个不同的进程,它只是在消息中包含另一个进程的pid。我知道我可以避免这种情况的发生,但我想完全避免这种情况的发生。如果我误解了,很抱歉。好吧,在受信任的集群中,防御我们自己的可能性太少了。如果您的一个进程想要伪造另一个进程,那么实际上没有办法阻止它。甚至在SSL上使用10因子身份验证。
# Receiver
if verify(msg, sender, a) do
  deliver(msg)
end