WordPressの不正アクセス対策

WordPressの不正アクセス対策

ロリポップにてWordPressを利用したサイトが大量に不正アクセスを受けて改ざんされてしまったという話は記憶に新しい(2013/09/09)ところ。私が関与しているロリポップのサイトはというと、どうやら無事のようでした。

が、その事件から1年以上経ったつい先日、そのサイトがクラックされたとの連絡を受けました。

連絡を受けたのは休日の23時前後で、友人達と外出中でPCが手元になかったため、急遽近くの漫画喫茶に立ち寄って取り急ぎ状況を確認することに。移動しながら手元のiPhoneで確認したところ、クラックされたのが運良くメインのユーザーではなかったようで、その場でiPhoneから管理画面にログイン、クラックされたユーザー、そして勝手に投稿された記事を削除することでなんとか応急処置をすることができました。

念のために私が管理している管理者用ユーザーのパスワードをより複雑なものに変更し、またもう1つのユーザーは以前のものとは違うユーザー名に、パスワードはより複雑なものへと変更しました。

今回はなんとか無事だったのですが、それはたまたま運が良かっただけの話。これを機にできる範囲での本格的な不正アクセスを防止するためのセキュリティ対策を考えてみることに。

素人にもできるWordPressの不正アクセス対策

高度な分野、特にサーバー自体のセキュリティを…ということになると素人には手出しができません。今回は比較的簡単に導入できるものを複数合わせて対策する方法を考えてみました。

現在の不正アクセスの試みを調べる

いずれにしてもセキュリティ対策は講じるのですが、自サイトに対して実際に不正アクセスの試みがあるのかどうかを調べてみることにしました。「自分は大丈夫」と考えている方も、調査だけはやってみる価値はあると思います。

この調査には「Crazy Bone」というプラグインを使用します。こちらは各ユーザーの管理画面へのログイン状態のログ(記録)を取ることができるものです。プラグインをインストールして有効にすれば、

ユーザー > ログイン履歴 からログイン履歴を見ることができます。

早速導入して調査したところ、驚くべき結果が。。。

CrazyBone

上に行くほど新しいログイン履歴でして、一番下が私自身のログインの記録。これはもちろん問題無しですが、導入からわずか2時間(11:30〜13:30)の間に、3回もログインの試みが確認できました。

詳細を見ると

  1. オランダから「admin」でログインの試み「不正パスワード」によりログイン失敗
  2. ウクライナから「admin」でログインの試み「不正パスワード」によりログイン失敗
  3. ウクライナから「admin」でログインの試み「不正パスワード」によりログイン失敗

2、3件目は同じIPで、同一人物により2回のログインの試みがあったことが分かります。

ちなみにこの「Crazy Bone」ですが、ログイン履歴の画面を開いた初期状態では、現在ログインしているユーザー名(この時は「admin」)でのログイン履歴のみが表示されますので、左上のリストから「全て」を選択し、「フィルタを適用」にて全ユーザー名のログイン履歴を見ることができます。これによりどういったユーザー名でログインを試みたのかということも調べられます。今回の調査では全て「admin」でした。

CrazyBone 02

この調査でも明白ですが、ユーザー名「admin」でのログインの試みが最も多い様です。今回の調査でも「admin」のみでした。

利用中の環境(サーバーなど)にもよりますが、WordPressの初期のメインユーザー名が自動的に「admin」とされている場合が多いのです。そしてそれを変更しないユーザーが多いので「admin」は最も狙われやすいユーザー名と言えます。

現在のクラッキングの手口の中で最も多いパターンは「ブルートフォースアタック」と呼ばれるものです。これは「強引な総当たり攻撃」という意味でして、「ユーザー名」と「パスワード」の組み合わせにおいて、理論的にありうるパターン全てを入力して解読する解読法です。

この作業、人間が手作業で実施するとなると気の遠くなるような作業なのですが、これはコンピュータープログラムによって自動的かつ短時間で相当な回数を実行されてしまいます。

しかも、先にも述べた通り「admin」のままのユーザーが多いので、ユーザー名を「admin」として絞り込んだ場合、やみくもでもヒットすれば良いのは「パスワード」のみとなりますので、クラッキングの成功率も格段に高くなってしまいます。

つまり、まずはユーザー名に「admin」を使っている場合は一刻でも早くこれを変更したほうがよさそうです。

1.メインのユーザー名を変更する

ご存知だと思いますが、WordPressでは一度決めた(決められた)ユーザー名は変更することができません。

Use name

そのため、厳密には現在の管理者のユーザー名の変更をするのではなく、管理者と同じ権限をもつ別のユーザーを1つ追加し、先の「admin」を削除することにより、ユーザー名の変更を実現させます。

①ユーザーの新規追加

管理画面:ユーザー > 新規追加

New user

この際に押さえておきたいポイントは

  1. ユーザー名はドメイン名が入っていないものを
  2. パスワードは「強力」に
  3. 権限グループは「管理者」に
ユーザー名はドメイン名が入っていないものを

どうやらドメイン名も狙われている可能性があります。冒頭で述べたロリポップのWordPressサイトでは、「ユーザー名」=「ドメイン名」(例:sample.com → ユーザー名:sample)としており、これがクラックされたユーザーでした。狙われているのは「admin」だけではない様子なので、「ドメイン名」もしくは「ドメイン名の一部をユーザー名としたもの」は敬遠したほうが賢明です。

パスワードを「強力」にするコツ

新規ユーザー追加の画面上でも「ヒント: パスワードは少なくとも7文字以上であるべきです。より強固にするためには大文字と小文字、数字、 ! ” ? $ % ^ & ) のような記号を使いましょう。」とありますので、これらのヒントを参考に表示が「強力」となるものに限定したいところですが、それだけでは不十分な場合もあります。

それは、パスワードの使い回しによる、他サービスからの情報漏れのリスクです。

世間を騒がす「LINE乗っ取り事件」ですが、これが正に他サービスから流出したID+パスワードを利用した不正ログインが原因だとの事です。(LINEがそう主張しているだけで、本当かどうかは知りませんが)

実は私も「LINE乗っ取り」の被害に遭いまして、それ以来Webサービス系はことごとくすべてのパスワードを違うものにして対策をしております。しかしこうなると大変なのが、サービスごとのパスワードの使い分け(覚えること)です。これについては別途まとめておりますので、以下をご参考に。

強力なパスワードを作成する方法

②メインのユーザーを削除する

WordPress users

▲管理画面:ユーザー > ユーザー一覧 にてadimin以外のユーザー名がちゃんと作成されていることが確認できましたので、旧ユーザー「admin」は削除します。

この時点では「admin」でログイン中だと思いますが、このままでは「admin」を削除することができませんので、一度ログアウトし、新規で作成したユーザーにて再度ログインします。

同様に【管理画面:ユーザー > ユーザー一覧】と遷移します。

WordPress users 02

このユーザー一覧ページにてユーザー名「admin」と表示されているあたりにマウスを当てると「削除」と表示されるのでこれをクリック、以下の画面が表示されます。

Delete user

ここで注意したいのが、必ず「すべてのコンテンツを以下のユーザーのものにする」にチェックを入れ、「引き継ぎたいユーザー名を選択しておく」ことです。

WordPressでは全文書コンテンツ(記事/固定ページ)には必ずその作者が紐付いております。今回のケースではこれまでのコンテンツは全て「admin」作でした。このユーザーを削除するにあたり、そのユーザー作のコンテンツは削除するか、誰かに引き継ぐか?を問うているのがこのステップです。

普通はコンテンツはそのまま残しておきたいでしょうから、この作業は絶対に忘れないようにしましょう。

WordPress users 03

▲「admin」が削除され、新ユーザーだけが残った状態。投稿に注目すると、先ほどまでは「admin:5:」「新ユーザー:0」なっていたものがちゃんと引き継がれているのが確認できますので、これでOK。

2.ログイン試行回数に制限を設ける

WordPressは標準ではログインの試行回数にに制限はありません。そのため何度でも試行することができるので、いつかは当てられてしまう可能性があります。そこで、一定回数ログインに失敗したらブロックするようにします。これもプラグイン(Login LockDown)を利用するのが簡単です。

Login LockDownの使い方

基本的にはプラグインのインストール、有効化ですぐ使えるようになります。

ある一定回数(任意に設定できますので、後述します)ログインに失敗すると、

WordPress login 02

とこのようにエラーが表示されます。

ERROR: We’re sorry, but this IP range has been blocked due to too many recent failed login attempts.

Please try again later.

(日本語訳)
エラー:申し訳ございませんが、制限回数以上のログインに失敗したためこのIPはブロックされました。

時間をおいてお試しください。

ユーザー名を変えるだけだと無制限にログイン試行されてしまいますので、いつかはクラックされてしまう可能性もゼロではありませんが、これだと一定回数のミスでログインというアクション自体を受け付けなくなるので、かなりのセキュリティの強化が期待できそうです。

Login LockDownの詳細設定

インストール・有効化だけでとりあえず機能しますが、自分好みに詳細設定をすることもできます。

LoginLockDown setting

【管理画面:設定 > Login LockDown】から行えます。上から順番に各項目について説明します。

Max Login Retries<最大試行回数>

何回失敗したらブロックするかという回数を設定できます。(初期値:3)

Retry Time Period Restriction (minutes)<ログイン試行猶予時間制限(分)>

ログインに失敗時に再試行が許される時間制限です。(初期値:5分)

ログインに失敗した場合、●分間以内にログイン成功をしないとブロックされてしまうようです。つまり、自分自身がログインに失敗した場合も●分以内に一度ログインに成功しておく必要がありそうです。

なお、当然ですがその●分の間に制限回数以上失敗したら即ブロックされてしまいます。

Lockout Length (minutes)<ブロック期間(分)>

どれくらいの長さブロックしておくか設定できます。(初期値:60分)

Lockout Invalid Usernames?<不正ユーザー名のブロック>

初期状態では、存在しないユーザー名によるログイン試行では「Login LockDown」が発動しないところを、Yes(発動させる)かNo(させないまま)かを変更できます。(初期値:No)

そもそも存在しないユーザー名に対しては動かなくてもいいや。という考えなのでしょうか。こちらも正直ピンとこなかったのですが、私の場合は不正ログインを試みようとする悪者にその試み自体を許すのは何か気持ち悪いので「Yes」としました。

Mask Login Errors?<ログインエラーの非表示>

WordPressは通常はログイン失敗時にはその理由を表示してくれます。

例)ユーザー名:○、パスワード:×

LoginLockDown error msg

例)ユーザー名:×、パスワード:○ or ×

LoginLockDown error msg 02

上記のように、それぞれなぜログインに失敗したのか(ユーザー名とパスワードのどちらが間違っていたかという)の理由が表示されます。

ユーザー名がそもそも間違っている場合ならまだしも、第3者が適当なユーザー名でログインを試みて、もしもそれが実際に使用しているユーザー名だったとしたら、パスワードだけが間違っていてユーザー名は正しいということを教えてしまうことになります。

この設定でYes(非表示にする)にした場合、例えユーザー名が正解であったとしても以下のように表示されます。

LoginLockDown error msg 03

ERROR: Invalid username or incorrect password. Lost your password?

(日本語訳)
エラー:不正なユーザー名かパスワードが間違っています。パスワードをお忘れのかたはこちら

これにより、ログイン試行によるユーザー名の特定をさせないようにすることができます。

Show Credit Link?<クレジットを表示させますか?>

ログイン画面に「Login form protected by Login LockDown.」というクレジットを表示させるかどうかを決めることができます。

開発者様曰く、これを見た他のユーザーが「Login LockDown」というプラグインにて不正アクセスをブロックできるということを知れるので、他のユーザーの手助けになるよ。とのことです。

なんの意図もない一般のユーザーがわざわざ他者のWordPressサイトのログインページを見る何てことは早々ないと思いますが。。。まあ一応「もしもお望みなら非表示にもできますが。」とお断りして3つの選択肢は用意してくれてはいるようです。

  • Yes, display the credit link.(表示する※初期値)
  • Display the credit link, but add “rel=’nofollow'” (ie. do not pass any link juice).(表示する。でも、SEO 的にこのリンクを評価しない)
  • No, do not display the credit link.(表示させない)

3.ログイン画面にCaptcha(キャプチャ)を導入する。

Captcha(キャプチャ)という言葉自体は聞きなれないかもしれませんが。WordPress上に限らず、皆さんどこかで一度は経験しているはずです。

▼こんなやつです。

Captcha

入力フォーム上に何かを入力して「送信/確定」をクリックする前に、表示されたコレが何て書いているか?をキーボードで入力して正解することによって初めて先に進めるというアレです。

人間が見ると「HTKEHS」と読めますが、これがコンピューターには読めないので、というセキュリティの手法です。

先に触れたように、クラックの手法としては「ブルートフォースアタック」というコンピューターによる総当たり攻撃が多いので、これは有効な気がします。

しかし、認知ソフトウェア(画像を解析するソフトなど)も進化しており、画像の文字まで読んでしまうという技術も高度化している事実もあります。そこで、今回は一般的なCaptchaではなく、一歩進んだ方法でセキュリティ対策をしたいと思います。

使用するプラグインは「Captcha」です。名前はそのまんまで普通っぽいですが、普通ではないのです。プラグインをインストールして有効化すればすぐ使えます。

有効化してログイン画面を見るとCaptchaが効いていますが、とりあえず無視してユーザー名とパスワードだけ入れて先に進もうとすると、

Captcha login

と、このように「このフォールドを入力してください。」と表示され、ログインをすることができません。

見ていただくと分かるのですが、そう、これは引き算になっていまして、その答えの正解を入力しないとログインできないという仕組みなのです。

この場合はもちろん「7」が正解です。7も入力することではじめてログインできます。

計算と入力がチョット面倒と感じる方もいるかもしれませんが、一般的なCaptchaであれば5文字前後入力するのが一般的なので、入力数は全然少なく済みます。

それに見てお分かりの通り、漢数字の「八」とアラビア数字の「1」の組み合わせですから、コンピューターはもちろんのこと外国人に対してもかなり強力です。不正アクセスの試行は圧倒的に海外からが多いので、これはかなり強力そうです。

なお、設定画面は大半が日本語化されているので、使い方もさほど困らないと思います。

4.「wp-config.php」のパーミッションを変更する

パーミッションというのは、簡単に言うとこのファイル(wp-config.php)へのアクセス権限のことを指します。そして「wp-config.php」というのはWordPressのファイルの中でも重要なファイルでして、パスワードをはじめとする各種設定などもファイルに記録されていたりするのです。

そんな重要なファイルのアクセス権がユルかったら、技術的なことは分からなくてもなにやらヤバイ気がします。

ということで、適切なパーミッションに変更します。

①「wp-config.php」のパーミッションを確認する

ここでは無料アプリ「FileZilla」を使用しますが、FFFTPなんかでもOKです。どちらも有名なアプリなので、探せばダウンロード先はたくさん見つかるはずです。

FileZilla

そういったアプリの細かい初期設定は割愛するとして、「wp-config.php」のパーミッションを調べてみると、

FileZilla 02

▲このように「644」となっています。

結論から言うとこれは「404」が望ましいとのこと。つまり変更をする必要があります。

②「wp-config.php」のパーミッションを変更する

FileZilla 03

▲「404」と入力して「OK」をクリックすればOKです。

レンタルサーバーなどのインストーラー(サーバーの管理画面から簡単にインストールできるアレ)を使ってワードプレスをインストールした場合、パーミッションは「644」「646」「666」あたりになっていたりするようです。ロリポップの改ざん事件の時も原因はこの辺りだったようでして(参考:第三者によるユーザーサイトの改ざん被害に関するご報告)、パーミッション「644」だったようです。ちなみに、この「644」という数字の2番目の数字は「グループパーミッション」というもので、同一サーバー上のユーザーであれば、このファイルを「読み込める」という設定だったのが原因だったそうです。

ちなみに、ロリポップの変更後のパーミッションは「400」のようです。

このように、これが原因での不正アクセスが実際にあったわけですから、これは早急に対策しておきたいですね。

パーミッションが変更できない場合

レンタルサーバーなどのインストーラーを使ってWordPressをインストールした場合、パーミッションが変更できない場合があります。

パーミッションは誰でも変更できるものではなく、そのファイルの所有者だけが変更できるようになっています。レンタルサーバーなどのインストーラーを使用した場合、サーバーがインストールすることになるので、サーバー(というよりApatche)がそのファイルの所有者となってしまい、あなたが所有者であると認められずに変更ができないということがあります。

この場合、一度サーバー上から「wp-config.php」だけでいいのでローカルにダウンロードします。そしてサーバー上の「wp-config.php」を削除した後、再度「wp-config.php」をアップロードすることで所有者があなたに変わりますので、これでパーミッションを変更することができるようになります。

5.「wp-config.php」ファイルへのアクセスを制限する

どうやら「wp-config.php」というファイルは重要かつ狙われるようなので、心配ならこのファイルへのアクセス自体を制限してしまいます。

これには「.htaccess」を使います。下記の内容を追記すればOKです。

試しにブラウザで「wp-config.php」にアクセスしてみました。

403 Error  Forbidden

とこのようにアクセス拒否されたのが確認できました。

まとめ

と、今回は私のように素人でも出来る範囲の不正アクセス対策に絞ってみたので、これならばどなたでも出来るのではないでしょうか。後半の2つは少し技術的/専門的な内容もあったのでややこしいところもあったかもしれませんが、この範囲なら頑張ればなんとかなるはずです。

それから忘れてはいけないのがWordPressの基本で、システムを「最新版にしておく」というところでしょうか。最近のWordPressは自動アップデートなどにも対応してくれていますが、メジャーアップデートはご自身の選択でやるので、こまめに最新版にしておきたいものです。後の祭りにならないように。。。