今天明月给大家分享个 Fail2ban 的过滤(Filter)规则,有关 Fail2ban 的文章大家可以参考【服务器全面使用 Fail2Ban 初见成效】和【使用 Fail2ban 禁止垃圾采集爬虫,保护 Nginx 服务器】等文了解,总之 Fail2ban 是 Linux 下不可或缺的安全防御工具,特别是针对 Nginx 的站点日志文件进行实时分析防御效果非常的出众,当你发现自己的站点被暴力破解、恶意爬虫骚扰、采集等等的时候明月非常建议你试试 Fail2ban。
今天分享给大家的这个过滤规则比较具有综合性,能防范暴力破解又能屏蔽拦截恶意骚扰请求,明月尤其喜欢的就是对 xmlrpc.php 的访问自动过滤允许来自安卓 WordPress 客户端的请求,另外对于那些使用随机伪装 UA 的请求拦截效果也非常的好。
规则代码:
[Definition]
failregex = ^<HOST> \- \S+ \[\] \"(GET|POST|HEAD) .+XDEBUG.+$
^<HOST> \- \S+ \[\] \"(GET|POST|HEAD) .+GponForm.+$
^<HOST> \- \S+ \[\] \"(GET|POST|HEAD) .+phpunit.+$
^<HOST> \- \S+ \[\] \"(GET|POST|HEAD) .+ajax-index\.php .+$
^<HOST> \- \S+ \[\] \"(GET|POST|HEAD) .+sellers\.json .+$
^<HOST> \- \S+ \[\] \"(GET|POST|HEAD) .+adminer\.php .+$
^<HOST> \- \S+ \[\] \"(GET|POST|HEAD) .+wp-configuration\.php.+$
^<HOST> \- \S+ \[\] \"(GET|POST|HEAD) .+ThinkPHP.+$
^<HOST> \- \S+ \[\] \"(GET|POST|HEAD) .+wp-config.+$
^<HOST> \- \S+ \[\] \"(GET|POST|HEAD) .+dede\/login\.php .+$
^<HOST> \- \S+ \[\] \"(GET|POST|HEAD) .+plus\/recommend\.php .+$
^<HOST> \- \S+ \[\] \"(GET|POST|HEAD) .+e\/install\/index.php .+$
^<HOST> \- \S+ \[\] \"(GET|POST|HEAD) .+m\/e\/install\/index\.php .+$
^<HOST> \- \S+ \[\] \"(GET|POST|HEAD) .+e_bak\/install\/index.php .+$
^<HOST> \- \S+ \[\] \"(GET|POST|HEAD) .+\.aspx .+$
^<HOST> \- \S+ \[\] \"(GET|POST|HEAD) .+\.act .+$
^<HOST>.*] "(GET|POST|HEAD) .*xmlrpc\.php.*
^<HOST> -.*"(GET|POST|HEAD).*HTTP\/1\.1.*"*.Mozilla/5\.0 \(Windows NT 6\.1\; rv\:60\.0\) Gecko\/20100101 Firefox\/60\.0.*"$
^<HOST> -.*"(GET|POST|HEAD).*HTTP\/1\.1.*"*.Photon.*"$
^<HOST> -.*"(GET|POST|HEAD).*HTTP\/1\.1.*"*.Mozilla\/5\.0 zgrab\/0\.x.*"$
^<HOST> -.*"(GET|POST|HEAD).*HTTP\/1\.1.*"*.XTC.*"$
^<HOST> -.*"(GET|POST|HEAD).*HTTP\/1\.1.*"*.python-requests.*"$
^<HOST> -.*"(GET|POST|HEAD).*HTTP\/1\.1.*"*.bidswitchbot.*"$
^<HOST> -.*"(GET|POST|HEAD).*HTTP\/1\.1.*"*.Google-adstxt.*"$
^<HOST> -.*"(GET|POST|HEAD).*HTTP\/1\.1.*"*.Apache-HttpClient.*"$
^<HOST>.*] "POST .*HTTP\/1\.1.*
^<HOST> -.*"(GET|POST|HEAD).*HTTP\/1\.1.*"*.Go-http-client\/1\.1.*"$
^<HOST> .* ".*\\x.*" .*$
^<HOST> -.*"(GET|POST|HEAD) .+wp-login\.php .*HTTP\/1\.1.*
^<HOST> -.*"(GET|POST|HEAD) .*wp-includes/wlwmanifest.xml .*HTTP\/1\.1.*
ignoreregex = ^<HOST>.*] "POST /xmlrpc\.php\?for=wpandroid*
^<HOST>.*] "POST /wp-cron\.php\?doing_wp_cron=.*
datepattern = {^LN-BEG}%%ExY(?P<_sep>[-/.])%%m(?P=_sep)%%d[T ]%%H:%%M:%%S(?:[.,]%%f)?(?:\s*%%z)?
^[^\[]*\[({DATE})
{^LN-BEG}
简单的给大家说明一下:
failregex = ^<HOST>.*] "(GET|POST|HEAD) .*xmlrpc\.php.*
ignoreregex = ^<HOST>.*] "POST /xmlrpc\.php\?for=wpandroid*
上述两条规则就是防止 Wordpress xmlrpc 攻击的规则,并且让 WordPress fo android 客户端正常访问工作,有关 WordPress 手机客户端大家可以参考【如何使用 WordPress 手机客户端?】和【WordPress 站点实现评论秒回复】等文章。
failregex = ^<HOST> .* ".*\\x.*" .*$
这个规则防止 URL 中的特殊字符攻击的,可以过滤掉如下这样的访问记录:
185.202.1.188 - - [23/Jun/2020:08:18:33 +0800] "\x03\x00\x00/*\xE0\x00\x00\x00\x00\x00Cookie: mstshash=Administr" 400 157 "-" "-"
不知道您见没见到过这样的访问记录,反正明月是真的见过不少次了!都是转义符想拦截都不知道到如何下手?嘿嘿,现在可以搞定了。
将上面分享的过滤规则单独保存为 nginx-custom.conf 文件到/etc/fail2ban/filter.d 目录下,然后打开/usr/local/nginx/conf/nginx.conf 编辑添加这个 nginx-custom 过滤的拦截条件如下:
[nginx-custom]
enabled = true
port = http,https
filter = nginx-custom
action = iptables-multiport[name=BadBots, port="http,https"]
logpath = /home/wwwlogs/*.log
maxretry = 1
bantime = 86400
然后保存,重启 Fail2ban 就可以生效进行实时分析拦截了,说实话这个拦截条件有点儿苛刻了,触发一次就屏蔽 IP 一整天确实够狠,呵呵!