原创作者: AvinDev
阅读:3505次
评论:0条
更新时间:2011-06-01
Erlang的分布式通讯安全策略,可以归结为 All or None。要不拥有全部的权限,要不就完全没有。
它的节点安全设置,是通过一个magic cookie来实现的。这个文件默认放到
$HOME/.erlang.cookie ,文件内容是字符串。
当启用分布通讯的时候,这个magic cookie就很重要了。如果在命令行里面带上 -setcookie ,则在当前节点使用这个cookie值,否则会使用 $HOME/.erlang.cookie
比如现在有两台机,192.168.0.2 & 192.168.0.3,分别叫做 foo 和 bar
在 foo 输入
输出
在 bar 输入
由于两个节点的cookie不一致,因此无法直接通讯,bar输出
而 foo 会输出警告
要使得bar能够跟foo通讯,可以使用
启动shell,或者在shell里面输入
这时候就可以了
而且节点间会建立了连接
要注意,之所以All or None里面的“ALL”,是因为互相连接上的节点可以拥有全部的权限,比如
如果不幸你是用root启动,太好了,通过rpc就可以拥有全部的操作权限。。。。
因此,使用分布式通讯,特别是有客户端节点部署在普通用户机上的系统,要非常留意权限问题。更好的方法是用Socket进行通讯,将请求封装为一个 tuple,比如 {login, Name, Password},然后用 term_to_binary 发送过去,只要两边都设置好 {packet ,4} 这样的参数,接收这个 tuple 是很方便的。
网上有人说,Joe的新书里面会对安全问题进行详细的介绍。
它的节点安全设置,是通过一个magic cookie来实现的。这个文件默认放到
$HOME/.erlang.cookie ,文件内容是字符串。
当启用分布通讯的时候,这个magic cookie就很重要了。如果在命令行里面带上 -setcookie ,则在当前节点使用这个cookie值,否则会使用 $HOME/.erlang.cookie
比如现在有两台机,192.168.0.2 & 192.168.0.3,分别叫做 foo 和 bar
在 foo 输入
引用
erl -name foo@192.168.0.2 -setcookie foofoo
输出
引用
Erlang (BEAM) emulator version 5.5.2 [source] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.5.2 (abort with ^G)
(foo@192.168.0.2)1>
Eshell V5.5.2 (abort with ^G)
(foo@192.168.0.2)1>
在 bar 输入
引用
erl -name bar@192.168.0.3 -setcookie barbar
引用
net_adm:ping('foo@192.168.0.2').
由于两个节点的cookie不一致,因此无法直接通讯,bar输出
引用
pang
而 foo 会输出警告
引用
=ERROR REPORT==== 28-Mar-2007::18:00:00 ===
** Connection attempt from disallowed node 'bar@192.168.0.3' **
** Connection attempt from disallowed node 'bar@192.168.0.3' **
要使得bar能够跟foo通讯,可以使用
引用
erl -name bar@192.168.0.3 -setcookie foofoo
启动shell,或者在shell里面输入
引用
erlang:set_cookie('foo@192.168.0.2', 'foofoo').
这时候就可以了
引用
(bar@192.168.0.3)2> net_adm:ping('foo@192.168.0.2').
pong
pong
而且节点间会建立了连接
引用
(bar@192.168.0.3)3> nodes().
['foo@192.168.0.2']
['foo@192.168.0.2']
要注意,之所以All or None里面的“ALL”,是因为互相连接上的节点可以拥有全部的权限,比如
引用
(bar@192.168.0.3)4> rpc:call('foo@192.168.0.2', os, cmd, ['ls']).
"bin\nChangeLog\nerlang\nerlang.ico\nlib\nstart.sh\n"
"bin\nChangeLog\nerlang\nerlang.ico\nlib\nstart.sh\n"
如果不幸你是用root启动,太好了,通过rpc就可以拥有全部的操作权限。。。。
因此,使用分布式通讯,特别是有客户端节点部署在普通用户机上的系统,要非常留意权限问题。更好的方法是用Socket进行通讯,将请求封装为一个 tuple,比如 {login, Name, Password},然后用 term_to_binary 发送过去,只要两边都设置好 {packet ,4} 这样的参数,接收这个 tuple 是很方便的。
网上有人说,Joe的新书里面会对安全问题进行详细的介绍。
评论 共 0 条 请登录后发表评论