它在日志中写道:
=INFO REPORT==== 2012-03-14 17:48:54 ===
I(<0.467.0>:ejabberd_listener:281) : (#Port<0.4384>) Accepted connection {{10,254,239,2},51986} -> {{10,254,239,1},5222}
=INFO REPORT==== 2012-03-14 17:48:54 ===
I(<0.1308.0>:ejabberd_c2s:784) : ({socket_state,tls,{tlssock,#Port<0.4384>,#Port<0.4386>},<0.1307.0>}) Failed authentication for USERNAME
=INFO REPORT==== 2012-03-14 17:48:54 ===
I(<0.1308.0>:ejabberd_c2s:649) : ({socket_state,tls,{tlssock,#Port<0.4384>,#Port<0.4386>},<0.1307.0>}) Failed authentication for USERNAME
它不会在失败时写入 IP。
并且字符串“已接受连接”和“身份验证失败”甚至可能不存在于附近(我认为在负载很重的服务器上),因此无法使用 fail2ban。
该怎么办?jabber 服务器(使用 ejabberd)如何受到保护?
答案1
您可以使用 iptables 来限制 IP 地址每分钟的连接尝试次数。由于这些都是自动攻击,因此大多数情况下,一旦被阻止,脚本就会继续寻找其他目标。
此示例适用于 tcp 端口 22(ssh),并将允许每分钟进行 3 次连接尝试,之后丢弃来自该 IP 地址的数据包。
iptables -A INPUT -p tcp --dport 22 --syn -m limit --limit 1/m --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 --syn -j DROP
答案2
fail2ban 将在 iptables 之上提供一个有用的附加逻辑层。ejabberd 网站上的请求建议使用 fail2ban 的可能方法,使用log_modsession。它包含在ejabberd-模块。
要记录失败的身份验证尝试,需要修补 ejabberd 的核心。幸运的是,log_modsession 随该补丁一起提供,因此您只需应用它并重新编译 ejabberd。
答案3
另一种方法是使用与 fail2ban 相同的方法,由于它们使用文件更改监视器 (fam) 库,我想我们可以创建一个自定义守护进程来监视 ejabberd 日志文件并以与 fail2ban 兼容的格式输出,并且有 python 和 perl 绑定。
有时调整另一个程序的源代码以满足您的需要会增加您的额外下载/补丁/编译工作,因此您无法从发行版安全更新中受益,您必须做这项工作,另一方面,您可以将您的补丁提交给负责 ejabberd 的作者并等待他们的答复,如果他们发现这很有价值并且整个社区都可以受益。
但恕我直言,我会选择自定义守护进程。