Fail2Ban 配合 CloudFlare 封鎖 IP


Fail2Ban 是阻擋暴力攻擊的工具,例如發現指定次數的登入失敗後,會自動把遠端的 IP 地址封鎖,在設定的時間過後才會對封鎖的 IP 開放。Fail2Ban 的用途非常廣泛,除了一般的 SSH 登入及電郵登入外,也可以對一些針對網頁的攻擊進行封鎖。

但如果網頁使用了 CloudFlare 的話,那 Fail2Ban 只會封鎖 CloudFlare 的 IP,而 CloudFlare 的那麼多,很多時即使封鎖了幾個 IP,攻擊者還是可以繼續進行攻擊及掃描漏洞。

要解決這個問題,可以使用 CloudFlare 的 API,在 Fail2Ban 設定把要封鎖的 IP 傳送給 CloudFlare,在 CloudFlare 那裡進行封鎖。

取得 CloudFlare API Key
要實現以上功能, 首先要取得 CloudFlare 的 API Key.

先登入 CloudFlare, 按下畫面右方的 ICON, 並按 “My Profile”.

按下左邊選單的 “API Tokens”, 然後會看到 “Global API Key”, 按下 “View”, 再輸入 CloudFlare 密碼確認, 便可以把 API Key 複製下來。

這個 API Key 必須小心保管, 因為其他人知道了可以修改 CloudFlare 的設定。

建立 Fail2Ban 的 CloudFlare Action
Fail2Ban 對每個封鎖動作都可以設定 action, 即當發現有撞密碼的行為時, 所實施的動作, 一般會用 iptables 等防火牆封鎖 IP, 但現在要把 IP 傳送給 CloudFlare 封鎖。

Fail2Ban 已經內建 CloudFlare 的 action, 但如果像我從 CentOS 安裝的 Fail2Ban, 裡面的 unban action 會有一些小問題, 可以到 Fail2Ban 的 Git 已經有修改版, 可以從以下網址取得:

https://github.com/fail2ban/fail2ban/blob/master/config/action.d/cloudflare.conf

現在建立新的 cloudflare action 設定檔:

# vi /etc/fail2ban/action.d/cloudflare-api4.conf

把上面網址的內容複製並貼上, 在上面的內容最後幾行, 修改 ClourFlare 的登入名稱及 API Key:

cftoken = your-key
cfuser = your-login-email

修改好後便儲存檔案。

修改 jail.conf

現在需要修改 /etc/fail2ban/jail.conf 檔案, 找到需要用 CloudFlare 封 IP 的 jails, 在裡面的 action 改成:

上面使用了兩個 action, 第一個是連接 cloudflare 的 api, 把 ip 傳送給 cloudflare 封阻, 第二個 iptables-allports 是本機的 iptables 封阻, 第二個 action 可以根據自己的需要修改, 或者不設定也可以。

修改後, 重新啟動 Fail2Ban:

# systemctl restart fail2ban

測試

進入設定了 Fail2Ban 保護的網頁, 嘗試登入失敗, 達到預先設定了的次數, 試了幾次後, 如果看到以下畫面便成功封鎖 IP 了, 等一會看看是否會解封 IP.

如果要立即把 IP 從 CloudFlare 解封, 可以登入 CloudFlare, 選擇相關的網域, 按左邊的 “Security” – “Tools”, 看到自己的 IP 後, 把它移除即可。

Leave a Reply