Fail2Ban 是一个通过动态分析日志文件来识别恶意 IP 的连续攻击行为,并自动触发防火墙规则进行封禁的工具。它支持多种服务的防护,包括但不限于:
SSH:防御暴力密码爆破攻击。
Apache/Nginx:防护 Web 目录扫描和 CC 攻击。
FTP(vsftpd/proftpd):阻止反复登录尝试。
SMTP/MySQL:保护邮件和数据库服务免受攻击。
本文以 SSH 防护为例,介绍如何在 CentOS 7 上安装、配置并使用 Fail2Ban 来增强服务器的安全性。
一、安装步骤
fail2ban依赖python运行,在centos7默认安装python2.7版本,如果没有或版本不适配,请提前安装python(最新版1.1.0要求python版本为3.5及以上)。
方式一、使用 Yum 安装
1.安装 EPEL 库:
yum install epel-release -y
2.安装 Fail2Ban:
yum install fail2ban -y
3.启动并启用服务:
systemctl start fail2ban
systemctl enable fail2ban
4.检查服务状态:
systemctl status fail2ban
5.获取帮助信息:
fail2ban-client -h
方式二、手动安装(可选)
如果希望从源码安装 Fail2Ban(yum和git安装版本相同,均为0.11.2),可以执行以下步骤:
1.克隆仓库:
git clone https://github.com/fail2ban/fail2ban.git
cd fail2ban
python setup.py install
2.配置 Systemd 服务:
系统init/service 脚本不会自动安装。要启用 fail2ban作为自动服务,只需将脚本从文件目录复制到/etc/init.d
cp build/fail2ban.service /etc/systemd/system/
systemctl daemon-reload
3.验证安装版本:
fail2ban-client -V
二、配置 SSHD 防护
jail.conf:这是 fail2ban 的主配置文件,包含了所有预定义的服务和规则。由于这个文件是由软件包管理器维护的,如果直接对其进行修改,那么在系统更新或软件包升级时,你的更改可能会被覆盖。
为了确保你的自定义配置不会因为软件包更新而丢失,建议使用以下两种方法之一进行配置。
方式一:使用 jail.local 文件
这是一个用户自定义的配置文件,优先级高于 jail.conf。 如果创建了这个文件,fail2ban 会先读取 jail.conf 中的配置,然后应用 jail.local 中的设置来覆盖或扩展它们。
1.复制默认配置文件:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
2.编辑 jail.local 文件,添加或修改以下部分以启用对 SSH 的防护:
[sshd]
enabled = true
logpath = /var/log/secure
maxretry = 3 #在3次失败尝试后封禁IP
findtime = 60 #在60s内触发规则
bantime = 600 #封禁时间为600秒,默认单位为s, m - minutes, h - hours, d - days, w - weeks, mo - months, y - yearsbackend = systemd
action = firewallcmd-ipset[name=sshd, port="ssh", protocol=tcp] #默认为iptables,这里指定为firewall
failregex = ^.*Failed password for .* from <HOST> port d+ ssh2$ #正则匹配,实测不加无法正确匹配
重启 Fail2Ban 使更改生效:
systemctl restart fail2ban
方式二:独立配置文件
jail.d/ 目录下的单独 .conf 文件.例如,可以创建一个名为 /etc/fail2ban/jail.d/sshd.conf 的文件,专门用于配置 SSH 服务的防护规则。
在jail.d下创建sshd.conf,并在配置文件中添加如下内容:
[sshd]
enabled = true
logpath = /var/log/secure
maxretry = 3 #在5次失败尝试后封禁IP
findtime = 60 #在60s内触发规则
bantime = 600 #封禁时间为600秒,默认单位为s, m - minutes, h - hours, d - days, w - weeks, mo - months, y - yearsbackend = systemd
action = firewallcmd-ipset[name=sshd, port="ssh", protocol=tcp] #默认为iptables,这里指定为firewall
failregex = ^.*Failed password for .* from <HOST> port d+ ssh2$ #正则匹配,实测不加无法正确匹配
重启 Fail2Ban 使更改生效:
systemctl restart fail2ban
测试规则
在进行任何更改之后,建议测试规则是否正确:
fail2ban-client -t
三、测试与维护
触发封禁测试
故意输入错误密码3次后验证:
fail2ban-client status sshd
解除 IP 封锁
如果需要解除某个 IP 地址的封锁,可以使用如下命令:
fail2ban-client set sshd unbanip 10.10.68.59
日志路径
Fail2Ban日志:
/var/log/fail2ban.log
防火墙拦截查看
fail2ban 默认使用iptables进行拦截,可使用以下命令查看具体信息:
iptables -L -n -v
当切换firewall时,fail2ban使用firewalld的ipset模块,使用以下命令可查看具体信息:
ipset list
四、常见问题:
centos默认安全日志在/var/log/secure,如果查看没有相关错误登录日志,则在sshd_config配置下启用以下配置并重启sshd服务
SyslogFacility AUTHPRIV
LogLevel INFO
https://github.com/fail2ban/fail2ban/blob/master/config/jail.conf
原文始发于微信公众号(网络个人修炼):CentOS 7 部署Fail2Ban防护SSH暴力破解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论