隱藏登入頁面提升WordPress安全性:Cerber Security & Antispam

用了一陣子WordPress,也安裝了iThemes Security(前身是Better WP Security,以下簡稱iThemes)來幫助我監測、阻擋brute force attack(暴力攻擊法),雖然有安裝兩步驟驗證(有中文、可用Google Authenticator,且支援HOTP,否則我的伺服器時間老是不準確,用TOTP總是錯XD),擋下了大多數攻擊,但監測到有人48小時不間斷嘗試登入,信箱收到一大堆Site Lockdown,決定把控制台(後台)登入頁面(wp-login、wp-admin等等)隱藏起來。

原本使用的iThemes雖然有這個功能(在Settings-Advanced-Hide Login Area),不知為何就算是設定之後,還是可以用原本頁面登入,而且我實在不太喜歡它用的.php?itsec-hb-token=方式……

總之我放棄了iThemes,改裝Cerber Security & Antispam(或WP Cerber Security,以下簡稱WP Cerber)來設定隱藏控制台登入頁面。
不過,本站有利用Cloudflare進行反向代理,也有啟用SSL,需要進一步設定、修正wp-config.php,才能讓WP Cerber抓到正確的IP,比較起來,iThemes就很聰明,不需要額外加程式碼,還具備Away Mode(設定某個時段不開放後台登入)、禁用控制台修改外掛程式碼功能等等,所以選用哪個見仁見智。
兩個外掛功能有部分重疊,雖然WP Cerber宣稱可以並存,仍請三思
以下簡單介紹「如果你網站也透過Cloudflare管理,或使用此外掛時發現IP不太正確」如何進行修正,其他使用設定請參考tungqian所寫的:WordPress Cerber Security – 安全有關的外掛如何安裝

參考的教學來自WP Cerber、Cloudflare官方網站
Cloudflare and WP Cerber:https://wpcerber.com/cloudflare-and-wordpress-cerber/
How do I exclude a specific URL from Cloudflare’s caching?:https://support.cloudflare.com/hc/en-us/articles/200172316-How-do-I-exclude-a-specific-URL-from-CloudFlare-s-caching-
Solving problem with incorrect IP address detection:https://wpcerber.com/wordpress-ip-address-detection/

第一部分:避免Couldflare將新登入頁存入快取
一、WordPress
1.登入、安裝並啟用外掛,設定要取代控制台登入頁面的新名稱
2.由右側WP Center選單進入控制台(Dashboard)頁面→找到Site connection(連接網站),開啟My site is behind a reverse proxy(我的網站置於反向代理伺服器下)敘述
我有開Redirect dashboard requests(控制台連線轉址):Disable automatic redirecting to the login page when /wp-admin/ is requested by an unauthorized request(禁止未授權連線至/wp-admin/時轉址到登入頁面),避免新登入頁面網址被亂試出來
啟用反向伺服器設定

二、Cloudflare
1.登入
2.進入Page Rules(頁面規則)頁面→點選Create Page Rule(設定頁面規則)→輸入你更改後的登入頁面→點選Add a setting(增加設定)→拉選Cache level(快取層級)項目,設定為Bypass(跳過)→點選Save and Deploy(儲存並啟用)
設定規則
完成設定
免費版的Cloudflare只能設定最多3條規則,原本已有其他規則,才會出現圖中下方的Order(順序)欄,讓你自定本條規則的優先順序。
此外,示範用的網址是利用萬用字元*涵蓋http://mydomain.com/real-login-page/、https://www.mydomain.com/blog/real-login-page/、http://blog.mydomain.com/new/real-login-page/等等狀況,且real-login-page作為新登入頁面名稱有點太明顯,請視自家網址狀況修改

之後可能會發現Access Lists中看到的Your IP: xxx.xxx.xxx.xxx並不是你真實的IP,以及所有在Acitvity(活動紀錄)中列出的IP,WHOIS查詢結果都屬於Cloudflare,感覺是不是封錯IP、誤會好人(?)呢?這就是第二部分所要解決的事情了。

第二部分:讓WP Cerber抓到真實的IP位址
一、確認真實的IP:進入WP Cerber提供的網址https://wpcerber.com/what-is-my-ip/,上面顯示粗體數字就是你的真實IP,請先把這串數字複製或記起來
真實IP

二、WordPress
1.右側WP Center選單→控制台(Dashboard)頁面→Access Lists(連線列表),然後在此頁面搜尋剛剛複製的IP,如果找不到,且下方看到的Your IP(你的IP)與前面網址查出的IP不一致,請繼續下一步
2.由右側WP Center選單進入Tools(工具)→Diagnostic(診斷)→捲動到最下方Server Info(伺服器資訊),點選底下方框,然後在此搜尋一開始複製的真實IP
3.複製這個IP前面顯示在[]框中的字串,有可能是[HTTP_X_REAL_IP] => 真實IP,或[HTTP_CF_CONNECTING_IP] => 真實IP,以找到的字串為準
尋找字串

三、伺服器
1.登入網站伺服器
2.找到wp-config.php並進行編輯
3.在/* That’s all, stop editing! Happy blogging. */前面幾行空白處(也可自行增加空白)加上
define('CERBER_IP_KEY', 'HTTP_X_REAL_IP' );
程式碼如果放在happy blogging那串之後會沒有作用,所以請放在之前。
另,此處以二、3.中找到的字串是HTTP_X_REAL_IP為範例,如果是HTTP_CF_CONNECTING_IP或其他,請將第二個’單引號’包圍的部分自行修改成正確的字串

4.存檔
程式碼

四、WordPress
回到Access Lists,此時Your IP後面顯示的數字應該已經是真實IP了

第三部分:設定白名單
因為我使用的佈景會使用admin-ajax.php,預設的安全層級會造成我手機登入有問題(用手機Chrome或Safari登入都會顯示HTTP 403 Forbidden,Form submission denied,然後IP Lockout,但PC瀏覽器可以正常登入),於是增加把admin-ajax.php加入白名單的說明
一、Traffic Inspector
1.進入「設定」頁籤
2.找到Request whitelist,輸入/admin-ajax.php
3.點儲存變更

二、Antispam
1.開啟Adjust antispam engine下的Safe mode: Use less restrictive policies (allow AJAX)
2.找到Query whitelist,輸入{\/admin-ajax\.php}
3.點儲存變更

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *