近年では、サイト全体をSSL(Secure Sockets Layer:インターネット上でデータを暗号化して送受信する仕組み)対応させセキュリティ対策に気を配っている企業サイトが多くなりました。

「常時SSL」はGoogleが推奨していることもあり、SEOにも影響がある(Google ウェブマスター向け公式ブログ「HTTPS をランキング シグナルに使用します」)ことから、ブログや個人が管理するミニサイトでもSSL化するところが増えているようにお見受けします。

そんなにPVもないしな~と自分は、まったくセキュリティ対策をしていなかったのですがカンタンらしいので、まずはWordPressのセキュリティ対策を一番アクセス数の多い食道楽系のブログに、備忘録を残しながら対応していくことにしました。

WordPressのプレフィックスを変更する

プレフィックスというのは、データベースのテーブルの接頭辞のことで、ほかのものと区別するために特定の文字を先頭に付与してあるものを指します。

この接頭辞が、WordPressのデフォルトでは「wp_」になっているため、そのままにしておくと誰でも知ることができてしまいます。

プラグインで変更

All In One WP Security & Firewallというプラグインでは、管理画面上で接頭辞を変更することができます。このプラグインは場合によりテーマやほかのプラグインと相性が悪くてアンインストールする必要に迫られる場合もあるのですが、アンインストールしてしまっても一度変更した接頭辞には影響がありません。

私は何度かこのプラグインがサイト構築上の問題となったことがあるので、現在ではなるべく使わないようにしています…。

WordPressインストール時の対応方法

インストール画面で指定する

WordPressのファイルをサーバーにアップロードしてから、/setup-config.phpにアクセスすると、「WordPressへようこそ」の画面が表示されます。

手順に沿って次のページに進むとデータベース名やユーザー名と共にテーブル接頭辞の入力欄があります。

デフォルトでは「wp_」になっていますが、別の文字に変更します。これは、セキュリティ的にも有効な設定内容ですが、かつどうしてもデータベースが足りなくて、1つのデータベース上に2つのWordPressをインストールする際にも有効です(同じwp_を接頭辞にするとデータベースが上書きされてしまうので、最初から固有のものにしておくと、その危険性が薄まります)。

wp-config.php の書き換え

WordPressを作りなれている場合や、エディタ編集・FTPアップロードの方が手間が無いという場合は、データベース名やユーザー名と同じように、直接/wp-config.phpを編集してしまったほうが早いでしょう。

WordPressのプレフィックスの変更
72行目の「$table_prefix = ‘wp_’;」にあるプリフィックスを好きなワードで書き換えます(例:$table_prefix = ‘ux_’;)

上記書き換えを行ったら、サーバーにアップして上書きをします。

WordPressインストール後の対応方法

一度立ち上げてしまったWordPressのプリフィックスを変更するには、上記のwp-config.php の書き換えと共に、データベースのテーブル名やその内容を編集する必要があります。

データベースの接頭辞を書き換え

キャプチャは、レンタルサーバー「コアサーバー」の管理画面からアクセスできるphpMyAdminです。

WordPressのプレフィックスの変更
phpMyAdminで接頭辞を同じワードに書き換えます(例:ux_)
WordPressのプレフィックスの変更
下部にある「Check All」ですべてのデータベースにチェックを入れて、ドロップダウンで「テーブル名の接頭辞を付け替える」を選択するとダイアログが開きます。
現在の「wp_」と付け替えたいワードを入力し「続ける」を押下します
WordPressのプレフィックス
すべて新しい接頭辞に代わりました(左のエリアはリロードしないと変わりませんでした)

phpMyAdminをリロードすると、表示されているデータベースの接頭辞が変わります。

データベースの中にある、指定されている接頭辞を書き換え

データベース名は変更できましたが、データベースの中の接頭辞の表記が「wp_」のままになっているので変更します。

WordPressのプレフィックスの変更
「ux_usermeta」の「wp_capabilities」と「wp_user_level」の「wp_」を新しい接頭辞に変更します
WordPressのプレフィックスの変更
それぞれのデータの「編集」を押下すると名称が帰られる画面が表示されますので、新しい接頭辞に変更して保存します

上記作業は、すべてで3カ所必要です。(接頭辞の変更例、「ux_」の場合)

  • ux_options:wp_user_roles
  • ux_usermeta:wp_capabilities
  • ux_usermeta:wp_user_level

WordPressの管理画面のURLを変更する

WordPressのログイン画面は /wp-login.php、管理画面は /wp-admin/ とURLが決まっています(なぜかご丁寧に、/login、/admin、/dashboard でもアクセスできてしまいます)。そのため、変更しないとログイン画面のURLが誰にでもわかってしまいます

プラグインで変更する方法もありますが、ここでは2つのファイルを変更&用意する簡単な方法を記載します。

1)新しい管理画面のURLとなるファイルを用意する

ここでは、新しいログイン画面が「/henohenomoheji.php」となるようにします。まず、テキストエディタで「henohenomoheji.php」というファイルを作成してください。

その中に、以下のコードを記述します。

<?php
define('LOGIN_KEY', password_hash( 'test', PASSWORD_BCRYPT, array('cost'=>10)));
require_once './wp-login.php';

保存して、「wp-login.php」と同じ場所にサーバーアップします。

2)テーマの「functions.php」を変更する

エディタで「wp-content/themes/テーマフォルダ/functions.php」を開き、以下のコードを追加します。どこに入れても問題ありませんが、ほかのコードを壊さないよう、一番下に入れるのが良いかと思います。

黄色いマーカー部分に、先ほど作成したファイルの名称を入れて保存し、サーバーにアップします。

define( 'LOGIN_PAGE', 'henohenomoheji.php');
add_action( 'login_init', 'admin_login_init');
function admin_login_init()
{
    if( !defined('LOGIN_KEY') || password_verify( 'test', LOGIN_KEY) === false ) {
        header('Location:' . site_url() . '/404.php');
        exit;
    }
}

add_filter( 'site_url', 'admin_login_site_url', 10, 4);
function admin_login_site_url( $url, $path, $orig_scheme, $blog_id)
{
    if( ($path == 'wp-login.php' || preg_match( '/wp-login\.php\?action=\w+/', $path) ) && (is_user_logged_in() || strpos( $_SERVER['REQUEST_URI'], LOGIN_PAGE) !== false) ) {
        $url = str_replace( 'wp-login.php', LOGIN_PAGE, $url);
    }
    return $url;
}

add_filter( 'wp_redirect', 'admin_login_wp_redirect', 10, 2);
function admin_login_wp_redirect( $location, $status) {
    if( is_user_logged_in() && strpos( $_SERVER['REQUEST_URI'], LOGIN_PAGE) !== falsee ) {
        $location = str_replace( 'wp-login.php', LOGIN_PAGE, $location);
    }
    return $location;
}

これで、キャッシュの残っていないログイン画面もしくは管理画面に直接アクセスしようとした場合、「404」ページを表示するようになります。

WordPressの管理画面に簡易認証を設定する

簡易認証(ベーシック認証)の設定はレンタルサーバーなどによっては管理画面からできるものもありますが、ちょっとしたファイルの書き換えで簡単に指定できます。第一階層に「.htaccess」ファイルが置けることが条件になります。

1)パスワードを作成する

パスワードを作成するオンラインサービスはいくつもありますが、私がいつも使っているのはこちらのサービス(無料)です。

WordPress管理画面に簡易認証をつける
好きなIDとパスワードを入れて「生成」を押すだけ!

もし、「.htaccess」がまだなければ、このようなサービスで、ファイルも同時に作ってしまうのが便利でしょう。

2)パスワードを記載したファイル「.htpasswd」を作成・設置

「.htpasswd」という空ファイルを作成し、生成したIDとパスワードをそのまま(間にカンマ(:)を入れたままで)ペーストします。

そしてそのファイルをFTPやファイルマネージャーなどで、サーバー上にアップします。この時、/home/や/public_html/などではなく、ルート上のもっと深いところに入れておくと良いでしょう。

3)「.htaccess」にコードを追記する

「.htaccess」に、どこに上記の「.htpasswd」を置いたかを記載します。「AuthName」は簡易認証のダイアログに表示されるので、好きなテキストを入れて問題ありません。

また、ここでは名称をよくある教科書に従って「.htpasswd」にしていますが、接頭辞としてピリオド(.)が使ってあれば、別の名前に変えることもできます。

多くのサイトが一つのサーバーにあるときは、このパスワードファイルの名称を変えることで、サイトの簡易認証のアイパスを変えることができます。


AuthUserFile ルートディレクトリからのパス/.htpasswd
AuthGroupFile /dev/null
AuthName "Administrator"
AuthType Basic

ルートのディレクトリ名はサーバーにより異なります。FTPで見たままを記載すればいいところもあれば、ユーザー名などを含んだ見ただけではわからないパスの場合もあるので注意が必要です。

また、「AuthName」は昔から「Input your ID & Password」など説明を入れる例が多いですが、今ではブラウザによって長い説明のついたダイアログを表示する(Administrator と表示されている箇所)ので、あまり文章を入れるのは適していないと感じています。

WordPress管理画面に簡易認証をつける
ブラウザにより「AuthName」をこのように組み込むため、あまり説明文を入れるとおかしくなります

セキュリティ対策のWordPress用プラグインを入れる

WordPressのプラグインはテーマやプラグインの組み合わせに相性があり、場合によっては使えないこともありますがとても便利です。

無料版でもある程度使えて、英語がわからなくても使えそうなものを挙げておきます。

  • Wordfence:実際に幾つかのサイトに入れているプラグインです。おかしなアクセスを遮断したり、ログインのエラー状況などをダッシュボードに表示してくれます。対策そのものをするというよりは、状況把握に優れたツールです
    ※使用していましたが表示速度が著しく落ちたため、使用を中止しました(2018/12/19)
  • SiteGuard WP Plugin:完全ではありませんが日本語対応しています。ログインページの変更やログインの失敗を繰り返したときに一定時間ロックしたりしてくれます
  • All In One WP Security & Firewall:一番機能が多く、一番有名なセキュリティ対策プラグインでしょうか。逆に機能が多すぎてわけがわからなくなりますが、コメント対策もあるので、自由にコメントを入れられるサイトを運営している場合は便利でしょう

まとめ

どれも、さほど難しくないので必ず施しておいたほうが良い対策と言えましょう。

次は、SSL対応をします!(多分!)あと、このサイトもなんとかしないと?