介紹
SSH 是連接雲端伺服器的事實上的方法。它是耐用的,而且它是可擴展的——隨著新的加密標準的發展,它們可以用來生成新的SSH金鑰,確保核心協議保持安全。然而,沒有任何協議或軟件堆棧是完全防不住的,而SSH被廣泛部署在互聯網上意味著它代表了一個非常可預測的攻擊面或攻擊向量,通過這個途徑人們可以嘗試獲得訪問。攻擊面或攻擊向量。
任何暴露在網絡上的服務都有可能成為這種方式的潛在目標。如果您審查一下在任何廣泛流量的伺服器上運行的SSH服務的日誌,您通常會看到重複的系統登錄嘗試,這些登錄嘗試代表了用戶和機器人一樣的暴力攻擊。儘管您可以對SSH服務進行一些優化,以減少這些攻擊成功的機會接近零,例如禁用密碼驗證,改用SSH金鑰,它們仍然可能構成輕微但持續存在的風險。
對於那些完全無法接受此風險的大規模生產部署,通常會在其SSH服務前面部署VPN,例如WireGuard,以便無法直接從外部互聯網連接到默認的SSH端口22,而需要額外的軟件抽象或閘道。這些VPN解決方案被廣泛信任,但會增加複雜性,可能會破壞一些自動化或其他小型軟件鉤子。
在承諾進行完整VPN設置之前或之後,您可以實施一種稱為Fail2ban的工具。Fail2ban可以通過創建規則,自動更改您的防火牆配置,以在一定數量的登錄嘗試失敗後禁止特定IP,從而顯著減輕暴力攻擊的影響。這將使您的服務器能夠自動對抗這些訪問嘗試,而無需您的干預。
在本指南中,您將了解如何在Debian 11服務器上安裝和使用Fail2ban。
先決條件
完成本指南,您需要:
-
一台Debian 11服務器和一個具有sudo權限的非root用戶。您可以在我們的Debian 11初始服務器設置指南中了解有關如何設置具有這些權限的用戶的更多信息。
-
可選地,您可以從第一台服務器連接到的第二台服務器,您將使用它來測試故意被禁止的情況。
步驟1 — 安裝Fail2ban
Fail2ban可在Debian的軟件存儲庫中找到。請以非root用戶身份運行以下命令來更新您的軟件包列表並安裝Fail2ban:
安裝完Fail2ban後,它將自動設置一個後台服務。您可以使用systemctl
命令檢查其狀態:
Output● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled
Active: active (running) since Tue 2022-06-28 16:23:14 UTC; 17s ago
Docs: man:fail2ban(1)
Process: 1942 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS
Main PID: 1943 (fail2ban-server)
Tasks: 5 (limit: 1132)
Memory: 15.8M
CPU: 280ms
CGroup: /system.slice/fail2ban.service
└─1943 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
您可以繼續使用Fail2ban的默認設置,但首先,您將查看一些其功能。
步驟2 — 配置Fail2ban
fail2ban服務將其配置文件保存在/etc/fail2ban
目錄中。那裡有一個名為jail.conf
的默認文件。轉到該目錄並使用head -20
命令打印該文件的前20行:
Output#
#警告:在0.9.0版本中大量重構。請檢查並
#自定義設置以適應您的設置。
#
#變更:在大多數情況下,您不應修改此
#文件,而應在jail.local文件中提供自定義設置,
#或在jail.d/目錄下提供獨立的.conf文件,例如:
#
#如何啟用Jail:
#
#您不應修改此文件。
#
#它可能會在發行更新中被覆蓋或改進。
#
#在jail.local文件或jail.d/customisation.local中提供自定義。
#例如,要更改所有jail的默認禁止時間並啟用
#ssh-iptables jail,.local文件中將出現以下(取消註釋)部分。
#詳見man 5 jail.conf。
#
# [DEFAULT]
正如您所看到的,此文件的前幾行都被註釋了-它們以#
字符開頭,表示它們應該被視為文檔而不是設置。正如您也會看到的,這些註釋指示您不要直接修改此文件。相反,您有兩個選擇:在jail.d/
目錄中創建多個Fail2ban的個別配置文件,或在jail.local
文件中創建和收集所有本地設置。jail.conf
文件將定期更新,因為Fail2ban本身會更新,並將用作您尚未創建任何覆蓋的默認設置的來源。
在本教程中,您將創建 jail.local
。您可以通過複製 jail.conf
來完成:
現在您可以開始進行配置更改。在 nano
或您喜歡的文本編輯器中打開文件:
當您在文件中滾動時,本教程將審查一些您可能想要更新的選項。位於文件頂部附近 [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_)
替换为:
…
# 封锁并发送包含 whois 报告的电子邮件到 destemail。
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"]
# 请参阅 action.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
行来单独启用,并带有它们的其他设置。
[jail_to_enable]
. . .
enabled = true
. . .
默认情况下,SSH 服务已启用,而其他所有服务均已禁用。
。
在这里设置的一些其他设置是将用于决定日志中的一行是否表示身份验证失败的filter
,以及告诉 fail2ban 该特定服务的日志位置的 logpath
。
filter
值实际上是指向位於 /etc/fail2ban/filter.d
目錄中的檔案,其副檔名 .conf
已移除。這些檔案包含了一些正規表示式(一種常見的用於文本解析的簡寫),用於確定日誌中的行是否為身份驗證失敗嘗試。在本指南中,我們不會深入探討這些檔案,因為它們相當複雜且預定的設定很好地匹配了適當的行。
但是,您可以通過查看該目錄來了解可用的過濾器的類型:
如果您看到一個與您正在使用的服務相關的檔案,您應該使用文本編輯器打開它。大多數檔案都有相當詳細的註釋,您至少應該能夠知道腳本被設計來防禦什麼類型的條件。這些過濾器中的大多數在 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
. . .
當您完成編輯後,請保存並關閉文件。如果您進行了任何更改,您可以使用 systemctl
重新啟動 Fail2ban 服務:
在下一步中,您將展示 Fail2ban 的操作。
第 3 步 — 測試封禁策略(可選)
從另一台不需要在將來登錄到您的 Fail2ban 服務器的服務器上,您可以通過讓該第二台服務器被封禁來測試規則。登錄到您的第二台服務器後,嘗試 SSH 連接到 Fail2ban 服務器。您可以嘗試使用不存在的名稱進行連接:
在密碼提示中輸入隨機字符。重複幾次此過程。在某個時候,您收到的錯誤消息應該從 Permission denied
變為 Connection refused
。這表明您的第二台服務器已被從 Fail2ban 服務器封禁。
在您的 Fail2ban 服務器上,您可以通過檢查您的 iptables
輸出來查看新規則。 iptables
是用於與服務器上的低級端口和防火牆規則交互的命令。如果您遵循了 DigitalOcean 的初始服務器設置指南,則將使用 ufw
來管理更高級別的防火牆規則。運行 iptables -S
將向您顯示所有 ufw
已經創建的防火牆規則:
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添加的规则:
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保护其他服务的信息,您可以阅读有关如何使用Fail2Ban保护Nginx服务器和如何使用Fail2Ban保护Apache服务器的内容。
Source:
https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-fail2ban-on-debian-11