WordPressを導入した際、やった方が良い対策

2021年12月17日

手軽にサイトを構築でき、投稿もできるということで「WordPress」というCMSを利用する方が非常に増えているように思います。ただ、Wordpressは便利である反面、ある程度考慮しないと攻撃の標的になる可能性があります。この記事ではそのあたりについて記載してみようと思います。

経験談

以前、Wordpressを利用しており実際に攻撃を受けてしまった方からの相談を頂いたことがあります。そのサイトは管理者自身が更新をおろそかにしていたということもあり、気づいた時には既に別サイトに完全に作り替えられてしまっていました。管理者の方は親切な方より「海外のハッカーサイトに掲載されている」と連絡を受けはじめて気づいたとのことです。この方の場合は、サイトのバックアップ自体が残っていたのでそこから復元することで復旧しました。ですが、数日後再度改ざんの形跡が現れました。最終的にこの方の場合は、管理をあきらめサイトを手放すことを選択しました。

あくまで経験上ですが、サイトの改ざんはある日突然というわけではなく事前に兆候があります。まず最初にサイトに対して機械的にアクセスをかけて標的を探しているように見受けられます。窃盗などと考え方は同じだと思いますが、まずはやりやすいサイトを探しているのではないかと思います。そしてある程度ターゲットを絞ったとことで、改ざんを試みているように思います。
改ざんの具体的な方法は私もわかりません。ただ、改ざんは少しずつ下準備をしているようです。「セキュリティホール」または「ログインパスワードを破る」を行い、なんらかの方法でサーバ上に改ざん用のスクリプトファイルを設置することから始まります。あとはそのスクリプトファイルを通して少しずつ情報取得・改ざんが始まっていきます。

狙われやすいサイトの傾向

よく攻撃を受けるサイトの傾向としては次の2点があると思います。
(1)サイトがあまり更新されていない
(2)セキュリティ対策をしている節がない(デフォルトのまま利用している)

(1)については更新されていない = 放置されている。つまり、改ざんが進んでいても管理者が気づくことがない。なので標的にしやすいということがあるのだと思います。(2)については意識が薄い管理者ということは、セキュリティパッチも当てていないだろうし、ID・パスワードも単純である可能性がある。つまり狙いやすいということですね。至って当たり前のことです。

WordPressとしてやっておいた方がいい対策

ここからが本題です。Wordpressのセキュリティ対策として何をすれば良いのか、漠然とわからないと思います。いくつか優先順に上げてみますので参考にしてみてください。

1. 本体およびプラグインの更新

WordPress本体やプラグインは定期的にパッチが提供されます。この中にはセキュリティに関するパッチも含まれています。Wordpressの管理画面にログインすると通知が来ていますので定期的に更新するようにしましょう。ただし、更新によってサイトが動作しなくなる可能性もありますので事前にバックアップはとりましょうね。

2. パスワードは簡易的なものではなく強いパスワードに

WordPressの管理画面にログインするためのパスワードは出来るだけ強いものにしましょう。後述しますが何も対策を考えていない場合、IDは丸見えです。誰でも確認することができます。簡単なものや推測できるようなパスワードは破られる可能性がありますので、推測できないようなランダムな文字列が好ましいです。

3. ログイン画面にセキュリティをかけましょう

WordPressのログイン画面に他者がアクセスできないようにセキュリティをかけることも有効です。
例えば、アクセスする拠点に固定IPアドレスがある場合には、IPアドレスにて制限をかけることが一番強いです。アクセス制限はサーバ上にある「.htaccess」にて可能です。※利用しているサーバ会社やミドルウェアによって異なります。
参考例ですが、次のような記述方法になります。

<FilesMatch "wp-login.php|wp-admin">
  Order deny allow
  Deny from all
  Allow from xxx.xxx.xxx.xxx
</FilesMatch>

IPアドレスが特定できない場合、次のような対策も考えられます。
(A) BASIC認証をかける
(B) 日本国外からのIPアドレスを拒否する

「(A) BASIC認証をかける」は、サイトにアクセスする際にBASIC認証という方法でID・パスワードをかけるという方法です。ID・パスワードが2重になってしまう形にはなりますが、機械的に攻撃している側としてはアクセスできない形になるため、多少効果はあるかと思います。
BASIC認証は「.htaccess」および「.htpasswd」の2つのファイルを利用して設定します。「.htpasswd」にはID・パスワードより生成した文字列を設定します。「https://www.luft.co.jp/cgi/htpasswd.php」のサイトなどで生成すると良いと思います。
「.htaccess」への記述方法は次のようになります。

<FilesMatch "wp-login.php|wp-admin">
AuthType Basic
AuthUserFile [パス]/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
require valid-user
</FilesMatch>

「(B) 日本国外からのIPアドレスを拒否する」も有効な方法かと思います。大抵の場合、攻撃は海外のサーバを経由して攻撃してくるためそもそも海外からのアクセスを弾いてしまえば、攻撃のリスクはかなり減ります。レンタルサーバなどに海外アクセスを遮断する仕組みがあるケースもあるのでそれを利用するのも手だと思います。
当サイトでは、「(B) 日本国外からのIPアドレスを拒否する」のためのプラグインを公開しています。利用条件にあうようでしたらお試しください。
日本以外のIPアドレスからのログインをガードするWordPressプラグイン

4. 各種Wordpressの設定やアクセス制限をかける

ここまでの対策を行なった上で、次のようなWordpressの設定変更やアクセス制限をかけることも有効な手段かと思います。いくつかピックアップしていますのでご参照ください。

ログインユーザ名の特定を防ぐ(1)

WordPressの管理画面において、ユーザ画面より「ニックネーム」を登録し、「ブログ上の表示名」をニックネームに変更します。

ログインユーザ名の特定を防ぐ(2)

「サイトのURL/?author=1」などでアクセスすると存在するログインユーザがわかるので対策します。
Wordpressのテーマフォルダ内にあるfunction.phpに次を追記します。

function redirect_author_archive(){
     if(is_author()) {
          wp_redirect(home_url());
          exit;
     }
}
add_action( 'template_redirect', 'redirect_author_archive');

ログインユーザ名の特定を防ぐ(3)

REST API(サイトURL/wp-json/wp/v2/users)でユーザ名が確認できるケースがあるので対策を行います。
Wordpressのテーマフォルダ内にあるfunction.phpに次を追記します。

function filter_reset_endpoints($endpoints) {
     if( isset($endpoints['/wp/v2/users'])) {
          unset($endpoints['wp/v2/users']);
     }
     if( isset( $endpoints['/wp/v2/users/(?P[\d]+)'])) {
          unset($endpoints['/wp/v2/users/(?P[\d]+)']);
     }
     return $endpoints;
}
add_filter('reset_endpoints', 'filtr_reset_endpoints', 10, 1);

XML-RPCを無効化する

XML-RPC(xmlrpc.php)は外部操作するための仕組みをもつファイルです。Dos攻撃やブルートフォースアタックの標的となりやすいので無効化します。
ただし、サイトで利用している場合は一律無効化というわけには行かないです。
「.htaccess」にて無効化します。記述方法は次のようになります。

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

その他

優先度が高くないですがやった方がいい対策を列挙します。
・不要なプラグインの削除
・不要なテーマの削除
・Wordpressのバージョン情報などの不要なヘッダー情報を削除する(function.php)
・wp-config.phpのアクセス権を変更する(外部からアクセスできない権限に変える。.htaccessよりアクセス拒否の設定をいれる)
・wp-config.php に認証ユニークキーを設定する。
・wp-include へのアクセスを禁止する(.htaccess)
・アップロードフォルダにてスクリプトファイルが実行できないように制限をかける(.htaccess)