【保存版】WordPressのセキュリティを強化する24の方法

【保存版】WordPressのセキュリティを強化する24の方法
Photo by Gratisography

WordPressは世界で最も使われいるコンテンツ管理システム(CMS)です。W3Techsによると、WordPressは世界のCMSで59%のシェアを獲得しています。さらに、驚くべきことに、全世界のサイトのうち、25%はWordPressで運営されているという調査報告が出ています。

WordPressが世界で使われている数

これだけ世界中で利用されているWordPressは、ハッカーの格好の標的になっており、実際に多くのWordPressサイトが改竄や乗っ取りの被害にあっています。

多くの攻撃は、自動攻撃ツールによって行われます。そのため、最低限のセキュリティ対策を行っておくだけで、ほとんどの攻撃を防ぐことができます。今回は、WordPressのセキュリティを強化するための24の方法を紹介します。

※2017/02/18 タイトルは24の方法になっていますが、1つ追加して25個になりました。

目次

WordPressのセキュリティを強化する24の方法

WordPressのセキュリティを高めるポイントは、「最新版を利用し脆弱性を少なくする」、「ログイン画面、管理画面を守る」、「wp-config.phpファイルを守る」の3つです。

WordPressを狙った攻撃で最も多いのが、古いバージョンのWordPressやプラグインの脆弱性を狙う手法です。ログイン画面、管理画面への不正アクセスをいかに防ぐかも大切なポイントです。さらに、wp-config.phpには、WordPressのセキュリティーキーや、データベースのアクセス情報が記載されているので、必ず守らなければいけません。

1. WordPress、プラグイン、テーマは最新に更新しておく

WordPress本体、プラグイン、テーマは常に最新版を利用するようにしましょう。特に、WordPress本体、プラグインはセキュリティ関連の更新も多いです。更新版がリリースされると、ハッカーにもその脆弱性が知れ渡ってしまいます。できるだけ早く、最新版に更新するようにしましょう。

また、プラグインやテーマはできるだけWordPress公式サイトで配布されているものを利用しましょう。一般的に、公式サイトで配布されているものの方が脆弱性が少ないです。

  • 効果: ★★★
  • 難易度: ★

2. 不要なテーマ、プラグインは削除する

更新されていない古いテーマやプラグインは、脆弱性が放置されていることがあります。利用していないテーマやプラグインは削除してしまいましょう。

  • 効果: ★★★
  • 難易度: ★

3. ユーザー名にadminを使わない

デフォルトのユーザー名、adminをそのまま使うのは避けましょう。ユーザー名にadminを使用していると仮定して、管理画面に攻撃をしかけることが多いです。既にadminを使用している場合は、新しいユーザー名を作成し、adminを削除しましょう。adminを削除する際に、既存の記事は新しいユーザーに紐付けることができます。間違って、adminの記事を削除しないように注意してください。adminを削除せず、権限を「購読者」に変更するだけでも大丈夫です。

ユーザー名を変更できるプラグイン「Admin renamer extended」を使う方法もあります。

Admin renamer extended

  • 効果: ★★★
  • 難易度: ★

4. 強固なパスワードを使用する

これは、どんなログインサービスでも言われていることですが、「英数字、記号を組み合わせた複雑で長いパスワードを使用する」 、「 他のサービスで使用しているパスワードを使用しない 」の2点は必ず守りましょう。

クライアント案件で、クライアント自身がユーザーを追加する場合、プラグイン「Force Strong Passwords」を使うと、強固なパスワードを強制することができます。

Force Strong Passwords

  • 効果: ★★★
  • 難易度: ★

5. 不正なIPからのアクセスをプラグインで防ぐ

プラグイン「Jetpack」の「プロテクト」機能を有効にすると、不正なIPからのアクセスをブロックすることができます。Jetpackを導入している数百万ものWordPressのアクセス情報を活用しているので、かなりの不正IPからのアクセスを防ぐことができます。

Jetpack

  • 効果: ★★★
  • 難易度: ★

6. ログイン画面に.htaccessでIPアクセス制限を設定する

会社など、固定IPのある環境からログイン画面にアクセスする場合は、.htaccessでIPアクセス制限を設定します。

wp-login.phpと同じ階層に以下の内容を記述した.htaccessファイルを設置します。xxx.xxx.xxx.xxxの部分には固定IPを記述します。

<Files wp-login.php>
  Order deny,allow
  Deny from all
  Allow from xxx.xxx.xxx.xxx
</Files>
  • 効果: ★★★
  • 難易度: ★★

7. ログイン画面に.htaccessでbasic認証アクセス制限を設定する

固定IPによる制限が難しい場合には、ログイン画面にbasic認証によるアクセス制限を設定します。

wp-login.phpと同じ階層に以下の内容を記述した.htaccessファイルを設置します。

<Files wp-login.php>
  AuthUserFile /path/to/.htpasswd
  AuthName "Private access"
  AuthType Basic
  require valid-user
</Files>

/path/to/の部分に、ユーザー名とパスワードを記述する.htpasswdファイルのサーバーパスを記述します。

.htpasswdファイルには以下のように記述します。

username:password

左側の「username」の部分がユーザー名、「password」の部分がパスワードです。「password」はパスワードそのままではなく、暗号化したものを記述します。

.htaccess ファイルを簡単作成「.htaccess Editor」にアクセスして、「ベーシック認証 (B)」メニューに進みます。ユーザー名とパスワードを入力。「.htpasswdを作成」ボタンを押して、.htpasswdに表示された内容をコピペします。

ベーシック認証

  • 効果: ★★★
  • 難易度: ★★

8. 管理画面に.htaccessでIPアクセス制限を設定する

会社など、固定IPのある環境から管理画面にアクセスする場合は、.htaccessでIPアクセス制限を設定します。

/wp-admin/直下に以下の内容を記述した.htaccessファイルを設置します。xxx.xxx.xxx.xxxの部分には固定IPを記述します。

Order deny,allow
Deny from all
Allow from xxx.xxx.xxx.xxx

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

プラグインによっては/wp-admin/にあるadmin-ajax.pjpを使用することがあるので、admin-ajax.phpへのアクセスは許可しておきます。

  • 効果: ★★★
  • 難易度: ★★

9. 管理画面に.htaccessでbasic認証アクセス制限を設定する

固定IPによる制限が難しい場合には、管理画面にbasic認証によるアクセス制限を設定します。

/wp-admin/直下に以下の内容を記述した.htaccessファイルを設置します。

AuthUserFile /path/to/.htpasswd
AuthName "Private access"
AuthType Basic
require valid-user

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

プラグインによっては/wp-admin/にあるadmin-ajax.pjpを使用することがあるので、admin-ajax.phpへのアクセスは許可しておきます。

/path/to/の部分に、ユーザー名とパスワードを記述する.htpasswdファイルのサーバーパスを記述します。

10. .htaccessファイルのパーミッションを604に設定する

サーバー環境によっても異なりますが、一般的なサーバーで安定して動作し、セキュリティも確保するためには、.htaccessファイルのパーミッションを「604」に設定します。本来は「600」が望ましいですが、通常のレンタルサーバーでは動作しなくることが多いです。

パーミッション 604

  • 効果: ★★★
  • 難易度: ★★

11. wp-config.phpのパーミッションを600に設定する

wp-config.phpはWordPressのセキュリティーキーやデータベースのアクセス情報が書かれている、最も大切なファイルです。パーミッションを変更し、外部からアクセスできないようにする必要があります。サーバー環境によっても異なりますが、一般的なサーバーで安定して動作し、セキュリティも確保するためには、wp-config.phpファイルのパーミッションを「600」に設定します。本来は「400」が望ましいですが、通常のレンタルサーバーでは動作しなくることが多いです。

ファイルのパーミッション

  • 効果: ★★★
  • 難易度: ★★

12. wp-config.phpのアクセスを制限する

さらに、wp-config.phpと同じ階層に.htaccessファイルを設置し、アクセスを制限ます。

<files wp-config.php>
  Order allow,deny
  Deny from all
</files>
  • 効果: ★★★
  • 難易度: ★★

13. データベーステーブルのプレフィックスを変更する

WordPressをインストールする際に、「テーブル接頭辞」という部分に表示される部分がデータベーステーブルのプリフィックスになります。そのままインストールしてしまうと、デフォルトで、「wp_」となってしまいます。SQLインジェクションなどの攻撃により、データを直接が改竄、削除されてしまうリスクがあります。インストール時に、「wps_」など、任意のプリフィックスに変更しましょう。ちなみに、インストール後にプリフィックスを変更するためには、データベースを直接操作する必要があるので、分かる人に相談しましょう。

データベーステーブルのプレフィックス

  • 効果: ★★★
  • 難易度: ★(運用中のプリフィックス変更にはデータベース操作の知識が必要)

14. バックアップを取る

バックアップは、万が一攻撃を受けてしまった後の救済措置になります。必ずバックアップを取っておきましょう。

参考

  • 効果: ★★
  • 難易度: ★★

15. WordPress本体のメジャーバージョンアップの自動アップデートを有効にする

WordPress3.7以降のバージョンでは、細かなバージョンアップは自動でアップデートされるようになりました。しかし、メジャーバージョンアップは手動で適用する必要があります。メジャーバージョンアップも自動で適用するには、以下の記述をwp-config.phpに追記します。

define('WP_AUTO_UPDATE_CORE', true);
  • 効果: ★★(メジャーバージョンアップが勝手に適用されてしまうので、通常は使わないほうがいい。)
  • 難易度: ★★

16. WordPressプラグインの自動アップデートを有効にする

WordPressプラグインの自動アップデートを有効にすることができます。以下の記述をwp-config.phpに追記します。

add_filter( 'auto_update_plugin', '__return_true' );
  • 効果: ★★
  • 難易度: ★★

17. WordPressテーマの自動アップデートを有効にする

WordPressテーマの自動アップデートを有効にすることができます。以下の記述をwp-config.phpに追記します。テーマを直接編集して使用している場合、テーマをアップデートすると編集内容が上書きされてしまうので、注意してください。

add_filter( 'auto_update_theme', '__return_true' );
  • 効果: ★★
  • 難易度: ★★

18. wp-config.phpの置き場所を移動する

wp-config.phpの置き場所を変更するという記事を見かけますが、これは、効果があるという意見と、ほとんど効果がないという意見が分かれています。とりあえず、移動しておいて損はないと思うので、移動しましょう。

ひとつ上の階層に移動するだけなら簡単で、通常は、wp-config.phpファイルをそのままひとつ上の階層に移動するだけで、動作します。他のファイルの設定を変更する必要もありません。

別のフォルダに移動する場合は、元の場所に新しいwp-config.phpファイルを作成し、以下の内容を記述します。/path/to/wp-config.phpに、元のwp-config.phpまでのパスを記述します。

<?php
  define'ABSPATH', dirname__FILE__ ;
  require_onceABSPATH '/path/to/wp-config.php';
  • 効果: ★★(効果がある、ないで意見が分かれている)
  • 難易度: ★★

19. WordPressのログイン画面をSSL暗号化(HTTPS)にする

通信を傍受された場合、通常のHTTP通信では、ログインIDやパスワードが筒抜けになってしまいます。

WordPressログインをSSL化するには、サーバーにSSL証明書を設定した後、wp-config.phpに以下を追記します。

define('FORCE_SSL_LOGIN', true);

 

  • 効果: ★★(通信が傍受されたときに安心)
  • 難易度: ★★★(サーバーへのSSL導入が必要)

20. WordPressのログイン画面、管理画面をSSL暗号化(HTTPS)にする

同様に、管理画面をSSL化するには、wp-config.phpに以下を追記します。

define('FORCE_SSL_ADMIN', true);
  • 効果: ★★(通信が傍受されたときに安心)
  • 難易度: ★★★(サーバーへのSSL導入が必要)

21. ファイル転送にFTPSを強制する

サーバーでFTPSが使える場合、ファイル転送にFTPSを強制してセキュリティを高めることができます。

wp-config.phpに以下を追記します。

define('FTP_SSL', true);
  • 効果: ★★(通信が傍受されたときに安心)
  • 難易度: ★★(サーバーが対応している必要がある)

22. ファイル転送にSFTPを強制する

サーバーでSFTPが使える場合、ファイル転送にSFTPを強制してセキュリティを高めることができます。

wp-config.phpに以下を追記します。

define('FS_METHOD', 'ssh2');
  • 効果: ★★(通信が傍受されたときに安心)
  • 難易度: ★★(サーバーが対応している必要がある)

23. 管理画面からテーマやプラグインが編集できないようにする

wp-config.phpに以下の記述を追記することで、管理画面上でテーマやプラグインの編集をできないようにすることができます。ただし、管理画面に入られた時点で、記事の削除などができてしまうので、あまり意味はありません。クライアントに勝手に操作させたくない場合には有効です。

define('DISALLOW_FILE_EDIT', TRUE);
  • 効果: ★
  • 難易度: ★★

24. 管理画面からテーマやプラグインの新規インストールができないようにする

wp-config.phpに以下の記述を追記することで、管理画面からのテーマやプラグインの新規インストールを禁止することができます。ただし、管理画面に入られた時点で、記事の削除などができてしまうので、あまり意味はありません。また、プラグインの更新をする際には、毎回、この記述を無効にする必要があるので、運用がかなり面倒になります。クライアントに勝手に操作させたくない場合には有効です。

define('DISALLOW_FILE_MODS', TRUE);
  • 効果: ★
  • 難易度: ★★

25. REST APIを無効にする

2017年にREST APIの脆弱性を狙った改ざん被害が発生しています。WordPressのバージョンアップで脆弱性は修正されましたが、今後のリスクを抑えるためにも、REST APIを利用していない場合は、無効にしておくことをおすすめします。REST APIを無効にするためには、以下のコードをfunctions.phpに追加します。プラグインによってはREST APIの機能を利用しているものもあるので、動作がおかしくなる場合は元に戻しましょう。

function my_limit_rest_init() {
 // Remove the REST API endpoint.
 remove_action( 'rest_api_init', 'create_initial_rest_routes', 99);
}
add_action( 'init', 'my_limit_rest_init', 9999 );

参考: WordPress4.7より追加されたREST API エンドポイントを無効にする | サイトスパイラル(Sitespiral) – 沖縄で ホームページ制作 / WordPressのことなら

  • 効果: ★★
  • 難易度: ★

おまけ ソースコードからWordPressのバージョン情報を削除する

よくWordPressのセキュリティ記事で、metaタグに表示されるバージョン情報<meta name="generator" content="WordPress 4.x.x"/>を削除しましょう、という記事を見かけますが、バージョン情報を消してもほとんど意味が無いので、これは気にしなくて大丈夫です。このmetaタグを消してもバージョン情報はRSSやCSSなど、あらゆる場所から判明します。

そもそも、バージョン情報を表示することに問題があるなら、とっくにWordPress本体が表示しないように仕様を変更していると考えられます。大切なのは、WordPressを常に最新に更新しておくことです。

バージョン情報のmetaタグを削除する場合は、functions.phpに以下を追記します。

remove_action('wp_head', 'wp_generator');
  • 効果: ★(ほとんど無し)
  • 難易度: ★★