WordPressはブログツールやウェブサイトのCMSとして広く使われている一方、セキュリティ対策がなされていないと、サイトの書き換えや乗っ取り、悪意のあるプログラムの踏み台にされるなどの被害にあう可能性があります。WordPress自体の脆弱性は随時アップデートされ修正されていますが、構築時にひと手間かけて管理画面のURLをデフォルトから変更することでWordPressの安全性をさらに高めることができます。本サイト構築時に行った設定を例に管理画面をデフォルトの位置から移動する方法について紹介します。
目次
セキュリティを意識したWordpress構築
WordPressのリスク
世界中にユーザーを持ち豊富なテーマとプラグインが用意されているWordPressは、導入やカスタマイズの容易さもあいまって世界中でウェブサイトのCMSやブログツールとして使用されています。しかし、広く使われているツールだからこそ、悪意を持ったクラッカーに狙われやすいと面もあり、過去に企業のサイトが改ざんされるなどの事件も起きています。
「wp-admin」「wp-include」を移動して管理画面を分離する
デフォルトのまま構築したWordPressでは、サイトのトップページURLからログイン画面、管理画面領域、コアファイル領域のパスが容易に推測可能です。WordPress構築時に管理領域の「wp-admin」ディレクトリとコアファイルのある「wp-include」ディレクトリのふたつを初期設定から変更することで、これらの位置を隠ぺいすることができます。WordPressへのよくある攻撃のひとつにIDパスワードの総当たり攻撃がありますが、ログイン画面を隠ぺいすることで、そうした攻撃からの安全性を高めることを狙っています。今回は管理領域の位置をより推測しづらくするために管理画面をサブドメインに移動する例を紹介します(なお、同一ドメインでディレクトリを変更するだけでも隠ぺいの効果は十分あります)。
【デフォルトのディレクトリ構成と変更後の構成(例)】
公開されるウェブサイトのトップページ(公開領域)
https://marketing-hack.com
↓
https:// marketing-hack.com(変更なし)
ログイン画面
https:// marketing-hack.com/wp_login.php
↓
https:// wp-admin.marketing-hack.com/wp_login.php
管理画面領域
https:// marketing-hack.com/wp-admin/
↓
https:// wp-admin.marketing-hack.com/wp-admin/
コアファイル領域
https:// marketing-hack.com/wp-include/
↓
https:// wp-admin.marketing-hack.com/wp-include/
ただし、今回紹介する方法ですべての攻撃から守ることができるわけではありません。より広範な安全性対策をするためには、WordPress Codexの「WordPressの安全性を高める」が参考になります。
WordPressインストール
まず初めにWrodPressをインストールします。公開領域と管理画面領域をそれぞれどのようなサブドメイン/サブディレクトリに分けるかを事前に考える以外は、通常のWordPressインストールと手順は同じです。すでに構築済みの場合は当然このインストールのステップは不要です。
- インストールドメインの決定
- サーバーサイドの設定
- DB設定
- WrodPressのインストール
インストールドメインの決定
公開サイトと管理画面やWordPressのコアファイルを置くドメインを決めます。
ドメイン・サーバーの設定
公開サイトとは別のサブドメインに管理画面を設置する場合は、公開領域と管理画面領域それぞれのドメインとサーバーの準備を行います。なお、可能ならSSL(https)を使えるようにしましょう。最近では安価なレンタルサーバーでも無料でSSLが利用できるはずです。SSLで管理画面にアクセスすることで、インターネット上の通信から管理画面のURLやパスワードが盗まれるリスクを減らすことができます。
データベース(DB)設定
WordPressで使用するDBの設定をサーバー側で行います。WrodPressインストール時にDBのユーザー名、パスワードが必要になりますので控えておきましょう。
WordPressのインストール
WordPressをインストールします。インストールは管理画面を設置することにしたドメインで行います。インストール時にDBのprefixを指定することができますが、その際デフォルトの「wp_」から変更したほうが安全性が高まります。
公開サイト側の設定
WordPressをインストールしたら一度管理画面にログインを行い、正常に動くか確認しましょう。正常にインストールされていることが確認できたら、公開サイト側に必要最低限のファイルを移します。
「index.php」のコピー
WordPressをインストールしたディレクトリにある「index.php」を公開領域側にコピーします。 (「.htaccess」がある場合は、これもコピーします。)
「wp-content」の移動
WordPressをインストールしたディレクトリにある「wp-content」ディレクトリをまるごと公開領域側に移動します。ディレクトリ名を変更することも可能です。今回はドメイン直下に「/wp-content-2/」として移動したケースで解説します。
アップロードディレクトリの作成
WordPressでアップロードする画像などの保存先となるディレクトリを公開領域側に作成します。公開領域内からアクセスできる場所であれば好きな場所に好きな名前で置くことができます。ディレクトリを作成したら、「/wp-content/」ディレクトリのパーミションと同じものを設定します。今回は「/wp-content-2/image」としたケースで解説します。
管理画面分離のための設定変更
「index.php」の修正
公開画面側にコピーしたindex.phpの設定を下記のように変更します。
- 「WP_HOME」「WP_SITEURL」の定義追加
- 「wp-blog-header.php」までのパス修正
「WP_SITEURL」「WP_HOME」の定義追加
管理画面と公開画面のURLをそれぞれ下記のように定義します。
define('WP_SITEURL', '管理画面URL');
define('WP_HOME', '公開画面URL');
「wp-blog-header.php」までのパス修正
次にWordPressをインストールした管理領域直下にある「wp-blog-header.php」までのパスが正しくなるよう変更します。相対パスを使用すると管理画面上でテーマの修正ができないなどの不具合が出るので必ずルートからの絶対パスで記述します。パスはサーバーにより異なりますので、確認してその値を用います。この記述は、 「WP_SITEURL」「WP_HOME」の後になるようにします。
//変更前
require( dirname( __FILE__ ) . '/wp-blog-header.php' );
//変更後:
require( '/home/wp-admin.marketing-hack.com/public_html/wp-blog-header.php' );
上記のように変更すると「index.php」はのソース次のようになります。 (コメント部分は除外しています)
<?php
define('WP_USE_THEMES', true);
define('WP_SITEURL', 'https://wp-admin.marketing-hack.com');
define('WP_HOME', 'https://marketing-hack.com');
require('/home/wp-admin.marketing-hack.com/public_html/wp-blog-header.php');
「wp-config.php」の修正
WordPressをインストールしたディレクトリの直下にある「wp-config.php」の修正をします。以下は、「/* 編集が必要なのはここまでです ! WordPress でブログをお楽しみください。 */」の直前に記述します。
「index.php」と同様に管理画面と公開画面のURLをそれぞれ下記のように定義します。
//define('WP_SITEURL','管理画面URL');
define('WP_SITEURL', 'https://wp-admin.marketing-hack.com');
//define('WP_HOME', '公開画面URL');
define('WP_HOME', 'https://marketing-hack.com');
公開側に移動した「/wp-content/」へのパスを追記します。
define( 'WP_CONTENT_DIR', '/home/marketing-hack.com/public_html/wp-content-2' );
define( 'WP_CONTENT_URL', 'https://marketing-hack.com/wp-content-2');
「/wp-contn/」ディレクトリにあるプラグインディレクトリの位置や名前をデフォルトから変更した場合は、上記と併せて次のように追記します。(変更がない場合は不要です)
define( 'WP_PLUGIN_DIR', '/home/marketing-hack.com/public_html/plugins-2' );
define( 'WP_PLUGIN_URL', 'https://marketing-hack.com/plugins-2');
アップロードディレクトリの指定
隠しオプション設定画面で公開ドメイン側に作成したアップロードディレクトまでのパスを設定します。管理画面の左メニュー「設定>一般」をひらき、URLから「-general」を削りページを開く方法が簡単です。
https:// wp-admin.marketing-hack.com/wp-admin/options-general.php
↓
https:// wp-admin.marketing-hack.com/wp-admin/options.php
このページで「upload_path」「upload_url_path」の項目を探し、それぞれ次のように設定します。
upload_path:ルートからアップロードディレクトまでのパス例
/home/marketing-hack.com/public_html/wp-content-2/image
upload_url_path:アップロードディレクトリのURL
https://marketing-hack.com/wp-content-2/images
「function.php」の修正
多くのテーマでは管理領域にある「/wp-includes/」ディレクトリ内にあるjsファイルなどをヘッダー、フッターで読み込んでしまうため、せっかく変更した管理領域のURLが外からまるわかりになってしまいます。そこでテーマファイルの「function.php」を下記のように修正します。なお、自作テーマの場合は下記を追記するだけでOKですが、配布されているテーマを使用している場合はテーマの更新時に変更した設定が消えてしまわないように「子テーマ」を作成してから修正することをおすすめします。
- 投稿記事のプレビューURL変更
- 不要なheaderの削除
- jQueryのCDN化
<?php
// プレビューのリンクの修正
// 投稿記事のプレビューが正しく表示されるように公開URLと管理領域URLを設定します。
function replace_preview_post_link ( $url ) {
//$replace_url = str_replace('公開URL', '管理領域URL', $url);
$replace_url = str_replace('https://marketing-hack.com', 'https://wp-admin.marketing-hack.com', $url);
return $replace_url;
}
add_filter('preview_post_link', 'replace_preview_post_link');
// 不要なheader削除
// ヘッダー内でデフォルトで読み込まれている不要なコードを削除します。
remove_action('wp_head', 'feed_links_extra', 3);
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'wp_shortlink_wp_head', 10, 0);
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('admin_print_scripts', 'print_emoji_detection_script');
remove_action('wp_print_styles', 'print_emoji_styles' );
remove_action('admin_print_styles', 'print_emoji_styles');
remove_action('wp_head', 'rest_output_link_wp_head');
remove_action('wp_head', 'wp_oembed_add_discovery_links');
remove_action('wp_head', 'wp_oembed_add_host_js');
// jqueryのCDN化
// ヘッダー内で読み込まれるjqueryを「wp-include」内のものからCDNで配布されているものに変更する
function add_files() {
wp_deregister_script('jquery');
wp_deregister_script('jquery-migrate');
wp_enqueue_script( 'jquery', '//ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js', "", NULL, false );
wp_enqueue_script( 'jquery-migrate', '//code.jquery.com/jquery-migrate-1.4.1.min.js', array( 'jquery' ), NULL , false);
}
add_action('wp_enqueue_scripts', 'add_files');
不要なheader削除の記述の詳細についてはは下記サイトが参考になります。
WordPressの関数「wp_head」の出力内容をアクションフックで制御する
まとめ
ここまで紹介した方法でWordPressの管理領域を公開サイトから分離し、管理画面URLを他者から隠ぺいすることができます。
ただし、使用しているテーマやプラグインによっては、管理領域へのリンクが存在している可能性がありますので、必ずソースコードをチェックしましょう。例えばWordPressのコメント機能を使用しているテーマでは、管理領域である「/wp-admin/」へのリンクが存在するためソースコード見れば管理領域の場所が一目瞭然です。このような場合は、テーマファイル内のコメント機能に関する部分を削除する必要ががあります(どうしてもコメント機能が必要ならコメントプラグインの利用がおすすめです)。
なお、セキュアなWordPressの構築という本稿の趣旨から外れるため触れませんでしたが、運用開始前の構築フェーズで下記のような設定をすることをお勧めします。
- テーマのインストール・修正
- テーマのインストール、子テーマ化
- テーマのカスタマイズ(CSS修正など)
- Googleアナリティクスなどのアクセス解析タグの追加(Googleタグマネージャーの利用がおすすめ)
- パーマリンクの設定
- 「.htaccess」の設定
- SSL利用時にhttpへのアクセスをhttpsへ転送
- 管理領域のへのBasic認証によるパスワード設定
- プラグインのインストール
- バックアップ設定(BackWPUpプラグインが便利)
これらについても、ニーズがあれば別記事にて取り上げたいと思います。