- サイトデザイン工事中です。ご意見をお寄せください。
- 赤色のリンクは、まだ日本語Codexに存在しないページ・画像です。英語版と併せてご覧ください。(詳細)
Hardening WordPress
この項目「Hardening WordPress」は、翻訳チェック待ちの項目です。加筆、訂正などを通して、Codex ドキュメンテーションにご協力下さい。
セキュリティは重要なトピックで、グレーゾーンの部分が多くあります。WordPress 開発者はセキュリティを非常に重要なものと考えています。しかし、他のシステム同様、セキュリティ上の問題が発生することがあるかもしれません。また、セキュリティと利便性のバランスは常にトレードオフの関係にあります。WordPress を安全に保つためにできる一般的なことをいくつか紹介します。
セキュリティとは何でしょう ? 基本的には、セキュリティとは「クラックすることが全く不可能なシステム」を指しているわけではありません。そういうシステムは、見つける/維持するのが不可能でしょう。セキュリティは、信頼と責任に関するものです。例えば、信頼できるホスティング業者は、(Apache、IIS、あるいはその他の)ウェブサーバーの安定した、パッチの当てられたブランチを実行しています。ホスティング業者は利用者にそう伝えるべきです。また自身で行った設定をテストするべきです。そして、決断するのは利用者自身です。信頼できないホスティング業者は、パッチがリリースされても適用せず、実行しているバージョンを利用者に通知しません。
このガイドにそっていくつかのテーマが実行されています。
- アクセスの制限: 悪意ある人物が利用可能な潜在的な入り口を効果的に減らす選択をします。
- 抑制: あなたのインストールの弱点を悪意ある人物が発見した場合に備え、システム内部で実行できる損害を最小化するようにシステムを設定すべきです。
- 知識: バックアップを取り、定期的に WordPress インストールの状態を知り、WordPress インストールを理解しやすいよう、行った変更をドキュメント化しておきましょう。
目次 |
ローカルコンピュータの脆弱性
WordPress に投稿するコンピュータが、スパイウェア、マルウェア、アドウェア、ウイルス感染していないことを確かめましょう。またアプリケーションが安全で安定したバージョンであることを確かめましょう。例えば、キーロガーが仕込まれていれば、以下の対策はほとんど無意味になってしまいます。
WordPress パッケージの脆弱性
プログラムを書いた結果、WordPress に脆弱性があるかもしれません。攻撃者が HTTP 引数、不正な URI 文字列、フォーム入力などを渡して悪いことを行うかもしれません。
この問題に対処する方法は、次の二つです。
- WP のバージョンを常に最新にする: WordPress 開発者は、古いバージョンの WordPress のセキュリティパッチ当てを行いません。新バージョンがリリースされるか、脆弱性が修復されたら、脆弱性を利用するのに必要な情報はほとんど公開され、古いバージョンは、スクリプトキディが簡単に攻撃できます。WordPress インストールを複数管理している場合は Subversion に付随するスクリプト/en を使用してチェックアウトし、最新版にすることを検討するべきでしょう。
- バグを報告する: バグだと思うものを見つけた場合は、報告してください。詳しくは、バグの報告をごらんください。脆弱性、または脆弱性に繋がるバグを見つけたかもしれません。セキュリティ上の問題を見つけたと思う場合の報告方法については、セキュリティ FAQ をごらんください。
サーバーの脆弱性
WordPress を実行しているウェブサーバー、WordPress データのあるデータベース、プラグインで使用される PHP およびその他のスクリプト/プログラム言語あるいはヘルパーアプリケーションに脆弱性があるかもしれません。ウェブサーバー、データベース、スクリプトインタプリタが安全で安定したバージョンであることを確かめるか、これらの作業を行う信頼できるホスティング業者を使用しているか確かめてください。
共有サーバー(同じサーバー上に他人が同居)において忠告すべきことがあります。誰かが感染すると、たとえこのガイドにしたがっていた場合でも、あなたも感染してしまう可能性が高いです。使用しているホスティングサービスがどのようなセキュリティ対策を行っているか確かめておいてください。
ネットワークの脆弱性
ネットワークの両端、WordPress サーバーサイドとクライアントサイド、は信頼できるべきです。つまり、家のルータのファイアウォールルールをアップデートし、どのネットワークから作業するかについて注意すべきです。例えば、混雑したインターネットカフェで、暗号化されていない無線接続で平文でパスワードを送信するのは、信頼できるネットワークではありません。 ホスティング業者は、ハッカーによって汚染されていないことを確かめるべきですし、あなたもそうすべきです。ネットワークに脆弱性があると、スニファやその他の破壊 (中間者攻撃など) の発生を許してしまうかもしれません。
パスワード
セキュリティ向上のための習慣を守れば、脆弱性の一部は回避可能です。ここで重要な点のひとつに、パスワードがあります。自分の名前や、(どんな言語であれ) 辞書にある語や、4文字の数字をパスワードにしたりしてはいけません。パスワードの目的は、検索空間を可能な限り巨大にすることです。数字や大文字小文字を混在させると、統計的にブルートフォースを難しくします。管理者アカウントを別の名前にしていない場合は特に重要です。この場合、悪意あるユーザーは難問の半分を既に解いています。どのユーザー名が、ファイルやデータベースを編集する特権を持っているか知っています。 インターネット上に多くのパスワード自動生成ツールが公開されており、安全なパスワードを作成するのに使用できます。
ファイルパーミッション
WordPress の便利な機能のいくつかは、ウェブサーバーがファイルに書き込みできることに基づいています。しかし、アプリケーションがファイルに書き込み権限を持つことは危険です。公開環境では特に危険です。
セキュリティの観点からベストなのは、ファイルパーミッションを可能な限り制限して、書き込み権限が必要な時のみ制限を緩くする、あるいは画像アップロード等の目的のために制限の緩い特別のフォルダを作成することです。
考えられるパーミッションスキーマの1つを示します。
すべてのファイルの所有者はあなたのユーザーアカウントで、あなたのみ書き込み可能。WordPress が書き込み権限を必要とするファイルは、ウェブサーバーで使用するユーザーアカウントのグループ所有。
-
/-- ルート Wordpress ディレクトリ: すべてのファイルは、あなたのユーザーアカウントでのみ書き込み可能。- 例外
.htaccessもし WordPress でリライト規則を自動生成したい場合
- 例外
-
/wp-admin/-- WordPress 管理領域: すべてのファイルは、あなたのユーザーアカウントでのみ書き込み可能。 -
/wp-includes/-- WordPress アプリケーションロジックの大半: すべてのファイルは、あなたのユーザーアカウントでのみ書き込み可能。 -
/wp-images/-- WordPress が使用する画像ファイル: すべてのファイルは、あなたのユーザーアカウントでのみ書き込み可能。 -
/wp-content/-- ユーザー提供の様々なコンテンツ: 開発者/en により、すべて (所有者、グループ、全体) 書き込み可能に意図されている。-
/wp-content/themes/-- テーマファイル。ビルトインテーマエディタを使用する場合は、グループに書き込み権限を与える。ビルトインテーマエディタを使用しない場合は、あなたのユーザーアカウントでのみ書き込み可能。 -
/wp-content/plugins/-- プラグインファイル: すべてのファイルは、あなたのユーザーアカウントでのみ書き込み可能。 -
/wp-content/の他のディレクトリは、プラグイン/テーマの要求次第で異なる。
-
- サーバーへのシェルアクセスが可能な場合は、以下のコマンドでファイルパーミッションを再帰的に変更できます。
ディレクトリ:
find [your path here] -type d -exec chmod 755 {} \;
ファイル:
find [your path here] -type f -exec chmod 644 {} \;
/wp-includes/ にはこのコマンドを使用してはいけません。
共有サーバーの場合は、wp-config.php のパーミッションを 750 にすべきです。他のユーザーがデータベースユーザー名とパスワードを閲覧できないようにします。FTP またはシェルアクセスで、以下を実行してください。
chmod 750 wp-config.php
自動アップグレードに関して
Version 2.7 から、WordPress は自動アップグレードが可能になりました。すべてのファイル操作は、ウェブサーバーのユーザーではなくファイル所有者によって実行されます。ファイルはすべて 0644 に、ディレクトリはすべて 0755 に設定され、所有者のみが書き込み可能で、その他はウェブサーバーを含むすべてのユーザーに閲覧可能になります。
データベースのセキュリティ
同一サーバー上で複数のブログを実行している場合は、別々のデータベースに格納し、異なるユーザーが管理するのが賢明でしょう。最初の WordPress のインストールで実行するのがもっとも達成しやすいでしょう。これは、抑制戦略です。もし侵略者が WordPress インストールのいずれかのクラッキングに成功した場合、他のブログを改変するのが難しくなるでしょう。
MySQL をあなたが管理している場合は、MySQL 設定を理解しているか確認し、(外部 TCP 接続を受け入れるなどの)不要な機能が無効になっていることを確認してください。MySQL の優れた入門については、Secure MySQL Database Design をごらんください。
wp-admin を安全にする
サーバーサイドで /wp-admin/ にパスワードを追加すると、ブログ管理領域、ログイン、ファイルに第二層の保護を追加します。攻撃者またはボットは、実際の管理ファイルではなく、第二層の保護を攻撃する必要があります。ほとんどの場合、WordPress への攻撃は、悪意あるソフトウェアボットが自動実行しています。しかし、単に wp-admin/ ディレクトを保護するだけでは WordPress の機能の一部が使えなくなってしまいます。これは、Ajax ハンドラ wp-admin/ajax-admin.php やその他のファイルがパスワードなしではアクセスできないからです。正しい wp-admin/ ディレクトリのパスワード保護のやり方については、リソースセクションをご覧ください。
WordPress ブログへのよくある攻撃は、以下の2つのカテゴリに分類されます。
- 特定の脆弱性を食い物にする特別な細工をした HTTP 要求をサーバーに送信する。古い/更新されていないプラグインやソフトウェアへの攻撃も含む。
- 「ブルートフォース」パスワード推測により、ブログへアクセスを試みる。
重要なファイルに第二層の保護を追加することで、攻撃者は、/wp-admin/ に攻撃を仕掛ける前に、これを突破する必要があります。この保護は、Basic HTTP 認証を使用し、パスワードは平文で、暗号化されずにネットワークに流れます。この保護の主な利点は、サーバーファイルへのアクセスを拒否し、あなたのブログへの攻撃が /wp-admin/ の入り口に達する前に警告が発生することです。
"第二層"パスワード保護の完全な実装をするには、/wp-admin/ ディレクトリに HTTPS SSL 暗号化接続し、すべての通信と重要なデータを暗号化することが必要です。
wp-config.php を安全にする
wp-config.php ファイルを、WordPress をインストールした階層の一つ上に移動することができます。ウェブスペースのルートにインストールしている場合、wp-config.php をウェブルートの外側に格納できます。wp-config.php が、WordPress (wp-includes のある場所) インストールの一つ上のディレクトリに格納できることに注意してください。また、あなた (とウェブサーバー) だけがこのファイルを閲覧可能 (通常はパーミッション400または440) にしてください。
SSL 暗号化セキュリティ
WordPress 2.6 以降では、SSL を使った管理への対応が飛躍的に向上しています。
プラグイン
まず、利用しているプラグインが常に最新に更新されていることを確かめてください。また、使用していないプラグインはシステムから削除するようにしてください。
セキュリティプラグイン
WP Security Scan プラグインは、WP Security Scan からダウンロードできます。あなたの WordPress インストールを保護するのに役立ちますが、それでも、ハッキングに備え、良いパスワードを維持することや、プラグインやテーマをインストールする前に調べることや、ファイルやデータベースをバックアップしておくことが必要です。
ファイアウォールプラグイン
ルールデータベースおよび/またはホワイトリストにより、怪しい要求を排除するプラグインがあります。 BlogSecurity's WPIDS plugin は PHPIDS、PHP アプリケーションの一般セキュリティレイヤー、をインストールします。WordPress Firewall は、WordPress 向けに設定されたルールとホワイトリストで、様々な設定をすることなく攻撃を排除します。
書き込み権限を必要とするプラグイン
プラグインが WordPress ファイルとディレクトリに書き込み権限を要求する場合は、コードを読んで合法であることを確認するか、信頼できる人にチェックしてもらうようにしてください。チェックする場所は、サポートフォーラムと IRC チャンネルです。
コードを実行するプラグイン
上述のとおり、WordPress を強固にする目的には、攻撃が成功した場合の被害を抑えることが含まれます。データベースのエントリから任意の PHP やコード実行を許可するプラグインは、攻撃が成功した場合の被害が非常に大きくなります。
これらのプラグインを避ける方法の一つは、関数を呼び出すカスタムページテンプレートを使用することです。このセキュリティの一部は、WordPress でファイル編集を無効にする場合にのみ有効です。
隠蔽によるセキュリティ
Security through obscurity (隠蔽によるセキュリティ向上) は、典型的には、基本戦略として健全でない、と考えられています。しかし、WordPress のある領域では、情報を隠蔽することがセキュリティの助けになることがあるかもしれません。
- 管理者アカウント名の変更: 新規インストール時に、新しい管理者アカウントを作成し、(WP2.9 以前で)デフォルトの
adminアカウントを削除します。既存の WordPress インストールでは、MySQL コマンドラインクライアントでupdate tableprefix_users set user_login='newuser' where user_login='admin';のようなコマンドを入力するか、phpMyAdmin のような MySQL フロントエンドを使用して、名前を変更しても良いでしょう。 - table_prefix の変更: 多くの既知の WordPress を狙った SQL インジェクション攻撃は、table_prefix がデフォルトの "wp_" であることを仮定しています。これを変更することは、隠蔽によるセキュリティですが、SQL インジェクション攻撃の一部は防ぐことができます。
- 動作中の WordPress バージョンを公開しない: 既知の脆弱性のある古いバージョンの WordPress を動作させている場合は、バージョン情報を公開するのは賢明ではありません。WordPress バージョンを画してしましましょう。可能な限り最新に更新しているとしても、リリースとデプロイにはタイムラグがあり、悪意ある者が攻撃を実行するのに十分な時間かもしれません。しかし、テーマファイルの WordPress のバージョン(例えば、<meta name="generator" content="WordPress 2.9" />) を全て取り除くのは大変です。最新バージョンの WordPress を使用しているのを確実にするのが最良でしょう。簡単な方法として、Replace WP-Version、Secure WordPress、あるいは WP-Secure Remove Wordpress Version といったプラグインがあります。この行をプラグインを使わないで取り除くには、テーマの function.php ファイルに
<?php remove_action('wp_head', 'wp_generator'); ?>を追加してください。 注意: これは、あなたのサイトの WordPress 攻撃を防ぐものではありません。現在のワームはバージョンを無視します。(注意: 使用している WordPress バージョンを決定する方法は多くあり、"generator" はあまり使用されていません。)
データバックアップ
データを定期的にバックアップしましょう。MySQL データベース (データベースのバックアップを参照) もです。データ保全は、信頼できるバックアップに大切です。バックアップを暗号化し、各バックアップファイルに独立した MD5 ハッシュをつけ、バックアップを読み込み専用メディア (CD-R など) に保存すると、データが改変されていない、という信頼性が高まります。
健全なバックアップ戦略は、WordPress インストール全体も含む (WordPress コアファイルとデータベースを含む) 定期的なバックアップを信頼できる場所に保管することです。毎週バックアップするサイトを考えてみましょう。5月1日に感染し、5月12日まで発見されなかった場合、サイトオーナーは、サイトを再構築する助けとなる感染前のバックアップを持っており、感染後のバックアップはサイトが感染した方法を決定する助けとなるでしょう。
ロギング
WordPress に送信される全ての $POST 変数をログを取ることが可能です。標準 Apache ログはセキュリティ監視には、さほど助けにならないでしょう。
モニタリング
ときには、予防策が十分でなく、攻撃されることがあります。このため、侵入の検知/監視が非常に重要です。すぐに対策を取ることができ、何が起きたかを把握し、ブログを元に回復することができるでしょう。
ログの監視
(admin アクセス権限のある) 占有サーバーでは、パスワード推測試行、ウェブアタック等を検知するためにログを見る必要があります。リアルタイムでログを監視し、攻撃を防ぐ、優れたオープンソースソリューションは OSSEC です。
ファイル変更の監視
攻撃が発生すると、必ず痕跡が残ります。ログまたはファイルシステム (新規ファイル、変更されたファイル等) です。上で推奨している OSSEC を使用している場合、ファイルを監視し、変更があると通知します。ファイル変更の通知には、オープンソース Tripwire を使用することもできます。
悪意ある変更に備えて外部からウェブサーバーを監視する
攻撃者がサイトを書き換えたり、マルウェアを追加しようとするとき、ウェブベースの改善検知ソリューションを使用して、これらの変更を検知することができます。
リソース
- Brad Williams: Lock it Up (動画)
- .htaccess Apache チュートリアル: 認証、承認、アクセス制御 - ファイルを使ったディレクトリのパスワード保護に関する公式ドキュメンテーション
- ミケネコの htaccess リファレンス|ディレクトリ制御 - 上記よりも分かりやすく解説されたディレクトリのパスワード保護方法
- Nicolas Kuttler: Password protecting the wp-admin directory - Apache と lighttpd でディレクトリをパスワード保護する際、ajax-admin.php ハンドラを除外する方法
- wp-admin/ 他のディレクトリ向け AskApache Password Protection プラグイン 警告: AskApache Password Protection プラグインをインストールすると、WordPress 管理パネルにアクセスできなくなるかもしれません。このプラグインについて他のユーザーの体験を読むには、プラグインホームページのコメントをご覧ください。
参考
最新英語版: WordPress Codex » Hardening_WordPress (最新版との差分)