分布式 erlang 安全性如何?

Distributed erlang security how to?

我想要2个可以相互通信的独立erlang节点:

所以节点 a@myhost 将能够向 b@myhost.

发送消息

有什么方法可以限制节点 a@myhost,所以只有来自 secure_module 的函数可以在 b@myhost?

被拜访

应该是这样的:

a@myhost> rpc:call(b@myhost,secure_module,do,[A,B,C]) returns  {ok,Result}

和所有其他电话

a@myhost> rpc:call(b@myhost,Modue,Func,Args)  return {error, Reason}

其中一个选项是使用 ZeroMQ 库在节点之间建立通信,但是如果可以使用一些标准的 Erlang functions/modules 来完成会更好吗?

在这种情况下,分布式 Erlang 不是您想要的。将节点 A 连接到节点 B 形成一个集群——一个巨大的、可信的计算环境。您不想信任其中的一部分,因此您不需要单个集群。

改为编写特定的网络服务。使用网络本身作为抽象层。最直接的方法是建立从 A 到 B 的流连接(只是无聊的旧 gen_tcp,或 gen_sctp 或使用 ssl,或其他)。

A 上的套接字处理进程从节点 A 需要调用 B 的任何部分接收消息——您可以完全编写此代码,就像它们直接连接时一样。使用正常的 Erlang 消息传递样式:Message = {name_of_request, Data} 或类似的。 A 上的连接过程只是 gen_tcp:send(Socket, term_to_binary(Message)).

B 上的套接字处理进程通过简单地接收 {tcp, Socket, Bin} -> Servicer ! binary_to_term(Bin).

在套接字和您的服务进程之间接收网络消息。

再次使用 term_to_binary/binary_to_term 转换,通过完全相同的过程,计算结果返回另一个方向。

您的服务进程应该接收明确定义的 消息,并忽略任何没有意义的内容(通常只是记录无意义的内容)。因此,通过这种方式,您不是在执行直接 RPC(这在不受信任的环境中是不安全的),您只是响应在您的(小小的)消息传递协议中定义的 valid semantics。套接字处理过程的编写方式可以为您抽象它并使您感觉就像您正在处理分布式 Erlang 中的可信环境,但实际上您有两个独立的集群,它们对每个集群的请求是有限的其他由您的协议定义。