本記事ではWordPress(以下WP)を利用したサイトのセキュリティ対策について解説しています。
WPはいちどサーバーに設置してしまえば、ブラウザ上で更新ができる便利なCMS(Contents Management System)です。現在も盛んに開発が進められており、オープンソースのソフトウェアとして誰でも無償で利用できます。日本語での情報も豊富で、個人に限らず企業でも採用しているところが多いですが、利用者が多い分脆弱性をついた攻撃が多いことも事実です。
ただ、適切に対策・運用をしていればこうした被害は大多数を防ぐことができるので、過度に恐れる必要はありません。以下、WPのセキュリティ対策について紹介しています。
WPや使用しているプラグインを最新のバージョンに保つ
WP本体やプラグインを古いバージョンのまま使い続けていると、それだけでセキュリティリスクが高くなってしまいます。基本的には常時最新のバージョンに保つことをおすすめします。
WP本体やプラグインの更新通知はWP管理画面(ダッシュボードやプラグイン管理ページなど)に表示されるので、インターネットに接続できる状態であれば管理画面上からアップデートが可能です。WP本体やプラグインは頻繁にアップデートされるため、定期的にチェックするとよいです。
また、不要なプラグインは使用停止にして、サーバーからもプラグインフォルダごと削除することをおすすめします。
WP本体の更新に関する注意事項
WP本体は、初期状態だと最新版が公開されたのち自動的にアップデートがかかります。この機能によりアップデートをし忘れても本体は最新版に保たれますが、以下の点に注意が必要です。
- WP初期テーマを利用していて独自にカスタマイズしてる部分がある場合は、レイアウト崩れや動作しないなどの不具合が起きる可能性がある
- WP初期テーマ以外のテーマを利用している場合は、レイアウト崩れや動作しないなどの不具合が起きる可能性がある
- インストール済みのプラグインが動作しなくなる可能性がある など
同じバージョン内でのアップデートの場合はあまりこうした不具合は起きにくいですが、バージョンが5→6に引き上げられるなどメジャーアップデートの場合はWPそのものが機能追加などで刷新されることがあるため、こうした不具合に遭遇することがあります(とくにあまりにも古いバージョンから最新バージョンに引き上げた場合など)
バージョンアップは管理画面から簡単にできますが、バージョンダウンはサーバーに設置したプログラム自体を入れ替える必要があるため、WP本体の更新は自動任せにせず、自分で(手動で)管理画面から更新することをおすすめします。
手動で更新できるようにするために、WPの自動更新を停止します。自動更新の停止は、wp-config.php
ファイルに以下の記述をします。
注意事項
wp-config.php
ファイルはWPの設定ファイルです。編集する際は事前に必ずバックアップをとってください。
// 以下のコメントアウト記述の間の行に
/* Add any custom values between this line and the "stop editing" line. */
/* That's all, stop editing! Happy publishing. */
// 以下を記述する
define('AUTOMATIC_UPDATER_DISABLED', true); //自動更新を無効にする
これでW本体Pの自動更新が停止されます。最新版プログラムがリリースされた際は、管理画面上部に下記が表示されます。「今すぐ更新してください」のリンクをクリックすると、WP本体の更新画面に遷移します。
注意事項
とくにWP本体のアップデートを行う際は、不具合が起きたときに直前の状態に戻せるよう、事前にDB(データベース)のバックアップを取っておくことをおすすめします。
DBのバックアップ(エクスポート)については、当サイトの以下記事もご参考ください。
管理画面のログインパスワードを強固なものに設定する
管理画面のログインパスワードについて、簡単な英単語や数字、短いものではなく、記号も含んだそれなりに長いランダムな文字列にすることをおすすめします。WPのユーザー作成時にパスワードを自動で生成できる機能があるので、それを使うことも有用です。
管理画面のログインURLを変更する
初期状態でWPの管理画面のログインURLのパスは、/wp-admin/
あるいはwp-login.php
です。サイトがWPで制作されているかどうかの判断は容易なので(サイトのソースコードから判断できます)、管理画面のログインURLにも簡単にアクセスできてしまいます。
これについては、管理画面のログインURLを変更することで対処可能です。ログインURL変更のためのプラグインはいくつかありますが、当サイトでは「Login rebuilder」を利用する方法について紹介しています。
なお、変更後のログインURLはわかりやすいもの(login.php
など)ではなく、推測されにくいもの(ランダムな英数字など)で構成するとよいです。
wp_head()
タグで出力されるバージョンパラメータを削除する
初期状態では、<head></head>
内に下記のmeta
タグや、cssあるいはjsファイルに?ver
からはじまるパラメータが出力されます。現在利用中のWP本体やテーマ・プラグインのバージョン情報などが出力されています。
<!-- 現在利用中のWPのバージョン情報 -->
<meta name="generator" content="WordPress 6.7.1"/>
<!-- 現在利用中のテーマやプラグインのバージョン情報など -->
<link rel='stylesheet' id='twentytwentyfive-style-css' href='https://domain.jp/wp-content/themes/twentytwentyfive/style.css?ver=1.0' media='all'/>
この表記はアップデートなどで該当ファイルに変更があった場合のキャッシュ対策(?
というパラメータをつけることで、ブラウザに新しいファイルとして認識させる方法)として利用されますが、そのバージョンのWP本体やプラグインに脆弱性があった場合、ピンポイントで攻撃されてしまう可能性があります。
このパラメータはテーマファイル内の設定に関するファイルであるfunctions.php
を編集することにより、出力させないようにすることが可能です。
注意事項
この方法はテーマファイル内の設定に関するファイルであるfunctions.php
を編集します。編集する際は事前に必ずバックアップをとってください。
以下をfunctions.php
内に記述します。必要箇所のみ記載しています。
<?php
/* バージョン表記削除 */
//metaタグ
remove_action('wp_head','wp_generator');
//css, jsパラメータ(?ver=~)
function remove_wp_ver_css_js($src) {
if(strpos($src, 'ver='))
$src = remove_query_arg('ver', $src);
return $src;
}
add_filter('style_loader_src', 'remove_wp_ver_css_js', 9999);
add_filter('script_loader_src', 'remove_wp_ver_css_js', 9999);
?>
上記function remove_wp_ver_css_js($src) {}
ではWPとプラグインのバージョン情報が両方とも出力されないようになります。WPのバージョン情報のみ出力しないようにするには、以下のコードを利用します。
<?php
function remove_wp_ver_css_js($src) {
if(strpos($src, 'ver=' .get_bloginfo('version')))
$src = remove_query_arg('ver', $src);
return $src;
}
add_filter('style_loader_src', 'remove_wp_ver_css_js', 9999);
add_filter('script_loader_src', 'remove_wp_ver_css_js', 9999);
?>
通常はどちらも出力しないようにするでよいかと思います。
WordPress REST APIを無効化する
WordPress REST API(以下WP REST APIまたはAPI)はver4.7から実装されたもので、外部からWPを操作するための機能です。このAPIを利用することにより、主に以下の情報を取得できます。
- 登録されているユーザー情報
- 投稿された記事情報
- 登録カテゴリやタグの情報
- アップロードした画像やファイルの情報
例として、WPサイトのアドレスに続けて/wp-json/wp/v2/
と入力しアクセスすると、サニタイズされたJSON形式のデータが返却(表示)されます。これがWP REST APIで提供される情報です(他にも記事単体のデータなどがあります)
補足
文字列を安全な形に変換する処理のことをサニタイズといいます。暗号化ではないので、ソースコード上では通常の文字列として読むことが可能です。
{
"namespace": "wp/v2",
"routes": {
"/wp/v2": {
"namespace": "wp/v2",
"methods": [
"GET"
],
//(以下略)
WP REST APIはエンジニアなど主に開発者向けに提供されている機能です。実装当初には深刻な脆弱性がありましたが、現在はきちんと修正されたものが提供されています。
とはいえ、通常サイトを運用する上ではあまり必要のない機能です(一部のプラグインではこの機能か利用されており、詳細は後述します)
上述のとおりAPIのアクセスはブラウザからでもできてしまうので、ユーザー情報などが見えてしまうというのは心情的にも「ちょっと…」ということもあるかと思います。
WP REST APIもfunctions.php
を編集することにより、出力させないようにすることが可能です。
注意事項
この方法はテーマファイル内の設定に関するファイルであるfunctions.php
を編集します。編集する際は事前に必ずバックアップをとってください。
以下をfunctions.php
内に記述します。必要箇所のみ記載しています。
<?php
//WP REST APIを無効化
function disable_rest_api() {
return new WP_Error('disabled', ['status' => rest_authorization_required_code()]);
}
add_filter('rest_authentication_errors', 'disable_rest_api');
?>
この記述がされた状態でWPサイトのアドレスに続けて/wp-json/wp/v2/
と入力しアクセスすると、以下のデータが返却(表示)されます。
{"code":"disabled","message":{"status":401},"data":null}
ただし、WP REST APIはプラグインで利用されている場合があり、無効化することによりプラグインが利用できないということがあるので注意が必要です。APIを無効化した際は、必ず動作確認を行なってください。
WP REST APIを無効化する際の留意事項
先述のとおり、プラグインではWP REST APIを利用しているものもあり、APIを無効化した際に動作に支障をきたす場合があります。このAPIを利用しているプラグインのひとつに「Contact Form 7」(Ajaxフォーム送信の利用)があります。
特定のプラグインのみWP REST APIを有効化する場合は、以下のコードを利用します。例として「Contact Form 7」でのみ有効化しています。
<?php
//WP REST APIを無効化(特定のプラグインでは有効化)
function disable_rest_api_ex($result, $wp_rest_server, $request) {
$namespaces = $request->get_route();
//有効化するプラグイン(のディレクトリ名)を記載)
if(strpos($namespaces, 'contact-form-7/') === 1 ) {
return $result;
}
return new WP_Error('rest_disabled', ['status' => rest_authorization_required_code()]);
}
add_filter('rest_pre_dispatch', 'disable_rest_api_ex', 10, 3);
?>
複数のプラグインを有効化する場合は、if(~) { return $result; }
の部分をコピペしてください。
補足
WP REST APIの機能などについては、以下サイトにわかりやすくまとめられているのでご参考ください。
また、「Contact Form 7」でのWP REST APIの利用については以下の公式FAQもご確認ください。
サイトを常時SSL化する
WPなどプログラムを動かしているかどうかにかかわらず、基本的にWebサイトは常時SSL化しておくことをおすすめします。
常時SSL化することにより、ログインフォームなど通信の際に送信内容が暗号化されるため、外部から内容が読み取られにくくなります。
補足
昨今ではブラウザ側の機能でhttp
でのアクセスをhttps
に転送する(https
に対応していないサイトは表示されない)機能が提供されているので、インターネット上に公開するサイトは基本的にSSL対応しておくとよいです。
この機能は中間者攻撃を防止するための技術で、HSTS(Hypertext Strict Transport Security)と呼ばれています。
(この機能はブラウザの設定において無効にすることも可能です)
定期的にバックアップをとっておく
WPはいちどサーバーに設置してしまえば、あとは基本的にブラウザ上で管理ができます。便利な反面、なんらかの要因でサイトやサーバーそのものに不具合が発生した場合、データがすべてなくなってしまうということも起こりえます(たとえば間違えてWPのDBを消去してしまったなど…)
脆弱性をつかれることによる被害などに関係なく、万が一の事態に備えて、サイトのデータは定期的にバックアップをとっておくとよいです。
サーバーが提供しているバックアップ機能を利用する
サーバーによっては、バックアップ機能を提供しているところもあります。
プラグインを利用してバックアップをとる
バックアップをとってくれるWPプラグインもあり、代表的なものに「BackWPup」というものがあります。無償版と有償版があり、基本的な機能は同じですが、有償版の方は管理画面から簡単にバックアップデータの復元が可能です。
- BackWPup - WordPress Backup & Restore Plugin - WordPress プラグイン | WordPress.org 日本語
- BackWPup Pro - The perfect WordPress Backup Plugin!
バックアップ先は同じサーバーのディレクトリを指定するほか、メールや他のサーバーにおくことも可能です。同じサーバーにバックアップデータを取る場合は、定期的にバックアップデータをPC上にダウンロードしておくことをおすすめします。
自分でバックアップを取る
サーバーが提供しているバックアップ機能やプラグインを使わず、自分でバックアップを取る場合は、以下の作業を行います。
- WPのDBをエクスポートする(当サイトの記事をご参考ください)
- サーバー内のWPディレクトリ一式をFTPなどでPC上にダウンロードする
.htaccess
ファイルはhtaccess.txt
などテキスト形式にリネームする- WP管理画面でアップロードした画像などファイルの格納場所は
/wp-content/uploads
- テーマファイルの格納場所は
/wp-content/themes
サイトを放置しない
ひとたびセキュリティが破られてしまうと、フィッシングサイトへの誘導など運営側だけでなくサイトの訪問者にも被害が及んでしまう可能性が高いです(どれだけ対策していても、絶対ということはありません)
個人が運営するサイトの場合はとくに、事情もさまざまあり継続して運用することが難しい面もあるかとは思いますが、多少でも自身のサイトを気にかけておくことで、更新ができない間でも異変があった場合に気づく可能性が高くなり、早めに手を打つことができます。
個人が趣味で運用する場合はそこまでガチガチの対策を徹底的にする必要もないですが、サイトをつくったらそこで終わるのではなく、メンテナンスに関しても可能な限り最低限バージョンアップだけでも行うようにしておくとよいかと思います。
本記事の解説は以上です。