現在Webサイトの管理サービスで最もよく使われているのが圧倒的にWordPressです。 そしてここまで人気ともなると、やはりそれだけ攻撃の標的にされやすくなるわけです。そこでしっかりセキュリティ対策をしないといけないわけですが、重要な項目として「知らない人に勝手にログインされないようにする」というものがあります。
それを対策してくれるSiteGuardというプラグインがあるのですが、実はあまり効果が期待できないのです。 今回は、なぜSiteGuardが使えないのか? 代わりにどうやって対策すればいいのか?
の二本立てでいきます。
WordPress Site Guardプラグインの必要性
WordPressをインストールしたらまずこれを入れろ! みたいな項目の中にこのプラグインの名前がだいたい入っています。 そしてみんな深いことはあまり考えずに入れるわけですが、本当に使えるのでしょうか? 必要なのでしょうか? 各機能を見つつ、考えてみましょう。
Site Guardプラグインの機能
管理画面のアクセス期限
このプラグインでは、管理画面へのアクセス制限をかけることができます。具体的には、24時間以内にログインしたIPアドレスのみ、管理画面にアクセスできるようになるというものですね。ただし、24時間でリセットされてしまうので、毎日ログインしなおす必要があります。また、リセットされてしまったタイミングで攻撃されて、万が一ログインされてしまったら逆に自分がログインできなくなったりしてしまうのではないでしょうか。
ログインURLを変更
後は、ログインURL自体を変更するという機能もあります。基本的にWordPressは「https://~.com/wp-login.php」というアドレスからログインすることができます。そのため、誰でも簡単にログイン画面までたどり着けてしまい、そこから総当たり攻撃などで不正ログインされてしまう可能性があるのです。それを解決すべく、ログインURL自体を変えてしまおうというのがこの機能ですね。だれも予測できないような名前のURLを作ってそこにログインページをうつしてしまえば不正ログインも大幅に減ります。
しかし、ログインURL自体を総当たり攻撃であぶりだされてしまったら特に意味はなさないのがこの機能です。定期的にログインURLを変えるのも大変ですしね…
画像認証機能
デフォルトではログインはユーザー名とパスワードだけで認証できます。これだとコンピュータで簡単に攻撃ができてしまうので、画像認証(人間じゃないと読めないような文字を表示させてそれを入力させる) を追加できる機能も含まれています。
しかしGoogleが導入しているような認証(信号機の写真を選択してください…みたいなやつ) ほどクオリティの高いものではないですし、最新の技術を使えば普通に画像解析ツールで突破されてしまうくらいのものです。
フェールワンス
正しいパスワードを入力しても一度あえて認証失敗にする機能です。こうすることでコンピュータによる攻撃では「よし、次のパスワードを試してみよう!」となってスルーしてくれるのでパスワードが暴かれずに済みます。
しかしそもそも何らかの形でユーザー名とパスワードの組を把握されてしまっている「リスト型攻撃」にはあまり効果がないですし、フェールワンスを想定されてしまっていたら総当たり攻撃にしても(突破までの時間はだいぶ長くなりますが) あまり対策ができないという問題が発生してしまいます。
Site Guardプラグインが必要ない理由
効果がない
他にも機能はあるわけですが、ログイン関係の主要な機能をざっとあげてみました。おそらくこのプラグインを導入することでログインを突破されてしまう可能性は数百分の一くらいまでは抑えられると思います。 しかし何らかの理由で多くの人のターゲットになってしまったとしたら、その数百分の一のわずかな隙間でも突破されてしまう危険性は否めないです。 そのため、厳密なセキュリティ対策はできないといった感じですね。
重い
Site Guardは非常に支持を得ている素晴らしいプラグインです。ですが素晴らしいプラグインほどそれなりに機能がたくさんあり、それなりにサイトが重たくなってしまう原因になってしまいます。 Site Guardプラグインに関してはましな方だとは思いますが、それでも塵も積もれば山となるでしょう。
プラグインは入れなくて済むならそれに越したことはないです。実際、私もSite Guardプラグインを試しに削除してみたら管理画面が体感で分かるくらい軽くなった感じがしました。
プラグインなしでサイトを守る方法
WordPressサイトへの攻撃の方法はたくさんあると思います。直接データベースに攻撃してきたりDoS攻撃をしたり…etc その中でも最も恐ろしいのが管理画面にアクセスされることですよね。
一度管理画面にアクセスしてしまえば基本的にどんなことでもできるわけです。投稿も全部消せるし、自分で必死に作ったテーマもすべて台無しにしてしまうことができるし…
そして管理画面にアクセスするにはログイン画面を経由する必要があります。 つまり、管理画面にアクセスされないようにするためにはそもそもログイン画面にアクセスできないようにすればいいのです。
ログイン画面にアクセスさせない方法
ログイン画面にアクセスさせないというのはつまり、ログインするためのPHPファイル(wp-login.php)を自分以外の人に利用できないように制限をかけるということです。 そしてこれには、「.htaccess」というファイルを操作する必要があります。
これはWebサーバーを建てるにあたってもっともよく使われている「Apache」というサービスの機能の一つです。(Nginxでは使用不可) 例えばかの有名なレンタルサーバー「Xserver」でもApacheが採用されています。
そして多くのレンタルサーバーでは、この「.htaccess」というファイルを操作する機能が備わっています。備わっていない場合や、自分でサーバーを立てている場合はサーバーにSSHで直接アクセスしてWordPressのディレクトリ(wp-login.phpがあるディレクトリ) に移動してVIMなどのテキストエディタで編集する必要がありますね。

例えばXserverなんかだとサーバーパネルにアクセスしていただいたら「ホームページ」という項目から編集することができるみたいです。 そしてここから自分のサイトのドメインを選択しつつ、以下のような記述を一番下に追加しましょう。
<FilesMatch "wp-login.php|wp-admin">
Order Deny,Allow
Deny from all
Allow from [自分のグローバルIPアドレス]
</FilesMatch>
自分のIPアドレスは、以下のサイトから確認できます。
https://www.cman.jp/network/support/go_access.cgi
間違っても自分のローカルIPアドレス(192.168.x.x)を入力しないように気を付けましょう。また、同じWi-Fiを使っていてもIPアドレスが変わることがあるので、アクセス拒否されるようになったら再びファイルを編集しましょう。
ちなみに同じパソコンを使っていても、ネットワークが変わったら(モバイルネットワークを利用したり、他のWi-Fiにつないだら) 基本的にグローバルIPアドレスは変わってしまいますので注意しましょう。
また、無料Wi-Fiなどを使っているときに設定しないように注意しましょう。あまり意味をなさないです。
上の記述の説明をしますと、「FilesMatch」という構文で、このディレクトリ内の「wp-login.php」と「wp-admin(管理画面)」というファイルについての記述を定義することができます。
そしてその中でDeny from all(基本的にすべての通信元を拒否する)、Allow from [自分のIP](ただし、このIPアドレスからの通信だけ許可する) と設定しています。ファイアウォールみたいなものですね。これで、自分以外の人は仮にユーザー名、パスワードを知っていたとしてもログイン画面にすらアクセスできなくなります。 しかもこの記述によってサイト自体が重くなることはありません。
なお、特殊な方法を用いると別のIPアドレスに成りすまして通信をすることもできたりするので、自分のグローバルIPアドレスが他の人に把握されないように気を付けましょう。また、あるWebサイトにアクセスしたとして、そのWebサイトはあなたのIPアドレスを簡単に知ることができます。 そのIPアドレスとあなたのWebサイトのURLが関連付けられてしまったら… という可能性もあるので、心配な方はこのIP制限+WP SiteGuardプラグインを使うなどすればほぼ確実に対策できるでしょう。
油断はしてはいけない
ただし忘れてはいけないのは、どんなに対策をしても突破されるリスクをゼロにすることはできないということです。htaccessファイルだって、レンタルサーバーにログインされてしまったら簡単に変えられますし、何のレンタルサーバーを使っているのかも簡単にわかってしまいます。
SSH通信のユーザ名とパスワードがばれたらWordPressごと消されてしまうかもしれないし、そもそも自分のパソコン自体にマルウェアが潜んでいたらそこから簡単に突破されてしまう可能性だってあります。 つまりネットワークに関係する機器すべてのセキュリティ対策をしっかりしないといけないということですね。穴は一つもあってはいけないのです厳密には。 パスワードを使いまわししないとか、サイトを放置しないで定期的にパスワードを変えたりするとか、そういった対策は常にやっていきましょう。
編集後記
最初にこの投稿のタイトルを考えたとき、めっちゃ長くなってしまったんですよね。長いとGoogleの検索結果に収まりきらなかったりしてもったいないので、それだったら重要なワードだけ残せば良いかと思ってもはや検索ワードみたいなタイトルになってしまいました。 でも日常から日本語を使う人だったらこのタイトルを見てある程度助詞・助動詞を補完することはできそうですし、そもそもそんな文っぽくしなくてもいいのかなと。
形態素分析したときにこちらの方が重要語の割合ってのが高くなると思うので、もしかしたら(多分ないけど)Googleからの評価が高くなったりするかなとか思ってやってみました。
案外いけそうだなと思ったら、これからちょくちょくこういうタイトルにしようかと思います。