0°

Fail2Ban 使用技巧和心得汇总

通过今天这个【屏蔽Nginx下的恶意404结果扫描】Fail2Ban监狱实例给大家分享了Fail2Ban的几个实用小技巧,希望可以帮助到大家,目前明月整理收集的几个监狱规则正在自己个人服务器上测试,等测试完成后就会部署在托管业务的服务器上,给客户提供最安全的服务器一直都是明月追求的目标。

通过【使用 Fail2Ban 保护 Nginx、WordPress 简单又高效】一文的梳理,明月基本上已经是彻底的明白和吃透了 Fail2Ban 的原理了,说白了 Fail2Ban 就是一个日志 IP 的过滤筛选器,根据不同的监狱规则从日志中找出这些“行为不端”的 IP,一旦这些 IP 发送了触犯监狱规则的请求达到阈值就会在 iptables 里直接封禁屏蔽,并且可以设置屏蔽这个 IP 的时间长久来避免误伤造成的危害过大。

所以用好 Fail2Ban 其实最重要的就是如何根据日志制定有效的监狱规则,规则制订完了还需要测试一下这个规则是否生效了,是否真的可以起到预期的目的。下面明月就结合一个实际的案例给大家具体的讲解一下:

如果经常分析 Nginx 站点日志的话,很多站长朋友们应该都会发现,站点经常收到很多返回码是 404 的请求,如下图所示:

Fail2Ban 使用技巧和心得汇总
//plus/mytag_j.php?aid=6022
//plus/ad_js.php?aid=9090
//plus/ad_js.php?aid=8888
//plus/mytag_js.php?aid=8080
//utility/convert/data/config.inc.php

像上述这些目录和文件的请求,很明显我们的站点根本就没有这些目录或者文件,这样的请求自然是返回 404 的,看似都是些很“正常”的无效访问而已,不过,仔细分析日志以及过往日志后就发现类似这种返回 404 结果的请求,就明月这样“严防死守”的服务器每天几乎都在 300-500 个之多。这种行为的目的我们先不去深究,就这种频率绝对算是一种骚扰了,如果数量再大一些频率再高一些那影响和浪费的可就是服务器带宽和流量了。所以,这种请求必须进行应对措施,至少让其不能这么肆无忌惮呀!

借助 Fail2Ban 可以筛选出发送这些请求的 IP 地址来进行拦截屏蔽处理,根据日志中返回 404 的记录制定 Fail2Ban 监狱规则命名为 nginx-not-found.conf,具体内容如下:

vim /etc/fail2ban/filter.d/nginx-not-found.conf

打开编辑 nginx-not-found.conf 监狱规则文件,注意一定要在/etc/fail2ban/filter.d/目录内哦

[Definition]
failregex = ^<HOST>.*"(GET|POST).*" (404|444|403|400) .*$
ignoreregex =

保存退出。

再打开编辑 jail.local 启用这个监狱规则。

vim /etc/fail2ban/jail.local

添加下面的代码到 jail.local 里即可。同样的,注意 jail.local 文件的目录哦。

[nginxno404]
#处理 nginx 下的恶意 404 结果扫描
enabled = true
port = http,https
filter = nginx-not-found
action = iptables[name=nginxno404, port=http, protocol=tcp]
#Fail2Ban 要监控的站点日志文件,大家可以根据自己站点来灵活调整。
logpath  = /home/wwwlogs/access.log
           /home/wwwlogs/www.imydl.com.log
           /home/wwwlogs/www.imydl.tech.log
           /home/wwwlogs/service.imydl.com.log
           /home/wwwlogs/eat.ymanz.com.log
bantime = 3600 #默认是屏蔽 IP 地址 10 分钟
#下面这两个是说 60 秒内 5 次 404 失败请求就开始屏蔽这个 IP 地址
findtime = 60
maxretry = 5

保存退出。

重新启动 Fail2Ban:

systemctl restart fail2ban.service

这时候,我们换需要验证一下 nginx-not-found.conf 这个监狱规则是否能够生效也就是真正的发现日志文件中返回码是:404、444、403、400 中任意一个的记录,我们可以使用 fail2ban-regex 命令来验证这个规则,具体命令如下:

fail2ban-regex /home/wwwlogs/www.imydl.com.log /etc/fail2ban/filter.d/nginx-not-found.conf

上述命令就是用/home/wwwlogs/www.imydl.com.log 这个日志文件来测试/etc/fail2ban/filter.d/nginx-not-found.conf 监狱规则是否能够生效,返回结果如下图所示:

Fail2Ban 使用技巧和心得汇总

通过上图的返回结果,可以看到这个监狱规则匹配了 655 条日志记录,说明规则是合适的,能够生效!通过查看 Fail2Ban 日志文件,我们也可以清晰的看到[nginxno404]监狱正在生效并且捕捉到了 IP 地址,如下图所示:

Fail2Ban 使用技巧和心得汇总

这是明月博客服务器目前的 Fail2Ban 实时日志截图,上图可以看到已经屏蔽(Ban)了 172.104.78.195 这个日志,那些 Found 的 IP 地址,因为没有触发“60 秒内 5 次 404 失败请求”这个规则所以暂时没有屏蔽(Ban),当然你也可以调高规则针对频率的阈值来直接屏蔽这些 IP 地址。

在实际生产环境中使用这个监狱规则的时候不可避免的会出现“误伤”的发生,一旦发现误伤我们就需要解除某个 IP 地址的屏蔽,这时候可以使用 fail2ban-client 命令来解除某给 IP 地址的屏蔽,比如:我们要解除 172.104.78.195 这个 IP 地址只需要fail2ban-client set 监狱名称 unbanip 要解除的 IP 地址 这样的命令即可解除,如:

fail2ban-client set nginxno404  unbanip 172.104.78.195
172.104.78.195

运行成功后会返回解除屏蔽的 IP 地址。

同时我们还可以查看[nginxno404]这个监狱的运行状况来查看已经屏蔽的 IP 地址有哪些:

fail2ban-client status nginxno404

这个命令会显示监狱[nginxno404]一共被触发了几次,施行屏蔽(Ban)IP 几次,IP 地址分别是哪几个,我就不再发图片了,大家自行再控制台终端体验即可。

通过今天这个【屏蔽 Nginx 下的恶意 404 结果扫描】Fail2Ban 监狱实例给大家分享了 Fail2Ban 的几个实用小技巧,希望可以帮助到大家,目前明月整理收集的几个监狱规则正在自己个人服务器上测试,等测试完成后就会部署在托管业务的服务器上,给客户提供最安全的服务器一直都是明月追求的目标。

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论