最近查看云服务器的安全告警事件,发现每天都有大量暴力破解的尝试,为了减少告警事件和攻击成功的概率(虽然很低),网上检索到有个开源入侵防御工具Fail2Ban,它可以实时监控日志文件,一旦检测到暴力破解行为(如多次登录失败),就会自动使用防火墙(如 firewalld)将攻击者 IP 临时或永久封禁。
查看系统安全日志/var/log/secure
1. 项目地址
https://github.com/fail2ban/fail2ban
因为在OpenEuler2203系统上面用yum找不到fail2ban,只能使用编译的方法进行安装
参考博客文章 Linux 命令工具 fail2ban 使用指南
2. 安装步骤
安装python依赖
dnf install python3-systemd -y
dnf install python3-devel gcc -y
git clone https://github.com/fail2ban/fail2ban.git
cd fail2ban
python3 setup.py install
如果看到这样的输出说明编译成功
3. 配置服务防护SSH
vim /etc/fail2ban/jail.conf
[DEFAULT] 是全局默认值,其他 jail 继承或覆盖
找到[DEFAULT] 开头的块去编辑
参考配置如下:
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 # 忽略本地 IP
bantime = 24h # 封禁时间( 小时)
findtime = 60m # 查找时间窗( 分钟)
maxretry = 5 # 最大失败次数(超出则封禁)
backend = systemd # 使用 systemd 读取日志
banaction = firewallcmd-ipset # 使用 firewalld 封禁 IP
[sshd]
enabled = true # 启用 SSH 防护
mode = aggressive
port = 16822 # 监控的端口(或自定义端口号)
logpath = %(sshd_log)s # 自动识别 /var/log/secure
filter = sshd # 使用默认 sshd 筛选规则
参数说明:
ignoreip:允许的 IP 地址(比如你家/公司白名单 IP)
bantime:封禁时长,可设置为 -1 实现永久封禁
findtime + maxretry:在 findtime 时间内失败超过 maxretry 次,就封禁
banaction:配合 firewalld 封 IP
backend = systemd:Rocky 使用 systemd 管理日志,比传统文件读取更稳定
mode: 在 aggressive 模式下,Fail2Ban 可能会对更多的错误类型进行匹配(如多次失败的密码尝试、无效用户等),而在 normal 模式下,可能只匹配标准的 SSH 登录失败。
sshd部分
4. 启动Fail2Ban服务
从编译目录下拷贝systemd服务文件到服务配置文件目录下
cp build/fail2ban.service /etc/systemd/system/
注意这里有坑,直接启动会失败,应该是python环境没读取成功
vi /etc/systemd/system/fail2ban.service
添加环境变量,依据自己python修改
Environment="PYTHONPATH=/usr/local/lib/python3.9/site-packages/"
我觉得注释掉PartOf这一列比较好
PartOf :该参数仅作用于单元的停止或重启。其含义是,当停止或重启这里列出的某个单元时, 也会同时停止或重启该单元自身。 注意,这个依赖是单向的, 该单元自身的停止或重启并不影响这里列出的单元。
更新服务重启就可以啦
systemctl daemon-reload
systemctl restart fail2ban.service
systemctl status fail2ban.service
5. Fail2Ban的一些命令
查看 Fail2Ban 状态:
fail2ban-client status
查看 sshd Jail 的详细状态:
fail2ban-client status sshd
手动封禁某个IP
fail2ban-client set sshd banip 10.0.0.111
解封IP
fail2ban-client set sshd unbanip 10.0.0.111
查看封禁结果
fail2ban-client status sshd