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

介紹

SSH 是連接到雲端伺服器的事實上的標準方法。它是耐用的,而且它是可擴展的 — 隨著新的加密標準的開發,它們可以用來生成新的 SSH 金鑰,確保核心協議保持安全。然而,沒有任何協議或軟件堆棧是完全防範的,而 SSH 在互聯網上被廣泛部署,意味著它代表了一個非常可預測的攻擊面或攻擊向量,通過它人可以嘗試獲得訪問權限。

任何暴露在網絡上的服務都是這樣的潛在目標。如果您檢查任何網絡流量龐大的伺服器上運行的 SSH 服務的日誌,您通常會看到重複的、系統化的登錄嘗試,這代表著使用者和機器人一樣的暴力破解攻擊。儘管您可以對您的 SSH 服務進行一些優化,以減少這些攻擊成功的可能性接近零,例如禁用密碼身份驗證,改為使用 SSH 金鑰,但它們仍然可能構成輕微的持續性風險。

對於那些完全無法接受這種風險的大規模生產部署,通常會在他們的SSH服務前部署一個VPN,例如WireGuard,這樣就無法直接從外部互聯網連接到默認的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套件存儲庫中可用,該存儲庫通常用於紅帽和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 文件,例如: # # 如何激活监狱: # # 您不应修改此文件。 # # 它可能会在分发更新中被覆盖或改进。 # # 请在 jail.local 文件或 jail.d/customisation.local 文件中提供定制内容。 # 例如,要更改所有监狱的默认封禁时间并启用 # ssh-iptables 监狱,以下(取消注释)将出现在 .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设置电子邮件中“From”字段的值。 mta参数配置用于发送邮件的邮件服务。 默认情况下,此设置为sendmail,但您可能想要使用Postfix或其他邮件解决方案。

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

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

默认情况下提供了其他action_脚本,您可以用上述$(action_)替换:

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

# 封禁并向destemail发送带有whois报告和相关日志行
# 的电子邮件。
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电子邮件,并包含相关日志行
# 的电子邮件。
action_xarf = %(action_)s
             xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]

# 在CloudFlare上封禁IP并发送带有whois报告和相关日志行的电子邮件
# 的电子邮件。
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":
# 正常(默認),ddos,額外或積極(結合所有)。
# 請參見 "tests/files/logs/sshd" 或 "filter.d/sshd.conf" 以了解用法示例和詳細信息。
#mode   = normal
enabled = true
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

這裡設定的一些其他設置是filter,它將用於決定日誌中的一行是否指示了失敗的身份驗證,以及logpath,它告訴fail2ban該特定服務的日誌位於哪裡。

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,請使用 😡 保存並退出。此時,您可以啟用 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 的工作。

步驟 3 — 測試封禁策略(可選)

從另一台不需要在將來登錄到您的 Fail2ban 伺服器的伺服器,您可以通過使該第二個伺服器被封禁來測試規則。登錄到您的第二個伺服器後,嘗試連接到 Fail2ban 伺服器的 SSH。您可以使用不存在的名稱嘗試連接:

  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