最低限必要なWordPressの脆弱性対策 2017年版

多くの人が使っているWPは人気が高いだけに脆弱性を狙われやすく、日々のメンテナンス(アップデート) やセキュリティ面のチェックはきちんとしておくべきです。

実際、私も仕事でWPを利用していくつものサイト構築を行いましたが、お客様によってはアップデートの必要性をきちんと理解していただけず、改ざんされてしまった事もありました。

その結果、サイトの復旧をご依頼いただいたりして、お客様自身が思わぬ打撃(コスト面も含めて)を受けてしまいました。

そんな悲劇がおきないためにも、最低限これだけは対策してほしいと思います。


ユーザ名に『admin』を使用しない

何も考えずにWPのインストールを行うと、管理者のユーザ名がadminとなってしまいます。(※環境により異なる)

これの何が危険かというと、ユーザがadminだとわかっているので、残りはパスワードを総当たり(ブルートフォースアタック)で入力されればいずれ乗っ取られてしまいます。
更に、PWが「誕生日の8桁」「サイトのドメインの一部」「氏名」等、貧弱な文字列であればどうでしょうか。

想像に難しくないですね。

対策1

ユーザ名にadminを使用しない

パスワードはWP管理画面のパスワード生成等で発行される、ランダムで強固な文字列を使用する

しかしこれだけでは足りません!

ユーザ名を外部から調べる方法があります。

最初のユーザ(管理者)に付与されるユーザIDは「1」となるので、「WPのURL/?author=1」等でアクセスすると、ID1のユーザのプロフィール画面、または投稿一覧が表示され、そこでユーザ名が判明してしまいます。

ユーザ名がわかってしまえば、あとはパスワード総当たりというわけです。

対策2

パターン1:ユーザの投稿一覧のURLを変更する。

「Edit Author Slug」というプラグインを入れて、ユーザプロフィール画面へアクセスすると、authorページのURLの変更設定が追加されていますので、そこでランダム(想像されにくい)なURLへ変更します。

パターン2:ユーザの投稿一覧へアクセスできないようにする。

この方法が可能かはサイトの運用にもよります。ユーザプロフィールやユーザの投稿いちらんをそもそも必要としないサイトであれば、「パターン1」よりもこちらの方法、下記をfunctions.phpへ追記することをおすすめします。

add_filter('author_rewrite_rules', '__return_empty_array');
function disable_author_archive() {
if( $_GET['author'] || preg_match('#/author/.+#', $_SERVER['REQUEST_URI']) ){
wp_redirect( home_url( '/404.php' ) );
exit;
}
}
add_action('init', 'disable_author_archive');

これで、ユーザの投稿一覧へのアクセスは、404ページへとリダイレクトされます。

対策3

更に、ユーザプロフィールの設定で「ブログ上の表示名」は「ニックネーム」を利用しましょう。

これにより、思わぬところでユーザ名が表示されるのを防ぎます。

WPログイン画面へのアクセス制限

wp-login.phpとwp-adminへ、可能であればIP制限をかけましょう。

固定IPの契約が困難な場合は、Basic認証くらいはかけましょう。

対策4

.htaccessを利用します。

パターン1:IP制限

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

「XXX.XXX.XXX.XXX」の箇所にアクセス許可する固定IPを入れます。

パターン2:Baisc認証

<Files "wp-login.php">
AuthUserFile /XXXXXXXXXXXX/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user
order deny,allow
</Files>

「XXXXXXXXXXXX」のサーバパスを修正して、設置したhtpasswdへのパスにします。

対策5

「wp-admin」ディレクトリ直下にも、対策4と同様の設定します。
通常はここにはhtaccessは存在しないので新規でアップロードする必要があります。
ただしadmin-ajax.phpはプラグインによっては、フロントで使用するので、
ここではfilesの指定で許可します。

パターン1:IP制限

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

「XXX.XXX.XXX.XXX」の箇所にアクセス許可する固定IPを入れます。

パターン2:Baisc認証

AuthUserFile /XXXXXXXXXXXX/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user
order deny,allow
<Files admin-ajax.php>
Satisfy any
allow from all
</Files>

「XXXXXXXXXXXX」のサーバパスを修正して、設置したhtpasswdへのパスにします。

xmlrpc.phpを無効化する

このファイルはWPのコアファイルで、スマホアプリ等、通常の管理画面以外からの記事投稿を可能にするものらしいです。

つまり、xmlrpc.php経由でクラッキングが可能となってしまいます。

対策6

少しやりすぎな気もしますが、htaccessとfunctions.phpで二重に対策します。

htaccessにて、アクセスを拒否(別IP(0.0.0.0)へリダイレクト)

下記のように、リダイレクトの設定を1行追記します。

———[Before]————-
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress

———-[After]———
# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^xmlrpc\.php$ "http\:\/\/0\.0\.0\.0\/" [R=301,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress

「functions.php」で無効化

functions.phpへ下記を追記します。

// 1)xmlrpc.phpの無効化(verにより効かない可能性あり)
add_filter('xmlrpc_enabled','__return_false');


// 2)「X-Pingback」のヘッダー情報も消去
function remove_x_pingback($headers) {
unset($headers['X-Pingback']);
return $headers;
}
add_filter('wp_headers','remove_x_pingback');

wp-config.phpのパーミッション調整

DB情報が記述された重要なファイルですのでアクセスを制限します。

対策7

wp-config.phpのパーミッションを「400」「440」等にして、アクセスを制限します。

対策8

wp-config.phpへのアクセスをhtaccessで制御します。

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

その他

  1. 長期間更新がとまっているプラグインを使用しない
  2. WP本体を定期的にアップグレードする
  3. プラグインを定期的にアップグレードする
  4. 重大な脆弱性が発見された場合は即時対応する
  5. htaccessやiniファイルのアクセス制限、パーミッション等、WPとは別の基本的なセキュリティを確認する
  6. サーバのセキュリティを調整する

まとめ

以上、最低限必要な対策をまとめると以下になります。

ユーザ名にadminを使用しない
すでにadminで登録されている場合は新規で管理アカウントを追加し、admin権限を移行しましょう。

投稿者のアーカイブページは、アクセスできないようにするか、URLを変更する

「ブログ上の表示名」は「ニックネーム」を利用

WPログイン画面へのアクセス制限
wp-login.phpとwp-adminへ、可能であればIP制限、難しければBasic認証をかける

xmlrpc.phpを無効化する

wp-config.phpのパーミッション調整

定期的なメンテナンスを実行し、重大な脆弱性が発見されたら、即時に対応する

なんだかんだでWordPressはとても便利です。Webサイト制作においてとても助かるCMSです。かわいがってお世話をしましょう。

その他、公式サイトでセキュリティ施策が案内されています。
下記を熟読しましょう。

https://wpdocs.osdn.jp/WordPress_の安全性を高める