WordPressで絶対【最初に】する4つのこと 後編 ログインID漏洩防止とwp-login.phpの撤廃

ブログ用CMSと言えば、WordPress。
しかし10年弱前の「日本では」ブログと言えば、ほぼ「Movable Type」。

歳月人を待たず。

このWordPressの躍進は日本だけにはとどまりません。
なんと「全世界のサイトの4分の1はWordPressで作られている」のだそうです。

WordPressのシェア

CMSイコールWordPress

さらに「全世界のサイトの4分の1はWordPressで作られている」によると、CMS内でのWordPressのシェアは58.7%にもなるそうです。

CMS内のシェア

もはや、「CMSイコールWordPress」の時代になったと言えるのでしょう。
私はこのサイト立ち上げる前は、2013年から「Drupal」というCMSを利用していました。

今回はブログということで、約3年ぶりにWordPressの利用を再開しました。
そこでつくづく思ったことがあります。
WordPressはいつ乗っ取られてもいいぐらい、セキュリティーが非常に甘いということです。

WordPressで企業サイトは危険

「全世界のサイトの4分の1はWordPress」という時代だというのに、WordPressのセキュリティーは「ノーガード」。

しかし「全世界のサイトの4分の1はWordPress」だといのですから、ブログだけでなく、(中小の)企業サイトなどもWordPressで運用されているのでしょう。

私はDrupalと比較をした上で、はっきりと言えます。WordPressは個人のブログ用途だけ。企業や公的組織、利益団体などがWordPressを採用することは、決しておすすめはしません。いくら便利なCMSだったとしても、セキュリティー攻撃に弱ければ、金額的な損失だけでなく信用も一瞬で失う可能性があるからです。

短所がセキュリティーなのは致命的

このノー・セキュリティー問題は、いずれ大事件に繋がるかもしれません。
事実、2013年、レンタルサーバーのロリポップにおいてWordPressが大量にハッキングされたようです。残念ながら、これはあまり大きなニュースにはなりませんでした。

参考:説明二転三転、根本的な原因は「パーミッション設定の不備」と:Update:「ロリポップ」でWeb改ざん、8438件でデータ改ざんや不正ファイル設置 - @IT

盛者必衰。

しかし、このまま「ノー・セキュリティー状態」なら、もっと重篤な社会的事件がいつ起きてもおかしくありません。その時点で今度こそWordPressは信頼を失い、終焉を迎えるのだろうと思いました。

WordPressの短所は「セキュリティー面」です。完璧なCMSなんてどこにも存在しませんが、セキュリティーが甘すぎるのは致命的です。痛すぎます。損害が大きすぎます。

このサイトは当面はWordPressで運用します。ただし余裕があればDrupalでブログサイトを再構築するかもしれません。Drupalでブログ構築が完了したら、Drupalに移転というか避難する可能性は高いです。そのぐらいのセキュリティーの低さに恐ろしさを感じました。

ログインIDが簡単に盗める仕組み

このブログは今年の3月1日に公開を始めました。
1ヶ月も経たない4月のある日、いつものように、アクセスを解析をしたところ、見に覚えのないURLへのヒットがありました。

そのURLとは以下の様なものでした。

http://(WordPressのURL)/author/ユーザーID

これはいわゆる投稿者アーカイブです。私はセキュリティー対策のため、「All in One SEO Pack」の「Noindex 設定」ではちゃんと、「投稿者アーカイブにnoindex を適用」にチェックを入れていました

投稿者アーカイブはnoindex

ですから検索サイトからのアクセスは無いはずです。
しかし実際は、投稿者アーカイブページへのにアクセスがあったのです。

投稿者アーカイブでログインID即漏洩

WordPressのまずい点は、ユーザーID=ログインIDだという点です。
更にまずいのは、投稿者アーカイブページにアクセスされると、その時点で、ログインIDが盗まれるということです。なぜなら投稿者アーカイブのURLは以下のようにっているからです。

http://(WordPressのURL)/author/ユーザーID(=ログインIDそのもの)/

ですから、投稿者アーカイブへアクセスがあった時点で、ログインIDは即漏洩。後はパスワードが解析されたら、すぐにハッキング完了です。最低です。

ニックネーム機能意味なし

WordPressのテーマの中には、初期状態で投稿者情報に「ユーザーID=ログインID」をそのまま表示するものがあります。

「Twenty Fourteen」や「Twenty Sixteen」などがそうです。

twenty-fourteen
ユーザーIDがそのまま表示されている

このように、投稿者情報から「ログインID」がバレることがあるため、よく「ニックネーム」を設定するよう注意がされています。しかし、そんなの何の効果もありません。

ニックネーム設定
ユーザーメニューからニックネームが設定できる
ニックネーム設定後
確かにニックネームが表示される

/?author=1または2でログインIDモロ見え

このサイトもニックネーム設定をしていました。それでもなんで、1ヶ月も経たないブログのログインIDが漏れてしまったのか?
そのからくりがわかりました。

WordPressでは、http://(WordPressのURL)の後に「/?author=ID」をつけると投稿者アーカイブページを誰で見ることができる仕組みなっていたのです。ここで言う、IDとはユーザーごとに与えられる数字です。

一人でWordPressを運営していれば、IDの数字はほぼ1です。次に可能性があるのが2です。

ですから、http://(WordPressのURL)/?author=1と入力すると、誰でも、投稿者アーカイブ http://(WordPressのURL)/author/ユーザーID(=ログインID)/にアクセスができるのです。

私のサイトは、運営して1ヶ月もしないうちにこの攻撃を食らったのです。

ニックネーム設定は、セキュリティー上意味無し

ニックネーム設定をしていても、上記の方法で投稿者アーカイブに直接アクセスされると、表示されるのはログインIDモロ見えのURL、http://(WordPressのURL)/author/ユーザーID(=ログインID)/

ニックネーム設定はもちろん必須です。しかし、それだけで安心していたら、いつサイトが乗っ取られたとしてもおかしくありません。追加の対策が必要です。

それこそが、「WordPressで絶対【最初に】すべきこと」なのです。前編で述べた子テーマとパーマリンク設定も重要ですが、重要度の次元がはるかに違います

対策1:Edit Author Slugプラグイン

ではWordPress運営者はログインID防止のためにはどんな手を打てば良いのでしょうか?
1つ目はユーザーID≠ログインIDとすることです。

具体的には「Edit Author Slug」プラグインを導入することです。

edit-author-slug

使い方はいたって簡単

使い方はいたって簡単。
インストールして有効化するだけ。

その後はダッシュボードから「ユーザー」をクリック。

ユーザーメニュー

「プロフィール」ページ最下部に「Edit Author Slug」という項目が現れます。
そこの「Custom」の欄にユーザーID兼ログインIDが表示されているので、そこを修正。

author-slug

vivaldiに変更
adminからvivalidiへ変更

その後、投稿者アーカイブにアクセスしてみると、変更後のAuthor Slugを含んだURLが表示されるようになるのです。

slug変更後の投稿者アーカイブ
URLの最後がadminからvivaldiに変わっている

これで万が一、投稿者アーカイブにアクセスされても、ログインIDが漏れることがなくなります。WordPressでブログをやろうとする場合、最低限このプラグインは導入すべきだと思います

対策2:投稿者アーカイブを404へ

1人でWordPressを運用している場合、投稿者アーカイブは何の意味も持ちません。だったら、投稿者アーカイブページヘのアクセスを拒否するの有効だと思います。

その場合は、子テーマのfunctions.phpへ以下のコードを追記します。

add_filter( 'author_rewrite_rules', '__return_empty_array' );
function disable_author_archive() {
    if( $_GET['author'] || preg_match('#/author/.+#', $_SERVER['REQUEST_URI']) ){
        wp_redirect( home_url( '/404.php' ) );
        exit;
    }
}
add_action('init', 'disable_author_archive');

このコードを追記することで、http://(WordPressのURL)/?author=ID で投稿者アーカイブに不正侵入しようとしても、404ページにリダイレクトされます。

404
投稿者アーカイブへのアクセスが拒否される

1人でブログを運営している人は、このコードを活用して不正アクセスを防止しましょう。

Drupalのススメ

ここで少し余談。

以前使っていたDrupalというCMSは、デフォルトで管理者(ADMINISTRATOR)と、一般の閲覧者(匿名ユーザー)で見られるページの管理が細かく出来ます

ですから、管理者の情報が一般の閲覧者に漏れる危険性は、WordPressに比べはるかに低いのです。

drupalの権限設定
drupalの権限設定画面

またユーザーごとに役割と権限の設定が細く設定できます。ですから例えば管理者の下に信頼できるサブ管理者を作ったりもできます。そうすることでグループでキメの細かい安全な運用ができます。

とてもハードルの高いCMSですが、企業、公共組織、利益団体のサイトはDrupalで作ったほうが安全です。

実際に、米国ホワイトハウスNASA、企業ではGEジョンソン&ジョンソンなどでDrupalが採用されています。

Drupal7と8のモジュールに互換性が無い

ただし1つ注意点があります。

2015年11月19日に新バージョンDrupal8がリリースされました。最新版がリリースされてまだ日が浅いということで、Drupal7で使えていたモジュール(=プラグイン)がまだほとんど使えていません。

今後Drupal8がメインになるのでしょうけど、今はまだDrupal8には手を出すべきではありません。「Drupal Hell(Drupal地獄)」に陥るだけです。今のDrupal8では、不自由すぎます。もう半年~1年ぐらい待ったほうが良いと思います。

根本の原因はDrupal8とDrupal7のモジュールには互換性が無いことにあります。Drupalは何でもできるCMSです。しかし残念ですが、手を出すには今はタイミングが悪すぎるようです。

wp-login.phpは即撤廃へ

さて話を戻します。

私は、このサイトを運用して1ヶ月も経たないうちに何者かにログインIDを盗み見られました。幸い、投稿者アーカイブへのアクセスは1回しかなかったので、本当に悪意のある攻撃というよりは、いたずらだったと信じています。

しかし、これを機にWordPressの脆弱性を認識することができました。ところが、恐ろしいことにWordPressの脆弱性はこれだけにとどまりません。

これは多くの人が知っていることだと思いますが、WordPressは誰でもログインページにアクセスすることが出来ます。誰かにログインIDを盗み見られた私は、ログインページヘのアクセスを拒絶しないと、その人にサイトごと乗っ取られてしまう危険性がありました。

そこで実施したのが、ログインURLの変更です。

All In One WP Security & Firewallのススメ

そこで使用したのが「All In One WP Security & Firewall」というプラグインです。

All In One WP Security & Firewall

このプラグインを知るきっかけは、単に「WordPressのセキュリティを強化する|さくらインターネット公式サポートサイト」で紹介されていたからです。

はっきり言って、全部英語ですし、かなり難易度の高いプラグインであることは前もってお伝えします。

必ず.htaccessをバックアップ

プラグインのインストールと有効化については割愛。

このプラグインは.htaccessに変更を加えるようです。ですから有効化したらまず初めに、現在の.htaccessファイルのバックアップを取ります。

まず「WP Security」から「setting」を選択します。

htaccessのバックアップ

その画面中央の「Backup .htaccess File」をクリックして必ずバックアップを取ります

ログインページは出入り自由

WordPressのログインページへは誰でもアクセス可能です。理由は2つあります。

  • メタ情報ウィジェットにログインリンクがある
  • http://(WordPressのURL)/wp-login.phpから侵入できる

WordPressではデフォルトで「メタ情報ウィジェット」が用意されています。ログインURLがWordPressなら、どのサイトでも「http://(WordPressのURL)/wp-login.php」であることを知らない人は、これがないと困るのかもしれません。

メタ情報ウィジェット
ウィジェットから誰でもログインページに入れる

しかし、便利かもしれませんが、こんなオープンな状態ではいつ乗っとりにあってもおかしくありません。ログインページヘのリンクが張られたデフォルトの「メタ情報ウィジェット」は無くした方が無難です。

wp-login.phpは重大なセキュリティホール

ただし「メタ情報ウィジェット」を無効にしてもほとんど効果がありません。なぜならWordPressサイトは、一律以下のURLから誰でもログインページにアクセスできるからです。

  • http://(WordPressのURL)/wp-login.php

こんなのセキュリティホール以外の何ものでもありません。開いた口がふさがりません。

このセキュリティーホールを回避するには、ログインURLを変えるしかありません。それができるのが、「All In One WP Security & Firewall」なのです。

なお、このプラグインでログインURLを変更すると、例の「メタ情報ウィジェット」が完全に消えて無くなります。金輪際利用不可になります。覚悟とご準備をお願い致します。

ログインURLの変え方

ではログインURLの変更方法について説明します。
ダッシュボードのメニュー「WP Security」から「Brute Force」を選択します。

すると以下の画面に遷移します。

ログインURLを変更

「Enable Rename Login Page Feature」にチェックも必ず入れた上で、「Login Page URL」に好きな文字を入力します。この文字は必ず控えます。なぜなら、先に申し上げたとおり、ここでURL変更した時点で、「メタ情報ウィジェット」が消滅するからです。

ここで入力したURLをブックマークに追加しないと、本人もログイン出来なくなるので要注意です。

  • 「Edit Author Slug」でユーザーID≠ログインIDへ
  • wp-login.phpの即変更

以上の2つはWordPress運営者がまず最初することです。そうしないと、本当にいつ乗っ取りにあってもおかしくありません。

コメントスパムも防ぎましょう

以上がWordPressサイトで絶対【最初に】すべきセキュリティー対策です。しかし、この「All In One WP Security & Firewall」には他にも便利な機能がありますので、いくつか紹介します。

まずはコメントスパム対策です。

メニューの「SPAM Prevention」をクリックします。
そうすると以下の画面に移ります。

コメントスパム防止

ここで何も考えず、2つのチェックにチェックを入れます。
ちなみに上のチェックを入れると、コメントフォームに「Captcha」が入れられます。

そして下の段はにチェックすると、コメント欄の下の方に、簡単な英文の計算式が出ます。日本語対応していないのが残念ですが、スパムを残すのは大体海外からのアクセスなので、意外とこの計算式も便利です

コメント欄に計算式
コメント欄最下部に計算式が表示

私は、「Akismet」とこの機能を併用してから、コメントスパムは1個も受けていません。地味に有効な機能です。

Pingback機能も無効化する

実はPingback機能もセキュリティー機能を甘くするそうです。Pingback機能自体、私は不要だと思うので、Pingback機能が必要と思う方以外は、ここで無効化した方が良いと思います。

メニューから「Firewall」を選択します。「Basic Firewall」タブを選択すると、次の画面に遷移します。

ピンバック防止

そこで真ん中の「Enable Pingback Protection」にチェックを入れます。それだけです。

ちなみに、その上の「Enable Basic Firewall Protection」もチェックを入れることをお勧めします。ただし、ファイルアップロードサイズが上限10MBに限定されるので、そこは要注意です。

テーブルプレフィックスの変更

あと個人的に推奨するのは、「テーブルプレフィックスの変更」です。WordPressのデータベースのテーブル接頭辞はデフォルトで「wp_」です。

データベースの中には、記事の本文、タイトル、メディアやプラグイン情報が含まれています。ですから、データベースが攻撃に遭うと、サイトが簡単に改ざんされます。

しかし、WordPressのデータベースの中には、パスワードなどの重要情報も格納されています。

特に「wp_users」というテーブルに不正アクセスされると、ログインID、パスワード、メールアドレス等の個人情報が盗まれます。それを防ぐためにも「wp_」という接頭辞は廃止にした方が確実です。

変更方法は簡単ですが、テーブル接頭辞を変更する前に必ず、データベースのバックアップを取りましょう。では、変更方法ですが「WP Security」メニューの「Database Security」をクリックします。そうすると以下の画面に遷移します。

接頭辞を変更

ここで好きな接頭辞をアルファベットで入力します。その後「Cahnge DB Prefix」をクリックします。以上です。

絶対【最初に】セキュリティー対策をしましょう

以上が私が考えうる必要最低限のセキュリティー対策です。口を酸っぱくして言いますが、これらの対策をしないと、WordPressは本当にいつ乗っ取りにあってもおかしくありません。

こんなにセキュリティーが甘いがCMSが世の中の大半を占めていのですから、ハッカーにとっては天国。みんなが一律で同様のセキュリティホールを持っているので、Brute Force Attack(辞書攻撃)も容易なはずです。

絶対【最初に】する4つのこと

以上2回に分けて、「WordPressで絶対【最初に】する4つのこと」をまとめてみました。前半で紹介した分も含めると、その4つは以下のようになります。

  1. 子テーマの作成
  2. パーマリンクは「投稿名」で
  3. Edit Author Slugを使用
  4. wp-login.phpの撤廃

前回も書きましたが、子テーマ作成はそれほど緊急度は高くありません。あえて順番を付けるなら、今回の記事で紹介したセキュリティー対策の2つが同率で1番目、2番目はパーマリンク設定でしょう

利便性と情報氾濫がもたらすセキュリティー低下

  • 順序あべこべでも運用できる「利便性」の高さ
  • 誰でも(無責任な)情報発信ができるため、順番あべこべな情報が氾濫

こんな便利なのか不便なのか分からない時代だからこそ、運営者は前回、取扱説明書の例で例えた「取扱説明書本体」ではなく、「はじめに」や「スタートガイド」に当たる親切な解説サイトを見つけてから、WordPressの構築を始めましょう。

特にセキュリティー対策をはじめに実施しないと、WordPressは決して安心して使えないのです。

※関連記事