在购买了VPS之后你应该做足的安全措施中我们提到过用 fail2ban 来保护 ssh ,这样即使不改变ssh端口(默认为22),也可以做到避免被暴力破解密码,当然,我们已经开启了证书登录并关闭了 ssh 的密码登录选项,但用 fail2ban 干掉那些不停尝试的 bot 也是一件令人心情愉悦的事情。
其实,除了 使用 fail2ban 防止 Bind9 被用于 DNS 放大攻击外,我们也可以用 fail2ban 来保护 nginx ,毕竟它的原理就是用正则匹配日志文件,然后操作 iptables,所以理论上一切能写日志的应用都可以用 fail2ban 来生成规则并加以保护。
这次我们就一起来看看,除了默认配置外,我们还能怎样用 fail2ban 来保护 nginx
首先是
配置监狱
也就是 fail2ban 的监控模块,其实默认配置中就已经写好了很多配置,当然我们需要手动来启动它们。
1 |
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local |
fail2ban 会自动读取 .local 文件的配置,然后再增量地读取 conf 配置,这样就避免了更新它时你辛辛苦苦写好的配置被覆盖掉了。
然后我们就来编辑 fail2ban 的配置 vi /etc/fail2ban/jail.local
首先是在 [DEFAULT] 字段下,我们可以改变一些行为参数,比如这样修改(多余的没有提到的配置就保留默认,不要理会即可):
1 2 3 4 5 6 |
bantime = 3600 #默认是10分钟,这个是说要ban多久,我们改长一点 #下面这两个是说在多长时间内失败多少次就被屏蔽, #比如这个是在3600秒内失败6次就被屏蔽 findtime = 3600 maxretry = 6 |
接下来就是添加我们的监狱配置了,默认配置信息中并没有内置 nginx ,只有 apache:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
[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 |
注意这里的配置都是基于 nginx 的日志的,所以你必须要允许 nginx 记录日志,有些管理员为了性能考量会关闭日志,这样我们这篇文章也就失去了意义。
另,在配置 fail2ban 之前,你就应该先安装好 nginx,否则 fail2ban 读不到 nginx 的日志,会报错。
为监狱配置规则
设置好了要启用的监狱,接下来就是给监狱创建规则了:
1 |
cd /etc/fail2ban/filter.d |
在这个目录下,存放这所有规则文件,一个配置名一个文件,有多少个文件就有多少个规则,这些规则被上文中监狱配置里 filter 字段调用。
1 |
vi nginx-http-auth.conf |
这个规则是存在的,我们在规则中加一行配置,来过滤除了账号密码错误外,空白账号或者密码的错误:
1 2 3 4 5 6 7 |
[Definition] failregex = ^ \[error\] \d+#\d+: \*\d+ user "\S+":? (password mismatch|was not found in ".*"), client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$ ^ \[error\] \d+#\d+: \*\d+ no user/password was provided for basic authentication, client: <HOST>, server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$ ignoreregex = |
添加的是高亮的那一行。
1 |
cp apache-badbots.conf nginx-badbots.conf |
过滤爬虫的规则是有现成的,所以我们只需要改个名就可以了;
1 |
vi nginx-nohome.conf |
这是过滤获取目录的:
1 2 3 4 5 |
[Definition] failregex = ^<HOST> -.*GET .*/~.* ignoreregex = |
1 |
vi nginx-noproxy.conf |
这是过滤反代的:
1 2 3 4 5 |
[Definition] failregex = ^<HOST> -.*GET http.* ignoreregex = |
确认生效
做完上述配置之后,就可以重启 fail2ban 了 service fail2ban restart
这时你可以通过命令 fail2ban-client status 来查看,不出意外,应该类似这样:
1 2 3 4 |
➜ ~ fail2ban-client status Status |- Number of jail: 5 `- Jail list: nginx-badbots, nginx-http-auth, nginx-nohome, nginx-noproxy, sshd |
本文由 落格博客 原创撰写:落格博客 » Fail2Ban 高级配置 保护 Nginx 服务
转载请保留出处和原文链接:https://www.logcg.com/archives/2998.html
您好!我按照老铁的配置设置后,[nginx-http-auth]配置错误提示:
ERROR No file(s) found for glob /var/log/nginx/*error.log
ERROR Failed during configuration: Have not found any log file for nginx-http-auth jail。
在网上找了一大圈,但是还是找不出解决办法,所以来请教老铁。
首先,你要确定你nginx正确配置且启动了,即开启了日志功能,有些默认配置是不开日志的,那么fail2ban自然就找不到日志文件了。
其次,你的日志目录是在nginx里配置的,我示例中给出的路径是一个比较通用的路径,但具体要看你的配置,有的人甚至喜欢把日志写到对应的wwwroot里……总之要看你具体配置,两边路径一致即可。
最后,治标不治本:logpath = /var/log/nginx/error.log,按照路径创建这个“error.log”文件即可。至少立即就不报错了。
https://service.imydl.com/yunwei/594.html
被抄袭了~