分布式erlang安全如何实现?

分布式erlang安全如何实现?,erlang,Erlang,我希望有两个可以相互通信的独立erlang节点: so节点a@myhost将能够向b@myhost 有没有办法限制节点a@myhost,因此只能在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}

我希望有两个可以相互通信的独立erlang节点:

so节点
a@myhost
将能够向
b@myhost

有没有办法限制节点
a@myhost
,因此只能在
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函数/模块来实现这一点会更好吗?

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

而是编写一个特定的网络服务。将网络本身用作抽象层。最直接的方法是建立从a到B的流连接(只需使用老式的
genu tcp
,或
gen\u sctp
或使用ssl,或其他任何方式)

A上的套接字处理进程接收来自节点A需要调用B的任何部分的消息——您完全按照直接连接的方式编写这些消息。使用普通的Erlang消息传递样式:
Message={name\u of_request,Data}
或类似样式。连接过程只需执行
gen\u tcp:send(Socket,term\u to\u binary(Message))

B Shutter上的套接字处理进程通过简单地接收
{tcp,socket,Bin}->Servicer,在套接字和您的服务进程之间接收网络消息!二进制到二进制项(Bin)

再次使用
术语到二进制
/
二进制
翻译,通过完全相同的过程,计算结果返回到另一个方向


您的服务流程应该接收定义良好的消息,并忽略任何没有意义的事情(通常只是记录这些废话)。因此,通过这种方式,您并不是在执行直接RPC(在不受信任的环境中是不安全的),您只是在响应(微小的)消息传递协议中定义的有效语义。套接字处理过程的编写方式可以为您抽象这一点,让您感觉就像是在分布式Erlang中处理一个受信任的环境,但实际上您有两个独立的集群,根据协议的定义,这两个集群的相互请求受到限制。

谢谢。这是一个“方案B”:)使用gen_tcp/gen_sctp比使用zeroMQ有什么优势吗?@AntonProkofiev。至少对我来说,这就是一切。我倾向于避免包含外部软件包,直到我的项目显示出需要某种特定的东西,而这种东西的阅读/配置/理解时间比构建时间要少。在这种情况下,您的需求非常简单,而且已经存在:
term\u to\u binary
/
binary\u to\u term
。在Erlang中构建网络服务非常容易,因此大多数情况下这是足够的。抽象Erlang消息协议背后的套接字,当您知道需要消息服务时(例如,高级路由),可以稍后将其放入。