如何在 Ubuntu 22.04 上使用 Fail2Ban 保護 SSH

介紹

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

通過這種方式,任何暴露在網絡上的服務都是潛在的目標。如果您查看任何經常使用的服務器上運行的 SSH 服務的日誌,您通常會看到重複的、系統化的登錄嘗試,這代表了使用者和機器人的暴力攻擊。儘管您可以對 SSH 服務進行一些優化,以將這些攻擊成功的機會降低到接近零的程度,比如禁用密碼驗證,改為使用 SSH 金鑰,但它們仍然可能構成輕微的、持續的風險。

大規模生產部署,對於這種責任完全不可接受的情況,通常會在他們的SSH服務前面實施一個VPN,例如WireGuard,這樣就不可能直接從外部互聯網連接到默認的SSH端口22,而無需額外的軟件抽象或閘道。這些VPN解決方案被廣泛信任,但會增加複雜性,並可能破壞一些自動化或其他小型軟件鉤子。

在承諾部署完整VPN設置之前或之後,您可以實施一個名為Fail2ban的工具。Fail2ban可以通過創建規則來顯著減輕暴力攻擊,這些規則會自動修改您的防火牆配置,以在一定數量的失敗登錄嘗試之後禁止特定的IP地址。這將使您的伺服器能夠在您不干預的情況下加強對這些訪問嘗試的保護。

在本指南中,您將了解如何在Ubuntu 22.04伺服器上安裝和使用Fail2ban。

先決條件

要完成本指南,您需要:

  • 一台Ubuntu 22.04伺服器和一個具有sudo權限的非root用戶。您可以在我們的使用Ubuntu 22.04進行初始伺服器設置指南中了解如何設置具有這些權限的用戶。

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

步骤1 — 安装Fail2ban

Fail2ban可以在Ubuntu的软件仓库中找到。首先,以非root用户身份运行以下命令来更新软件包列表并安装Fail2ban:

  1. sudo apt update
  2. sudo apt install fail2ban

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

  1. systemctl status fail2ban.service
Output
○ fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: enabled 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

現在,您可以開始進行配置更改。 使用nano或您喜歡的文本編輯器打開文件:

  1. sudo nano 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
…
# 禁止並向目標郵件地址發送帶有 whois 報告的電子郵件。
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"]

# 請參閱動作.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服務已啟用,其他所有服務均已禁用。
.
這裡設置的其他一些設置是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
. . .

编辑完成后,请保存并关闭文件。在此时,您可以启用 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: enab> 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 /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 服务器的服务器,您可以测试规则以使该第二服务器被禁止。登录到您的第二服务器后,尝试通过 SSH 连接到 Fail2ban 服务器。您可以尝试使用一个不存在的名称进行连接:

  1. ssh blah@your_server

輸入隨機字符到密碼提示中。重複這個步驟幾次。在某個時候,您收到的錯誤消息應該從權限被拒絕變為連接被拒絕。這表示您的第二個伺服器已被 Fail2ban 伺服器封禁。

在您的 Fail2ban 伺服器上,您可以通過檢查您的iptables輸出來查看新規則。iptables是一個用於與伺服器上的低級端口和防火牆規則進行交互的命令。如果您按照 DigitalOcean 的初始伺服器設置指南進行操作,您將使用ufw來管理更高級別的防火牆規則。運行iptables -S將顯示ufw已經創建的所有防火牆規則:

  1. sudo iptables -S
Output
-P INPUT DROP -P FORWARD DROP -P OUTPUT ACCEPT -N f2b-sshd -N ufw-after-forward -N ufw-after-input -N ufw-after-logging-forward -N ufw-after-logging-input -N ufw-after-logging-output -N ufw-after-output -N ufw-before-forward -N ufw-before-input -N ufw-before-logging-forward -N ufw-before-logging-input -N ufw-before-logging-output …

如果您將iptables -S的輸出管道傳送給grep,以在這些規則中搜索字符串f2b,您可以看到 fail2ban 添加的規則:

  1. sudo iptables -S | grep f2b
Output
-N f2b-sshd -A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd -A f2b-sshd -s 134.209.165.184/32 -j REJECT --reject-with icmp-port-unreachable -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 伺服器

Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-ubuntu-22-04