みなさんの WordPress はセキュリティ対策できてますか?
世界中の Web サイトの約25%が WordPress で作られているという調査があるほど今や絶大なシェアを誇る WordPress ですが、それに比例して WordPress をターゲットにした悪質な攻撃も近頃増えているようです。(W3Techs、最新Web脆弱性トレンドレポート より)
「じゃ、WordPress のセキュリティ対策って具体的に何をすればいいの?」
そんな方にとても参考になりそうな「WordPress Security Checklist」というサイトがありましたので、その内容を紹介してみたいと思います。
全部で32項目もあるリストですが、頑張って見てみましょう!
ログイン画面
まずは、ログイン画面に対しての対策です。
繰り返しログインに失敗したらログイン画面にロックをかける
Web サイトへの攻撃者は、ブルートフォースアタック(総当たり攻撃)と呼ばれる方法で WordPress に不正なログインを試みてきます。それに対して、繰り返してログイン認証に失敗した場合はログイン画面をロックする対策を取ることで、その攻撃を軽減することができます。
ログイン画面にロックをかけるには「Login Lockdown」「iThemes Security」等のプラグインがあります。
- WordPress › Login LockDown « WordPress Plugins
- WordPress › iThemes Security (formerly Better WP Security) « WordPress Plugins
こちらは「Login Lockdown」プラグインで、ログイン画面にロックがかけられた時の様子です。
2段階認証を有効にする
2段階認証を有効にすることで、ログイン認証の強度をより高めることができます。
プラグイン「Google Authenticator for WordPress」を使うと、WordPress に Google の2段階認証を組み込むことができます。
ユーザー名の代わりにメールアドレスをログインに使う
「WP Email Login」プラグインをインストールすると、ログイン認証にユーザー名とメールアドレスの両方を使えるようになります。
例えば、ユーザー名は推測できないランダムな文字列にしておき、メールアドレスを認証に使うようにすることで、少しでも攻撃者から推測しにくいログイン情報を作ることができるでしょう。
ログイン画面の URL を変更する
攻撃者は WordPress 標準のログイン画面 URL (wp-admin、wp-login.php)に対して不正アクセスを行います。ログイン画面の URL を変更して、アクセス先を隠蔽することも セキュリティ上効果があります。
「iThemes Security」のようなプラグインを使うと、ログイン画面の URL を変更することができます。
テーマからログイン画面へのリンクを削除する
一般的な Web サイトの場合、ログイン画面への URL はサイト運営者だけが分かっていれば良い情報です。
もし使っているテーマに、ログイン画面へのリンクが含まれるページがあれば、そのリンクは削除しておきましょう。
全てのアカウントに対して大文字、小文字、数字、特殊文字を含む強力なパスワードを使う)
アカウントのログインパスワードには大文字、小文字、数字、特殊文字を交えた推測されにくい文字列を設定するようにしましょう。
WordPress にはパスワード入力時にその強度が表示される強度表示器が付いているので、それを参考にしながら設定すると良いでしょう。
また、パスワードを作成するのが手間な方は「password generator」のような Web サービスを利用して、パスワードを自動生成するのも便利です。
定期的にパスワードを変更する
WordPress に限ったことではありませんが、パスワードは定期的に変更するようにしましょう。
※ちなみに、パスワードの定期変更はその是非がよく議論となります。下記のようなページも参考に、そのメリット・デメリットをケースバイケースで判断して方針を決めるのが良いでしょう。
- 世の中に満ち溢れる「パスワードの定期的変更」についてまとめてみた。 – piyolog
- パスワードの定期的変更がセキュリティ対策として危険であることにGoogleとIPAは気づいている | まるおかディジタル株式会社
ログインエラーメッセージを汎用的なものにする
WordPress 標準のログインエラーメッセージは、どの入力項目が間違えているかまで丁寧に表示されますが、これは第三者にログイン情報を推測する情報を与えてしまうためセキュリティ上好ましくありません。
functions.php に次のようなコードを追記することで、エラーメッセージをより汎用的なものに変更することができます。
上記の変更を適用後のログインエラーメッセージがこちら。
管理画面
ここからは、WordPress の管理画面に関する対策です。
wp-admin ディレクトリをパスワード保護する
wp-admin ディレクトリに Basic 認証でパスワードをかけることで、攻撃者が直接ログイン画面へアクセスすることを避けることができます。
ただし、認証がかかっていると機能的に不都合が生じる一部のファイルについては、下記のような方法で制限を解除してください。
WordPress を最新版にアップデートする
WordPress で発見された脆弱性は、最新版でその都度対策が施されていきます。言い換えれば、古いバージョンを使い続けることは脆弱性を抱えた WordPress を使うことにもなるわけです。
WordPress は常に最新版にアップデートして使うようにしましょう。
admin という名前でユーザーを作成しない。もしある場合、そのアカウントは削除して新しい管理者ユーザーを作成する
WordPress でデフォルトのユーザー名として使われてきた「admin」は、不正ログインを試みる攻撃者に最も狙われるユーザー名の一つです。admin という名前のユーザー名は作成しないようにしましょう。
もし admin ユーザーがすでに存在する場合は、admin を削除して別の名前でユーザーを作り直すことが望ましいです。
admin ユーザーを削除する手順
- WordPress に admin でログインする。
- admin とは別の新規ユーザーを作成し、そのユーザーに管理者権限を割り当てる。
- admin をログアウトする。
- 新規作成したユーザーでログインする。
- admin を削除する。(※削除時に「すべての投稿とリンクを次のユーザーに割り当てる」を新規作成したユーザーに設定すること。)
編集者権限のユーザーを作成し、コンテンツの公開はそのユーザーを使用する
記事の作成を行うための編集者権限を持つユーザーを作成して、普段はそのユーザーを使用するようにしましょう。
万が一そのユーザーに対して不正ログインが行われた場合に、その被害をより少なく留めることができるはずです。
管理画面のアクセスには SSL を使用する
通常の http アクセスを行っている場合、その通信を傍受した第三者にログイン情報や転送データが盗まれてしまう可能性があります。
SSL で通信内容を暗号化していれば、もし傍受されても情報が特定されることはありません。
ファイルの変更をチェックするプラグインをインストールする
攻撃者は Web サイトの脆弱性をついてファイルを書き換え、悪意のあるコードを埋め込んでくることがあります。
「WP Security Scan」「Wordfence」「iThemes Security」といったプラグインを使うことで、WordPress のファイルに不正な書き換えが行われていないかチェックすることができます。
- WordPress › Acunetix WP Security « WordPress Plugins
- WordPress › Wordfence Security « WordPress Plugins
- WordPress › iThemes Security (formerly Better WP Security) « WordPress Plugins
ウィルス、マルウェア、セキュリティ侵害に対してウェブサイトをスキャンする
WordPress サイトがウィルス等のマルウェアに感染していないか、ウィルススキャンソフトやサイトチェッカー等でスキャンをかけて、定期的に安全性をチェックしておきましょう。
例えば、Web 上でサイトのチェックができるサービスとしては、次のようなサイトがあります。
下記の画面は、Sucuri を使って当サイトのサイトチェックを行った例です。
テーマ
次はテーマについての対策です。
テーマを最新版にアップデートする
WordPress 本体と同様、脆弱性の対策が取られている最新版のテーマを常に利用するようにしましょう。
使っていないテーマを削除する
使用していないテーマを残したままにしておくと、もしそのテーマに脆弱性が存在した場合、攻撃者にそのファイルを狙われる隙が生じてしまいます。
使わないテーマは、サーバ上からファイルを完全に削除しておきましょう。
信頼できるソースからテーマをダウンロードして使用する
インターネット上で検索すると見つかる WordPress テーマの中には、実は悪意のあるコードが埋め込まれたテーマも多く存在します。配布元が必ず信頼できるテーマだけを使うようにしましょう。
なお、信頼できるテーマを見つける最も確実な方法は、WordPress 公式サイト テーマディレクトリに登録されているテーマから選択することです。
テーマから WordPress バージョンの表記を削除する
テーマによってページ内に WordPress のバージョン番号が埋め込まれたものが存在しますが、それは悪意のある攻撃者に対してヒントを与えているようなものです。バージョン番号を表示している箇所は削除しておきましょう。
テーマからバージョン表記を削除する方法は、下記ページが参考になります。
プラグイン
続いてプラグインに関する対策です。
全てのプラグインを最新版にアップデートする
WordPress 本体やテーマと同様な話です。脆弱性に対する対策が施された最新版のプラグインを利用するようにしましょう。
使っていないプラグインを削除する
テーマでも同じ話題が出ましたが、使用していないプラグインを残しておくと、もしそのプラグインに脆弱性が存在する場合にそこがセキュリティホールになって、攻撃者に狙われてしまいます。
使用しないプラグインは、「停止」して無効化するだけではなく、サーバ上からファイルを完全に削除しておきましょう。
信頼できるソースからプラグインをダウンロードして使用する
こちらもテーマで出た話と同様です。悪意のあるコードが埋め込まれたプラグインを誤って利用してしまうことがないように、プラグインは信頼できる配布先から取得したものだけを利用しましょう。
信頼できるプラグインを見つけるには、WordPress 公式サイト プラグインディレクトリに登録されているものから探すのが確実です。
古いプラグインは代わりとなる新しいプラグインに置き換える
古くて開発が止まっているようなプラグインだと、最新版の WordPress に対応していなかったり、脆弱性が発見されたときに迅速にアップデートが行われないといった不都合が起きることがあります。
利用しているプラグインと同等な機能を持つ別のプラグインがある場合、より新しくて頻繁に更新も行われているプラグインに置き換えることも検討すると良いでしょう。
たくさんプラグインをインストールする前によく考える
プラグインはとても便利な仕組みですが、たくさん入れれば入れるほど前述のようなセキュリティ上のリスクも高まるし、その管理の手間が増えることにも繋がります。
導入する前にそのプラグインが本当に必要かよく考えてみて、必要なものだけをインストールするようにしましょう。
データベース
次はデータベースについての対策です。
デフォルトのテーブル接頭辞を変更する
WordPress をインストールする際に、デフォルトでは全てのテーブル名に「wp_」という接頭辞がセットされますが、これでは攻撃者にテーブル名が特定されてしまうため SQL インジェクション攻撃のリスクが高まってしまいます。
テーブル名を推測されにくくするため、接頭辞にはデフォルト以外の文字列をセットするようにしましょう。
なお、すでにテーブル接頭辞「wp_」でインストール済みの場合、下記ページのような方法でテーブル名を変更することも可能です。
データベースバックアップを週単位でスケジュールする
データベースの定期的なバックアップを行うようにしましょう。
万が一データベースに攻撃を受けてしまった場合、適切にバックアップを取っていれば、安全な時点までデータを復旧したり、攻撃前後のデータを比較して原因の特定を行ったりすることが可能になります。
wordpress の定期的なバックアップを行うことができるプラグインには「Backup」「WP-DB-Backup」等があります。
データベースのユーザーに対して大文字、小文字、数字、特殊文字を含む強力なパスワードを使う
データベースのユーザーのパスワードには大文字、小文字、数字、特殊文字を交えた強度の高い文字列を設定するようにしましょう。
前述の「password generator」のような Web サービスを利用して、パスワードを自動生成することもできます。
ホスティングサービス
最後に、サイトを運用するホスティングに関する対策内容です。
信頼できるホスティングサービスを借りる
photo credit: IMG_9352 via photopin (license)
Web サイトを運用するホスティングサービスには信頼できるものを利用するようにしましょう。
サポートやセキュリティ面で問題があったり、前触れも無く突然サービスを終了してしまうような業者も中には存在します。
サーバへの接続は SFTP か SSH を使用する
ファイルの転送は SFTP、コンソールでのログインは SSH など、サーバ接続を行う場合は暗号化された方式で行うようにしましょう。
例えばファイル転送に FTP を使用していると、サーバー間の通信が全て平文で流れてしまうため、パスワードやデータが傍受されてしまう恐れがあります。
全てのディレクトリのパーミッションを 755、ファイルのパーミッションを 644 に設定する
WordPress にはメディアのアップロードやファイルの編集など、サーバ上のファイルやディレクトリへの書き込み権限が必要となる機能が幾つかありますが、不正な書き込みを防ぐためパーミッションをできるだけ制限して、必要最小限の書き込み権限だけ設定することがセキュリティ上重要です。
Codex(ファイルパーミッション) に書かれている説明を参考に、ディレクトリ毎に適切なパーミッションを設定するようにしましょう。
wp-config.php ファイルが他者からアクセスできないことを確認する
wp-config.php は、データベースの接続情報など WordPress の基本設定が記述された重要なファイルなので、一般ユーザーからはアクセスできない場所に格納しておくことが好ましいです。
wp-config.php は標準で WordPress がインストールされたディレクトリから一つ上のディレクトリに設置することが可能なので、DocumentRoot に WordPress をインストールしている場合、その一階層上の非公開ディレクトリに移動することができます。
wp-config.php のパーミッションは Apache 等の Web サーバ実行ユーザーが読み取れる権限だけ(例:400)を付与するようにします。
また、.htaccess に下記の記述を追記することで、外部からのアクセスを行えないように制限をかけられます。
license.txt, wp-config-sample.php, readme.html ファイルは削除するか .htaccess でアクセスをブロックする
WordPress のインストール時に含まれる license.txt, wp-config-sample.php, readme.html は通常使用しないファイルですが、公開されたままだと外部にサイトの情報を与えることにも繋がります。
これらのファイルは削除しておくか、.htaccess で外部からのアクセスを制限しておくと良いでしょう。
例えば .htaccess に下記のように記述すれば、ファイル毎のアクセス制限をかけられます。
ファイル編集機能を使用不可にする
WordPress には、管理画面からプラグインやテーマのファイルを直接編集できる機能が付いています。不正にログインした攻撃者がこの機能を使って悪意のあるコードを実行できないよう、編集機能を無効にしておきましょう。
wp-config.php に下記のコードを追記することで、編集機能を無効にすることができます。
ディレクトリ一覧の表示を防ぐ
Apache には、デフォルトのインデックスファイル(index.htmlなど)が無い場合にディレクトリの中身を一覧表示する仕組みがありますが、その状態では攻撃者にファイル構成が容易に閲覧されてしまいセキュリティ上の問題となります。一覧が表示されないように設定しておきましょう。
.htaccess に次のような記述を入れることで、ディレクトリ一覧が表示されなくなります。
まとめ
以上、WordPress のセキュリティチェックリストでした。
これら全ての対策を取るのは簡単なことではありませんが、万が一の事態が起きたことを想像すると・・・やはり多少の労力を割いてでもサイトの安全性は高めておきたいですよね。紹介した対策はちょっとした手間でできる内容も沢山ありますのでぜひ試してみてください。
自分の WordPress サイトのセキュリティ対策が一体どこまでできているか、みなさんも一通りチェックしてみてはいかがでしょうか?