熱門分類
載入中…
目錄0%

🔐 Fail2Ban + iptables 防暴力破解實戰(SSH 與常見服務)

    🔐 Fail2Ban + iptables 防暴力破解實戰(SSH 與常見服務)

    暴力破解(Brute-force)攻擊是常見的入侵手法,特別針對 SSH、FTP、和各種網路服務。本文用實務操作教你如何用 Fail2Ban 搭配 iptables 快速建立防護機制,含設定範例、測試方式與注意事項,適用於伺服器管理者與資安維運人員。

    📌 文章重點(快速導覽)

    • Fail2Ban 是什麼,以及如何與 iptables 整合
    • 安裝與基本設定(Debian/Ubuntu 與 RHEL/CentOS 範例)
    • 範例 jail 與自訂 action(block via iptables)
    • 測試攻擊、查看封鎖記錄與解除封鎖
    • 部署建議與進階防護要點

    1️⃣ Fail2Ban 與 iptables:簡短說明

    Fail2Ban 會監控日誌(如 /var/log/auth.log、/var/log/secure),當偵測到重複失敗登錄或可疑行為時,透過「action」呼叫系統防火牆(例如 iptables)把攻擊來源 IP 暫時封鎖。這種「即時偵測+動態封鎖」對抗暴力破解非常有效。

    2️⃣ 安裝(快速指令)

    以下提供 Debian/Ubuntu 與 RHEL/CentOS 的安裝指令:

    # Debian / Ubuntu
    sudo apt update
    sudo apt install -y fail2ban iptables
    
    # RHEL / CentOS / AlmaLinux
    sudo yum install -y epel-release
    sudo yum install -y fail2ban iptables
    sudo systemctl enable --now iptables   # 若使用 legacy iptables
    

    3️⃣ 基本設定檔位置與工作流程

    • /etc/fail2ban/jail.conf:預設樣板(不要直接改,改用 jail.local)
    • /etc/fail2ban/jail.local:放你的自訂 jail 與參數
    • /etc/fail2ban/action.d/:定義封鎖方式(iptables、firewalld、ufw 等)

    4️⃣ 範例:針對 SSH 的 jail.local

    把以下內容加入 /etc/fail2ban/jail.local(或在 jail.d/ 建檔):

    [DEFAULT]
    # 全域預設
    bantime  = 3600        # 封鎖時間(秒)— 1 小時
    findtime = 600         # 在多少秒內計算失敗次數 — 10 分鐘
    maxretry = 5           # 超過失敗次數則封鎖
    backend = auto
    usedns = no
    
    [sshd]
    enabled = true
    port = ssh
    filter = sshd
    logpath = /var/log/auth.log
    maxretry = 5
    bantime = 3600
    action = iptables-multiport[name=SSH, port="ssh", protocol=tcp]
    

    5️⃣ iptables action 範例(預設通常已存在)

    Fail2Ban 會使用 action.d/ 下的動作。系統通常已提供 iptables-multiport。若你想確認或自訂,可參考:

    # 範例動作片段(簡化)
    /sbin/iptables -I f2b- 1 -s  -j DROP
    # 或使用 REJECT
    /sbin/iptables -I f2b- 1 -s  -j REJECT --reject-with icmp-port-unreachable
    

    6️⃣ 建立專用 iptables chain(Fail2Ban 自動建立)

    啟用 Fail2Ban 並啟動 jail 後,Fail2Ban 會自動建立像是 f2b-sshd 的鏈(chain),並把對應規則加入 INPUT。你可以用以下指令檢視:

    sudo iptables -L -n --line-numbers
    sudo iptables -L f2b-sshd -n --line-numbers    # 檢查 f2b 封鎖清單

    7️⃣ 針對多服務(HTTP / vsftpd / postfix)範例 jail

    [apache-auth]
    enabled = true
    port = http,https
    filter = apache-auth
    logpath = /var/log/apache2/error.log
    maxretry = 3
    bantime = 86400
    
    [vsftpd]
    enabled = true
    port = ftp
    filter = vsftpd
    logpath = /var/log/vsftpd.log
    maxretry = 5
    bantime = 7200
    
    [postfix]
    enabled = true
    port = smtp
    filter = postfix
    logpath = /var/log/mail.log
    maxretry = 5
    bantime = 7200
    

    8️⃣ 測試與除錯

    測試封鎖可以用模擬失敗登入或直接用測試 IP 觸發:

    # 重啟 fail2ban 後檢查狀態
    sudo systemctl restart fail2ban
    sudo systemctl status fail2ban
    
    # 查看 jail 狀態
    sudo fail2ban-client status
    sudo fail2ban-client status sshd
    
    # 查看某 jail 的封鎖 IP 列表
    sudo fail2ban-client status sshd
    
    # 手動封鎖 / 解封
    sudo fail2ban-client set sshd banip 1.2.3.4
    sudo fail2ban-client set sshd unbanip 1.2.3.4
    

    9️⃣ 進階:自訂 filter(範例為 SSH)

    Filter 定義在 /etc/fail2ban/filter.d/sshd.conf。若要加入自訂偵測,可建立自訂 filter:

    # /etc/fail2ban/filter.d/custom-ssh.conf
    [Definition]
    failregex = ^%(__prefix_line)s(?:error: PAM: )?Authentication failure for .* from (?: port \d*)?(?: ssh\d*)?$
                ^%(__prefix_line)sFailed password for .* from  port \d+
    ignoreregex =
    

    🔟 測試攻擊(安全測試步驟)

    請只在你自己的測試環境或取得許可的系統上執行模擬攻擊。下面示範如何用 sshpass 做多次錯誤密碼嘗試(會被封鎖):

    # 安裝測試工具(測試環境)
    sudo apt install -y sshpass
    
    # 模擬錯誤登入 6 次(會觸發 maxretry)
    for i in {1..6}; do
      sshpass -p "wrongpassword" ssh -o StrictHostKeyChecking=no user@your-server.example.com exit
    done

    1️⃣1️⃣ 日誌與追蹤

    Fail2Ban 的活動會寫入系統日誌(通常是 /var/log/fail2ban.log),同時會在 systemd journal 中有相關紀錄:

    sudo tail -n 200 /var/log/fail2ban.log
    sudo journalctl -u fail2ban -f

    1️⃣2️⃣ 部署注意事項與最佳實務

    • 避免誤封鎖內部 IP:對於可信任的內部網段可在 ignoreip 中加入,如 ignoreip = 127.0.0.1/8 10.0.0.0/8
    • 整合 fail2ban 與 firewalld / nftables:若系統使用 firewalld 或 nftables,請選擇相容的 action(如 firewalld action 或 nftables action),避免同時混用 iptables legacy 與 nft。
    • 監控與告警:把 fail2ban log 與封鎖事件推到集中化日誌或監控(如 ELK / Grafana Loki),以便統計攻擊來源與趨勢。
    • 調整 bantime 與 maxretry:根據服務的重要性與流量模式決定封鎖時間;對於高風險服務可採長時間封鎖。
    • 搭配多因素認證 (MFA):Fail2Ban 是阻擋自動化攻擊的好工具,但應與 SSH key + 2FA 一起使用,才能達到更強的保護。

    1️⃣3️⃣ 常見問題(FAQ)

    • Q:Fail2Ban 無效或不封鎖?
      A:檢查 logpath 與 filter 的 failregex 是否對日誌格式匹配,並確認 fail2ban 有權讀取 log 檔。
    • Q:如何永久封鎖特定 IP?
      A:可直接在防火牆加入 DROP 規則,或在 fail2ban action 改為永久封鎖(bantime = -1)。
    • Q:使用 cloud provider(如 AWS)時怎麼做?
      A:在 cloud 中建議搭配 security group、WAF、以及集中化防護,fail2ban 適用於 instance 層面的即時封鎖。

    📘 結語

    Fail2Ban 與 iptables 的搭配能快速建立對抗暴力破解的第一道防線。這套方案部署成本低、回饋快,是大多數 Linux 伺服器的必備防護工具。下一步可考慮結合集中日誌、WAF 與 IAM 最佳實務,建立多層次的資安防護。


    🔗 延伸閱讀

    — WWFandy・系統安全與維運筆記

    🔗 分享這篇 LINE Facebook X

    沒有留言:

    字級