Photo by Gratisography
WordPressは世界で最も使われいるコンテンツ管理システム(CMS)です。W3Techsによると、WordPressは世界のCMSで59%のシェアを獲得しています。さらに、驚くべきことに、全世界のサイトのうち、25%はWordPressで運営されているという調査報告が出ています。
これだけ世界中で利用されているWordPressは、ハッカーの格好の標的になっており、実際に多くのWordPressサイトが改竄や乗っ取りの被害にあっています。
多くの攻撃は、自動攻撃ツールによって行われます。そのため、最低限のセキュリティ対策を行っておくだけで、ほとんどの攻撃を防ぐことができます。今回は、WordPressのセキュリティを強化するための24の方法を紹介します。
※2017/02/18 タイトルは24の方法になっていますが、1つ追加して25個になりました。
- WordPressのセキュリティを強化する24の方法
- 1. WordPress、プラグイン、テーマは最新に更新しておく
- 2. 不要なテーマ、プラグインは削除する
- 3. ユーザー名にadminを使わない
- 4. 強固なパスワードを使用する
- 5. 不正なIPからのアクセスをプラグインで防ぐ
- 6. ログイン画面に.htaccessでIPアクセス制限を設定する
- 7. ログイン画面に.htaccessでbasic認証アクセス制限を設定する
- 8. 管理画面に.htaccessでIPアクセス制限を設定する
- 9. 管理画面に.htaccessでbasic認証アクセス制限を設定する
- 10. .htaccessファイルのパーミッションを604に設定する
- 11. wp-config.phpのパーミッションを600に設定する
- 12. wp-config.phpのアクセスを制限する
- 13. データベーステーブルのプレフィックスを変更する
- 14. バックアップを取る
- 15. WordPress本体のメジャーバージョンアップの自動アップデートを有効にする
- 16. WordPressプラグインの自動アップデートを有効にする
- 17. WordPressテーマの自動アップデートを有効にする
- 18. wp-config.phpの置き場所を移動する
- 19. WordPressのログイン画面をSSL暗号化(HTTPS)にする
- 20. WordPressのログイン画面、管理画面をSSL暗号化(HTTPS)にする
- 21. ファイル転送にFTPSを強制する
- 22. ファイル転送にSFTPを強制する
- 23. 管理画面からテーマやプラグインが編集できないようにする
- 24. 管理画面からテーマやプラグインの新規インストールができないようにする
- 25. REST APIを無効にする
- おまけ ソースコードからWordPressのバージョン情報を削除する
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」を使う方法もあります。
- 効果: ★★★
- 難易度: ★
4. 強固なパスワードを使用する
これは、どんなログインサービスでも言われていることですが、「英数字、記号を組み合わせた複雑で長いパスワードを使用する」 、「 他のサービスで使用しているパスワードを使用しない 」の2点は必ず守りましょう。
クライアント案件で、クライアント自身がユーザーを追加する場合、プラグイン「Force Strong Passwords」を使うと、強固なパスワードを強制することができます。
- 効果: ★★★
- 難易度: ★
5. 不正なIPからのアクセスをプラグインで防ぐ
プラグイン「Jetpack」の「プロテクト」機能を有効にすると、不正なIPからのアクセスをブロックすることができます。Jetpackを導入している数百万ものWordPressのアクセス情報を活用しているので、かなりの不正IPからのアクセスを防ぐことができます。
- 効果: ★★★
- 難易度: ★
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」が望ましいですが、通常のレンタルサーバーでは動作しなくることが多いです。
- 効果: ★★★
- 難易度: ★★
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');
- 効果: ★(ほとんど無し)
- 難易度: ★★