WordPressのセキュリティを考えよう
昨今のサイト事情
この10年で多くの方がサイトを持つようになりました。
複雑なコーディングやプログラミングを理解してなければ決してつくることができなかったようなサイトも多々見るようになりました。
コーディングとプログラミングの知識・技術を持つ方と、そうでない方の制作物には埋めることができないほど大きな差ができています。それだけクオリティの差は大きな差になりました。
その中で「コードは書けないけれど、編集、更新をしたい」というニーズに応えるものとして「CMS(コンテンツ・マネジメント・システム)」というものへの注目が高まりましたね。
CMSはコードが書けない方の代わりに、プログラムがコードを書きだしてくれる というようにイメージしてもらえればいいかな、と思います。 その為、コーディングとプログラミングの知識・技術を持たずとも高品質なサイトが作成できます。
しかしながら当然、コードをそのまま書くのに比べ何倍もの時間と労力を要しますので 通常のサイト制作よりもコストは大幅に上がることが多い。 そうそう簡単に手を出すことができないものでした。
そんな中、オープンソースのフリーウェアが出現し始めます。 Wordpressもその一つ。元々はBlogをつくる為のソフトウェアでしたが、多彩なプラグインや拡張機能によって CMSに近い機能を持たせることができる、ということで大変な注目を浴びるようになりました。
WordPressは公開以後バージョンアップを重ね、様々な拡張機能を有するようになりました。 オープンソース特有のフォーラムも充実し、様々な機能改善や追加機能などが日々生まれていっています。 現在でも世界中で愛され、非常に多くのユーザーが利用しています。
- 「特別何の知識や技術ももたずともよい」
- 「無償で、かつ自ら何かを創出せずともあらゆるものが揃っている」
この2点が非常に大きなポイントとなり、こうしたソウフトウェアを利用する方はどんどん増えています。
しかし、一つ大切なことを覚えておかなければなりません。
単純なHtmlとcssでつくられたwebページ(サイト)に比べてプログラムを有するページやサイトはその分、管理も少し高度になります。
しかし、特別何も勉強なども何もしていなければ、単純なHtmlとcssでつくられたサイトと同じ管理をしてしまっていることでしょう。
それが大きなセキュリティホールになってしまいます。
なぜWordpressは狙われる?
A.単純に的が多い。
ダウンロード数だけでも億単位のWordpress。
下記は現在のWordpressダウンロード数のリアルタイムカウンター。
http://wordpress.org/download/counter/
一度ダウンロードしてしまえば、その一つのフォルダでいくつもサイトをつくることができるので 実質のWordpress使用数はこの数倍あるとみてもいい。
簡単にインストールでき、様々な機能を有する数多くのプラグインによって 簡単に高品質なサイトを構築できることもあり、利用者は世界的に多い。
この「簡単さ」が仇になってか
当然のことながらWebデベロッパーではない人が制作しているケースも多い。
(※Webデベロッパーとはいわば「Webサイトの専門のプログラマー」。僕もWebデベロッパーではない側の人間の一人になります)
中にはWebにあまり詳しくない人が使っているケースも大変多い。
phpはもちろんのこと、Htmlやcssすら分からない人にだって簡単にインストールして使うことができてしまう。
当然セキュリティは甘アマ=(可能性が高い)ということ。
特に下記のケースなどははっきり言っていい的だ。
サーバー備え付けの「かんたんインストール」をして特にセキュリティ対策を施すことなくそのまま使用している管理者の方も少なくない。
「かんたんインストール」を使用したユーザーは基本的にデータベース名、データベースユーザー名が全員共通になる。
また、ちょっとサイト構築のことを分かっている人なら絶対にやらないであろう危険なパーミッション設定や アクセスできてはならないファイルへ外部からアクセス・閲覧可能になってしまっているケースもある。
WordPressのファイルパーミッション(Wordpress Codexより)
基本として最低限度これだけは覚えておいて下さい。
- 説明書はしっかり読む!(上記Codex)
- phpファイルは表示できてはならない(index.php他Htmlを吐き出すphp以外のファイルはブラウザで表示できてはならない=エラーが返る設定を行う)
- 管理者以外に安易に書き込み権限を与えるものではない(使用状況による)
やりすぎ!?Wordpressセキュリティ対策
今回セキュリティ向上のために行ったものの一例と、色々と調べている中で見つけた「これはなかなかいいな!」と思ったものをいくつか紹介させていただきます。
ものによっては難易度が大きく異なるので、今回は主に特別な知識や技術がなくともすぐに行えるものを紹介させていただきます。
の各項目でお送りいたします。
4重鍵のログイン画面
まずは前回の記事にもあった「4重鍵」を手軽に設定できる方法として。 プラグインを利用した方法を紹介します。
ID、パスワードと共に
- 認証キー
- 画像認証
の四段階での認証をパスしなければログインできない仕様です。
使用するのは- Stealth Login Page
- SI CAPTCHA Anti-Spam
パスワードの下に「Authorization Code」(認証文字列)と「CAPTCHA Code」いうものが追加されていますね。 これらは上記2つのプラグインを有効化し、簡単な設定を行うと追加されます。
では、それぞれのプラグインに関する説明と設定方法について。
•Stealth Login Page
Stealth Login Page
以前はちょっと違う効果だったプラグインのようですが 現在は「ログイン画面に認証キーを追加する」というものに変わっています。
- まずはこの箇所にチェックを入れることで有効化
- ここに任意の認証キーを入力します。
- 認証失敗時にリダレクト(転送)されるページURLを入力します
3は確か記入しなくとも機能はしたと思いますが、リダレクトしなければいつまでもログイン画面に居座られることになるので
リダレクト先を記載しておいたほうがよいでしょう。
また、せっかくなのでサイトのページへリダレクトして1PVになってもらってから帰ってもらいましょう。
世の中は「Give and take」なのです。
この認証キーの優れている点が大小アルファベット、数字、記号に加えて「ひらがな・カタカナ・漢字」を認証キーとして用いることができる ということ。
ひらがな、カタカナ、漢字を織り交ぜて使用するのは世界中で日本だけ。 それだけに、海外で使うクレジットカードなどのサインを日本語にする方が多いのも それだけセキュリティ性が高いということ。 (※その字を使いこなせる絶対数が少ないから、という意味くらいですが)
また、前回のように「文字数」で考えたとしても
ひらがな、カタカナはそれぞれ50音(正確には48文字)。
漢字に至っては・・・・・ですね?
(常用漢字全部使えるのかは試していません・・数が多すぎて。。苦笑
ただ、PCに入っている漢字は全部使えるはず。)
なので、認証キーを大小アルファベット、数字、記号、ひらがな、カタカナ、漢字を織り交ぜて つくると非常に強固な認証キーが作成できます。
当然、これはID、パスワードと共に一致しなければ鍵が開かない訳ですから(IDに使用されている文字種の文字数)×IDの文字数×(パスワードに使用されている文字種の文字数)×パスワードの文字数×(認証キーに使用されている文字種の文字数)×認証キーの文字数+画像認証キー
の組み合わせとなり、考えられる組み合せ数は計算するのも嫌になるほどの天文学的数値となります。 つまり、強度としては申し分無し。
※参考
「パスワード強度の考え方」
•SI CAPTCHA Anti-Spam
SI CAPTCHA Anti-Spam
こちらはログイン、コメント、コンタクトなどの各種フォームへ「画像認証を追加する」プラグインです。
プラグインを有効化し、このオプション画面でチェックを入れた項目に画像認証を追加できます。
ログインフォームへ画像認証を追加する場合は、チェックボックスの一番上「ログインフォームでキャプチャを有効にする」の項目にチェックを入れればOKです。
ちなみに、このプラグインではコメントフォームやコンタクトフォームにも同様の画像認証を追加できるので スパムメールやスパムコメント対策にも有効です。
鍵は3つでも十分な効果を果たすでしょう。
bot相手には画像認証も十分有効とは言えますが、個人的には「認証キー」をおすすめします。
(毎回出てくる文字列を眺めてから入力しなければならないのも結構面倒なので・・)
認証キーなら覚えておけるキーワードでつくってしまうのもいいかもしれません。 自分の頭の中にしか記録されていないキーワードはセキュリティ性としては高いと言えます。 (※PCに記録させたりキーボードキャプチャーなどが潜まされていれば論外ですが)
日本語のみで、日本人ならではの言い回しや言葉遊び的なキーワードであれば案外海外の方には見破られにくかったりします。
例えばこのBlogタイトルをもじって「でザイん報告しョ」などであれば
ログイン試行回数制限
いくら鍵を強固にしていても、何度も試してよければいつかは破られます。
試せる回数は制限しましょう。
- の「Max Login Retries」で試行可能回数を設定し
- の「Retry Time Period Restriction」で何分以内に
- の「Lockout Length」で失敗時にどれだけの時間アクセス制限を行うか
- 「Author Slug」の一番上が元々の生ID。
- 2段目がニックネームがエンコードされた文字列(%e6%b7%b1%e4%ba%95%e5%ad%a6=深井学のような)
- 3段目の「Custom」の箇所に任意の文字列を入力すると、その文字列がスラッグ(URL)として適用されるようになります。
- どのユーザーが
- どこのホストから
- 何のOSでどのバージョンを使って
- 何のブラウザで
- いつ
•Limit Login Attempts(or Login LockDown)
・Limit Login Attempts
・Login LockDown
この二つはどちらもだいたい同じ効果ですので、いずれかをお好みで。
ちょっと切れてしまっておりますが、
をそれぞれ設定します。
2で設定した時間内に、1で設定した回数以上ログインに失敗すると、3で設定した時間アクセスを制限する
というものです。
3分内に5回間違うと15分アクセス制限、などインターバルの時間が短すぎてはあまり意味がないようにも思います。
アクセス制限は数時間単位がいいのではないかな、と思います。
・・ちなみに、ウチは結構いやらしい設定にしています。
また、その下のラジオボタンの箇所、どちらもYesにチェックを入れていますが
「Lockout Invalid Usernames?」はユーザー名(ID)を間違えた際も試行可能回数を減らすか?
ということです。
「Mask Login Errors?」はID、パスワードどちらが違うのかをMask(隠す)ということで こちらをYesにすると失敗時のメッセージが『ユーザー名、パスワードが違います』になります。
前回も言った通り、「情報は与えないこと、漏らさないこと」が鉄則です。 攻撃者にヒントを与えてはなりません。多重扉
ログイン画面に入る前に、もう一枚鍵付きの扉を設けて ここでも「足止めする」「諦めさせる」という方法です。
•BASIC認証
サーバーの基本機能の中に「BASIC認証」という機能があります。
.htaccessと.htpasswdを使用して特定のディレクトリ、ファイルへのアクセスを制限するものです。
これを用いて、ログイン画面に入る前にも正規のユーザーかどうかを判別させます。
BASIC認証の画面はアクセスするブラウザによって変わります。
(※こちらはChromeでアクセスした場合の画面)
効果的ではありますが、こちらはあくまでも「基本機能」。 あれこれと設定を施すこともできず、ただ事務的に機能してくれるだけのものです。 なので過信は禁物。
ただし、cgiを用いることで BASIC認証に対しても「○分内に○回失敗すると○分アクセスを拒否」といった アクセス制限の機能を持たせることもできます。
IDを隠す
これは「やっておいて損はないかな・・?」程度です。 実際すでにバレているならそこまで効果は高くないですが 新たに来た攻撃者には有効であることと、「ユーザーを変更したのか?」と思わせる効果はあるかな、と。 (表面上はダミー設定なのかユーザー変更なのかは分からない)
•Edit Author Slug
Edit Author Slug
通常、URLの書き変えは.htaccessによって行いますが、慣れない方にはちょっと難しく感じてしまうことも。 しかし、このプラグインを使うと.htaccseeを触らずともユーザーのスラッグ(URL)が自在に変更できます。
このプラグインを有効化するとダッシュボードの「ユーザー」の項目の最後に、下記画像のように「Author Slug」の項目が追加されます。
ここで自由にスラッグを変更できるようになります。
基本的には3番目にチェックを入れるのがよいでしょう。
ユーザースラッグを書きかえると、前回紹介した「URL/?author=数字」でユーザーを調べられてもここで設定したスラッグが表示される為 正しいユーザー名(ID)が第三者に漏れることはなくなります。
当然のことながらIDが間違っていればパスワードが正しくともログインすることはできませんので パスワード単体で守っていることから比べれば累乗的に防御率は上がります。
「IDを隠すこと」の目的は2重鍵に戻すことです。
管理画面へのユーザーの出入りを監視
•Crazy Bone(狂骨)
Crazy Bone(狂骨)
というプラグインを入れると、どのユーザーがログイン・ログアウトしたのか、の一覧が閲覧できるようになります。
プラグインの設定を有効化すると、パッと見は良く分からないのですが ダッシュボードの右上、ユーザーの箇所に「最終ログイン:○分前」と出るようになります。 ここをクリックするとログイン履歴一覧画面へ移動します。 (※一覧画面は個人情報のオンパレードですので、記載は控えさせていただきます・・御了承下さい。)
このプラグインの優れているところは
ログイン/ログアウト、ログイン失敗したのかを一覧で表示してくれる点です。
例えば、自分のIDが乗っ取られていた場合は 自分がログインしていないはずの時間にログイン・ログアウトの履歴が残るということになりますし、 自分が使っているOS(のバージョン)、ブラウザと違う組み合わせでログインしていても疑うべきと考えられます。
管理するには申し分の無い機能が揃っている非常に優れたプラグインだと思います。
ちょっと補足‥
ちなみに、前回の記事の「自分のサイトが攻撃された時の対応」の項目で書いていた 【荒らされた形跡が無いか調べる】の項目について補足しておきます。
- 見知らぬファイルが増えていないか
- ファイルの中身が改変されていないか
という二つのチェックを行う、と書いていましたが、 普段から触っていないと元々がどうだったか・・ということをいまいち把握できていないものです。
いちばん確実なのは、http://ja.wordpress.org/からWordPressをまるまるダウンロードしてきてサーバー内のファイルと一つ一つ見比べていくことです。
元々のデータ内に無いファイルは自分(or制作者)で追加したか 攻撃された際に埋め込まれたかということになります。
制作者が自分ではないなら、制作者に聞く。 自分ですべてつくっていた場合はいきなり中を開くのではなく、そのファイル名をググればどんなファイルなのか が出てきます。
また、よくあるものとしてテーマのphpファイルの中に eval(base64_decode(~))などといった一文が追加されているケース。 これは完全にアウト(悪意あるコード)なので、これをテーマ内からすべて削除しなければならない。
このevalコードを埋め込まれていた場合、いちばん確実なのはクリーンインストール。
Wordpress本体とテーマファイルを新品のものと完全に入れ換えてしまいましょう。
注意点として、フリーのテーマの中には元々このevalコードが埋め込まれているという、とんでもないものもあるそうです。 開発元は確かなもののほうが良いでしょう。
最後に
今回いくつかのセキュリティ対策ツールと方法を紹介しましたが これだけやれば「攻撃を『防げる』のではなく『しにくくする』」というだけである、という認識を忘れないで下さい。
今回紹介した手法は「万全なセキュリティ」ではありません。
施すことで、「普通」に比べれば「面倒くさいセキュリティ」のレベルにはなるでしょう、といったレベルです。
しかしながら、Wordpressを使用する上でこれは比較的効果的なものにもなります。
冒頭にも述べたようにWordpressを使用しているユーザーは数十億人以上。 攻撃者にしてみれば「的はいくらでもある」という認識なので 下手に攻めにくいところに時間をかけるくらいなら、ザルのところを探しだすほうが簡単で効率がいい。 =自分の管理するサイトが面倒だと感じさせられれば攻撃は止むことが多い。
結局のところ、セキュリティを破られるのは往々にしてヒューマンエラーです。
管理者は常に、意識を張ってセキュリティを保全していなければなりません。
また、ちょっと気合いを入れてセキュリティ対策をすれば
関連するphpファイルの中を書き変えていって
ディレクトリ構造や名称、ファイル名を変更すれば、通常のWordpress相手への攻撃はすべてスルーできるようにもなります。
Wordpressは(一応)ディレクトリ内にディレクトリやファイルを追加しても動きます。
それと今回紹介した内容のものなどを応用して組み合わせるなどして、セキュリティ強度を高めていきましょう。
Comments