Security Elixir分布式安全性和允许的白名单节点 TL;博士 如何将可以节点的节点列为白名单。将连接到Elixir 还有其他安全建议吗 安装程序

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

我已经开始尝试在两台不同的服务器上分发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 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分布式。