Ejabberd源码解析前奏--安全
一、防火墙设置
当你配置防火墙的时候,你需要注意以下 TCP 端口:
端口 | 描述 |
---|---|
5222 | 用于 Jabber/XMPP 客户端连接的标准端口, 纯文本或 STARTTLS. |
5223 | Jabber 客户端使用旧的 SSL 方法连接的标准端口 . |
5269 | 用于 Jabber/XMPP 服务器连接的标准端口. |
4369 | EPMD 监听Erlang节点名请求. |
端口范围 | 用于两个Erlang节点之间的连接. 这个范围是可配置的(参见第二部分即epmd). |
二、epmd
epmd (Erlang端口映射守候进程) 是一个包含在 Erlang/OTP 里的小的名字服务器,并且在建立分布式 Erlang 通讯时被 Erlang 程序使用. ejabberd 需要 epmd 来使用 ejabberdctl,并且使用集群的ejabberd 节点时也需要它. 这个小的程序是由Erlang自动启动的, 并且永不停止. 如果 ejabberd 停止了, 并且没有任何其它 Erlang 程序运行在系统上, 如果你想的话可以安全地停止 epmd.
ejabberd 运行在一个Erlang节点内部. 为了和 ejabberd 通讯, 脚本 ejabberdctl 启动一个新的 Erlang 节点并连接到这个运行着 ejabberd 的Erlang节点. 为了这个通讯能工作, epmd 必须运行和在端口4369监听名字请求. 你应该在防火墙以这种方式禁止端口4369,即只允许你机器上的程序访问它.
如果你建立了一个许多 ejabberd 实例的集群, 每个 ejabberd 实例被称为一个 ejabberd 节点. 那些 ejabberd 节点使用一个特别的 Erlang 通讯方法来建立集群, 那么 EPMD 再次需要监听端口 4369. 所以, 如果你计划计建立一个 ejabberd 节点的集群,你必须为这个集群涉及的机器打开端口 4369. 记住禁止这个端口使得它无法从互联网访问到.
一旦一个Erlang节点使用EPMD和端口4369解析了另一个Erlang节点的节点名, 节点之间就直接通讯. 在这个情况下使用的端口缺省是随机的, 但是可以在文件 ejabberdctl.cfg里配置. Erlang命令行参数被内部使用, 例如:
erl ... -kernel inet_dist_listen_min 4370 inet_dist_listen_max 4375
三、Erlang Cookie
Erlang cookie 是一个数字和字母组成的字符串. 一个Erlang节点在启动时从命令行参数 -setcookie 读取cookie. 如果没有指定, 则从 $HOME/.erlang.cookie 读取cookie 文件. 如果这个文件不存在, 它会被立刻以一个随机的cookie建立. 两个Erlang节点只有它们有相同的cookie时才会通讯 . 在Erlang节点上设置一个cookie允许你结构化你的Erlang网络,并定义哪个节点被允许连接到哪个.
感谢Erlang cookies, 你可以阻止对Erlang节点的错误访问, 例如:当同一台机器上有许多Erlang节点运行不同程序的时候.
设置一个安全cookie是一种简单的方法来增加非法访问你的Erlang节点的困难度. 然而, 对于阻止对Erlang节点的未授权访问或侵扰,cookie系统不是最终有效的. Erlang节点之间的通讯是未加密的, 所以 cookie 可能被网络上的嗅探程序读取. 推荐使得Erlang更加安全的方法是禁止端口4369.
四、Erlang节点名
一个Erlang节点可以拥有一个节点名. 这个名字可能很短 (如果用命令行参数 -sname 指定) 或很长 (如果用参数 -name 指定). 以 -sname 启动一个Erlang节点限制Erlang节点和LAN之间的通讯.
使用选项 -sname 而不是 -name ,是一个简单增加对你的Erlang节点的未授权访问难度的方法. 然而, 对于阻止对Erlang节点的未授权访问或侵扰,它不是最终有效的. 因为有可能伪装你在另一个网络里使用一个修改过的 Erlang epmd. 推荐使得Erlang更加安全的方法是禁止端口4369.
五、敏感文件安全
ejabberd在文件系统里存储敏感数据要么使用纯文本要么是二进制文件. 文件系统许可应被设置为只允许适当的用户读、写和执行那些文件和目录.
ejabberd configuration file: /etc/ejabberd/ejabberd.cfg
包含外部组件的管理员的 JID 和密码. 备份文件可能也包含这个信息, 所以整个 /etc/ejabberd/ 目录的安全是必要的.
ejabberd service log: /var/log/ejabberd/ejabberd.log
包含客户端的IP地址. 如果 loglevel 设为 5, 它包含全部的会话和密码. 如果使用了一个 logrotate 系统, 可能有好几个日志文件拥有类似的信息, 所以整个 /var/log/ejabberd/ 目录的安全是必要的.
Mnesia database spool files in /var/lib/ejabberd/
这个文件存储二进制数据, 但是一些部分仍是可读的. 这个文件由 Mnesia 生成并且它们的许可不能被直接设置, 所以整个 /var/lib/ejabberd/ 目录的安全是必要的.
Erlang cookie file: /var/lib/ejabberd/.erlang.cookie