見落とすと大変なWordPressの脆弱性への対策

見落とすと大変なWordPressの脆弱性への対策

初めまして。
梅木と申します。
元々グラフィックデザイナーでしたが、現在はシステム寄りのディレクターを主にしています。
前職では音声収録、編集も行っていました。

梅木千世(うめき・ちせ)
取得資格
・Google AdWords認定資格(検索広告/ディスプレイ広告)
・Google Analytics個人認定資格
・格闘技のライセンスがありましたが失効しました。
「元ライブドア社員」で検索するとだいたい3ページめくらいに出てきます。

今回はWordPressの脆弱性をテーマに記事を書かせていただく事になりました。

まず最初に【Wordpress】とは

オープンソースで誰でも使う事のできるブログシステムです。
そのため、自由にカスタムする事ができます。
一般的なブログサービスでは、提供会社が指定するドメインでしか利用できなかったり、ロゴの表示が必須である事が多いですが、WordPressはそのような制約を受けることなく利用できます。

また、ブログシステムですがデザインを工夫することで、ブログだけでなく様々なWebサイトを展開することが可能です。
他にもWordpressのメリットや反対にデメリットなどは多々ありますが、これについては既に様々なところで語られていますので今回は割愛します。

それでは、今回のテーマである「WordPressの脆弱性」についてお話ししていきましょう。

オープンソースの宿命ともいえる「脆弱性」

既にご紹介した通り、WordPressはオープンソースです。
オープンソースとはつまり、誰でもソースコードを見ることができるということです。そのため、ソースコードを隈なく見ていけば、脆弱性を発見し、そこに攻撃を仕掛けることもできてしまいます。
例えば、Webサイトの内容を改ざんされてしまったり、ページが突然なくなってしまったりということが起きてしまう可能性があります。
こういったことを防ぐために、WordPressを導入する場合には脆弱性に留意して開発、運用する必要があります。

脆弱性対策その1:基本は『アカウント管理』

例えば、WordPressへのログインにユーザーネームとパスワードが必要だとすると、ユーザーネームさえわかればパスワードは総当たりで次々試すことで、いつかはログインできてしまう可能性があります。

WordPressの標準仕様では、「http://example.com/」といったURLの後に「?author=1」(末尾の数字は任意)をつけるとユーザーネームが表示されます。
この末尾の「1」はWordPressでアカウント発行した何番目のユーザーであるかを示す値で、1を指定すると、そのサイトの最初のユーザー、つまり管理者である可能性が高い、という事になります。

ユーザーネームが表示された例ユーザーネームが表示された例

ユーザーネームがわかれば、先に述べたように、総当りでパスワードを試すなどの方法で、第三者がログインすることができるようになってしまいます。
この問題は、プラグイン等で対処することができます。
例えば『Edit Author Slug』というプラグインは、ユーザーネームを隠し、投稿者・作成者の表示を「ユーザネーム」ではなく「ニックネーム」で表示してくれます。

脆弱性対策その2:ログイン画面は隠せ

アカウント管理の基本は、先に述べたようにユーザーネームを外部に知られないようにしたりパスワードを保護することですが、そもそもの対策として、パスワードの入力画面自体を見せない、という方法もあります。

ログインページが表示された例URLによりログインページが表示された例

今回は、手軽に対処できる方法をご紹介します。

対処その1:プラグインで対処

WordPressをはじめとしたオープンソースのシステムでは、原則的にシステムへのログイン画面が同じファイル位置になります。
Wordpressの場合は「wp-login.php」です。このファイルを別のファイルネームにするのは比較的大きな作業になりますが、最近では対応するプラグインも公開されていますのでぜひ、検索してみてください。

対処その2:アクセス元を制限

特定のIPアドレスからのアクセスでしか、ログイン画面を表示しない「IP制限」という方法です。
この制限を設けることで、例えば、社内ネットワークからしかログイン画面にアクセスできない、というような制限を設けることが可能です。

apache上で設定する方法もありますが、ここでは手軽に設置できる「.htaccess」ファイルを設置する方法をご紹介します。
この方法の場合には、サーバの再起動などは必要ありません。
1点注意したいのが、.htaccessは設置したディレクトリ配下のファイル全てに適用されるということです。
WordPressは、フロント画面と管理画面のファイルが同じサーバにあることが基本なので、ROOTに設置してしまうと、コンテンツ全体にアクセス制限がかかってしまいます。

ですので、.htaccessファイルは、管理画面に関するファイルの入っている「wp-adminディレクトリ」に設置するようにしてください。

wp-adminの例wp-adminfディレクトリの例

IP制限に関する.htaccessファイルの記述例:

order deny,allow(拒否してから許可を行うオーダー)
deny from all(一度全て拒否する)
allow from 【許可するIPアドレス1】
allow from 【許可するIPアドレス2】
ErrorDocument 401 【エラー時の転送先】
ErrorDocument 403 【エラー時の転送先】
ErrorDocument 404 【エラー時の転送先】
ErrorDocument 500 【エラー時の転送先】

このように記述すると、許可したIPアドレスからのアクセスのみログインができるように設定できます。
一部のIPアドレスからのアクセスを拒否するような場合には、denyとallowの記述が逆になります。

対処その3:ログイン画面へのアクセスにもユーザー認証

ユーザー認証にはデータベース認証、トークン認証などいくつか方法がありますが、ここでは比較的手軽に導入できる「ベーシック認証」の設定をご紹介します。

ベーシック認証の例ベーシック認証の画面例

ベーシック認証は、最もポピュラーなユーザー認証方法です。
ページにアクセスしようとすると、ユーザー名とパスワードを入力させるダイアログが表示されます。
導入はIP制限と同様に、制限を設けたいディレクトリに.htaccessファイルを設置します。この方法も、ROOTに設置してしまうとコンテンツ全体に制限がかかってしまいます。

ベーシック認証に関する.htaccessファイルの記述例:

AuthUserFile 【.htpasswdファイルのフルパス】
AuthGroupFile /dev/null
AuthName “【入力を求める文言】”
AuthType Basic
require valid-userdeny from all

これとは別に、パスワードを格納する.htpasswdファイルも設置する必要があります。

.htpasswdファイルの記述例:

【ユーザーネーム】:【パスワード(暗号化)】

パスワードは暗号化した上で記述するのが一般的です。
検索すると暗号化するサービスがみつかると思いますので、色々試してみてください。
また、ユーザーが複数いる場合には、改行して同じように【ユーザーネーム】:【パスワード】を記述していきます。

今回ご紹介した方法は一つだけでは不十分ですので、環境に合わせていくつか組み合わせて設置することををおすすめします。

最後に

WordPressの脆弱性はいくつも出てきます。今回ご紹介したもの以外にも脆弱性はありますし、オープンソースであるがゆえに、脆弱性がゼロになることはありません。

どの対処方法にも言える事ですが、WordPressのシステム利用は、ユーザーネームとパスワードの組み合わせで本人確認をするため、ユーザーネームとパスワードが外部に漏れてしまったら意味がありません。
企業などで利用する場合には、退職した社員のアカウントは削除するなど定期的なアカウント管理は欠かせません。
また、利用中のユーザーにおいても、定期的なパスワードの見直しなどは実施するべきでしょう。
運用する人間がWordPressには脆弱性があることを理解し、アカウント管理についてしっかりと意識して利用することで、不要なトラブルを防ぐことができます。

梅木千世でした。

*株式会社D2Cソリューションズは2016年10月1日に株式会社D2C dotへと社名を変更しました。