使用Fail2ban保护云服务器

云服务器一般没有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里添加条目进行拦载。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注