今まで、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