WordPress 用 .htaccess でちょっと安全な設定方法

今まで、xml-rpc を通じてログインをしようとするパスワードアタックがひどく、Mac で軽快にブログ記事を更新できる Calyoso アプリ導入を保留にしていたのですが、 .htaccess で、Automattic からだけ xmlrpc へのアクセスを許可することによって、アプリが使えるようになりました。

自分は、セキュリティの専門家ではないですが、WordPress サイトを運営している中、培ってきた、.htaccess の設定を公開します。

なんかツッコミやご指摘があれば、ご意見お願いします。

管理画面 & ログインページを BASIC 認証にする

wp-login.php や /wp-admin/ ディレクトリ配下を BASIC 認証にしています。

BASIC 認証の設定方法の詳細は、他のブログ記事を参考にしてください。

wp-login.php の BASIC 認証の例

WordPress のルートフォルダに設置している .htaccess

# wp-login.php basic auth
AuthUserFile /var/www/XXXXX/.htpasswd
AuthGroupFile /dev/null
AuthName "Editing"
AuthType Basic
<Files wp-login.php>
 require valid-user
</Files>

/wp-admin/ 配下にある .htaccess

AuthUserFile /var/www/XXXXX/.htpasswd
AuthGroupFile /dev/null
AuthName "Editing"
AuthType Basic
require valid-user
<Files ~ "^.(htpasswd|htaccess)$">
 deny from all
</Files>

オーサーリンクの停止

オーサーリンクを使って、admin の ID 名を取得しようとする、総当たり攻撃があったので、それを防ぐために .htaccess で設定しました。

これも、WordPress ルートの .htaccess に設定します。

# Disable Author link
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ /? [L,R=301]

WordPress.com (Jetpack) は許可するけど他は NG

次に REST-API に重要な、xml-rpc.php です。

wp-login.php を BASIC 認証にしたのに、パスワード総攻撃が続いていて、どこから攻撃していたのか不思議だったのですが、xml-rpc.php を通じでログインしようとしていました。

なので、xmlrpc.php を守るのは非常に重要です。

基本的にホワイトリスト形式にして、自分の IP や、JetPack からのアクセスのみ許可するようにします。

こちらも、xmlrpc.php が設置してある、WordPress のルートフォルダに設置します。

「Allow from」の行を増やして許可する IP アドレスを増やせます。私の場合は会社の固定IPを加えています。

<Files xmlrpc.php>
 Order Deny,Allow
 Deny from all

 # Allow Automattic
 Allow from 192.0.64.0/18
 # Allow concrete5 IP
 # Allow from XXX.XXX.XXX.XXX
</Files>

.htaccess まとめ

以上、自分のサイトの ルートフォルダに置いていある .htaccess の全文の一部抜粋です。

マルチサイト運営をしているので、マルチサイトの部分や、キャッシュプラグインの設定は省いています。

<Files ~ "^.(htpasswd|htaccess)$">
deny from all
</Files>
# wp-login.php basic auth
AuthUserFile /var/www/XXXXX/.htpasswd
AuthGroupFile /dev/null
AuthName "Editing"
AuthType Basic
<Files wp-login.php>
require valid-user
</Files>
<Files xmlrpc.php>
 Order Deny,Allow
 Deny from all

 # Allow Automattic
 Allow from 192.0.64.0/18
 # Allow concrete5 IP
 # Allow from XXX.XXX.XXX.XXX
</Files>

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# Disable Author link
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{QUERY_STRING} ^/?author=([0-9]*)
RewriteRule ^(.*)$ /? [L,R=301]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule . index.php [L]

 

参考
https://ja.forums.wordpress.org/topic/21134