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

介绍

SSH 是连接到云服务器的实际方法. 它是可持续的,而且可以扩展 - 随着新的加密标准的开发,它们可以用来生成新的 SSH 密钥,确保核心协议仍然安全。

如果您查看在任何受广泛流通的服务器上运行的 SSH 服务的日志,您通常会看到重复的系统性登录尝试,这些尝试代表用户和机器人的暴力攻击,尽管您可以对您的 SSH 服务进行一些优化,以减少这些攻击成功的可能性接近零,例如 禁用对 SSH 密钥的密码身份验证,但它们仍然可能产生较小的持续责任。

对于这种责任完全不可接受的大规模生产部署,通常会在他们的SSH服务前部署一个VPN,如WireGuard(https://andsky.com/tech/tutorials/how-to-set-up-wireguard-on-rocky-linux-8),所以没有额外的软件抽象或网关,就无法直接连接到外部互联网的默认SSH端口22。

在完成VPN设置之前或除此之外,您还可以实施一个名为Fail2ban的工具。Fail2ban可以通过创建规则来显著减轻暴力攻击,从而自动改变您的防火墙配置,以便在某些失败的登录尝试后禁止特定IP。

在本指南中,您将看到如何在Rocky Linux 9服务器上安装和使用Fail2ban。

前提条件

要完成本指南,您将需要:

  • Rocky Linux 9 服务器和具有 sudo 特权的非根用户. 您可以在我们的 Rocky Linux 9 初始服务器设置指南中了解有关如何设置具有这些特权的用户的更多信息. 您还应该在服务器上运行防火墙,这是我们初始服务器设置指南中涵盖的。

步骤 1 – 安装 Fail2ban

Fail2ban 无法在 Rocky 的默认软件存储库中使用,但是,它可以在 EPELEnhanced Packages for Enterprise Linux 存储库中使用,该存储库通常用于 Red Hat 和 Rocky Linux 上的第三方软件包。

1sudo dnf install epel-release -y

dnf 包管理器现在将检查 EPEL 除了安装新软件时的默认包源。

1sudo dnf install fail2ban -y

Fail2ban 在安装后会自动设置背景服务,但默认情况下是禁用,因为其某些默认设置可能会导致不必要的效果。

1systemctl status fail2ban.service
1[secondary_label Output]
2 fail2ban.service - Fail2Ban Service
3     Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled
4     Active: inactive (dead)
5       Docs: man:fail2ban(1)

您可以立即启用 Fail2ban,但首先,您将查看其的一些功能。

步骤 2 – 配置 Fail2ban

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

1cd /etc/fail2ban
2head -20 jail.conf
 1[secondary_label Output]
 2#
 3# WARNING: heavily refactored in 0.9.0 release. Please review and
 4#          customize settings for your setup.
 5#
 6# Changes:  in most of the cases you should not modify this
 7#           file, but provide customizations in jail.local file,
 8#           or separate .conf files under jail.d/ directory, e.g.:
 9#
10# HOW TO ACTIVATE JAILS:
11#
12# YOU SHOULD NOT MODIFY THIS FILE.
13#
14# It will probably be overwritten or improved in a distribution update.
15#
16# Provide customizations in a jail.local file or a jail.d/customisation.local.
17# For example to change the default bantime for all jails and to enable the
18# ssh-iptables jail the following (uncommented) would appear in the .local file.
19# See man 5 jail.conf for details.
20#
21# [DEFAULT]

正如你所看到的,这个文件的头几个行是 评论 – 它们以#字符开始,表示它们应该作为文档而不是设置读取。 正如你所看到的,这些评论指示你不要直接修改这个文件。 相反,你有两种选择:要么在jail.d/目录中的多个文件中创建Fail2ban的个别配置文件,要么在jail.local文件中创建和收集您的所有本地设置。

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

1sudo cp jail.conf jail.local

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

1sudo vi jail.local

当您浏览文件时,本教程将审查您可能想要更新的一些选项。位于文件顶部的[DEFAULT]部分下面的设置将适用于 Fail2ban 支持的所有服务。在文件中的其他地方,有[sshd]和其他服务的标题,其中包含服务特定的设置,这些设置将适用于默认值。

1[label /etc/fail2ban/jail.local]
2[DEFAULT]
3. . .
4bantime = 10m
5. . .

bantime参数设置了客户端在未能正确身份验证时将被禁用的时间。

1[label /etc/fail2ban/jail.local]
2[DEFAULT]
3. . .
4findtime = 10m
5maxretry = 5
6. . .

接下来的两个参数是findtimemaxretry,这些参数一起建立了客户端被认为是应该被禁止的非法用户的条件。

maxretry变量设置了客户端在findtime定义的时间窗口内验证的尝试次数,然后被禁用。

1[label /etc/fail2ban/jail.local]
2[DEFAULT]
3. . .
4destemail = root@localhost
5sender = root@<fq-hostname>
6mta = sendmail
7. . .

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

1[label /etc/fail2ban/jail.local]
2[DEFAULT]
3. . .
4action = %(action_)s
5. . .

此参数配置了 Fail2ban 想要设置禁令时所采取的操作. 值 action_ 在该参数前不久在文件中定义。 默认操作是更新您的防火墙配置以拒绝侵权主机的流量,直到禁令时间过期。

默认情况下提供的其他action_脚本,您可以用上面的$(action_)代替:

 1[label /etc/fail2ban/jail.local]
 2 3# ban & send an e-mail with whois report to the destemail.
 4action_mw = %(action_)s
 5            %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]
 6
 7# ban & send an e-mail with whois report and relevant log lines
 8# to the destemail.
 9action_mwl = %(action_)s
10             %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
11
12# See the IMPORTANT note in action.d/xarf-login-attack for when to use this action
13#
14# ban & send a xarf e-mail to abuse contact of IP address and include relevant log lines
15# to the destemail.
16action_xarf = %(action_)s
17             xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]
18
19# ban IP on CloudFlare & send an e-mail with whois report and relevant log lines
20# to the destemail.
21action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
22                %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
23

例如,‘action_mw’采取行动并发送电子邮件,‘action_mwl’采取行动,发送电子邮件,并包括登录,而‘action_cf_mwl’除了向与您的帐户相关联的 Cloudflare API 发送更新外,还执行上述所有操作,以禁止犯罪分子在那里。

个人监狱设置

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

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

1[label /etc/fail2ban/jail.local]
2[jail_to_enable]
3. . .
4enabled = true
5. . .

对于本教程,您将启用SSH监狱. 它应该位于个别监狱设置的顶部。 默认参数将以不同的方式工作,但您需要在[sshd]标题下添加一个配置行,表示启用 = true

 1[label /etc/fail2ban/jail.local]
 2#
 3# JAILS
 4#
 5
 6#
 7# SSH servers
 8#
 9
10[sshd]
11
12# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
13# normal (default), ddos, extra or aggressive (combines all).
14# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
15#mode   = normal
16enabled = true
17port    = ssh
18logpath = %(sshd_log)s
19backend = %(sshd_backend)s

这里设置的其他设置包括将用于决定日志中的行是否表示身份验证失败的过滤器,以及告诉 fail2ban 该特定服务的日志所在的logpath

过滤器值实际上是指位于 /etc/fail2ban/filter.d 目录中的文件,其 .conf’ 扩展被删除,这些文件包含 常规表达式 (用于文本解析的常见缩写),这决定了日志中的一个行是否是一个失败的身份验证尝试。

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

1ls /etc/fail2ban/filter.d

如果你看到一个看起来与你正在使用的服务相关的文件,你应该用文本编辑器打开它. 大多数文件都很好地评论,你应该能够至少告诉你脚本的条件是为了防范什么类型。

例如,假设您正在使用 Nginx 服务一个网站,并意识到您的网站的密码保护部分正在遭到登录尝试。你可以告诉 fail2ban 使用 nginx-http-auth.conf 文件在 /var/log/nginx/error.log 文件中检查这种情况。

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

1[label /etc/fail2ban/jail.local]
2. . .
3[nginx-http-auth]
4
5enabled = true
6. . .

当您完成编辑时,保存并关闭文件. 如果您正在使用vi,请使用:x来保存和停止。在此时,您可以启用 Fail2ban 服务,以便从现在开始自动运行。

1sudo systemctl enable fail2ban

然后,用systemctl start首次手动启动:

1sudo systemctl start fail2ban

您可以检查它是否在systemctl 状态下运行:

1sudo systemctl status fail2ban
 1[secondary_label Output]
 2 fail2ban.service - Fail2Ban Service
 3     Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled
 4     Active: active (running) since Wed 2022-09-14 20:48:40 UTC; 2s ago
 5       Docs: man:fail2ban(1)
 6   Main PID: 39396 (fail2ban-server)
 7      Tasks: 5 (limit: 1119)
 8     Memory: 12.9M
 9        CPU: 278ms
10     CGroup: /system.slice/fail2ban.service
11             └─39396 /usr/bin/python3.6 -s /usr/bin/fail2ban-server -xf start
12
13Sep 14 20:48:40 rocky9-tester systemd[1]: Starting Fail2Ban Service...
14Sep 14 20:48:40 rocky9-tester systemd[1]: Started Fail2Ban Service.
15Sep 14 20:48:41 rocky9-tester fail2ban-server[39396]: Server ready

在下一步中,您将展示 Fail2ban 在行动中。

步骤 3 – 测试禁令策略(可选)

從另一個伺服器,一個不需要在未來登入您的 Fail2ban 伺服器,你可以測試規則,讓第二個伺服器被禁止。登入您的第二個伺服器後,嘗試 SSH 到 Fail2ban 伺服器。

1[environment second]
2ssh blah@your_server

在密码提示中输入随机字符. 重复几次. 在某个时候,您收到的错误应该从允许被拒绝更改为连接被拒绝

在您的 Fail2ban 服务器上,您可以通过检查fail2ban-client的输出来查看新的规则。

1sudo fail2ban-client status
1[secondary_label Output]
2Status
3|- Number of jail:      1
4`- Jail list:   sshd

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

1sudo fail2ban-client status sshd
 1[secondary_label Output]
 2Status for the jail: sshd
 3|- Filter
 4|  |- Currently failed: 2
 5|  |- Total failed:     7
 6|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
 7`- Actions
 8   |- Currently banned: 1
 9   |- Total banned:     1
10   `- Banned IP list:   134.209.165.184

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

结论

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

有关如何使用 fail2ban 来保护其他服务的信息,请阅读有关 如何使用 Fail2Ban 保护 Nginx 服务器

Published At
Categories with 技术
comments powered by Disqus