云服务器一般没有IPS或其他安全防护设备,可以借助Fail2ban来提升Linux服务器的安全性。本文演示的环境为Ubuntu20.04,ubuntu其他版本及Debian同样适用。
安装
首先是常规操作,系统安全更新。
sudo apt update
sudo apt dist-upgrade
在生产环境中,建议进行重启,使相关安全更新生效。
新建服务器的话,可以先清理再重启。
sudo apt autoremove
sudo reboot
安装 fail2ban。
sudo apt install fail2ban
确认fail2ban是否运行,不同的Linux发行版的默认状态是不一样的。我们看到Ubuntu20.04默认是运行的。
sudo systemcctl status fail2ban
查看fail2ban的服务启动情况。
sudo fail2ban-client status
我们能看到有一个jail在用,这个jail是sshd。
fail2ban是怎么工作的?
以ssh为例,它监视失败登陆日志,到达一定阈值时,就在防火墙添加一条规则阻止该特定的IP。我们可以设置允许登录失败的次数,以及阻止时间有多长。默认一般已启用ssh登陆监测,可以增加其他类型,比如Apache web登录 或 nginx web等。
如何配置?
我们进入 /etc/fail2ban 目录,能看到有个jail.conf文件,在jail2ban启动时就查看该文件的配置。但实际该文件不是首选,而是jail.local文件。
确实可以直接编辑jail.conf文件使fail2ban生效,但在软件升级时,该文件可能会被新版本覆盖而使配置失效,所以一般的做法是复制该文件建立新文件jail.local,相关配置在jail.local中进行。sudo cp jail.conf jail.local
sudo vim jail.local
在vim中开启显示行数,然后定位到文本末尾,能看到有900多行。## 在vim中执行命令, :set number用于显示行数,大写的G定位到最后一行## 再按 gg 回到文本头。
:set number
G
下面开始配置 jail.local:
ignoreip表示白名单,防止把自己锁在外面,这里的183.222.444.555表示自己的公网出口。
bantime表示锁定的时间。
findtime表示在多少时间范围。
maxretry表示发生的次数。
以下的配置表示在10分钟内发生5次的话就阻止,阻止时间为10分钟。
ignoreip = 127.0.0.1/8 ::1 183.222.444.555
bantime = 10m
findtime = 10m
maxretry = 5
然后我们看jail.local各节,比如在sshd节,我们添加在此下面添加enabled = true即可完成。注意在ubuntu中,sshd不加enabled=true默认也是开启的。
......
[sshd]
enabled = true
......
我们激活一个默认的jail [nginx-botsearch],只需在其下面添加 enabled = true即可,该 jail 在 /etc/fail2ban/filter.d 下有相应的文件:nginx-botsearch.conf。
下面来看一个实际场景中非常有用的例子:
云服务器部署nginx作为web反向代理部署面对互联网时,经常会有大量的扫描尝试访问,后端的服务器会响应返回404,我们可以设置策略阻止这些扫描行为。
新建一个文件 /etc/fail2ban/filter.d/nginx-4xx.conf。键入以下内容:
[Definition]
failregex = ^<HOST>.*"(GET|POST).*" (404|444|403|400) .*$
ignoreregex =
表示过滤404,444,403,400等错误。然后在 /etc/fail2ban/jail.local添加一节:
[nginx-4xx]
enabled = true
port = http,https
logpath = %(nginx_access_log)s
bantime = 7200
findtime = 2
maxretry = 2
注意我们自定义了该节的findtime和maxretry、bantime,表示2秒内有2次以上的404等响应,就认为该IP是在扫描,就阻止它2个小时(7200秒),当然这个时间参数要根据实际情况不断作相应调整。
然后进行fail2ban的重启并查看实际已在运行
systemctl restart fail2ban
systemctl status fail2ban
可以查看fail2ban的日志及相关的日志查看执行情况。
cat /var/log/fail2ban.log
cat /var/log/syslog
cat /var/log/auth.log
cat /var/log/nginx/access.log
更简单的是用fail2ban提供的命令查看特定的jail。
fail2ban-client status nginx-4xx
我们看到在nginx-4xx这个jail中,有一个IP被 我们阻止了,因为它频繁向我们的服务器发出各种尝试,达到阈值时,我们就在iptables中加入对该IP的禁止访问。
如果想解除对这个IP的阻止,可以键入命令。
fail2ban-client set nginx-4xx unbanip 122.224.114.99
你可能好奇,fail2ban是如何阻止IP的,只要执行查看iptables就知道了。
iptables -L
我们看到,Fail2ban在需要阻止某IP时,会自动在iptables里添加条目进行拦载。