使用 fail2ban 抵御所有试图未经授权访问服务器的家伙!
大家好,我是无能。在上一篇文章中,我确认了在短短一天内有大量IP地址尝试访问。虽然服务器一直运行良好,没有实际发生过未经授权的访问,但还是应该采取措施。
说实话,日志文件积累过多变得难以查看也让我有点不爽。因此,我决定引入Fail2Ban,它是我以前安装iRedMail时作为依赖项安装的,当时就引起了我的兴趣。
这是什么?
通过日志审计,当达到设定的尝试次数时,可以按IP地址进行封锁。
此外,当有尝试发生时,还可以通过iptables丢弃数据包。[安装
这次我以root身份登录,所以不使用sudo。通过pkg search找到了以下软件包,现在进行安装。
pkg install py311-fail2ban-1.1.0
通常不建议直接修改 fail2ban.conf 配置文件,而是建议创建并编辑 jail.conf。因此,这次我将针对
SSH, Postfix, Dovecot
这三个服务的登录尝试进行配置,因为我非常不喜欢这些尝试。
此外,查看了许多网站后发现,不仅可以设置秒数,还可以设置1w(一周)、1d(一天)等,所以我将进行激进的设置。毫不留情地封禁一周。
~ # cat /usr/local/etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
bantime = 1w
findtime = 1d
maxretry = 5
[postfix]
enabled = true
port = smtp,ssmtp,submission
logpath = /var/log/maillog
bantime = 1w
findtime = 1d
maxretry = 10
action = block-drop[name=postfix, port=smtp, protocol=tcp]
[dovecot]
enabled = true
port = pop3,pop3s,imap,imaps,submission
logpath = /var/log/maillog
bantime = 1w
findtime = 1d
maxretry = 10
action = block-drop[name=dovecot, port=imap, protocol=tcp]
虽然似乎最好创建一个[default]部分,但我将先观察一下,只对这三个服务进行设置,如果需要再添加。顺便说一下,设置为一周的原因是:
-
首先,我现在是通过密钥认证登录的,所以不可能出错。
-
邮件服务器一旦登录,会持续保持登录认证一段时间,所以很少会手动尝试登录。
-
一旦被封禁,我希望直接丢弃所有数据包。
-
一天内超过5次登录失败本身就不正常。
所以这算是比较严格?还是比较宽松呢?我也不想因为封禁时间过短而消耗过多资源,所以就这样设置了。顺便说一下,似乎也可以封禁HTTP服务器的GET方法。https://hana-shin.hatenablog.com/entry/2023/05/24/210949我目前只将此服务器用作中间服务器,所以尚未引入此功能,但如果需要的话,我可能会尝试一下。此外,我额外设置了 action = block-drop,其配置如下。
# cat /usr/local/etc/fail2ban/action.d/block-drop.conf
[Definition]
actionstart = iptables -N f2b-<name>
iptables -A f2b-<name> -j DROP
iptables -I INPUT -p all -j f2b-<name>
iptables -I FORWARD -p all -j f2b-<name>
actionstop = iptables -D INPUT -p all -j f2b-<name>
iptables -D FORWARD -p all -j f2b-<name>
iptables -F f2b-<name>
iptables -X f2b-<name>
actioncheck = iptables -n -L INPUT | grep -q 'f2b-<name>[ ]'
actionban = iptables -I f2b-<name> -s <ip> -j DROP
actionunban = iptables -D f2b-<name> -s <ip> -j DROP
基本上,一旦被封禁,我就会直接丢弃所有数据包。我曾考虑过使用Reject,但重新查看后发现https://serverfault.com/questions/157375/reject-vs-drop-when-using-iptables结果是,Reject应该在你想让对方知道被拒绝时使用,而这次是封禁,所以我决定毫不留情地将数据包彻底丢弃。
启动与健康检查
由于是FreeBSD,所以这样启动:
service fail2ban start
如果显示'Server ready'就表示正常。查看日志以确认是否正常运行。
# tail /var/log/fail2ban.log
2024-07-24 13:34:05,654 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:34:05
2024-07-24 13:34:05,755 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:34:05
2024-07-24 13:34:05,884 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:34:05
2024-07-24 13:34:06,000 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:34:05
2024-07-24 13:34:06,317 fail2ban.actions [39963]: WARNING [sshd] already banned
2024-07-24 13:34:06,731 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:34:06
2024-07-24 13:37:14,327 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:37:14
2024-07-24 13:42:12,266 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:42:12
2024-07-24 13:42:17,389 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:42:17
2024-07-24 13:42:23,357 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:42:23
本来会显示IP地址,但这次我将其隐藏了。它立刻就被封禁了!成功了!我在心里大喊着“小鬼!”
(反正对方是机器人,对着机器有什么好想的呢?)把这种无聊的胜利姿势收起来,为了让它自动启动,在/etc/rc.conf中添加以下内容。
fail2ban_enable="YES"
这样一来,即使服务器重启,进程也会自动启动。
今天就到这里。顺便说一下,我还在想,将迄今为止日志中记录的登录尝试所使用的用户名显示在图表中,或许也会很有趣。下次再见。