Fail2Ban 是一种入侵防御软件框架,可以保护计算机服务器免受暴力攻击。它以 Python 编程语言编写,能够在 POSIX 系统上运行,该系统具有本地安装的数据包控制系统或防火墙的接口,例如 iptables 或 TCP Wrapper。
配置监控模块
Fail2Ban的配置模块非常的简单,默认的配置已经写好了很多实用模块,我们直接调用即可。
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Fail2Ban 会自动读取 .local 文件的配置,然后再增量地读取 conf 配置,这样就避免了更新它时你辛辛苦苦写好的配置被覆盖掉了。
然后我们编辑jail.local添加我们自定义的监控模块
vim /etc/fail2ban/jail.local
首先我们先对默认规则 [DEFAULT] 进行一些适量修改
bantime = 3600 #默认是 10 分钟,这个是说要 ban 多久,我们改长一点 #下面这两个是说在多长时间内失败多少次就被屏蔽, #比如这个是在 3600 秒内失败 6 次就被屏蔽 findtime = 3600 maxretry = 6
接下来就是添加我们的监狱配置了,默认配置信息中并没有内置 Nginx ,只有 Apache:
# 保护Linux,防止远程SSH爆破 [ssh-iptables] enabled = true filter = sshd action = iptables[name=SSH, port=26568, protocol=tcp] logpath = /var/log/secure # HTTP 验证防暴力破解 [nginx-http-auth] enabled = true filter = nginx-http-auth port = http,https logpath = /data/wwwlogs/access.log #屏蔽恶意爬虫 [nginx-badbots] enabled = true port = http,https filter = nginx-badbots logpath = /data/wwwlogs/access.log maxretry = 2 #避免恶意请求网站目录结构 [nginx-nohome] enabled = true port = http,https filter = nginx-nohome logpath = /data/wwwlogs/access.log maxretry = 2 #避免 nginx 被他人用于反向代理 [nginx-noproxy] enabled = true port = http,https filter = nginx-noproxy logpath = /data/wwwlogs/access.log maxretry = 2 #防范 WordPress 暴力破解登录请求 [wp-login] enabled = true port = http,https filter = wp-login maxretry = 10 findtime = 60 bantime = 43600 logpath = /data/wwwlogs/access.log #防止 WordPress 受到 xmlrpc.php CC 攻击 [xmlrpc] enabled = true port = http,https filter = xmlrpc logpath = /data/wwwlogs/access.log bantime = 43600 maxretry = 1 findtime = 5
注意将logpath修改为自己的Nginx日志路径,Fail2Ban本质上是一款防火墙外挂,仅作为日志分析使用,根据设置的监控模块及相应规则,向防火墙传递参数,使防火墙把恶意ip拦截。
上述配置中 logpath 是指日志文件的路径的(如: /data/wwwlogs/access.log),需要注意的是这里可以指定多个日志文件的,具体格式如下:
logpath = /data/wwwlogs/www.wanvi.net.log /data/wwwlogs/v.ixmu.net.log /data/wwwlogs/ixmu.net.log /data/wwwlogs/dl.ixmu.net.log
一行一条日志路径,Fail2Ban读取时会自动过滤多余空格。
配置监控模块规则
监控模块我们在上面我们已经完成了配置,监控模块有了,还需要配置模块相应的规则,让模块正确匹配内容,从中筛选出需要的部分。
模块规则使用正则进行匹配,这里使用到最近本的正则,花上半个小时基本入门了,如果要匹配精深的规则,请认真学习正则表达式。
Fail2ban模块规则放在/etc/fail2ban/filter.d目录下
cd /etc/fail2ban/filter.d
在这个目录下,存放这所有规则文件,一个配置名一个文件,有多少个文件就有多少个规则,这些规则被上文中监狱配置里 filter 字段调用。
保护Linux,防止远程SSH爆破,sshd.conf已经内置了,无需单独添加。
这个规则是存在的,我们在规则中加一行配置,来过滤除了账号密码错误外,空白账号或者密码的错误:
vim nginx-http-auth.conf
[Definition] failregex = ^ \[error\] \d+#\d+: \*\d+ user "\S+":? (password mismatch|was not found in ".*"), client: , server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$ ^ \[error\] \d+#\d+: \*\d+ no user/password was provided for basic authentication, client: , server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$ ignoreregex =
过滤爬虫的规则是有现成的,所以我们只需要改个名就可以了;
cp apache-badbots.conf nginx-badbots.conf
屏蔽恶意请求网站目录结构
vim nginx-nohome.conf #添加如下规则进行匹配 [Definition] failregex = ^ -.*GET .*/~.* ignoreregex =
屏蔽 nginx 被他人用于反向代理
vim nginx-noproxy.conf #添加如下规则进行匹配 [Definition] failregex = ^ -.*GET http.* ignoreregex =
防范 WordPress 暴力破解登录请求
vim wp-login.conf #添加如下规则进行匹配 [Definition] failregex = ^ -.* /wp-login.php.* HTTP/1\.." ignoreregex =
防止 WordPress 受到 xmlrpc.php CC 攻击
vim xmlrpc.conf #添加如下规则进行匹配 [Definition] failregex = ^ .*POST .*xmlrpc\.php.* ignoreregex =
至此,Fail2Ban 保护Linxu、Nginx、WordPress 基本算是完成了,最后不要忘记重启Fail2ban服务。
service fail2ban restart
效果查看
使用tail命令查看Fail2Ban的运行日志
从日志我们可以看出150.138.26.216.79/78.81、58.22.206.234/119.188.116.15这5个IP都触发了filter规则并被Fail2Ban成功捕获,进入观察中。
你还可以查看防火墙规则,观察哪些ip已经被ban了
iptables --list -n
小结
Fail2Ban的功能非常丰富,你可以通过查看filter.d目录下预置的规则进行学习,从中筛选出你需要的规则,进行直接调用。如果你有编程基础,懂的正则表达式的书写,那么恭喜你,你可以使用Fail2Ban定制属于自己的个性化安全策略。