如何在Rocky Linux 8上使用Fail2Ban保护SSH

介绍

SSH是连接到云服务器的事实标准方法。它耐用且可扩展——随着新的加密标准的开发,可以使用它们来生成新的SSH密钥,确保核心协议保持安全。然而,没有协议或软件堆栈是完全防范的,SSH在互联网上的广泛部署意味着它代表了一个非常可预测的攻击面或攻击向量,通过它人可以尝试获取访问权限。

以这种方式暴露在网络上的任何服务都是潜在的目标。如果您查看任何广泛使用的服务器上运行的SSH服务的日志,通常会看到表示用户和机器人进行的重复系统化登录尝试的迹象,这代表了暴力破解攻击。尽管您可以对SSH服务进行一些优化,以减少这些攻击成功的机会接近于零,例如禁用密码身份验证,改用SSH密钥,它们仍然可能构成轻微的持续责任。

对于那些绝对不能容忍此类责任的大规模生产部署,通常会在其SSH服务前部署类似于WireGuard的VPN,以便不经过额外的软件抽象或网关,无法直接连接到外部互联网上的默认SSH端口22。这些VPN解决方案被广泛信任,但会增加复杂性,并可能破坏一些自动化或其他小型软件钩子。

在全面采用VPN设置之前或之际,您可以实施一个称为Fail2ban的工具。Fail2ban可以通过创建规则,在一定数量的登录尝试失败后自动更改您的防火墙配置以禁止特定IP地址,从而显著减轻暴力破解攻击。这将使您的服务器能够自我加固以防止这些访问尝试,无需您的干预。

在本指南中,您将了解如何在Rocky Linux 8服务器上安装和使用Fail2ban。

先决条件

要完成本指南,您需要:

  • 一个带有sudo权限的非root用户的Rocky Linux 8服务器。您可以在我们的使用Rocky Linux 8进行初始服务器设置指南中了解如何设置具有这些权限的用户。您还应该在服务器上运行firewalld,这在我们的初始服务器设置指南中有所涵盖。

  • 可选地,您可以连接到第一个服务器的第二个服务器,您将使用它来测试被故意禁止的情况。

步骤1 — 安装Fail2ban

Fail2ban在Rocky的默认软件仓库中不可用。但是,它可以在EPEL,或增强的企业Linux软件包仓库中找到,这是Red Hat和Rocky Linux上常用的第三方软件包。如果您尚未将EPEL添加到系统软件包源中,您可以使用dnf添加该仓库,就像安装任何其他软件包一样:

  1. sudo dnf install epel-release -y

现在,dnf软件包管理器将在安装新软件时检查EPEL以及您的默认软件包源。继续安装Fail2ban:

  1. sudo dnf install fail2ban -y

Fail2ban安装后将自动设置一个后台服务。但是,默认情况下它是禁用的,因为一些默认设置可能会导致不良影响。您可以使用systemctl命令来验证:

  1. systemctl status fail2ban.service
Output
○ fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled Active: inactive (dead) Docs: man:fail2ban(1)

您可以立即启用Fail2ban,但首先,您将审查一些其特性。

步骤2 – 配置Fail2ban

Fail2ban服务将其配置文件保存在/etc/fail2ban目录中。有一个名为jail.conf的默认文件。转到该目录并使用head -20打印该文件的前20行:

  1. cd /etc/fail2ban
  2. head -20 jail.conf
Output
# # 警告:在 0.9.0 版本中进行了大量重构。请 检查并定制您的设置。 # # 更改:在大多数情况下,您不应修改此 # 文件,而是在 jail.local 文件中提供定制, # 或者在 jail.d/ 目录下提供单独的 .conf 文件,例如: # # 如何激活 jails: # # 您不应修改此文件。 # # 它可能会在发行版更新中被覆盖或改进。 # # 在 jail.local 文件或 jail.d/customisation.local 文件中提供自定义设置。 # 例如,要更改所有 jails 的默认封禁时间并启用 # ssh-iptables jail,以下内容(未注释)将出现在 .local 文件中。 # 详细信息请参阅 man 5 jail.conf。 # # [DEFAULT]

正如您所看到的,此文件的前几行都被注释掉了-它们以 # 字符开头,表示它们将被视为文档而不是设置。正如您也将看到的,这些注释指示您不要直接修改此文件。相反,您有两个选项:要么在 jail.d/ 目录中创建多个 Fail2ban 的个人配置文件,要么创建并收集所有本地设置到一个 jail.local 文件中。jail.conf 文件将定期更新,随着 Fail2ban 本身的更新而更新,并将用作您尚未创建任何覆盖的默认设置的源。

在本教程中,您将创建jail.local文件。您可以通过复制jail.conf来完成:

  1. sudo cp jail.conf jail.local

现在,您可以开始进行配置更改。在vi或您喜欢的文本编辑器中打开文件:

  1. sudo vi jail.local

当您浏览文件时,本教程将审查一些您可能希望更新的选项。位于文件顶部附近[DEFAULT]部分下的设置将应用于Fail2ban支持的所有服务。文件的其他位置有[sshd]和其他服务的标题,其中包含将覆盖默认设置的特定于服务的设置。

/etc/fail2ban/jail.local
[DEFAULT]
. . .
bantime = 10m
. . .

bantime参数设置了客户端在身份验证失败时被禁止的时间长度。这以秒为单位进行计量。默认情况下,此设置为10分钟。

/etc/fail2ban/jail.local
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .

接下来的两个参数是findtimemaxretry。它们一起工作,建立客户端被视为不合法用户应该被禁止的条件。

maxretry变量设置了客户端在由findtime定义的时间窗口内尝试身份验证的次数,在被禁止之前。使用默认设置,fail2ban服务将在10分钟的时间窗口内对尝试登录失败5次的客户端进行封禁。

/etc/fail2ban/jail.local
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .

如果您需要在Fail2ban采取行动时接收电子邮件警报,您应该评估destemailsendernamemta设置。 destemail参数设置应该接收封禁消息的电子邮件地址。 sendername设置电子邮件中“发件人”字段的值。 mta参数配置发送邮件所使用的邮件服务。默认情况下,这是sendmail,但您可能希望使用Postfix或其他邮件解决方案。

/etc/fail2ban/jail.local
[DEFAULT]
. . .
action = $(action_)s
. . .

此参数配置Fail2ban在希望实施封禁时采取的操作。值action_在此参数之前的文件中定义。默认操作是更新您的防火墙配置,以拒绝来自违规主机的流量,直到封禁时间过期。

默认提供了其他action_脚本,您可以将$(action_)替换为上述:

/etc/fail2ban/jail.local
…
# 封禁并发送带有whois报告的电子邮件给destemail。
action_mw = %(action_)s
            %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]

# 封禁并发送带有whois报告和相关日志行
# 到destemail。
action_mwl = %(action_)s
             %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]

# 请参阅action.d/xarf-login-attack中的重要说明
#
# 封禁并向IP地址的滥用联系人发送xarf邮件,并包括相关日志行
# 到destemail。
action_xarf = %(action_)s
             xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]

# 在CloudFlare上封禁IP并发送带有whois报告和相关日志行的电子邮件
# 到destemail。
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
                %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
…

例如,action_mw 执行操作并发送电子邮件,action_mwl 执行操作、发送电子邮件并包括日志记录,action_cf_mwl 还在您的账户关联的 Cloudflare API 中执行上述所有操作,并在那里禁止违规者。

单独的监狱设置

接下来是处理各个服务的配置文件部分。这些由节标题指定,例如 [sshd]

这些节中的每一个都需要通过在标题下添加一行 enabled = true 来单独启用,以及它们的其他设置。

/etc/fail2ban/jail.local
[jail_to_enable]
. . .
enabled = true
. . .

对于本教程,您将启用 SSH 监狱。它应该位于单独监狱设置的顶部。否则,默认参数将起作用,但您需要在 [sshd] 标题下添加一行配置行,内容为 enabled = true

/etc/fail2ban/jail.local
#
# JAILS
#

#
# SSH 服务器
#

[sshd]

# 若要使用更激进的 sshd 模式,请在 jail.local 中的 filter 参数“mode” 中设置:
# normal(默认),ddos,extra 或 aggressive(组合所有)。
# 有关用法示例和详细信息,请参见“tests/files/logs/sshd”或“filter.d/sshd.conf”。
#mode   = normal
enabled = true
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

这里设置的一些其他设置包括将用于决定日志中的一行是否表示身份验证失败的filter和告诉fail2ban该特定服务的日志位于何处的logpath

filter值实际上是对位于/etc/fail2ban/filter.d目录中的文件的引用,其.conf扩展名已被移除。这些文件包含正则表达式(文本解析的常见缩写),用于确定日志中的一行是否是失败的身份验证尝试。在本指南中,我们不会深入讨论这些文件,因为它们相当复杂,预定义的设置可以很好地匹配适当的行。

但是,您可以通过查看该目录来了解可用的过滤器类型:

  1. ls /etc/fail2ban/filter.d

如果您看到与您使用的服务相关的文件,您应该使用文本编辑器打开它。大多数文件都有相当完善的注释,您应该至少能够了解脚本设计用于防范的条件类型。大多数这些过滤器在jail.conf文件中有适当的(禁用)部分,我们可以在jail.local文件中启用它们,如果需要的话。

例如,想象一下,您正在使用Nginx提供网站,并且意识到网站的受密码保护部分正在遭受大量的登录尝试。您可以告诉fail2ban使用nginx-http-auth.conf文件在/var/log/nginx/error.log文件中检查此条件。

这实际上已经在你的/etc/fail2ban/jail.conf文件中的一个名为[nginx-http-auth]的部分设置好了。你只需要添加enabled参数:

/etc/fail2ban/jail.local
. . .
[nginx-http-auth]

enabled = true
. . .

编辑完成后,保存并关闭文件。如果你使用vi,请使用:x保存并退出。在此时,你可以启用Fail2ban服务,这样它将自动运行。首先,运行systemctl enable

  1. sudo systemctl enable fail2ban

然后,首次手动启动它使用systemctl start

  1. sudo systemctl start fail2ban

你可以用systemctl status来验证它是否正在运行:

  1. sudo systemctl status fail2ban
Output
● fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled Active: active (running) since Mon 2022-06-27 19:25:15 UTC; 3s ago Docs: man:fail2ban(1) Main PID: 39396 (fail2ban-server) Tasks: 5 (limit: 1119) Memory: 12.9M CPU: 278ms CGroup: /system.slice/fail2ban.service └─39396 /usr/bin/python3.6 -s /usr/bin/fail2ban-server -xf start Jun 27 19:25:15 fail2ban22 systemd[1]: Started Fail2Ban Service. Jun 27 19:25:15 fail2ban22 fail2ban-server[39396]: Server ready

在下一步中,你将演示Fail2ban的工作。

第三步 — 测试封禁策略(可选)

从另一台服务器,那台未来不需要登录到你的Fail2ban服务器的服务器上,你可以测试规则以使该第二台服务器被封禁。登录到你的第二台服务器后,尝试SSH连接到Fail2ban服务器。你可以尝试使用一个不存在的名称连接:

  1. ssh blah@your_server

在密码提示中输入随机字符。重复几次。在某个时候,你收到的错误消息应该从Permission denied变为Connection refused。这表示你的第二台服务器已被Fail2ban服务器封禁。

在您的Fail2ban服务器上,您可以通过检查fail2ban-client的输出来查看新规则。 fail2ban-client是Fail2ban提供的另一个命令,用于检查其运行配置。

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

如果您运行fail2ban-client status sshd,您可以看到已被禁止使用SSH的IP列表:

  1. sudo fail2ban-client status sshd
Output
Status for the jail: sshd |- Filter | |- Currently failed: 2 | |- Total failed: 7 | `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 134.209.165.184

被禁止的IP列表 的内容应反映您第二个服务器的IP地址。

结论

现在您应该能够为您的服务配置一些封禁策略了。Fail2ban是保护使用身份验证的任何类型服务的有用方式。如果您想了解更多关于fail2ban如何工作的信息,可以查看我们关于fail2ban规则和文件工作原理的教程。

关于如何使用fail2ban保护其他服务的信息,您可以阅读关于如何使用Fail2Ban保护Nginx服务器如何使用Fail2Ban保护Apache服务器

Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-rocky-linux-8