服务器安全之用Fail2Ban 保护 Nginx、WordPress 简单又高效

2019年7月19日21:04:39 发表评论 热度357 ℃

Fail2Ban 是一种入侵防御软件框架,可以保护计算机服务器免受暴力攻击。它以 Python 编程语言编写,能够在 POSIX 系统上运行,该系统具有本地安装的数据包控制系统或防火墙的接口,例如 iptables 或 TCP Wrapper;其实Fail2Ban 就是一个日志 IP 的过滤筛选器,根据不同的监狱规则从日志中找出这些“行为不端”的 IP,一旦这些 IP 发送了触犯监狱规则的请求达到阈值就会在 iptables 里直接封禁屏蔽,并且可以设置屏蔽这个 IP 的时间长久来避免误伤造成的危害过大。
下面开始配置监狱,也就是 Fail2Ban 的监控模块,默认配置中就已经写好了很多配置,我们需要手动来启动它们。
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Fail2Ban 会自动读取 .local 文件的配置,然后再增量地读取 conf 配置,这样就避免了更新它时你辛辛苦苦写好的配置被覆盖掉了。
然后我们就来编辑 Fail2Ban 的配置;
vim /etc/fail2ban/jail.local
首先是在 [DEFAULT] 字段下,我们可以改变一些行为参数,比如这样修改(多余的没有提到的配置就保留默认):

  1. bantime = 7200 #默认是 10 分钟,这个是说要 ban 多久,我们改长一点
  2. #下面这两个是说在多长时间内失败多少次就被屏蔽,
  3. #比如这个是在 600 秒内失败 6 次就被屏蔽
  4. findtime = 600
  5. maxretry = 6

接下来就是添加我们的监狱配置了,默认配置信息中并没有内置 Nginx ,只有 Apache:

  1. [nginx-http-auth]
  2. # HTTP 验证防暴力破解
  3. enabled  = true
  4. filter  = nginx-http-auth
  5. port    = http,https
  6. logpath  = /var/log/nginx/error.log
  7. [nginx-badbots]
  8. #屏蔽恶意爬虫
  9. enabled  = true
  10. port    = http,https
  11. filter  = nginx-badbots
  12. logpath  = /var/log/nginx/access.log
  13. maxretry = 2
  14. [nginx-nohome]
  15. #避免恶意请求网站目录结构
  16. enabled  = true
  17. port    = http,https
  18. filter  = nginx-nohome
  19. logpath  = /var/log/nginx/access.log
  20. maxretry = 2
  21. [nginx-noproxy]
  22. #避免 nginx 被他人用于反向代理
  23. enabled  = true
  24. port    = http,https
  25. filter  = nginx-noproxy
  26. logpath  = /var/log/nginx/access.log
  27. maxretry = 2
  28. [wp-login]
  29. #防范 WordPress 暴力破解登录请求
  30. enabled = true
  31. port = http,https
  32. filter = wp-login
  33. maxretry = 10
  34. findtime = 60
  35. bantime = 43600
  36. logpath  = /var/log/nginx/access.log
  37. [xmlrpc]
  38. #防止 WordPress 受到 xmlrpc.php CC 攻击
  39. enabled = true
  40. port = http,https
  41. filter = xmlrpc
  42. logpath  = /var/log/nginx/access.log
  43. bantime = 43600
  44. maxretry = 1
  45. findtime  = 5

注意这里的配置都是基于 Nginx 的日志的,所以你必须要允许 Nginx 记录日志;上述配置中 logpath 是指日志文件的路径的(如:/var/log/nginx/access.log),需要注意的是这里可以指定多个日志文件的,具体格式如下:

  1. logpath  = /home/wwwlogs/access.log
  2.            /home/wwwlogs/www.aaa.com.log
  3.            /home/wwwlogs/www.bbb.tech.log
  4.            /home/wwwlogs/service.ccc.com.log
  5.            /home/wwwlogs/eat.ddd.com.log

每个日志文件需要回车换行(空格直接去掉了,所以可以放心用空格对齐)才能识别到哦!在配置 Fail2Ban 之前,你就应该先安装好 Nginx,否则 Fail2Ban 读不到 Nginx 的日志,会报错。
为监狱配置规则,设置好了要启用的监狱,接下来就是给监狱创建规则了:
cd /etc/fail2ban/filter.d
在这个目录下,存放这所有规则文件,一个配置名一个文件,有多少个文件就有多少个规则,这些规则被上文中监狱配置里 filter 字段调用。
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

  1. [Definition]
  2.  failregex = ^ -.*GET .*/~.*
  3.  ignoreregex =

这是过滤反代的:vim nginx-noproxy.conf

  1. [Definition]
  2. failregex = ^ -.*GET http.*
  3. ignoreregex =

这是防止 WordPress 受到 xmlrpc.php 请求的 CC 攻击:vim xmlrpc.conf

  1. [Definition]
  2. failregex = ^ .*POST .*xmlrpc\.php.*
  3. ignoreregex =

防范 WordPress 暴力破解登录请求:vim wp-login.conf

  1. [Definition]
  2. failregex = ^ -.* /wp-login.php.* HTTP/1\.."
  3. ignoreregex =

借助 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/目录内

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

保存退出;再打开编辑 jail.local 启用这个监狱规则;
vim /etc/fail2ban/jail.local
添加下面的代码到 jail.local 里即可;

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

做完上述配置之后,就可以重启了fail2ban service fail2ban restart
这时你可以通过命令 fail2ban-client status 来查看,不出意外,应该类似这样:

  1. Status
  2. |- Number of jail: 7
  3. `- Jail list: nginx-badbots, nginx-http-auth, nginx-nohome, nginx-noproxy, sshd, wp-login, xmlrpc

至此,Fail2Ban 保护 Nginx、WordPress 基本算是完成了,平时可以观察一下 Fail2Ban 的日志文件来观察 Fail2Ban 的防御效果,命令如下:
tail -f /var/log/fail2ban.log
再通过查看 iptables 防火墙的拦截
iptables --list -n

资讯猿

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: