WordPressのセキュリティを高める - 侵入を防ぐ

WordPressは全世界で使用されている有名なソフトウェアであることもあり、攻撃されやすいソフトウェアのひとつです。

※ 2015年11月時点では、全世界の1/4のサイトがWordPressで作られているという統計も出ています (全世界のサイトの4分の1はWordPressで作られている - GIGAZINE)。攻撃する側としては多く使われているソフトウェアの攻撃手法を見つけられれば少ない労力で多くのサイトを狙うことができるので、「多く使われているソフトウェアほど攻撃されやすい」ということがよく起こります。(Windowsなどもそうです)

本レシピでは、WordPressのセキュリティを高めるためにどのようなことをするとよいか、侵入(不正ログインによるハッキングなど)を防ぐ対策を主として紹介します。

攻撃のパターン

一般的に、WordPressのようなCMS(Webページなどのコンテンツを管理するシステム)の攻撃のパターンとしては下記のようなものがあります。(1と2は純粋にWordPressに関わること、3と4はWordPressが動いているサーバーに関わることです)

No. パターン
1 CMS管理画面のログインID・パスワードが破られるか盗まれるかなどで不正ログインされる
2 CMSやそのプラグインに脆弱性(攻撃が可能になってしまう部分)があり、そこから攻撃される
(例: 任意のファイルをアップロードできる脆弱性があり、PHPファイルをアップロード→実行により改ざんされたりデータを盗まれる)
3 FTP、SSHなどサーバー側のログインID・パスワードが破られるか盗まれるかなどで不正ログインされる
4 サーバーの他のソフトウェアに脆弱性がある・またはサーバーに起因する別の要因により攻撃される

このため、上記の原因になる問題を解消できれば、最低限セキュリティが保たれるということになります。

対策の例 (レンタルサーバーを使用している方向け)

上記を踏まえ、レンタルサーバーを使用してWordPressを運用している方の場合の対策の例を紹介します。
(下記の条件を満たすサーバーで、サーバー側のセキュリティは保たれている前提です。満たされていない場合はレンタルサーバーを変更したほうがよいと思います)

  • サーバーの各種ソフトウェアが常に最新のものにアップデートされている (代表的なものではApache/Nginx、PHP、OpenSSL)
    • またはサーバーの管理画面などで自分で各種ソフトウェアのバージョンを最新のものに変更でき、最新にしている
  • サーバーの接続方式にFTP以外の方式(FTPS、SFTP)が利用できる
  • その他、サーバー側はレンタルサーバーの事業者が適切なセキュリティ対策を行っている
No. 内容 優先度
1 WordPress本体やプラグイン、テーマのバージョンを最新の状態に保つ A
2 安易にプラグインやテーマをインストールしない A
3 WordPressのパスワードを強固なものにする (長く、ランダムな、英数字(大文字小文字)と記号を使用したもの) A
4 サーバーのアクセスにFTPを使用しない (FTPS・SFTPを使用する) A
5 管理画面やログイン画面をSSL化する (SSLが導入できる場合) B
6 管理画面やログイン画面にアクセス制限を掛ける (国外アクセス制限、固定IPアドレスが使える場合など) B
7 ファイルのパーミッションを変更する (共有サーバーの場合) C
8 ログイン画面の機能を強化する C
9 管理画面やログイン画面にBasic認証など別の認証の仕組みを導入する C

※ A: 必要、B: できればしたほうがよい、C: 余裕があればしておくとよい

この項目は、主に「侵入の入口をふさぐ」を目的としたものです。

Webセキュリティの専門家である徳丸浩さんが「WordPressの侵入対策は脆弱性管理とパスワード管理を中心に考えよう」で述べられてていますが、「WordPressのテーブルの接頭辞を変える」などは攻撃が成功してしまったあとの被害軽減を目的としたものになるので、労力と効果を考えるとそのような対策を取る前に「まずは入らせない」ということが必要になってくると思います。

※ 下記以降、解説が少し長いため、必要そうなもののみかいつまんで見ていただけるとよいと思います。出来る限り2016年時点でのまっとうな説明になるよう心掛けていますが、もし不備などがあればお知らせください。
お断り: 下記の説明の一部では「エックスサーバー」「さくらのレンタルサーバー」「ロリポップ!レンタルサーバー (ロリポップ)」の3つのレンタルサーバーの説明を記載しています。これらは 1.「自分が使ったことがある (現在も使っている)」 2.「レンタルサーバー業界内でシェアがある程度あると思われる (多くの人が参考にしやすいと思われる)」の2点で選定しており、利益関係はありません。

1. WordPress本体やプラグイン、テーマのバージョンを最新の状態に保つ

WordPressやプラグイン、テーマは絶えず更新が続けられており、その間に脆弱性が見つかったり、新しい脆弱性が生まれることもあります。

WordPress本体の更新情報「日本語 « ブログ — WordPress」で「セキュリティリリース」となっているものは何らかの脆弱性が修正されたことを示していますが、古いものは新しいものに比べてそういった脆弱性が残っているということですので、最新状態にしておくことは特に意味のあるセキュリティ対策になります。

WordPressでは、セキュリティやメンテナンスでの修正があった場合(バージョン4.6から4.6.1など、3桁目の番号が上がるとき)は管理者が何もしなくても自動更新が行われる仕組みがあります。ただ、機能追加(1桁目や2桁目の番号が上がるとき)は標準では自動で更新されませんし、プラグインやテーマも自動では更新されませんので、管理画面に表示される更新通知を確認して更新することが必要になります。

2. 安易にプラグインやテーマをインストールしない

品質のよくないWordPressのプラグインやテーマをインストールしてしまうと、そこから攻撃されてしまう可能性があります。

厳密にはセキュリティ上の問題がないかすべてのコードを確認する必要がありますが、そこまでの労力をかけていると大変なので、最低限下記のいずれかに当てはまるプラグインやテーマはインストールするのをできるだけ避けたほうがよいです。(自分で検証できない場合は特に)

  • WordPressの公式のプラグインやテーマ一覧からインストールできない (公式の一覧は審査が行われているため、一定の品質は保たれている)
  • WordPress本体の最新バージョンに対応していない (たとえ公式の一覧に載っているものでも、最新バージョンに対応していないものは予期しない不具合が起こる可能性がある)
  • 有名なものではない (ダウンロード数が少ないなど。たくさんの人が使っているものであれば、ある程度品質は保たれていると推測できる)

3. WordPressのパスワードを強固なものにする (長く、ランダムな、英数字(大文字小文字)と記号を使用したもの)

長く、ランダムで、英数字(大文字小文字)と記号を使用したパスワードを設定していれば、攻撃プログラムからのパスワード解析が困難になり、不正ログインされる可能性が大幅に下がります。

WordPressにはパスワードの強度チェックを行う仕組みがあるので、「強力」と表示されるのを目安にパスワードを設定するとよいです。


(ユーザーの追加画面にあるパスワード欄。最初のインストール時や、ユーザー編集画面にも同じように強度チェックの仕組みがあります)

4. サーバーのアクセスにFTPを使用しない (FTPS・SFTPを使用する)

テーマのファイルなどをサーバーにアップロードするのにWindowsを使用されている方であればFFFTPやFileZillaなどのFTP接続ソフトを使用している方が多いと思いますが、FTPは通信が暗号化されていないため、通信の途中でパスワードが第三者に見られる可能性があります。

通信が暗号化されている下記の方式でサーバーにアクセスすることで、パスワードが漏洩する可能性を下げられます。

通信方式 概要
FTPS FTPの通信を https:// で使われているSSLで暗号化する仕組み。(FTP + SSL)
SFTP SSHという暗号化通信接続の仕組みを流用して、SSHの通信上でFTPと同じような操作を行えるようにした仕組み。(SSH + FTP)

(FFFTPであればFTPS、FileZillaであればFTPSとSFTPが使用できます)

通信方式はレンタルサーバーによって対応している方式が違うため、公式の機能一覧やマニュアル等を参照してください。(SFTPを使うためのSSHがサーバーの初期状態で有効になっていないなどがあるので、FTPSのほうが楽だと思います)

レンタルサーバー 対応している方式 参考
エックスサーバー FTPS / SFTP (FTPS)
https://www.xserver.ne.jp/manual/man_ftp_ffftp_setting.php
https://www.xserver.ne.jp/manual/man_ftp_filezilla_setting.php
さくらのレンタルサーバー FTPS / SFTP (FTPS・SFTP)
http://www.sakura.ne.jp/plans.html
ロリポップ FTPS / SFTP (FTPS)
https://lolipop.jp/manual/hp/w-ff-ftps/

5. 管理画面やログイン画面をSSL化する

4.と同じように管理画面やログイン画面も通常の状態では通信が暗号化されていないため、パスワードを入力した際に通信の途中でパスワードが第三者に見られる可能性があります。

インターネットでお買い物をするときクレジットカードを入力する画面などで必ず通信が暗号化されているのと同じように、管理画面やログイン画面上の通信をSSL(HTTPS通信)で暗号化することでパスワードが漏洩する可能性を下げられます。

サーバー側はレンタルサーバーによって設定方法が違うため、お使いのレンタルサーバーのマニュアル等を参照してください。WordPress上での設定方法は下記に記載があります(※1)。

ただ、SSL化についてはSSL化のための証明書が基本的には有料のため敷居が高かったり(※2)、レンタルサーバーで独自SSLに対応していない場合がある(※3)ので、状況によっては難しい場合があります。

※1 説明がわかりづらい部分があるため、将来的に本サイトで別途説明を作成するかもしれません。
※2 エックスサーバーの場合、独自SSLを無料で利用できる設定があります。(独自SSLについて | レンタルサーバー【エックスサーバー】 。暗号化のみに特化したLet's Encryptという証明書のため無料で提供されている)
※3 例えば2015年以前のさくらのレンタルサーバー スタンダードなどでは独自SSLが使用できませんでした。

6. 管理画面やログイン画面にアクセス制限を掛ける

管理画面やログイン画面に管理者しかアクセスできないようになっていれば、そもそも不正ログインはほぼ起こりません(家のドアや窓自体に辿りつけなければ侵入されることがないのと同じ理屈)。

WordPressには会員制サイトを作るなどの目的のために「だれでもユーザー登録ができるようにする」という機能がありますが、そういった仕組みが不要であればアクセス制限を掛けるとよいです。

制限の種類としては、1つは「管理画面やログイン画面に国外からはアクセス出来ないようにする」です。

一般的に攻撃は海外から行われることが多いこと、日本の方がWordPressを管理するのはたいてい国内であることを考えると、これはわりと効果が高いです。

また、最近のレンタルサーバーでは「国外IPアドレス制限」という機能が備わっていることがあり、サーバーの管理画面で手軽に設定ができます。(エックスサーバーは初期状態で有効になっている)

レンタルサーバー 参考
エックスサーバー WordPressセキュリティ設定 | レンタルサーバー【エックスサーバー】
さくらのレンタルサーバー 国外IPアドレスフィルタ – さくらのサポート情報

もう1つは「管理画面やログイン画面に管理者のIPアドレス以外ではアクセス出来ないようにする」です。

これは可能ならとてもよい方法ですが、IPアドレスは固定IPアドレスの回線を使っていない場合変動するため、「設定した」→「ログイン画面に入れなくなった!」→「自分の回線のIPアドレスが変わっていた…」ということが起こります。(「外出先などでログイン」などもできなくなる)

もし「固定IPアドレスの回線を使っている」などでそういう問題がクリアできるのであれば、下記のように設定ができます。(Apacheが動作している、.htaccessが使用できる一般的なWebサーバーの場合)

(ログイン画面のアクセス制限。WordPressを設置したフォルダ直下の.htaccessに追加します) ※1

(管理画面のアクセス制限。wp-adminフォルダ直下の.htaccessに追加します) ※1 ※2

 

※1 .htaccessが無い場合は作成してください。「必要なIPアドレス」は 111.111.11.11 のような形式で、「アクセス情報【使用中のIPアドレス確認】」などで確認ができます。
※2 管理画面の wp-admin フォルダに制限を掛ける場合、wp-admin内にあるadmin-ajax.phpはテーマやプラグインが公開側で利用していることがあるため、このファイルは対象から外すようにすることが勧められています。(「ブルートフォース攻撃 - WordPress Codex 日本語版」)

7. ファイルのパーミッションを変更する

WordPressの侵入対策は脆弱性管理とパスワード管理を中心に考えよう」では、特に共用のレンタルサーバーではファイルのパーミッション(操作権限)を適切に変更することが勧められています。

これについては「レンタルサーバー事業者側の対策が十分であれば通常は問題になることはないはずですが」とある通り、本来はサーバー側が対策できていれば特別に変更しなくてもよいものですが、実際にこの関係で攻撃が大規模になった例 (第三者によるユーザーサイトの改ざん被害に関するご報告 (ロリポップで2013年に発生した大規模攻撃。あるユーザーの未インストールのWordPressとサーバー側のパーミッションの不備が突かれ、約8000件の改ざんが行われた)) もありますので、できれば初期状態から変更しておくとよいと思います。

また、各レンタルサーバーにもパーミッションの変更を勧める文書があります。(「サイト改ざんへの対策をお願いいたします - ロリポップ!レンタルサーバー」)

パーミッションの推奨値は下記のとおりです。

内容 徳丸(2015) エックスサーバー さくら ロリポップ 一般的な初期状態
HTML、CSS、JS、画像 604 644 ? 604 644
PHPファイル 600 644 755 604 644
CGIファイル 700 755, 705いずれか 755 700 755
.htaccess ? 644 ? 604 644
ディレクトリ (フォルダ) 701 755, 705いずれか ? 705 755
wp-config.php ? ? ? 400 644

※ 3桁の数字は左から「所有者」「同じグループのユーザー」「その他のユーザー」のパーミッションを示していて、「読み取り (4)」「書き込み (2)」「実行 (1)」を組み合わせた値になっています。例えば「604」は「所有者は読み取り(4)・書き込み(2)ができ、同じグループのユーザーは何もできず、その他のユーザーは読み取り(4)のみできる」という意味です。

(厳密には2016/09時点で未検証ですが)WordPressの自動更新によってパーミッションが元に戻ってしまったりする場合もあると思いますので、.htaccessやwp-config.phpなど重要なファイルを重点的に厳しいパーミッションにするとよいのかなと思います。

8. ログイン画面の機能を強化する

これは「家に入られないためにドアを頑丈に(高機能に)する」ようなアプローチで、できればしておくと安全性を高めることができます。6のIPアドレス制限で「そもそも扉に完全に辿りつけない」ようになっていれば原理的には必要ありませんが、6で100%アクセスを防ぐことは難しい場合が多いので、対策をしておくとよいと思います。

ログイン画面の機能強化用途のプラグインは様々ありますが、その中でも「SiteGuard WP Plugin」はよい選択肢だと思います。

  • 日本の、セキュリティを主事業としている企業が開発しているプラグインである
    • 説明などが日本語なので何をしているかわかりやすい
    • 個人よりもメンテナンスが放棄される心配が少ない
  • ログイン周りに特化した機能が豊富(下記)で、必要に応じてON・OFFできる
    • 管理ページアクセス制限 (ログインが成功していないアクセス元は管理画面にアクセス出来ないようにする。対策項目としては6.に近い)
    • ログインページ変更 (ログインページのURLを変更することで攻撃されづらくする)
    • ひらがな画像認証 (画像認証でひらがな対応している攻撃プログラムが多いとは考えらづらいので、これだけでも意味がある)
    • ログインロック (パスワードを何度も間違えたアクセス元は一定時間ログインを試し直せないようにする)
    • XML-RPC防御 (WordPressで特に狙われやすい仕組みを無効化する)
    • etc

9. 管理画面やログイン画面にBasic認証など別の方式の認証の仕組みを導入する

これは「家のドアに新しく鍵をもう1つ付ける」ようなアプローチです。「別の方式」としては「Basic認証」「Google reCAPTCHA」(「変形文字の判読はもう不要、Googleが新型CAPTCHA開発 - ITmedia ニュース」)「Google Authenticator」(スマートフォンと連携した二段階認証)などがあり、対応するWordPress用プラグインなどもたくさんあります。

ただ、プラグイン自体の安全性がどれだけ確保できているかという別の問題もあるので、Basic認証を手動で設定するのが手軽ではと思います。(管理画面やログイン画面をSSL化していないとBasic認証のパスワードも暗号化されないので、その点は留意してください)

Basic認証はレンタルサーバーによってはサーバーの管理画面から手軽に設定することができます。

レンタルサーバー 参考
エックスサーバー アクセス制限(BASIC認証) | レンタルサーバー【エックスサーバー】
さくらのレンタルサーバー ファイルマネージャーでアクセス制限をする – さくらのサポート情報
ロリポップ パスワード制による制限 / ホームページ / マニュアル - レンタルサーバーならロリポップ!

更新履歴

  • 2016/09/12 レンタルサーバー各社のパーミッション推奨値を追加するなど一部調整を行いました。また、分量が長くなりすぎるのを避けるため「WordPressのセキュリティを高める - 侵入を防ぐ」にタイトルを変更しました。(他のセキュリティ観点については別のレシピで掲載予定です)
  • 2016/09/11 仮作成 (WordPressのセキュリティをテーマに対策項目を挙げているブログ等の検証と、サーバー管理者向けの対策についてが未定稿のため公開できていません)

コメント

内容の誤りなどがありましたら下記からご連絡をお願いします。頂いたコメントは基本的に公開されることはありません(必要な場合は個別に返信させて頂きます)。

CAPTCHA