如何在 Ubuntu 20.04 上使用 Fail2Ban 保护 SSH

介绍

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

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

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

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

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

前提条件

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

  • 一个 Ubuntu 20.04 服务器和具有 sudo 特权的非根用户. 您可以在我们的 初始服务器设置与 Ubuntu 20.04 指南中了解有关如何设置具有这些特权的用户的更多信息。

步骤 1 – 安装 Fail2ban

Fail2ban 可在 Ubuntu 软件存储库中使用。 作为非 root 用户,请开始运行以下命令,以更新您的包列表并安装 Fail2ban:

1sudo apt update
2sudo apt install fail2ban

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: enabled
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

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

1sudo nano 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(https://andsky.com/tech/tutorials/how-to-install-and-configure-postfix-on-ubuntu-22-04)或其他邮件解决方案。

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服务被启用,所有其他服务都被禁用。 . 这里设置的其他一些设置是过滤器,用于决定日志中的行是否表示身份验证失败,以及logpath,告诉 fail2ban该特定服务的日志所在位置。

过滤器值实际上是指位于 /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. . .

当您完成编辑时,保存并关闭文件. 在此时刻,您可以启用 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: enab>
 4     Active: active (running) since Tue 2022-06-28 19:29:15 UTC; 3s 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 /usr/bin/fail2ban-server -xf start
12
13Jun 28 19:29:15 fail2ban20 systemd[1]: Started Fail2Ban Service.
14Jun 28 19:29:15 fail2ban20 fail2ban-server[39396]: Server ready

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

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

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

1[environment second]
2ssh blah@your_server

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

在您的 Fail2ban 服务器上,您可以通过检查您的iptables输出来查看新规则。iptables是您服务器上与低级端口和防火墙规则进行交互的命令。如果您遵循 DigitalOcean 的初始服务器设置指南,您将使用ufw来管理更高级别的防火墙规则。

1sudo iptables -S
 1[secondary_label Output]
 2-P INPUT DROP
 3-P FORWARD DROP
 4-P OUTPUT ACCEPT
 5-N f2b-sshd
 6-N ufw-after-forward
 7-N ufw-after-input
 8-N ufw-after-logging-forward
 9-N ufw-after-logging-input
10-N ufw-after-logging-output
11-N ufw-after-output
12-N ufw-before-forward
13-N ufw-before-input
14-N ufw-before-logging-forward
15-N ufw-before-logging-input
16-N ufw-before-logging-output
17

如果您将iptables -S的输出输入到grep以搜索这些规则中的字符串f2b,您可以看到 fail2ban 添加的规则:

1sudo iptables -S | grep f2b
1[secondary_label Output]
2-N f2b-sshd
3-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
4-A f2b-sshd -s 134.209.165.184/32 -j REJECT --reject-with icmp-port-unreachable
5-A f2b-sshd -j RETURN

包含REJECT - reject - with icmp-port-unreachable的行将被 Fail2ban 添加,并应反映您第二个服务器的 IP 地址。

结论

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

有关如何使用 fail2ban 来保护其他服务的信息,请参阅 如何在 Ubuntu 14.04 上使用 Fail2Ban 保护 Nginx 服务器如何在 Ubuntu 14.04 上使用 Fail2Ban 保护 Apache 服务器

Published At
Categories with 技术
comments powered by Disqus