如何使用Fail2Ban保护SSH

保护服务器免受暴力攻击是必不可少的。问题是,如何做到?幸运的是,Fail2Ban 就在附近,可以保护您的服务器,但是 Fail2Ban 的默认配置需要一些调整以实现最佳安全性。不过不用担心,本教程已经为您做好了准备。

在本教程中,您将学到如何设置 Fail2Ban 并通过保护您的 SSH 服务器来抵御暴力攻击。

准备好了吗?继续阅读以优化您的 SSH 服务器安全性!

先决条件

本教程包含逐步说明。如果您想跟着做,请确保您已经做好了以下准备:

  • 一个 Ubuntu 和 Debian 服务器 – 本教程使用运行Ubuntu 18.04 LTS 的服务器来设置 Fail2Ban,并使用 Debian 10 服务器来测试 Fail2Ban 的封禁配置。
  • Root 访问或服务器上的 sudo 特权以作为超级用户执行命令。
  • Fail2Ban已安装在Ubuntu或Debian服务器上。

设置基础防火墙

Fail2Ban通过监视日志文件并封禁在特定时间段内尝试登录次数过多的IP地址来保护您的服务器。但首先,您将设置一个基础防火墙,您可以在其中添加规则以阻止服务器上的恶意行为。

1.首先运行以下service命令停止Fail2Ban(fail2ban stop)运行。在更改配置文件时停止Fail2Ban,以便您可以测试更改并确保其按预期工作。

sudo service fail2ban stop
Stopping the fail2ban service

2.运行apt install命令安装SendmailIPTables-persistent。Sendmail是Fail2Ban用于通知您封禁IP地址的程序。而IPTables-persistent是一个程序,它会将更改后的配置设置保存在/etc/sysconfig/iptables文件中。

安装这些程序可以保持防火墙设置的完整性,即使发生意外情况,如停电。

sudo apt install sendmail iptables-persistent -y

现在运行下面的每个iptables命令来设置防火墙。这些命令不会生成任何输出,但会向防火墙添加四条规则。这些规则要么允许连接到您的服务器,要么阻止连接。

## 第一条规则-接受服务器(lo接口)生成的所有流量 
sudo iptables -A INPUT -i lo -j ACCEPT
## 第二条规则-接受所有属于已建立或相关连接的流量
## 第三条规则-允许通过端口22的SSH流量
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
## 第四条规则-拒绝所有其他流量
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

sudo iptables -A INPUT -j DROP
Adding four rules to your firewall

4. 运行以下iptables命令以查看您在防火墙中设置的摘要。

sudo iptables -S

下面,突出显示了您在防火墙中添加的规则。

Checking your firewall rules

5. 接下来,运行以下命令将您的规则保存在/etc/sysconfig/iptables-config文件中,并启动Fail2Ban服务。 iptables-config文件保存了所有永久性防火墙规则。

Fail2Ban将自动向防火墙添加一些规则以保护您的服务器。

sudo dpkg-reconfigure iptables-persistent
sudo service fail2ban start

6. 最后,重新运行下面的iptables命令以查看您的防火墙规则。

sudo iptables -S

如下所示,以红色突出显示了Fail2Ban添加到您的防火墙的新规则。

Previewing your firewall rules

调整本地Fail2Ban配置

现在您已经运行了基本防火墙,是时候调整您本地的Fail2Ban配置文件,以加强对服务器的安全控制。本教程使用/etc/fail2ban/jail.conf配置文件,因为它包含配置Fail2Ban应用程序全局设置所需的所有选项。

也许您想为SSH服务器创建自定义规则。如果是这样,您将创建一个新的jail.local文件(基于jail.conf文件),并将SSH特定的规则放在jail.local文件中。这样做可以让您覆盖jail.conf文件中的服务器默认设置。

1. 运行以下awk命令执行以下操作:

  • 打印/etc/fail2ban/jail.conf文件的内容('{ printf "# "; print; }')。
  • 创建一个名为jail.local的文件(基于jail.conf文件),可用于覆盖jail.conf文件中的默认设置。
  • /etc/fail2ban/jail.conf文件的内容传递到tee命令。这样将把jail.conf文件的内容写入您的本地文件系统(/etc/fail2ban/jail.local)。
awk '{ printf "# "; print; }' /etc/fail2ban/jail.conf | sudo tee /etc/fail2ban/jail.local
Creating the jail.local file

2. 创建了jail.local文件后,请运行下面的ls命令。该命令列出您服务器的Fail2Ban目录(/etc/fail2ban)的内容,以验证您的jail.local文件是否正确生成。

ls /etc/fail2ban

如果您看到新的jail.local文件,如下所示,则表示您的本地文件已正确生成。

Checking the newly created local file (jail.local)

3. 在您喜欢的文本编辑器中打开/etc/fail2ban/jail.local文件,并导航到[ssh]部分。

通过删除下面显示的选项前的#符号来取消注释[sshd]enabled选项,以启用SSH。

从此处到教程的其余部分,删除前置于任一部分或选项前的#符号以启用它们。

Enabling the [ssh] section

4. 向下滚动,并取消注释下面显示的[DEFAULT]部分。此部分是您配置Fail2Ban的默认设置的地方。此部分中的任何设置都将应用于Fail2Ban管理的所有jails

Uncommenting the [DEFAULT] option

5. 接下来,滚动到bantime部分,并设置bantime60分钟。bantime选项设置了在登录尝试失败后,IP地址被禁止的时间量,以分钟为单位。

默认的禁令时间设置为600秒(10分钟)。您可以根据需要调整此设置,但重要的是要注意,禁令时间设置越低,服务器的负载就越大。

Setting a ban duration

6. 转到findtimemaxretry选项。保留findtime设置为原样(10m),将maxretry降低到3

findtime选项设置了IP地址在登录失败之前可以经过的时间,以分钟为单位。而maxretry选项设置了IP地址在被禁止之前的登录尝试次数。

默认的findtime设置为10分钟,maxretry为5分钟。因此,在10分钟内登录失败5次的IP地址将被禁止。

Setting a Window Time for an IP Address to Login Before Getting Banned

7. 向下滚动,取消注释并配置destemailsendermta选项:

  • destemail – 输入一个电子邮件地址,Fail2Ban将通知发送到该地址。
  • sender – 设置Fail2Ban发送到destemail的电子邮件中的“发件人”字段。
  • mta – 保持默认设置(sendmail)。mta选项设置了Fail2Ban用于发送通知的电子邮件传送代理。
Configuring destemail, sender, and mta options

8. 导航到如下所示的操作选项,取消注释action_mwl选项。这样做可以让Fail2Ban向您发送logwatch邮件。您可以查看logwatch邮件以进一步调查服务器上可能存在的安全问题。

保存更改并退出文本编辑器。

Enabling Logwatch Emails

9. 现在运行以下命令重新启动您的fail2ban服务。

sudo service fail2ban stop
sudo service fail2ban start

10. 最后,运行以下命令检查您的fail2ban服务statussudo service fail2ban status 如果Fail2Ban服务正常运行,您将得到如下输出。

sudo service fail2ban status

如果Fail2Ban服务正常运行,您将得到如下输出。

Checking the Fail2Ban Service Status

测试您的封禁配置

您刚刚配置了Fail2Ban,现在是时候测试封禁配置是否实际生效了。尝试从辅助服务器对Fail2Ban服务器进行多次失败的SSH登录,然后查看该辅助服务器是否被封禁。

1. 登录到您的辅助服务器(Debian),并运行以下命令以通过SSH连接到您的Fail2Ban服务器。

此演示使用Debian 10服务器,IP为134.122.20.103,通过ssh连接到IP为69.28.83.134fail2ban服务器。

2. 在提示时输入随机密码,然后按Enter键。

第一次尝试时,Fail2Ban服务器将停止SSH登录尝试并打印权限被拒绝消息,如下所示。再次尝试SSH登录大约两到三次,Fail2Ban服务器最终将停止响应您的SSH登录尝试。

此时,您将不再收到权限被拒绝消息,而是一个空白屏幕。出现空白屏幕表示您的第二个服务器(Debian)已被Fail2Ban服务器禁止。

Testing if a server gets banned from Fail2Ban server after several failed logins

但也许您已经有一个要从Fail2Ban服务器阻止的IP地址列表。如果是这样,请打开jail.local文件并导航到[DEFAULT]部分。取消注释ignoreip选项并设置要阻止的IP地址,如下所示。

地址可以是多个单独的IPv4或IPv6条目,也可以用逗号分隔。

Setting IP Addresses to Block from Fail2Ban Server

3. 在您的Fail2Ban服务器(Ubuntu)上重新运行下面的iptables命令以查看您的防火墙规则。

sudo iptables -S

请注意,下面有一个新规则拒绝来自134.122.20.103IP地址的SSH登录尝试。

如果您在Fail2Ban服务器上设置了sendmail,您还将收到一封电子邮件通知,其中附有日志文件,表明Fail2Ban已成功阻止了暴力攻击,并保护了您的服务器免受潜在损害。

Checking additional firewall rules

结论

在本教程中,您已经学习了如何在Ubuntu服务器上配置Fail2Ban。此时,您应该已经具备了保护SSH服务器免受暴力攻击的知识。

现在,为什么不将这些新学到的知识提升一下呢?也许可以从在docker主机上使用Fail2Ban阻止所有端口的IP开始?

Source:
https://adamtheautomator.com/fail2ban-ssh/