WordPress 如何防範暴力攻擊 Brute Force Attack

WordPress

針對 WordPress 的暴力攻擊正在進行中

密碼暴力攻擊 (Brute Force Attack),是駭客常用的一種手法,它是利用程式來猜密碼,因為程式執行的速度很快,如果又遇上你所使用的密碼是很簡單或是很容易猜得到的話,那歹徒成功的機率就很高

就算是猜不到你的密碼,但是有人整天有人拿著鑰匙來試你家的大鎖,我想任何人都不應該置之不理

從昨天開始,國外許多網站紛紛發出 WordPress 暴力攻擊的警訊,請大家小心這一波的暴力攻擊(詳見文章最後的延伸閱讀)

為什麼暴力攻擊會找上 WordPress?

如果你是跟我一樣使用 WordPress 自己架站的人,一定會好奇駭客為什麼會找上你呢?就讓我來告訴你為什麼:

  • WordPress 是全世界最多人使用的架站程式
  • 在 3.0 版以前安裝的 WordPress 後台管理的名稱都會叫 admin
  • WordPress 後台的網址一律是 你的網址/wp-admin/
  • 沒有特別限定的網站主機,全世界每個人都可以到你後台登入頁面玩猜猜看的遊戲
  • 如果是沒有安全觀念的 WordPress 網站主,人家猜了你密碼一年你都還不知道呢!
  • 很多 WordPress 網站主都電腦或網站方面的知道都不夠又沒找專業人員代管
  • 看了以上的理由,你是不是也會想試試看啊?
WordPress 如何防範暴力攻擊 Brute Force Attack

本人對 WordPress 從一開始就比別人付出更多的心力在安全這方面,而且早在四年前就發過 幫WordPress後台築城牆 這篇文章,教大家安裝 Limits Login Attempts 這個外來知道有誰在試你的 WordPress 後台密碼

但是很不幸的在這一篇文章發表了一年之後,我的網站還是被駭了,由此可見上面這個外掛的邏輯還是不對,裝了這個外掛網站還是無法高枕無憂

WordPress 後台是機房重地

很多機關都會有「機房重地、閒人勿入」,那你的 WordPress 機房重地(wp-admin 後台)有這樣的安全措施嗎?

而這些機房重地是只放一張警告牌在那裡,壞人就會止步了嗎?還是要用圍籬甚至鐵絲網圍起來才能阻止壞人?

雖然我也早就三年前被駭之後提出了解決方案(詳見 被駭全記錄),甚至也不只一次在 WordPress 相關的社團提出這個解決方案,但是大家好像一直都看不懂我在說什麼,所以今天就再把這個方法說個明白

黑名單 vs 白名單

前面提到的機房重地要進入的時候是不是要有身份辨識?現在一般都是用刷卡管制,所以就算歹徒知道機房(wp-admin)在那裡也是不得其門而入

所以 WordPress 要安全第一要件就是限制可以進入 wp-admin 目錄的 IP 位址,昨天還有國外重量級的資安網站列出前30名惡意登入後台的 IP 位址,意思是叫大家封鎖這些 IP 位址,這樣就安全了嗎?

在以前這一招或許有用,但是這一次駭客是利用超過10萬台電腦的殭屍電腦網路 (botnet) 來發動暴力攻擊的,就算你是自己架設獨立主機的,應該也不可能把這些 IP 全部封鎖,更何況這些 IP 大部份都是一般上網的民眾,可能也是你網站本來的訪客哦!

與其建立超過10萬名的「黑名單」,為什麼不改用只有你自己一個的「白名單」呢?

而一般人會覺得白名單的方法不可行是因為大家都告訴你:你要先有固定 IP 才可以用白名單,因為你每次上網的 IP 都不固定!

這個說法並不完全對,因為跟據我的觀察,一般人上網的浮動 IP 會是特定的幾組範圍,你只要把這幾組都列入白名單就可以達成類似的效果,雖然還有可能同一網段的壞人會搞鬼,但至少比起全世界所有 IP 範圍少得多了,對吧?

如何知道你上網的 IP?

所以請你到下列的網站:

WordPress 如何防範暴力攻擊 Brute Force Attack

網頁顯示就是你上網的 IP 位址

然後網路斷線重撥重新取得 IP,多試幾次你就會有一份你上網 IP 的清單,公司以及家裡都這樣記錄

不過手機上網的 IP 就比較沒有規則可言,所以建議用手機就不要進網站的後台(用家裡或是公司的 WiFi 則不在此限,因為那也是用 ADSL/光纖的 IP 上網)

限制 WordPress 後台存取 IP

我們有了自己的白名單之後,把它設定到網站的 .htaccess 檔案就可以限制這些 IP 才能存取 WordPress 後台,其他的人會被網站主機拒絕

我們要設定的有兩個地方,首先是你的網站根目錄的 .htaccess 請加上,請用主機後台(cPanel)或是FTP來編輯這個檔案

<Files .htaccess>
order allow,deny
deny from all
</Files>

<Files wp-config.php>
order allow,deny
deny from all
</Files>

<Files wp-login.php>
order deny,allow
deny from all
allow from 123.123
</Files>

把 allow from 123.123 換成你自己的查到的 IP 位址,我只設前兩個 IP 數字是假設你查到的 IP 前兩個數字都一樣

如果有不只一組 IP 範圍的話,再加一列 allow from 112.123

接下來要在 wp-admin 目錄裡面的 .htaccess 檔案加上以下內容(如果沒有這個檔案請自行新增)

AuthGroupFile /dev/null
AuthName "WordPress Admin Access Control"
AuthType Basic
<LIMIT GET POST>
order deny,allow
deny from all
allow from 173.231.39.82
allow from 122.123
</LIMIT>

<Files admin-ajax.php>
    Order allow,deny
    Allow from all
    Satisfy any
</Files>

設定的 IP 範圍跟根目錄的相同,再加上網站主機的 IP(例如我現在的 IP 是 173.231.39.82)

就這麼簡單別人再也進不到你的後台了

註:高登發現某些主機的這個 .htaccess 的設定,可能會讓你的後台進不去(HTTP 403 Error),如果是這樣那 wp-admin 這邊的 .htaccess 就不要設了

會不會把自己也封鎖了?會的!不過你的主機 cPanel 後台以及 FTP 都還可以進去把新的 IP 加到白名單,這樣知道怎麼做了吧?

但是還有一個漏洞聰明的您想到了嗎?

沒錯!就是可以去改白名單的 cPanel 後台還有 FTP,這兩個就不是一般租用主機的人可以防範的,但是我是自己架設的 VPS 就可以哦!不信你可以試試看!

以上的白名單方法只會比你去封鎖一大堆黑名單,或是讓人玩猜猜看,猜錯3次再封鎖你都還有效,甚至駭客不是用後台駭入你的網站(例如直接改你的 MySQL 資料表),就算他已經知道帳號密碼也是一樣進不到你的 WordPress 後台,這樣子你覺得是不是安全多了?

如果你的網站需要高登來協助的話,請利用「關於高登」頁面的連絡表單提出,祝大家的網站都平安!

延伸閱讀

19 則留言

  1. 我用的Windows主機+IIS,可以設定後台啟用 Windows 身份驗證來解決,更厲害的辦法就是啟用SSL,然後進行使用者憑據驗證,沒有安裝電子憑據的人一律不能登入後台,硬要登入的話,直接提示403.7。現在微軟的Windows 2012作業系統+IIS8.0對於SSL進行了改良,多個網站可以共用一個SSL連接埠。

    • 用 Windows 主機來架 WordPress 不在官方的建議配備中,因為要花錢買 OS 的版權,感覺跟開源的理念格格不入
      不過你的作法真的是最安全的,我或許也會採用,謝謝您!

  2. 現在也不知道開源的網站伺服器軟體是不是已經支援多個SSL站台使用同一個IP位址以及連接埠,因為小弟研究的是微軟的作業系統,因此對此了解不多。順便問一下,考MCSA在中華民國找工作有沒有幫助?

  3. 我想問一下我的網站為何點閱任何文章仍會出現 404 的情況?
    有什麼地方是我可能作錯了?

    以下是我從網路上 ( 包含高登您的 ) 所收集整理的 .htacess 內容 ( 如需我的其它資料請告之喔 ^^ )

    # Do not remove this line, otherwise mod_rewrite rules will stop working

    AuthUserFile /dev/null
    AuthGroupFile /dev/null
    AuthName "Wordpress Admin Access Control"
    AuthType Basic

    order deny,allow
    deny from all
    allow from 114.38.
    allow from 114.41.

    # Block the include-only files.
    RewriteEngine On
    RewriteBase /
    RewriteRule ^wp-admin/includes/ - [F,L]
    RewriteRule !^wp-includes/ - [S=3]
    RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
    RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
    RewriteRule ^wp-includes/theme-compat/ - [F,L]
    # BEGIN WordPress

    order deny,allow
    deny from all
    allow from 114.38.
    allow from 114.41.

    LimitRequestBody 10240000

    RewriteEngine On
    RewriteCond %{REQUEST_METHOD} POST
    RewriteCond %{REQUEST_URI} .wp-comments-post\.php*
    RewriteCond %{HTTP_REFERER} !.*healthhome.hostoi.com.* [OR]
    RewriteCond %{HTTP_USER_AGENT} ^$
    RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]

    # 禁止瀏覽目錄
    Options -Indexes

    order allow,deny
    deny from all
    allow from 114.38.
    allow from 114.41.

    #擋掉百度
    SetEnvIfNoCase User-Agent "^Baidu" bad_bot
    SetEnvIfNoCase User-Agent "^sogou" bad_bot
    SetEnvIfNoCase User-Agent "^Bloghoo" bad_bot
    SetEnvIfNoCase User-Agent "^Scooter" bad_bot
    Deny from env=bad_bot

    # 去除在頁尾會自動附加的 JavaScript
    php_value auto_append_file none

  4. 最近這問題好像吵很兇,
    一開始還沒特別去管,想說應該不重要…
    後來還是想說防護一下好了。

    我是自己手動改一下程式,
    登入頁面那裡設計一些只有自己才知道的進入方式。

    然後就算進到登入頁面,除了原本的密碼欄之外,
    我又多做了一個欄位當第二層密碼來驗證。
    如圖http://i.imgur.com/HUFxzIB.png

    (雖然網站很小,人氣不高

  5. 只要讓人家找不到你的門以及讓人家不知道你用的是wordpress,就可以防止9成以上專門找wordpress麻煩的人了。

    連門都找不到的時候,可以阻隔暴力登入的部分。因為沒門就不會有暴力測試密碼,還可以防止因為太多的attempt,導致的當機。

    讓人家不知道你用的是wordpress 更是一勞永逸的方法。

    http://www.sohokakadong.com/Lana/

    這不是打廣告,只是我自己要做的測試網站。之後要當成portofolio的。
    他完完全全就是wordpress. 但是 沒人敢說他是wordpress , 因為根本看不出來他是wordpress.

    連門在哪邊都找不到了,更何況暴力破門?
    所有顯示的頁面程式碼,都不是wordpress的樣子。

    做到了這樣,接著就是自己的主機的帳號密碼的保護了。

    • 做網站先學會看網頁原始碼再說吧
      查不出是 WordPress 的架的?那先把你的原始碼裡面的 wp- 藏起來吧
      而且人家也不用查,直接用程式試你的帳密
      還有你以為顯示 404 就不會對主機造成負擔?這樣 DDoS 怎麼會有效呢?
      話說回來,你這樣的作法是正確的,但不是這樣就可以免於被駭,你太小看駭客了
      還有你的主機是租 Linode 的,知道不久前他們整個母雞被駭過的事吧?

  6. 高登老師您好,感謝您的網站清楚的教導,想請教您,我已經依照這個頁面的說明設定自己的電腦IP為白名單,但還是有駭客嘗試登入,他們應該看不到我的登入頁面了,但又可以嘗試登入,這是什麼原因呢?希望能得到您的回覆,謝謝

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料