多くの人が使っている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>
その他
- 長期間更新がとまっているプラグインを使用しない
- WP本体を定期的にアップグレードする
- プラグインを定期的にアップグレードする
- 重大な脆弱性が発見された場合は即時対応する
- htaccessやiniファイルのアクセス制限、パーミッション等、WPとは別の基本的なセキュリティを確認する
- サーバのセキュリティを調整する
まとめ
以上、最低限必要な対策をまとめると以下になります。
ユーザ名に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_の安全性を高める
Web業界のお仕事ナビ