如何使用 Fail2Ban 安全 SSH

保護伺服器免受暴力攻擊是必須的。問題是,如何做到?幸運的是,Fail2Ban 就在附近,可以保護您的伺服器,但 Fail2Ban 的默認配置需要進行一些調整以獲得最佳安全性。但不用擔心,這份教程為您提供了完整的解決方案。

在這個教程中,您將學會如何設置 Fail2Ban 並通過保護您的 SSH 伺服器來擊退暴力攻擊。

準備好了嗎?繼續閱讀,以優化您的 SSH 伺服器安全性!

先決條件

此教程包含逐步的說明。如果您想跟著操作,請確保您已經具備以下條件:

  • 一台運行Ubuntu 18.04 LTS 以設置 Fail2Ban 的 Ubuntu 和 Debian 伺服器,以及一台用於測試 Fail2Ban 封禁配置的 Debian 10 伺服器。

建立基本防火牆

Fail2Ban通過監視日誌並禁止在特定時間內進行太多次登錄嘗試的IP地址來保護您的伺服器。但首先,您需要建立一個基本防火牆,在其中可以添加規則以阻止您伺服器上的惡意行為。

1. 首先,執行以下service命令來停止Fail2Ban(fail2ban stop)運行。在更改配置文件時停止Fail2Ban,以便您可以測試更改並確保它們按預期工作。

sudo service fail2ban stop
Stopping the fail2ban service

2. 執行apt install命令來安裝Sendmail IPTables-persistent。Sendmail是Fail2Ban用於在禁止IP地址時通知您的程序。而IPTables-persistent是一個程序,它將您的更改的配置設置保存在/etc/sysconfig/iptables文件中。

安裝這些程式可以保持您的防火牆設定完整,即使發生意外情況,例如停電。

sudo apt install sendmail iptables-persistent -y

現在執行下面的每個iptables命令來設定您的防火牆。這些命令不會產生任何輸出,但會向您的防火牆添加四條規則。這些規則可以允許或阻止與您的伺服器的連接。

## 第一個規則 - 接受由伺服器生成的所有流量(lo介面) 
sudo iptables -A INPUT -i lo -j ACCEPT
## 第二個規則 - 接受所有是部分 
## 已建立或相關連接的流量
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
## 第三個規則 - 允許端口22上的SSH流量
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
## 第四個規則 - 阻止所有其他流量
sudo iptables -A INPUT -j DROP
Adding four rules to your firewall

4. 執行下面的iptables命令以查看您在防火牆中設定的摘要。

sudo iptables -S

下面,突出顯示了您在防火牆中添加的規則。

Checking your firewall rules

5. 接下來,執行以下命令將您的規則保存在/etc/sysconfig/iptables-config文件中並啟動Fail2Ban服務。 iptables-config文件保存了所有您的永久性防火牆規則。

Fail2Ban將自動向您的防火牆添加一些規則以保護您的伺服器。

sudo dpkg-reconfigure iptables-persistent
sudo service fail2ban start

6. 最後,重新執行下面的iptables命令以查看您的防火牆規則。

sudo iptables -S

如下所示,以紅色突出顯示了Fail2Ban向您的防火牆添加的新規則。

Previewing your firewall rules

調整您的本地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)。
awk '{ printf "# "; print; }' /etc/fail2ban/jail.conf | sudo tee /etc/fail2ban/jail.local
Creating the jail.local file

2. 當您創建了 jail.local 檔案後,執行以下 ls 命令。該命令列出了您伺服器的 Fail2Ban 目錄 (/etc/fail2ban) 的內容,以驗證您的 jail.local 檔案是否正確生成。

ls /etc/fail2ban

如果您看到新的 jail.local 檔案,如下所示,那麼您的本地檔案已經正確生成。

Checking the newly created local file (jail.local)

3. 在您首選的文字編輯器中打開 /etc/fail2ban/jail.local 檔案並導航到 [ssh] 部分。

通過刪除前面的 # 符號來取消註釋 [sshd]enabled 選項,如下所示以啟用 SSH。

從此處到教程的其餘部分,刪除前面的 # 符號以啟用它們中的任何部分或選項。

Enabling the [ssh] section

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

Uncommenting the [DEFAULT] option

5. 接下來,滾動到 bantime 部分,並設置 bantime60 分鐘。 bantime 選項設置了 IP 地址在登錄失敗後被禁止的時間量,以分鐘為單位。

默認的封鎖時間設置為600秒(10分鐘)。您可以根據需要調整此設置,但重要的是要注意,封鎖時間設置越低,您的服務器承受的負載就越大。

Setting a ban duration

6. 導航到 findtimemaxretry 選項。將 findtime 保持原樣(10m),並將 maxretry 降低到 3

findtime 選項設置了 IP 地址在被禁止之前連續失敗登錄的時間(以分鐘為單位)。而 maxretry 選項則設置了 IP 地址在被禁止之前的連續失敗登錄次數。

默認的 findtime 設置為10分鐘,maxretry 設置為5分鐘。因此,在10分鐘內連續5次登錄失敗的 IP 地址將被封鎖。

Setting a Window Time for an IP Address to Login Before Getting Banned

7. 向下滾動,取消註釋並配置 destemailsendermta 選項:

  • destemail – 輸入 Fail2Ban 發送通知的電子郵件地址。
  • sender – 設置 Fail2Ban 發送給 destemail 的郵件中的“發件人”字段。
  • mta – 保持默認(sendmail)不變。 mta 選項設置了 Fail2Ban 用於發送通知的電子郵件發送代理。
Configuring destemail, sender, and mta options

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

保存更改並退出文本編輯器。

Enabling Logwatch Emails

9. 現在執行以下命令來重新啟動您的 fail2ban 服務。

sudo service fail2ban stop
sudo service fail2ban start

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

sudo service fail2ban status

如果 Fail2Ban 服務正常工作,您將獲得以下類似的輸出。

Checking the Fail2Ban Service Status

測試您的封禁配置

您剛剛配置了 Fail2Ban,現在是時候測試封禁配置是否真正有效。從次要伺服器對您的 Fail2Ban 伺服器嘗試多次失敗的 SSH 登錄,並查看該次要伺服器是否被封禁。

1. 登錄到您的次要伺服器(Debian),並運行以下命令以 SSH 登錄到您的 Fail2Ban 伺服器。

此演示使用具有 IP 地址 134.122.20.103 的 Debian 10 伺服器來 ssh 到具有 IP 地址 69.28.83.134fail2ban 伺服器。

2. 在提示時輸入一個隨機密碼,然後按 Enter。

在第一次尝试时,Fail2Ban服务器将停止SSH登录尝试并打印Permission denied消息,如下所示。重复大约两到三次SSH登录尝试,Fail2Ban服务器最终将不再响应您的SSH登录尝试。

此时,您将不再收到Permission denied消息,而是一个空屏幕。出现空屏幕表示您的第二个服务器(Debian)已被Fail2Ban服务器禁止。

Testing if a server gets banned from Fail2Ban server after several failed logins

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

地址可以是多个单独的IPv4或IPv6条目,也可以用逗号分隔。

Setting IP Addresses to Block from Fail2Ban Server

3. 在您的Fail2Ban服务器(Ubuntu)上重新运行以下iptables命令以查看防火墙规则。

sudo iptables -S

请注意下面有一个新规则,拒绝来自134.122.20.103 IP地址的SSH登录尝试。

如果您在Fail2Ban服务器上设置了sendmail,您还将收到一封电子邮件通知,其中附有一个日志文件,说明Fail2Ban已成功阻止了暴力攻击,并保护了您的服务器免受潜在的损害。

Checking additional firewall rules

结论

在這個教程中,您已經學會了如何在Ubuntu伺服器上配置Fail2Ban。現在,您應該已經具備了足夠的知識來保護您的SSH伺服器免受暴力攻擊。

現在,為什麼不將這些新學到的知識提升一個層次呢?也許從在Docker主機上使用Fail2Ban阻止所有端口的IP開始?

Source:
https://adamtheautomator.com/fail2ban-ssh/