WordPressは今やもうインターネットで利用されている最も有名なコンテンツマネジメントシステムと言って間違いないかと思います。最初の頃こそ様々な批判を数多く受けましたが、Automattic社はその度にきちんと問題解決を行ってきました。ほどなくしてWordPressは有名なコンテンツマネジメントシステムの成長をサポートしてきた多数のブランドに採用されました。オープンソースであることは、ハッカーからの攻撃に対し脆弱性があるともいえます。その為WordPressで作られてサイトのWEBマスターは、セキュリティ上の問題を決して軽視してはいけません。
この記事は、http://www.onextrapixel.com/ の許可を得て、翻訳しています。一部変更して翻訳している部分もある場合があります。オリジナルの記事はここよりご覧いただけます。
私自身過去5年間ブロガーとして過ごしてきて、所有者の視点からのブログの重要性を理解しているつもりです。今回の記事では読者のみなさんがWordPressのセキュリティ問題への理解を深め、またどのように対処したらよいか理解するお手伝いが出来たらと思っております。そして今後もこのシリーズは続けていくつもりです。
注意書き:
- この記事にあるテストを始める前に、必ずWordPressブログのバックアップを取って下さい。かわいい我が子の挙動がおかしくなったら困りますものね。(その際、後述するWP Security Scanプログインを使用してください。)
- この記事ではプラグインの使用方法のみならず、手動で実行する方法も記述していきます。読者のみなさんは卓越したWEBマスターたちは、WordPressで全てのタスクをこなす為にプラグインに頼ったりしないと言うことを覚えておかなければなりません。また複数のプラグインを使用すると空きメモリを喰うので、動作が遅くなる傾向があることも覚えておきましょう。最後にWEBマスターたるもの、知識領域を増やす為に手動での方法をも試すべきだとも思いますよ。
WordPressのセキュリティ強化
初めに・・・(自動インストールは無しです)
ホスティング企業はWordPressのインストールを非常に簡単なものにしました。今の今まで一度もコーディングをしたことが無いような人でも、あっという間にブログをアップすることが出来ます。ホスティング企業はWordPressのインストールを超簡単にするためにFantasticoとcPanelのようなツールを統合しました。そのようなツールはパッと見とても有効に思えますが、WEBマスターにとって本当に有益であるかはまだ証明されていません。
手動でWordPressをインストールすると、データベース内のテーブルに自分の好きなプレフィックス(接頭辞)を付けることが出来ます。ちなみにデフォルトでは全てのテーブルにwp_というプレフィックスが使われており、このプレフィックスを変更しなければ、ハッカーのお仕事を半分手伝ってしまったことになります。その為自分で変更したカスタムプレフィックスをお使いになることをお勧めします。この作業は後述するプラグイン、または手動でのWordPressインストール中にwp-config.phpを書き換える事により可能となります。
それでは、インストールを始める前にwp-config.phpを開き、コードを下記の様に別のものに変更して下さい:
$table_prefix = 'wp_';
↓自分の好みのプレフィックスに変える↓
$table_prefix = 'myprefix_';
既に稼働中のブログを変更する場合、wp_プレフィックスを変更するには以下の様に2つの追加作業が必要となります。
1. phpMyAdminを使ってWordPressデータベースにログインし、全てのテーブルネームをカスタムプレフィックスに変更してください。
2. 「optionsテーブル」と「usermetaテーブル」内の幾つかのフィールドでもwp_プレフィックスが使われている可能性があるので、以下のクエリーを走らせてプレフィックスを変更してください。
SELECT * FROM `myprefix_options` WHERE `option_name` LIKE '%wp_%' SELECT * FROM `myprefix_usermeta` WHERE `meta_key` LIKE '%wp_%'
お役立ちプラグイン
WP Security Scanというプラグインはデフォルトのwp_プレフィックスを別のものに変更してくれます。インストールした後に「Security」>「Database」へ進んでインストラクションに従ってください。
スパマー対策「Akismet」
あまりに有名過ぎるアンチスパムプラグインAkismetのことをご存じない方はいらっしゃらないかとは思いますが、この先Akismet無しで進むことは、スパマーたちに対して「さぁどうぞ私のブログにスパムコメントを書き込んでください!」と両手を広げて歓迎しているような状態になってしまい非常に危険なので、念のためここに書いておきますね。Akismetは必須です!!
「SALT」
SALTはWordPressのパスワードのセキュリティを強化するシークレットキー認証方式です。パスワードをソルトすると、ここで生成される複雑なハッシュ文字列(ここではページがリフレッシュされる度に、ランダムハッシュ文字が生成されています。)を付加することにより、ブルートフォース攻撃からWordPressのインストールをを保護します。データベース証明書のすぐ下にある8行のコードをwp-config.phpファイルにコピーして下さい。これだけで完成です♪
まず、もしWordPress 2.5かそれより新しいバージョンのWordPressをインストールして使っているのであれば、wp-config.phpファイルにシークレットキーが既に存在するはずです。そのデフォルト値はハッカーたちに知れ渡っているので、この値も変更すべきです。次に、元々WordPress 2.5より古いバージョンのWordPressを使っていて、それをアップデートして今でも使用しているのであれば、wp-config.phpファイルに手動で追加する必要があります。
お役立ちプラグイン
Chap Secure LoginプラグインはWordPressログインをまた別の方法で保護します。プラグインを有効にした後、暗号化されないで転送される文字列はユーザー名のみです。パスワードは複雑なMD5アルゴニズムでハッシュされます。またゼロ設定のプラグインであるため、コンフィグ変更を行う必要もありません。
注意書き:
インストール後の初回ログイン時は必ず失敗しますが、2回目は成功します。なので、プラグインのインストール後の初回ログインに失敗しても慌てず、もう一度パスワードを入力してください。
ログイン試行制限
WordPressのログインセキュリティに関して論ずるのであれば、セキュリティ強化の為に別の機能を追加するというのは、なかなか良いアイデアだとは思いませんか。Login LockDown WordPress pluginプラグインは、WordPressブログへのログイン試行を失敗した特定範囲のIPアドレスをブロックします。このプログインは3回ログインに失敗すると、IPアドレスを1時間ブロックします。この機能はオプションパネルで変更が可能で、管理者には必要に応じてブロックされたIPアドレスを解放するアクセス権があります。
パスワードチェック機能
Login WordPress Password Checkerは複数の筆者がいるブログに便利なプラグインです。このプラグインは、新しいユーザーがパスワードを作成する際に、定義されたリストと照らし合わせ、リスト上のパスワードの使用を禁止します。これにより新しいユーザーが推測されやすい簡単なパスワードを作成することを防ぐことが可能です。
プラグインディレクトリのdictionary.txtファイルにパスワードを追加することも出来ますが、パスワードデータベースが増加すると応答時間も長くなることも頭に入れておいてください。
デフォルトユーザー名のadminは使わない
もし私があなたのWordPressインストールをハッキングしようと思ったら、まずWordPressインストール時に使用されるデフォルト値から攻めていきますね。そしてもしあなたがインストールする際にデフォルトユーザー名の「admin」を管理用にそのまま使用されていたとしたら、もう私の仕事は半分は終わったようなものです。あなたのユーザー名は分かってしまっているので、後やらなければならないのはパスワードを推測する事のみです。
管理者ユーザーの変更方法
- 新しく管理者権限を与えるユーザー名を作成する。
- 「admin」ユーザーを削除する。
- 任意のユーザーを削除する前に、削除するユーザーが所有していた投稿やリンクをどのようにするかとWordPressが確認してくるので、「Attribute all posts and links to(すべての投稿とリンクを次のユーザーに割り当てる)」を選択する。
次回「admin」を使ってログインを試みても、もうアカウントは削除済みで存在しないのでお気を付け下さいね。
wp-config.phpファイルの保護
wp-config.phpファイルはWordPress インストールで最も大切なファイルの1つです。このファイル内には、ハッカーがWordPressデータベースへアクセスするのを容易にしてしまうような重要な管理権限が含まれています。その為、.htaccessファイルに以下のコードを加えて下さい。
# protect wp-config.php <files wp-config.php> order allow,deny deny from all </files>
.htaccessファイルはwwwのルートディレクトリにあるはずです。もしそこに無かったらファイルを新規作成し、上記のコードを追加してください。
ディレクトリ一覧の非表示
先ほどwp-config.phpを保護しましたが、それだけではまだまだ足りません。WordPress インストールには沢山のディレクトリがあり、ちょっとデキるハッカーならば簡単にアクセス出来てしまいます。.htaccessファイルに下記のコードを加えて、パブリックからの閲覧を不可能にさせましょう。
Options –Indexes
この変更を行うと、変更を行った特定のディレクトリの内のサブディレクトリへのアクセスを無効にします。
パスワード強度の確認
先ほどWordPress Password Checkerのプラグインのところで、他のユーザーが予測されやすい簡単なパスワードを使うことを制限する方法を説明しましたが、こちらのプラグインで更に一歩セキュリティ強化を図れる事間違いなしです。基本的な考え方としては、管理者パスワードにはガールフレンドの名前なんて使わないように!ということです。責めているわけではありませんよ。みんなやることです。
WP Security Scanプラグインは既にインストールされているかと思いますが、ダッシュボードの「Security」オプションメニューの下に「Password Tool」オプションがあるかと思います。それをクリックするとパスワードツールの以下のような画面が表示されるはずです。
強力なパスワードを生成して、何度も忘れてしまうことが無いようにどこかに保存してください。ちなみに上記の画像で赤で表示されているパスワードに意味はありません。
WP_head部分からバージョン情報の削除
WP Security Scanプラグインを既にインストールしていればもう準備万端ですが、1つ確認しておいた方がよいことがあります。WordPress 2.6以降の場合、WP_head部分に自動的にバージョン情報が記されてしまいます。これにより何か問題が発生すると言うことはありませんが、ハッカーに使用バージョンを知られてしまうとハッキングの脆弱性も増してしまうと言えるでしょう。WP Security Scanプラグインは、何も変更を加えなくとも自動的にWP_head部分からこのバージョン情報を隠してくれます。
プラグインインストール後はこのように表示されているはずです。
注意書き:
もしあなたが洞窟の奥の方か何かに住んでいて、2.6よりも古いバージョンのWordPressを使用していたとしたら、使用中のテーマから手動でバージョン情報を削除する必要があります。header.phpファイル(Appearance > Editorで見つかるはずです)内で、下記のメタタグを見付けて削除して下さい。もし該当のメタタグが見当たらなかったらラッキーです♪
<meta name="generator" content="WordPress <?php bloginfo('version'); ?>" />
複数ユーザーへの権限割り当て
今回のステップは複数のユーザーがいるブログにとって非常に重要です。ブログが成長してユーザーの数も増えてきたら、それぞれのユーザーに与える権限をきちんと分析しておいた方がよいでしょう。そして以下のどのプラグインを使用するか選ぶ時期が来たと言えるでしょう。
以前branding our WordPress dashboardという記事で取り上げたプラグインを思い出してみましょうか。Adminimizeは視覚的に変化を与えるだけではなく、あなた自身のダッシュボードだと言う気分にさせてくれます。このプラグインは素晴らしくて、複数ユーザーそれぞれがダッシュボードのメニューやサブメニュー内でどんな作業が出来るのか有効化(もしくは無効化)させることが出来ます。このプラグインを使えば、ほぼすべての機能を有効化(もしくは無効化)させることが出来てしまいます。
注意書き:
Role ScoperやCapability Managerと言ったプラグインはAdminimizeよりもよい選択肢なのですが、最新バージョンのWordPressに合わせてアップデートされていないので、お勧めは致しません。もし評判を聞いて使ってみようかなと思うのであれば、あなたご自身の責任で行ってくださいね。
フォルダへのアクセス権
適切なユーザーに適切なフォルダアクセス権を与えることは、セキュリティ強化にも繋がります。壁に頭を打ち付けて、どのユーザーにどのようなアクセス権を与えるか悩むよりも、WP Security Scanをインストールすることをお勧めします。インストールした後にダッシュボードの「Security」 > 「Scanner」へ行くと、以下のような画面が表示されるかと思います。
もし全て緑色ならば、問題なしです。もしそうでなければ、プラグインのガイドラインに従って、フォルダへのアクセス権を変更することとお勧めします。
wp-adminの保護
この記事の中で何度かwp-adminフォルダを最適なセキュリティ状態にするための方法を述べてきました。wp-adminフォルダのセキュリティを更に強化する為にはAskApache Password Protectと言うプラグインを使う選択肢もあります。その他の機能に加え、このプラグインのパスワードはwp-adminディレクトリとログインページを保護してくれます。従って、誰かがwp-adminディレクトリにアクセスしようとするとアクセスするための権限を求められます。
WordPressを定期的にバックアップ
バックアップ!バックアップ!バックアップ!今まで何十回何万回と、WordPressデータベースを定期的にバックアップするよう言われてきたかと思います。そうでなければ大変なことになりますよ。これは本当にその通りで、遵守した方がよいですよ。既にインストール済みのWP Security Scanを使ってバックアップを取り、.sqlファイルをダウンロードする事も出来ます。また、WP-DB-Backupプラグインを使うとバックアップオプションを拡張することが出来ます。
WP-DB-Backupプラグインで出来る事
- デフォルトのバックアップには含まれないカスタムテーブルを含ませることが可能
- お使いのコンピュータにバックアップをダウンロードし、オンラインサーバで保存したり、メール送信することが可能
- 必要に応じてバックアップの予約
注意書き:
- 決してダッシュボード自体にバックアップを取らないで下さい。もし私が(重大な損害を起こすでもなく)ただ何となくちょっとからかってみようかななんて思い付き、ブログのダッシュボードへのアクセス権限を持っていたとしたら古いバックアップの復元を行います。これって不気味に面白いですよね。そう思いませんか?
- 定期的にダミーのWordPressインストールでバックアップのテストを行ってください。壊れた古いバックアップを復元しようと四苦八苦するよりイライラすることはあんまりありませんよ。交通量の激しい高速道路の真ん中で立ち往生するようなものです。
WordPress用のMySQL権限
このセクションはよくよく目を開けてご覧くださいね。famous 5 minute WordPress installationはWEBマスターがWordPressデータベースにアクセスするユーザーに全ての権限を与えるよう示唆しています。これが何を意味するかと言うと、特定のユーザーが文字通り全ての権限を保有することになるので(非常に稀なケースですが)セキュリティ上の脅威と成り得ると言うことです。
MySQLデータベース用の推奨パーミッション:
- SELECT
- INSERT
- DELETE
- UPDATE
- CREATE
- DROP
- ALTER
- INDEX (あまり使われる事もないですが・・・)
避けた方がよい推奨パーミッション:
- EXECUTE
- CREATE ROUTINE
- ALTER ROUTINE
- CREATE VIEW
- SHOW VIEW
- REFERENCES
- CREATE TEMPORARY TABLES
- LOCK TABLES (ハッカーに使われてしまったら、何も原因が分からないままテーブルがロックされてしまいます。)
注意書き:
先に提唱したパーミッションだけで殆どの操作が可能ですが、もしかしたらブログが変な動作をし始めることがあるかもしれません。その際には権限を高め、それが実際役に立つかどうか確認してみて下さい。こんなことは起こらないのが一番ですが、もしそういうことが起こった時の為に、私が何を警告しているのか把握しておいた方がよいと思いますよ。
HTTPSの使用と信頼性の高いホスト会社の選択
HTTPSセッションを使用するには、wp-config.phpファイルにいくつか変更を加える必要があります。SSLはセキュリティで保護されたチャネルを使用する為に、バーチャルホストを使用してドメイン内でコンフィグされている必要がございますのでご注意下さいね。詳細はホスティング会社にご確認ください。
wp-config.phpファイルに以下のコードを加えると、セキュリティで保護されたチャネルを通る全ての管理セッション及びログインを変換してくれます。
define('FORCE_SSL_ADMIN', true); Please note that this line must be added above the code: /* That's all, stop editing! Happy blogging. */ ... require_once(ABSPATH . 'wp-settings.php');
これでうまく効果を与えてくれるはずです。
SSL証明を使うことはコスト的にも少し負担がかかりますが、もし信頼出来るホスティング会社をお使いであれば、きっと(割引は無いかもしれませんけれど)スムーズにプロセスが進むかと思いますよ。一度SSL証明がインストールされれば、それからWordPressブログで行われるセッションはセキュリティ保護されたチャネルを介して作成されることになります。それはハッキングからブログを守るもう1つのセキュリティ層として機能してくれます。
WordPressでのSSLの複雑さを理解する為にはAdministration over SSLを参照するとよいかと思います。最後に、ブログ用にSSL証明を得るにはホスティング会社が最も強い味方となってくれるはずですので、きちんとホスティング会社に確認してみるとよいですよ。
常に最新バージョンへアップデートする
これは非常に大切なことです。既知のセキュリティ脆弱性から守るために、あなたのブログがWordPressの最新バージョンを使用しているかどうか常に確認しておく必要があります。WordPressはオープンソースのコンテントマネジメントシステムであるが故に、ハッカーのターゲットにもなり易いのです。もし最新版のWordPress使用していれば、ハッカーからの攻撃を遠ざけることが出来ます。
終わりに・・・
これで全てですか?はい、今のところはこれで終わりです。今回WordPressを保護する為にお伝えした数々のヒントは、WordPress インストールを保護するのに充分な情報です。他にもここに記されていないトリックを使っている方はいらっしゃいますか?