Security Elixir分布式安全性和允许的白名单节点 TL;博士 如何将可以节点的节点列为白名单。将连接到Elixir 还有其他安全建议吗 安装程序
我已经开始尝试在两台不同的服务器上分发Elixir 例如,假设服务器的两个IP地址是:Security Elixir分布式安全性和允许的白名单节点 TL;博士 如何将可以节点的节点列为白名单。将连接到Elixir 还有其他安全建议吗 安装程序,security,elixir,iptables,Security,Elixir,Iptables,我已经开始尝试在两台不同的服务器上分发Elixir 例如,假设服务器的两个IP地址是: 198.51.100.0 203.0.113.0 首先,我向两台服务器上的添加了新规则,为节点打开了端口4369()和9000-9010之间的10个端口。我也只允许从另一台服务器的确切IP地址传入连接 198.51.100.0的配置示例: -A INPUT -p tcp -m state --state NEW --dport 4369 -s 203.0.113.0 -j ACCEPT -A INPUT -p
-A INPUT -p tcp -m state --state NEW --dport 4369 -s 203.0.113.0 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 9000:9010 -s 203.0.113.0 -j ACCEPT
$ iex --name one@198.51.100.0 --cookie secret --erl '-kernel inet_dist_listen_min 9000' --erl '-kernel inedist_listen_max 9010'
203.0.113.0的配置示例:
-A INPUT -p tcp -m state --state NEW --dport 4369 -s 198.51.100.0 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 9000:9010 -s 198.51.100.0 -j ACCEPT
$ iex --name two@203.0.113.0 --cookie secret --erl '-kernel inet_dist_listen_min 9000' --erl '-kernel inedist_listen_max 9010'
现在我可以在每台机器上打开iex
shell:
198.51.100.0:
-A INPUT -p tcp -m state --state NEW --dport 4369 -s 203.0.113.0 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 9000:9010 -s 203.0.113.0 -j ACCEPT
$ iex --name one@198.51.100.0 --cookie secret --erl '-kernel inet_dist_listen_min 9000' --erl '-kernel inedist_listen_max 9010'
203.0.113.0:
-A INPUT -p tcp -m state --state NEW --dport 4369 -s 198.51.100.0 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 9000:9010 -s 198.51.100.0 -j ACCEPT
$ iex --name two@203.0.113.0 --cookie secret --erl '-kernel inet_dist_listen_min 9000' --erl '-kernel inedist_listen_max 9010'
我可以从节点1成功连接到节点2:
iex(one@198.51.100.0)> Node.connect(:'two@203.0.113.0')
true
并列出节点2中的节点:
iex(two@203.0.113.0)> Node.list
[:"one@198.51.100.0"]
我的问题:
我读过一篇文章,它可以用来列出允许连接的确切列表。但我似乎无法让它工作:
iex(one@198.51.100.0)> :net_kernel.allow([])
:ok
iex(one@198.51.100.0)> Node.connect(:'two@203.0.113.0')
true
我希望既然我已经允许了一个没有的列表,就不允许连接。有什么建议吗
更新:
我发现,如果我将至少一个值传递给:net\u kernel.allow
,它似乎可以工作:
iex(one@198.51.100.0)> :net_kernel.allow([:'127.0.0.0'])
:ok
iex(one@198.51.100.0)> Node.connect(:'two@203.0.113.0')
false
23:38:27.702 [error] ** Connection attempt with disallowed node :"two@203.0.113.0" **
iex(one@198.51.100.0)> :net_kernel.allow([:'two@203.0.113.0'])
:ok
iex(one@198.51.100.0)> Node.connect(:'two@203.0.113.0')
true
这就是诀窍吗?白名单基于VM Cookie,
~/.erlang.Cookie
。
然后,只有经过授权的节点才能拥有良好的cookie。在安全方面,我在我的服务器和笔记本电脑之间设置了一个安全保护,这是我需要的所有安全保护,同时提供了极大的灵活性。
net\u kernel
是一个创建gen\u服务器
进程的模块。在该进程状态下,它有一些参数,如allowed
,其中包含允许节点的列表,并且在启动时由空列表启动
有一个未记录的特性,如果连接的给定节点不是允许节点的成员,但该列表为空,则允许节点连接。模块中的此代码段说明了以下事实:
setup(Node,Type,From,State) ->
Allowed = State#state.allowed,
case lists:member(Node, Allowed) of
false when Allowed =/= [] ->
error_msg("** Connection attempt with "
"disallowed node ~w ** ~n", [Node]),
{error, bad_node};
_ ->
%% set up connection to given node
end.
另一个重要的注意事项是关于
netu内核:allow/1
函数,它是一个仅附加的函数。当使用++
运算符将新节点添加到以前的节点时,可以在其源代码中检查此事实:
handle_call({allow, Nodes}, From, State) ->
case all_atoms(Nodes) of
true ->
Allowed = State#state.allowed,
async_reply({reply,ok,State#state{allowed = Allowed ++ Nodes}},
From);
false ->
async_reply({reply,error,State}, From)
end;
问题不在于cookie或网络安全。这是关于
netu内核的行为:allow/1
函数;顶部的DR对“任何其他安全建议?”更开放,因此我感谢这一建议。谢谢。小心白名单节点。它将您的程序与基础架构联系起来,使扩展变得困难。如果您信任您的网络,为允许的节点设置公共cookie就足够了。如果您不这样做,请仔细考虑使用Erlang分布式。