使用 Fail2Ban 保护 Nginx、WordPress 安全又高效

雷石 591 1

Fail2Ban 是一种入侵防御软件框架,可以保护计算机服务器免受暴力攻击。它以 Python 编程语言编写,能够在 POSIX 系统上运行,该系统具有本地安装的数据包控制系统或防火墙的接口,例如 iptables 或 TCP Wrapper。

使用 Fail2Ban 保护 Nginx、WordPress 安全又高效

配置监控

也就是 Fail2Ban 的监控模块,其实默认配置中就已经写好了很多配置,当然我们需要手动来启动它们。

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Fail2Ban 会自动读取 .local 文件的配置,然后再增量地读取 conf 配置,这样就避免了更新它时你辛辛苦苦写好的配置被覆盖掉了。

然后我们就来编辑 Fail2Ban 的配置

vim /etc/fail2ban/jail.local

首先是在 [DEFAULT] 字段下,我们可以改变一些行为参数,比如这样修改(多余的没有提到的配置就保留默认,不要理会即可):

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

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

[nginx-http-auth]
# HTTP 验证防暴力破解
enabled  = true
filter  = nginx-http-auth
port    = http,https
logpath  = /var/log/nginx/error.log
 
[nginx-badbots]
#屏蔽恶意爬虫
enabled  = true
port    = http,https
filter  = nginx-badbots
logpath  = /var/log/nginx/access.log
maxretry = 2
 
[nginx-nohome]
#避免恶意请求网站目录结构
enabled  = true
port    = http,https
filter  = nginx-nohome
logpath  = /var/log/nginx/access.log
maxretry = 2
 
[nginx-noproxy]
#避免 nginx 被他人用于反向代理
enabled  = true
port    = http,https
filter  = nginx-noproxy
logpath  = /var/log/nginx/access.log
maxretry = 2

[wp-login]
#防范 WordPress 暴力破解登录请求
enabled = true
port = http,https
filter = wp-login
maxretry = 10
findtime = 60
bantime = 43600
logpath  = /var/log/nginx/access.log

[xmlrpc]
#防止 WordPress 受到 xmlrpc.php CC 攻击
enabled = true
port = http,https
filter = xmlrpc
logpath  = /var/log/nginx/access.log
bantime = 43600
maxretry = 1
findtime  = 5

注意这里的配置都是基于 Nginx 的日志的,所以你必须要允许 Nginx 记录日志,有些管理员为了性能考量会关闭日志,这样我们这篇文章也就失去了意义。

上述配置中 logpath 是指日志文件的路径的(如:/var/log/nginx/access.log),需要注意的是这里可以指定多个日志文件的,具体格式如下:

logpath  = /home/wwwlogs/access.log
           /home/wwwlogs/www.1111.com.log
           /home/wwwlogs/www.2222.tech.log
           /home/wwwlogs/service.3333.com.log
           /home/wwwlogs/eat.4444.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

这是过滤获取目录的:

[Definition]
 failregex = ^ -.*GET .*/~.*
 ignoreregex =
vim nginx-noproxy.conf

这是过滤反代的:

[Definition]
 failregex = ^ -.*GET http.*
 ignoreregex =
vim xmlrpc.conf

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

[Definition]
failregex = ^ .*POST .*xmlrpc\.php.*
ignoreregex =
vim wp-login.conf

防范 WordPress 暴力破解登录请求

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

确认生效

做完上述配置之后,就可以重启

fail2ban  service fail2ban restart

这时你可以通过命令 fail2ban-client status 来查看,不出意外,应该类似这样:

fail2ban-client status
|- Number of jail: 7
`- 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

如上图所示,IP 地址 193.201.224.220,14.13.135.161,218.92.139.149,90.181.101.224 都触发了 Fail2Ban 的【wp-login】监狱规则并被 Fail2Ban 捕获到了。

在通过查看 iptables 防火墙的拦截

iptables --list -n

使用 Fail2Ban 保护 Nginx、WordPress 安全又高效
上图的结果中 IP 地址 193.201.224.220 因为一定时间(5 秒)请求次数达到设定的值而被 iptables 防火墙给屏蔽了,屏蔽的时间是 43600 秒。

发表评论 取消回复
表情 图片 链接 代码

  1. repostone
    repostone Lv 1

    非技术的路过。

分享