使用Fail2Ban保护Linux服务器

时间:2020-03-05 15:26:41  来源:igfitidea点击:

什么是Fail2Ban

如果启用了SSH,请检查Linux服务器的登录历史记录。

我们会惊讶地发现,大量IP尝试通过SSH登录到服务器。

如果没有适当的机制来阻止这些登录尝试,则系统很容易受到蛮力攻击。

基本上,脚本/机器人将通过尝试用户名和密码的各种组合来继续尝试与系统建立SSH连接。

这是Fail2Ban之类的工具出现在此处的地方。

Fail2Ban是一个免费的开源软件,可帮助保护Linux服务器免受恶意登录的侵害。
如果存在一定数量的失败登录尝试,Fail2Ban将禁止IP(在一定时间内)。

Fail2Ban具有基本设置的开箱即用功能,但它也是可配置的。
我们可以根据自己的喜好对其进行调整,并根据需要创建过滤器和规则。

在Linux上安装Fail2Ban

在CentOS和Red Hat上安装Fail2Ban

我们必须是root或者sudo用户才能在系统上安装新软件。

我们需要确保系统是最新的,并且已经安装了EPEL存储库。

sudo yum update && sudo yum install epel-release

现在,我们可以使用以下命令安装Fail2Ban:

sudo yum install fail2ban

在Ubuntu和Debian上安装Fail2Ban

首先,请确保系统已更新:

sudo apt update && sudo apt upgrade -y

现在,使用以下命令安装Fail2Ban:

sudo apt install fail2ban

了解Fail2Ban配置文件

Fail2Ban中有两个主要配置文件:/etc/fail2ban/fail2ban.conf和/etc/fail2ban/jail.conf。
让我解释一下他们的工作。

/etc/fail2ban/fail2ban.conf:这是Fail2Ban守护程序的操作设置的配置文件。
此处定义了日志级别,日志文件,套接字和pid文件等设置。

/etc/fail2ban/jail.conf:这是发生所有魔术的地方。
这是我们可以其中配置默认禁止时间,禁止IP之前的联系数,将IP列入白名单,邮件发送信息等内容的文件。
基本上,我们可以从此文件控制Fail2Ban的行为。

现在,在我们更改这些文件之前,Fail2Ban建议我们为这些conf文件使用.local文件进行复制。
这是因为默认的conf文件可以在更新中覆盖,并且我们将丢失所有设置。

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

现在,让我们了解jail.conf文件。
如果使用less命令读取此大文件,则可能会造成混乱。

conf文件试图用太多的注释来解释一切。
所以,让我为我们简化一下。

jail.conf文件分为服务。
有一个[默认]部分,它适用于所有服务。
然后,我们可以看到各种服务及其相应的设置(如果有)。
所有这些服务都放在方括号中。
我们会看到[sshd],[apache-auth],[squid]等部分。

如果删除注释,则默认部分如下所示:

[DEFAULT]
ignorecommand =
bantime = 10m
findtime = 10m
maxretry = 5
backend = auto
usedns = warn
logencoding = auto
enabled = false
mode = normal
filter = %(name)s[mode=%(mode)s]
destemail = Hyman@theitroad
sender = Hyman@theitroad
mta = sendmail
protocol = tcp
chain =
port = 0:65535
fail2ban_agent = Fail2Ban/%(fail2ban_version)s
banaction = iptables-multiport
banaction_allports = iptables-allports
action_abuseipdb = abuseipdb
action = %(action_)s

让我告诉我们其中一些参数的含义。

  • bantime:设置禁止时间。默认值为10分钟。
  • findtime:将对IP进行操作的窗口。默认值为10分钟。假设某个IP在10:30尝试了错误登录。如果相同的IP在10:40之前达到最大重试次数,则将被禁止。否则,10:40之后的下一次失败尝试将被计为第一次失败尝试。
  • maxretry:在执行操作之前重试失败的次数
  • usedns:“警告”设置尝试使用反向DNS查找主机名,并禁止使用主机名。将其设置为no将禁止IP,而不是主机名。
  • destemail:警报将发送到的电子邮件地址(需要配置)
  • 发件人:通知电子邮件中的发件人名称
  • mta:用于通知电子邮件的邮件传输代理
  • banaction:此参数使用/etc/fail2ban/action.d/iptables-multiport.conf文件来设置最大次数的重试后的操作
  • 协议:禁令后将被丢弃的流量类型

如果要对任何一个监狱(或者所有监狱)进行任何更改,例如最大重试次数,禁止时间,查找时间等,则应编辑jal.local文件。

如何使用Fail2Ban保护Linux服务器

让我向我们展示一些使用Fail2Ban加强Linux安全性的方法。

请注意,我们必须是root用户或者具有sudo权限才能运行fail2ban命令。

在服务器上启用Fail2Ban并检查所有正在运行的监狱

我们可以使用systemd命令在Linux服务器上启动并启用Fail2Ban:

systemctl start fail2ban
systemctl enable fail2ban

启用Fail2Ban后,我们可以使用fail2ban-client命令查看状态和活动的监狱:

fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshd

如果我们想知道,默认情况下会启用sshd jail。

查看Fail2Ban日志

Fail2Ban日志位于/var/log/fail2ban.log。
日志文件采用以下格式:

2019-03-25 07:09:08,004 fail2ban.filter [25630]: INFO [sshd] Found 139.59.69.76 – 2019-03-25 07:09:07
2019-03-25 07:09:36,756 fail2ban.filter [25630]: INFO [sshd] Found 159.89.205.213 – 2019-03-25 07:09:36
2019-03-25 07:09:36,757 fail2ban.filter [25630]: INFO [sshd] Found 159.89.205.213 – 2019-03-25 07:09:36
2019-03-25 07:09:36,774 fail2ban.actions [25630]: NOTICE [sshd] Ban 159.89.205.213
2019-03-25 07:09:36,956 fail2ban.filter [25630]: INFO [sshd] Found 182.70.253.202 – 2019-03-25 07:09:36
2019-03-25 07:09:36,957 fail2ban.filter [25630]: INFO [sshd] Found 182.70.253.202 – 2019-03-25 07:09:36
2019-03-25 07:09:36,981 fail2ban.actions [25630]: NOTICE [sshd] Ban 182.70.253.202
2019-03-25 07:09:37,247 fail2ban.filter [25630]: INFO [sshd] Found 112.64.214.90 – 2019-03-25 07:09:37
2019-03-25 07:09:37,248 fail2ban.filter [25630]: INFO [sshd] Found 112.64.214.90 – 2019-03-25 07:09:37
2019-03-25 07:09:37,589 fail2ban.actions [25630]: NOTICE [sshd] Ban 112.64.214.90

我们会看到它识别IP并在IP超过最大重试阈值时将其禁止。

查看Fail2Ban禁止的IP

一种方法是检查某个监狱的状态。
我们可以为此使用Fail2Ban客户端。

fail2ban-client status <jail_name>

例如,如果必须查看Fail2Ban禁止的所有错误的ssh登录,则可以按以下方式使用它。
输出将显示失败尝试总数和被禁止的IP总数。

Hyman@theitroad:~# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 14
| |- Total failed: 715
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 7
|- Total banned: 17
`- Banned IP list: 177.47.115.67 118.130.133.110 68.183.62.73 202.65.154.110 106.12.102.114 61.184.247.3 218.92.1.150

尝试从失败的登录名通过SSH登录的系统应收到这样的错误

ssh: connect to host 93.233.73.133 port 22: Connection refused

如何使用Fail2Ban永久禁止IP

现在,我们知道Fail2Ban对IP的禁令是暂时的。
默认情况下,登录时间为10分钟,攻击者可以在10分钟后尝试再次登录。

这会带来安全风险,因为攻击者可能会使用脚本尝试在10分钟的间隔后登录。

因此,我们如何使用Fail2Ban永久禁止?
没有明确的答案。

从Fail2Ban版本0.11开始,将自动计算禁止时间,并且永久IP的禁止时间将成倍增加。

但是,如果我们检查Fail2Ban版本,则可能正在运行版本0.10.

fail2ban-server --version 
Fail2Ban v0.10.2
Copyright (c) 2004-2008 Cyril Jaquier, 2008- Fail2Ban Contributors
Copyright of modifications held by their respective authors.
Licensed under the GNU General Public License v2 (GPL).

在较早的版本中,我们可以使用负的禁止时间(bantime = -1),这等效于永久禁止,但是如果我们尝试此方法,则可能会看到类似“启动fail2ban:错误NOK:(''的错误。
数据库磁盘镜像格式不正确',)'。

一个不太干净的解决方法是将禁令时间增加到大约1天,1周,1个月或者1年。
在系统上提供新版本之前,这可以解决问题。

如何取消被Fail2Ban阻止的IP

首先检查IP是否被阻止。
由于Fail2Ban可在iptables上运行,因此我们可以查看iptable来查看服务器禁止的IP:

iptables -n -L

如果有太多的IP被禁止,则可能必须使用grep命令。

如果在输出中找到指定的IP地址,则该IP地址被禁止:

因此,下一步是找出哪个“监狱”禁止了该IP。
我们必须在此处将Grep命令与fail2ban日志一起使用。

从下面的输出中可以看到,该IP被sshd jail禁止了。

Hyman@theitroad:~# grep -E ‘Ban.*61.184.247.3’ /var/log/fail2ban.log
2019-03-14 13:09:25,029 fail2ban.actions [25630]: NOTICE [sshd] Ban 61.184.247.3
2019-03-14 13:52:56,745 fail2ban.actions [25630]: NOTICE [sshd] Ban 61.184.247.3

现在我们知道了阻止IP的监狱的名称,我们可以使用fail2ban-client取消IP的禁止:

fail2ban-client set <jail_name> unbanip <ip_address>

如何在Fail2Ban中将IP列入白名单

如果你禁止自己,那将不是一件好事,对吧?
要忽略Fail2Ban当前会话禁止的IP地址,我们可以使用以下命令将该IP列入白名单:

fail2ban-client set <JAIL_NAME> addignoreip <IP_Address>

我们可以在Linux中轻松找到IP地址。

就我而言,这是

sudo fail2ban-client set sshd addignoreip 203.93.83.113
These IP addresses/networks are ignored:
`- 203.93.83.113

如果要永久将IP列入白名单,则应编辑监狱配置文件。
转到所述监狱部分,并添加ignoreip行,如下所示:

ignoreip = 127.0.0.1/8 <IP_TO_BE_WHITELISTED>

如果要将系统中所有监狱的IP列入白名单,最好编辑/etc/fail2ban/jail.local文件,并在DEFAULT部分下添加一行,就像上面看到的一样。

我们必须重新启动Fail2Ban才能使此更改生效。

如何通过监狱查看IP白名单

我们可以使用以下命令查看被监狱列入白名单的所有IP:

fail2ban-client get <JAIL_NAME> ignoreip

它应显示该监狱在Fail2Ban中忽略的所有IP:

sudo fail2ban-client set sshd addignoreip 203.93.83.113
These IP addresses/networks are ignored:
|- 127.0.0.0/8
|- ::1
`- 203.93.83.113

如何从Fail2Ban白名单中删除IP

如果我们要从某个监狱的白名单中删除IP,则可以使用以下命令:

fail2ban-client set <JAIL_NAME> delignoreip <IP_Address>

如果要永久删除IP,则应编辑/etc/fail2ban/jail.local文件。