如何在 Rocky Linux 9 上使用 Fail2Ban 保护 SSH
介绍
SSH 是连接到云服务器的实际方法。它经久耐用且可扩展——随着新加密标准的开发,它们可用于生成新的 SSH 密钥,确保核心协议保持安全。然而,没有任何协议或软件栈是万无一失的,SSH 在互联网上的广泛部署意味着它代表了一个非常可预测的攻击面或攻击向量,人们可以通过它尝试获得访问权限。
任何暴露于网络的服务都是这种方式的潜在目标。如果您查看运行在任何被广泛访问的服务器上的 SSH 服务的日志,您会经常看到重复的、系统的登录尝试,这些尝试代表了用户和类似机器人的暴力攻击。尽管您可以对 SSH 服务进行一些优化以将这些攻击成功的可能性降低到接近于零,例如禁用密码身份验证以支持 SSH 密钥,但它们仍然会造成轻微的、持续的责任。
完全不能接受这种责任的大规模生产部署通常会在其 SSH 服务之前实施 WireGuard 等 VPN,因此如果没有额外的软件抽象或网关。这些 VPN 解决方案受到广泛信任,但会增加复杂性,并可能破坏某些自动化或其他小软件挂钩。
在进行完整的 VPN 设置之前或之外,您可以实施一个名为 Fail2ban 的工具。 Fail2ban 可以通过创建规则来显着减轻暴力攻击,这些规则会在登录尝试失败一定次数后自动更改防火墙配置以禁止特定 IP。这将允许您的服务器在没有您干预的情况下针对这些访问尝试加强自身。
在本指南中,您将了解如何在 Rocky Linux 9 服务器上安装和使用 Fail2ban。
先决条件
要完成本指南,您需要:
- <李> Rocky Linux 9 服务器和具有 sudo 权限的非根用户。您可以在我们的使用 Rocky Linux 9 进行初始服务器设置指南中了解有关如何设置具有这些权限的用户的更多信息。您还应该在服务器上运行
firewalld
,这在我们的初始服务器设置指南中有所介绍。 <李> (可选)第二个服务器,您可以从中连接到您的第一个服务器,您将使用它来测试是否被故意禁止。 第 1 步 — 安装 Fail2ban
Fail2ban 在 Rocky 的默认软件存储库中不可用。但是,它在 EPEL 或 Enhanced Packages for Enterprise Linux 存储库中可用,通常用于 Red Hat 和 Rocky Linux 上的第三方软件包。如果您还没有将 EPEL 添加到您的系统包源中,您可以使用 dnf
添加存储库,就像安装任何其他包一样:
- sudo dnf install epel-release -y
dnf
包管理器现在会在安装新软件时检查 EPEL 以及您的默认包源。继续安装 Fail2ban:
- sudo dnf install fail2ban -y
Fail2ban 安装后会自动设置后台服务。但是,默认情况下它是禁用的,因为它的某些默认设置可能会导致不良影响。您可以使用 systemctl
命令验证这一点:
- 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 行:
- cd /etc/fail2ban
- head -20 jail.conf
Output#
# WARNING: heavily refactored in 0.9.0 release. Please review and
# customize settings for your setup.
#
# Changes: in most of the cases you should not modify this
# file, but provide customizations in jail.local file,
# or separate .conf files under jail.d/ directory, e.g.:
#
# HOW TO ACTIVATE JAILS:
#
# YOU SHOULD NOT MODIFY THIS FILE.
#
# It will probably be overwritten or improved in a distribution update.
#
# Provide customizations in a jail.local file or a jail.d/customisation.local.
# For example to change the default bantime for all jails and to enable the
# ssh-iptables jail the following (uncommented) would appear in the .local file.
# See man 5 jail.conf for details.
#
# [DEFAULT]
正如您将看到的,该文件的前几行被注释掉了——它们以 #
字符开头,表明它们将被视为文档而不是设置。正如您还将看到的,这些注释指示您不要直接修改此文件。相反,您有两个选择:在 jail.d/
目录中的多个文件中为 Fail2ban 创建单独的配置文件,或者在 jail.local中创建并收集所有本地设置代码>文件。 jail.conf
文件将随着 Fail2ban 本身的更新而定期更新,并将用作您尚未创建任何覆盖的默认设置的来源。
在本教程中,您将创建 jail.local
。您可以通过复制 jail.conf
来做到这一点:
- sudo cp jail.conf jail.local
现在您可以开始进行配置更改。在 vi
或您最喜欢的文本编辑器中打开文件:
- sudo vi jail.local
当您滚动文件时,本教程将查看您可能想要更新的一些选项。位于文件顶部附近的 [DEFAULT]
部分下的设置将应用于 Fail2ban 支持的所有服务。在文件的其他地方,有 [sshd]
和其他服务的标头,其中包含将在默认设置之上应用的特定于服务的设置。
[DEFAULT]
. . .
bantime = 10m
. . .
bantime
参数设置客户端在未能正确验证时将被禁止的时间长度。这是以秒为单位测量的。默认情况下,此设置为 10 分钟。
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .
接下来的两个参数是 findtime
和 maxretry
。这些共同确定了发现客户端是应被禁止的非法用户的条件。
maxretry
变量设置客户端在被禁止之前必须在 findtime
定义的时间窗口内进行身份验证的尝试次数。使用默认设置,fail2ban 服务将禁止在 10 分钟窗口内 5 次尝试登录失败的客户端。
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .
如果您需要在 Fail2ban 采取行动时接收电子邮件警报,您应该评估 destemail
、sendername
和 mta
设置。 destemail
参数设置应该接收禁止消息的电子邮件地址。 sendername
设置电子邮件中“发件人”字段的值。mta
参数配置将使用什么邮件服务来发送邮件。默认情况下,这是 sendmail
,但您可能想使用 Postfix 或其他邮件解决方案。
[DEFAULT]
. . .
action = %(action_)s
. . .
此参数配置 Fail2ban 在要实施禁令时采取的操作。值 action_
在此参数之前的文件中定义。默认操作是更新您的防火墙配置以拒绝来自违规主机的流量,直到禁令时间结束。
默认提供了其他的 action_
脚本,您可以将 $ (action_)
替换为上面的内容:
…
# ban & send an e-mail with whois report to the destemail.
action_mw = %(action_)s
%(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
# ban & send an e-mail with whois report and relevant log lines
# to the destemail.
action_mwl = %(action_)s
%(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
# See the IMPORTANT note in action.d/xarf-login-attack for when to use this action
#
# ban & send a xarf e-mail to abuse contact of IP address and include relevant log lines
# to the destemail.
action_xarf = %(action_)s
xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]
# ban IP on CloudFlare & send an e-mail with whois report and relevant log lines
# to the 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
行及其其他设置来单独启用。
[jail_to_enable]
. . .
enabled = true
. . .
对于本教程,您将启用 SSH 监狱。它应该位于个人监狱设置的顶部。默认参数否则会起作用,但您需要在 [sshd]
标头下添加一个配置行,说明 enabled=true
。
#
# JAILS
#
#
# SSH servers
#
[sshd]
# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode = normal
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
此处设置的一些其他设置是 filter
将用于决定日志中的一行是否指示失败的身份验证和 logpath
告诉 fail2ban 日志在哪里该特定服务位于。
filter
值实际上是对位于 /etc/fail2ban/filter.d
目录中的文件的引用,其 .conf
扩展名已删除.这些文件包含正则表达式(文本解析的常用简写),用于确定日志中的一行是否是失败的身份验证尝试。我们不会在本指南中深入介绍这些文件,因为它们相当复杂并且预定义的设置与适当的行匹配得很好。
但是,您可以通过查看该目录来了解可用的过滤器类型:
- 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
参数:
. . .
[nginx-http-auth]
enabled = true
. . .
完成编辑后,保存并关闭文件。如果您正在使用 vi
,请使用 :x
保存并退出。此时,您可以启用您的 Fail2ban 服务,以便它从现在开始自动运行。首先,运行 systemctl enable
:
- sudo systemctl enable fail2ban
然后,第一次使用 systemctl start
手动启动它:
- sudo systemctl start fail2ban
您可以使用 systemctl status
验证它是否正在运行:
- sudo systemctl status fail2ban
Output● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled
Active: active (running) since Wed 2022-09-14 20:48:40 UTC; 2s 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
Sep 14 20:48:40 rocky9-tester systemd[1]: Starting Fail2Ban Service...
Sep 14 20:48:40 rocky9-tester systemd[1]: Started Fail2Ban Service.
Sep 14 20:48:41 rocky9-tester fail2ban-server[39396]: Server ready
在下一步中,您将演示 Fail2ban 的实际应用。
第 3 步 — 测试禁止策略(可选)
从另一台服务器,将来不需要登录到您的 Fail2ban 服务器,您可以通过禁止第二台服务器来测试规则。登录到您的第二台服务器后,尝试通过 SSH 连接到 Fail2ban 服务器。您可以尝试使用不存在的名称进行连接:
- ssh blah@your_server
在密码提示中输入随机字符。重复几次。在某些时候,您收到的错误应该从 Permission denied
更改为 Connection refused
。这表示您的第二个服务器已被 Fail2ban 服务器禁止。
在您的 Fail2ban 服务器上,您可以通过检查 fail2ban-client
的输出来查看新规则。 fail2ban-client
是 Fail2ban 提供的额外命令,用于检查其运行配置。
- sudo fail2ban-client status
OutputStatus
|- Number of jail: 1
`- Jail list: sshd
如果运行 fail2ban-client status sshd
,您可以看到已被 SSH 禁止的 IP 列表:
- sudo fail2ban-client status sshd
OutputStatus 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
Banned IP list
内容应反映您的第二台服务器的 IP 地址。
结论
您现在应该能够为您的服务配置一些禁止策略。 Fail2ban 是保护任何使用身份验证的服务的有用方法。如果您想了解有关 fail2ban 如何工作的更多信息,您可以查看我们关于 fail2ban 规则和文件如何工作的教程。
有关如何使用 fail2ban 保护其他服务的信息,您可以阅读如何使用 Fail2Ban 保护 Nginx 服务器。