保護伺服器免受暴力攻擊是必須的。問題是,如何做到?幸運的是,Fail2Ban 就在附近,可以保護您的伺服器,但 Fail2Ban 的默認配置需要進行一些調整以獲得最佳安全性。但不用擔心,這份教程為您提供了完整的解決方案。
在這個教程中,您將學會如何設置 Fail2Ban 並通過保護您的 SSH 伺服器來擊退暴力攻擊。
準備好了嗎?繼續閱讀,以優化您的 SSH 伺服器安全性!
先決條件
此教程包含逐步的說明。如果您想跟著操作,請確保您已經具備以下條件:
- 一台運行Ubuntu 18.04 LTS 以設置 Fail2Ban 的 Ubuntu 和 Debian 伺服器,以及一台用於測試 Fail2Ban 封禁配置的 Debian 10 伺服器。
- Root 訪問權限或在伺服器上以超級用戶身份執行命令的 sudo 權限。
- 在Ubuntu或Debian伺服器上安裝了Fail2Ban。
建立基本防火牆
Fail2Ban通過監視日誌並禁止在特定時間內進行太多次登錄嘗試的IP地址來保護您的伺服器。但首先,您需要建立一個基本防火牆,在其中可以添加規則以阻止您伺服器上的惡意行為。
1. 首先,執行以下service
命令來停止Fail2Ban(fail2ban stop
)運行。在更改配置文件時停止Fail2Ban,以便您可以測試更改並確保它們按預期工作。

2. 執行apt install
命令來安裝Sendmail
和IPTables-persistent
。Sendmail是Fail2Ban用於在禁止IP地址時通知您的程序。而IPTables-persistent是一個程序,它將您的更改的配置設置保存在/etc/sysconfig/iptables文件中。
安裝這些程式可以保持您的防火牆設定完整,即使發生意外情況,例如停電。
現在執行下面的每個iptables
命令來設定您的防火牆。這些命令不會產生任何輸出,但會向您的防火牆添加四條規則。這些規則可以允許或阻止與您的伺服器的連接。

4. 執行下面的iptables
命令以查看您在防火牆中設定的摘要。
下面,突出顯示了您在防火牆中添加的規則。

5. 接下來,執行以下命令將您的規則保存在/etc/sysconfig/iptables-config文件中並啟動Fail2Ban服務。 iptables-config文件保存了所有您的永久性防火牆規則。
Fail2Ban將自動向您的防火牆添加一些規則以保護您的伺服器。
6. 最後,重新執行下面的iptables
命令以查看您的防火牆規則。
如下所示,以紅色突出顯示了Fail2Ban向您的防火牆添加的新規則。

調整您的本地Fail2Ban配置
現在您已經運行了基本的防火牆,是時候調整您的本地Fail2Ban配置文件,以增強對伺服器的安全控制。本教程使用/etc/fail2ban/jail.conf配置文件,因為它包含配置Fail2Ban應用程序的全局設置所需的所有選項。
也許您想為SSH伺服器創建自定義規則。如果是這樣,您將創建一個新的jail.local文件(基於jail.conf文件),並將SSH特定的規則放在jail.local文件中。這樣做可以讓您覆蓋jail.conf文件中的伺服器默認設置。
1.執行以下awk
命令執行以下操作:
- 打印
/etc/fail2ban/jail.conf
文件的內容('{ printf "# "; print; }'
)。 - 創建一個名為jail.local的文件(基於jail.conf文件),可用於覆蓋jail.conf文件中的默認設置。
- 將
/etc/fail2ban/jail.conf
文件的內容傳輸到tee
命令。這樣將jail.conf
文件的內容寫入本地文件系統(/etc/fail2ban/jail.local
)。

2. 當您創建了 jail.local 檔案後,執行以下 ls
命令。該命令列出了您伺服器的 Fail2Ban 目錄 (/etc/fail2ban
) 的內容,以驗證您的 jail.local 檔案是否正確生成。
如果您看到新的 jail.local 檔案,如下所示,那麼您的本地檔案已經正確生成。

3. 在您首選的文字編輯器中打開 /etc/fail2ban/jail.local 檔案並導航到 [ssh] 部分。
通過刪除前面的 # 符號來取消註釋 [sshd] 和 enabled 選項,如下所示以啟用 SSH。
從此處到教程的其餘部分,刪除前面的 # 符號以啟用它們中的任何部分或選項。

4. 向下滾動,並取消註釋下面顯示的 [DEFAULT] 部分。 這部分是您配置 Fail2Ban 默認設置的地方。 此部分中的任何設置都將應用於 Fail2Ban 管理的所有 jails。

5. 接下來,滾動到 bantime 部分,並設置 bantime 為 60 分鐘。 bantime 選項設置了 IP 地址在登錄失敗後被禁止的時間量,以分鐘為單位。
默認的封鎖時間設置為600秒(10分鐘)。您可以根據需要調整此設置,但重要的是要注意,封鎖時間設置越低,您的服務器承受的負載就越大。

6. 導航到 findtime 和 maxretry 選項。將 findtime 保持原樣(10m),並將 maxretry 降低到 3。
findtime 選項設置了 IP 地址在被禁止之前連續失敗登錄的時間(以分鐘為單位)。而 maxretry 選項則設置了 IP 地址在被禁止之前的連續失敗登錄次數。
默認的 findtime 設置為10分鐘,maxretry 設置為5分鐘。因此,在10分鐘內連續5次登錄失敗的 IP 地址將被封鎖。

7. 向下滾動,取消註釋並配置 destemail、sender 和 mta 選項:
- destemail – 輸入 Fail2Ban 發送通知的電子郵件地址。
- sender – 設置 Fail2Ban 發送給 destemail 的郵件中的“發件人”字段。
- mta – 保持默認(sendmail)不變。 mta 選項設置了 Fail2Ban 用於發送通知的電子郵件發送代理。

8. 導航到以下顯示的 操作 選項,並取消註釋 action_mwl 選項。這樣做可以讓 Fail2Ban 將 logwatch 郵件發送給您。您可以查看 logwatch 郵件以進一步調查伺服器上的任何潛在安全問題。
保存更改並退出文本編輯器。

9. 現在執行以下命令來重新啟動您的 fail2ban
服務。
10. 最後,執行以下命令來檢查您的 fail2ban
服務 狀態
。 sudo service fail2ban status
如果 Fail2Ban 服務正常工作,您將獲得以下類似的輸出。
如果 Fail2Ban 服務正常工作,您將獲得以下類似的輸出。

測試您的封禁配置
您剛剛配置了 Fail2Ban,現在是時候測試封禁配置是否真正有效。從次要伺服器對您的 Fail2Ban 伺服器嘗試多次失敗的 SSH 登錄,並查看該次要伺服器是否被封禁。
1. 登錄到您的次要伺服器(Debian),並運行以下命令以 SSH 登錄到您的 Fail2Ban 伺服器。
此演示使用具有 IP 地址 134.122.20.103 的 Debian 10 伺服器來 ssh
到具有 IP 地址 69.28.83.134
的 fail2ban
伺服器。
2. 在提示時輸入一個隨機密碼,然後按 Enter。
在第一次尝试时,Fail2Ban服务器将停止SSH登录尝试并打印Permission denied消息,如下所示。重复大约两到三次SSH登录尝试,Fail2Ban服务器最终将不再响应您的SSH登录尝试。
此时,您将不再收到Permission denied消息,而是一个空屏幕。出现空屏幕表示您的第二个服务器(Debian)已被Fail2Ban服务器禁止。

但也许您已经有一个IP地址列表要从Fail2Ban服务器阻止。如果是这样,请打开jail.local文件并导航到[DEFAULT]部分。取消注释ignoreip选项并设置要阻止的IP地址,如下所示。
地址可以是多个单独的IPv4或IPv6条目,也可以用逗号分隔。

3. 在您的Fail2Ban服务器(Ubuntu)上重新运行以下iptables
命令以查看防火墙规则。
请注意下面有一个新规则,拒绝来自134.122.20.103 IP地址的SSH登录尝试。
如果您在Fail2Ban服务器上设置了sendmail,您还将收到一封电子邮件通知,其中附有一个日志文件,说明Fail2Ban已成功阻止了暴力攻击,并保护了您的服务器免受潜在的损害。

结论
在這個教程中,您已經學會了如何在Ubuntu伺服器上配置Fail2Ban。現在,您應該已經具備了足夠的知識來保護您的SSH伺服器免受暴力攻擊。
現在,為什麼不將這些新學到的知識提升一個層次呢?也許從在Docker主機上使用Fail2Ban阻止所有端口的IP開始?