WordPressのセキュリティ対策・チェック方法まとめ
このページは約14分で読み終わります
後で読む
2017/12中旬、高い堅牢性が求められるホワイトハウスのサイトがDrupalからWordPressに変更され大きな話題を呼びました。
WordPressはシェア数が圧倒的なことから攻撃対象として狙われがち、そしてそこから脆弱性が高いという印象を持たれる傾向にあります。実際何も配慮をせず、放置してるとリスクがとても高いものですが、適切な対応をすることでセキュアな環境になります。
WordPressのホスティングサービスで、Prime Strategy社の提供するKUSANAGIというサービスがあるのですが、先日お話を伺った際には、過去に不正侵入は一度もないとのことでやはり設計次第かなという印象です。
ここでは上記と何ら関係性がありませんが、WordPressでセキュリティに関して網羅的に把握したい方向けに情報をまとめました。
「WordPressのセキュリティって‥どうすればいいかよく分からないけど、怖い話を聞いたことがあるからとりあえず何かしておきたい」
「サーバとかよく分からないけど‥手軽にできることないの?」
そんな方へ「具体的にどうすれば」という視点で、この記事ではWordPressのセキュリティ対策、診断ツールの使い方などについて一通りご紹介をします。
主な目次としては以下となります。
IPA (情報処理推進機構)も「CMSのセキュリティ対策のポイント」などを発表していますが、具体的にどのようにWordPressサイトの安全性を高め、品質の安全性の確認をするかを知ることはとても大切です。
それでは順番に見ていきましょう。
WPセキュリティにおける基本的な考え
そもそも攻撃を試みるハッカー(クラッカー)は、どうやってWordPressサイトを見つけ不正アクセスを試みるのでしょうか?
その一つにGoogle HackingというGoogle検索を利用してランダムにWordPressサイトを見つけ、脆弱性を探して攻撃をする方法があります。
この場合特定サイトを狙ったものというより、不特定多数の世界中のWordPressサイトが標的とされ、中国やロシアを始め様々な国のIPから僕らのサイトは攻撃にさらされています。
その背景には全世界のサイトの27%はWordPressサイトとも言われ、OSに例えるとWindows、ブラウザで例えるとChromeのようにシェア数が多い=常に攻撃対象になりやすい傾向にあります。
加えてレンタルサーバにあるWordPressの自動インストール機能や、wordpress.comを利用し、その手軽さから敷居も低く簡単にWordPressサイトを保有できる傾向にあります。その半面リテラシーの低さからサイトの放置であったり、運用はしつつも、アップデートはせずに古いバージョンを利用してしまうこともあります。
ただWordPress本体やプラグインは、放置をすることで脆弱性が増え続けますし、不正改ざんされるリスクが高まるので、基本的な知識は持っておくようにしましょう。
不正侵入されるとどうなるか
不正侵入した後、メッセージを残し「hacked by XXX」だけの悪ふざけのものもあります。悪用されるケースとしては、サイトを改ざんしSEO用のリンクを仕込む、踏み台サーバとして利用をする、個人情報を盗むなど様々な被害にあうリスクが考えられます。
サイトやブランドの信頼性に関わることですので、個人サイトももちろん、企業サイトで利用をする際には、十分な配慮をするに越したことはありません。
この記事では手軽に対応できる範囲にしぼり、これだけは抑えておきたいセキュリティとして、以下にご紹介します。
本体、プラグインのバージョン更新
WordPress本体
WordPressは、本体だけでも定期的に脆弱性のためのアップデートが実施されています。2017年度だけでも8回、2016年度は5回といった割合で本体のセキュリティアップデートが行われました。常に最新にしておくよう心がけましょう。
アップデートには機能追加だけでなく、脆弱性へのパッチも含まれており、SQLインジェクションや、クロスサイトスクリプティングなど様々なセキュリティホールへのパッチが適用されています。
なお、コアハックとしてCMS本体の改変をするのは避けましょう。アップデートの際に全て消されますし、本体に対する脆弱性の原因となる可能性があります。
プラグイン
プラグインも同様で、本体との互換性以前に、更新が停止されているプラグインはセキュリティの面でも懸念があります。原則「1年以内に更新がされたプラグインを利用する」「利用者が多くコミュニティも活発」など、一定の品質が保たれたプラグインを利用すると安心でしょう。
理想論としては上記の通りですが、プラグインを多く利用してしているサイトでは本体またはテーマと互換性が保てず、不具合が生じる場合もあります。
本体及びプラグインのアップデートは本番環境で直接実施せず、予めステージング環境を用意の上、事前検証できるようにしておくと安心です。
互換性がないものは代替のプラグインに変更する、また本番でアップデートを実施をする際には、事前にFTP及びMySQLデータのバックアップを取得しておくと安心でしょう。
WordPressテーマ
基本的にはWordPress公式のテーマを利用するようにします。外部で購入したテーマを利用する、またはオリジナルのテーマを作成する場合、Theme Checkで品質チェックをするようにします。
導入が容易なセキュリティ対策 16種
以下では比較的容易に確認できる項目として、16種類のセキュリティ対策を挙げてみました。
1. Adminユーザーは利用しない
Botで自動的にWordPressサイトを見つけ「admin」ユーザーでアタックする方法がよく見かけられます。ブルートフォースアタックというパスワード総当りの攻撃手法を受けますが、その際ID名が「admin」はよく攻撃を受ける対象のID名となります。
推測されにくいID名(ex: YamadaTaroなど)を利用するのがオススメです。これ自体はパスワードが弱い場合のおまじないみたいなものですが、実際にアクセスログを見ると、 (存在しない場合でも)adminユーザーで膨大な攻撃を受けているのが分かります。
2. 管理者アカウントをむやみに作らない
サイトによってはユーザーアカウントを多く発行する場合があります。その際「管理者」アカウントはむやみに発行せず、編集者、投稿者、寄稿者で運用ができないか検討をします。
数が多くなることで管理が煩雑化し、中にはパスワードを分かりやすい「123456」などに変更をするメンバーも出てくる可能性があるので、セキュリティに対する周知も心がけるようにします。
3. パスワードは難読化されたものを利用
比較的新しいWordPressでは、アカウントを作成する際にパスワードを自動生成できるようになっています。(ex: gVj@DhsnHx3ri(TuRLSHDzRnなど)
独自の場合でも、こういった難読化されたものを利用するようにします。間違っても「12345」のようなパスワードは避けましょう。クラッカーは辞書攻撃をしてくるので「mywp123」のようなシンプルなものも同様に避けるべきです。
参考:2016年度最も利用されたパスワードリスト(by Keeper Security)
4. 認証用ユニークキーの設定
wp-config.phpファイル内には「認証用ユニークキー」と呼ばれるものがあります。この認証キーはローカルに保存されるログイン情報のCookieを暗号化してくれる役割があります。
自動インストールの場合は気付かないうちに自動生成されますが、手動インストールなどで空になっている場合は設定をしておきましょう。認証用ユニークキーは以下のサイトから生成が可能です。
https://api.wordpress.org/secret-key/1.1/salt/
5. wp-config.phpへのアクセスを遮断
データベースへの接続情報が書かれたwp-config.phpはセキュアである必要があります。外部からアクセスされないよう.htaccessファイルに以下の記述をすることで拒否設定を行うことができます。
<files wp-config.php>
order allow,deny
deny from all
</files>
6. XML-RPCへのアクセスを遮断
XML形式のデータをhttpでやり取りをする為の仕組みとして、XML-RPCがあります。便利な一方でDDoS攻撃などに悪用される恐れがあるので、管理画面以外からの記事投稿をするリモート投稿が利用する必要がない場合は、アクセスを遮断しておいたほうが安全でしょう。
これも.htaccess内に記述することでxmlrpc.phpへの拒否設定が行なえます。
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>
7. wp-comments-post.phpへのアクセスを遮断
コメントスパムによる書き込みを試行される恐れがあります。コメント機能を利用しないサイトの場合は、wp-comments-post.phpへのアクセスを遮断しておくとよいでしょう。または国内サイトであれば、サーバの設定側から海外からのIPを遮断するというのも方法として考えられます。.htaccessに下記を追記します。
<files wp-comments-post.php>
order allow,deny
deny from all
</files>
8. wp-cron.phpの無効化
いわゆる予約投稿やスケジューリングに関するプラグインが利用していないサイトの場合、wp-cron.phpへのファイルアクセスも無効化しておくと、より安心です。無効化するにはwp-config.php内に下記のコードを追記するようにします。
define('DISABLE_WP_CRON', 'true');
9. 管理画面内での操作を制限
万一不正に侵入された場合、下記をwp-config.phpに追記しておくことで管理画面からの「テーマの編集」「プラグイン追加」「プラグイン編集」が行えないようにできます。これにより管理画面からのPHP実行を防ぐことができます。
define('DISALLOW_FILE_MODS',true);
10. Index ofを隠す
サーバによっては特定のURLを叩いた際にファイルやフォルダが見えてしまうことがあります。/wp-content/plugins/などですね。クラッカーがランダムにサイトを探す際、検索対象にされても困るのでindex ofは非表示化させます。.htaccessに以下のいずれかを記載します。
# 下記1行のみ記述
Options -Indexes
# 上記でエラーが出る場合は、下記で試してください。(上とは併用しません)
DirectoryIndex index.html .ht
11. table prefixの変更 (インストール時)
WordPress本体のインストール時、table prefixというデータベース内のテーブル接頭辞は標準では「wp_」となります。
ユーザーIDが「admin」と同様、推測しやすい為、標準から予め変更し接頭辞を変更しておくとよいでしょう。「mysite_wp_」など。
ただ既に運用しているWordPressの接頭辞を変更するには少し知識を要します。もし変更を試みる場合には「WordPressのテーブル接頭辞を変更する方法と注意点」などをご参考にし、作業前には万が一に備えて必ずMySQLデータのバックアップを取るようにしましょう。
12. /wp-login.php へのBasic認証の設置
ログインURLが見えてしまえば、IDとパスワードをランダムに入力されてしまいます。そこで攻撃を受ける前にwp-confi.php自体に直接Basic認証を設定します。こうすることで、ブルートフォースアタックを受けることもない為、サーバとしても余計なアクセス負荷が軽減できます。
以下.htaccessの記述
<Files wp-login.php>
AuthUserFile /var/www/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user
</Files>
※/var/www/.htpasswdのファイルパスはサーバの環境により異なります。これは以下のソースを記述したphpファイルをサーバにUPしアクセスするとパスが分かります。(ex: url.php等としてUP)
<?php echo __FILE__; ?>
.htpasswdは以下などで作成が行なえます。
http://www.htaccesseditor.com/#a_basic
13. FTP接続を制限
サーバへの接続はFTPでは行わず、SSHまたはSFTP / FTPSで行うようにします。また可能であれば接続にあたりIP制限を行うことでより安全性が高まります。
14. 管理画面へのIP制限
固定IPを持ち、そのIP以外からのアクセスを遮断したい場合、以下を.htaccessに記述することで、FilesMatchにて「wp-login.php」「wp-admin」へのIP制限を行うことができます。「xxx.xxx.xxx.xxx」には許可したいIPを書き、複数ある場合は「Allow from xxx.xxx.xxx.xxx」を複数繰り返して記述をします。
<FilesMatch "wp-login.php|wp-admin">
Order deny, allow
Deny from all
Allow from xxx.xxx.xxx.xxx
</FilesMatch>
15. ファイル/フォルダのパーミッション設定
ファイル / フォルダのパーミッションは644、755とします。サーバによっては604、705が推奨されていることもあるので適宜確認をするようにしてください。
16. uploads配下でのphp実行制限
/wp-content/uploads/はWordPressの画像をアップロードする為に書き込み権限があり、その中でPHP実行をされないよう、/wp-content/uploads/.htaccessとして下記を書いておくようにします。
<Files *.php>
deny from all
</Files>
17. REST APIへのアクセス制限
REST APIを利用しない場合、API経由による不正侵入を防止するのにここでも.htaccessに下記記述をすることでアクセス制限が行なえます。
デフォルトではREST APIを使っている意識がなくともURLが自動的に生成されるので不要であれば無効にしておきます。WordPressのリライトルールを下記のように書き換えます。
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/wp-json/
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} rest_route=
RewriteRule ^$ /? [R=404,L]
</IfModule>
※まっしろブログさんよりコードを拝借しております。
ここでは狙われやすいWordPressの脆弱性対策として.htaccess内への記述などを紹介しました。作業前には必ずバックアップを取ってから実行するようにしましょう。
尚、上記で触れている.htaccessは「/wp-login.php」などのWordPressを設置した階層と同じ階層に置くようにします。
また固有のケースとなりますが、Xserverでは以下の設定が可能です。
Xserverの場合
Xserverであれば、サーバーパネルにログイン後、「WordPressセキュリティ設定」よりWordPress専用のセキュリティ設定が可能です。
こちらでは以下の設定が行うことができますので、先の機能と類似のものもありますので、どちらを利用するか検討してみるとよさそうです。
1) 海外からのIP制限の実施
・管理画面
- /wp-admin
- /wp-login.php
・XML-RPC
- /xmlrpc.php
・REST API
- /wp-json
2) ログイン試行回数制限の設定
ブルートフォースアタックの制限が行なえます。
3) コメントトラックバック制限
・大量のコメントまたはトラックバックの際自動的に検知し遮断
・海外からのコメント、トラックバックを遮断
またそれ以外にもサーバによってWAF (Webアプリケーションファイヤーウォール) などもあったりする為、適宜利用してみるとよりセキュアな環境になりそうです。
なお、ここでご紹介したことをやれば大丈夫、というものではなくあくまで一例となりセキュリティを見直すきっかけになれば幸いです。
その他WordPress Codexより「WordPress の安全性を高める」として情報が公開されているので、まだ見たことがない方は一読しておくと良いでしょう。
プラグインで高めるセキュリティ対策
汎用的なセキュリティプラグイン「SiteGuard WP」
今や定番中の定番ですが、SiteGuard WP Plugin というJP-Secureという日本のセキュリティ会社が提供している無償のWordPressプラグインがあります。
https://ja.wordpress.org/plugins/siteguard/
これはセキュリティに関するいくつかの機能を兼ね備えています。
機能概要
ログイン履歴 | どこのIPからいつアクセスがあったか |
---|---|
ログインページ変更 | wp-login.phpのURLを変更 |
画像認証 | 日本語の文字列を入れないといけない為、海外からのアクセス遮断に適してる。 |
メッセージの無効化 | ログイン時のエラーメッセージを非表示にできます。 |
ログインロック | ログインを短期間に指定回数間違えると一定期間アクセス不可にできます。 |
フェールワンス | 正しいログインをしてももう一度入力が求められます。 |
XMLRPC防御 | XMLRPCの悪用を防ぎます。 |
更新通知 | 更新ファイルがある場合、管理者宛にメール通知を飛ばします。 |
詳しくは公式サイトをご覧ください。なお、サーバにWAFがインストールされている場合、SiteGuardのWAFよりルールの設定を行うこともできます。
メリット
・手軽に導入が可能
デメリット
・マルチサイトに非対応
留意点
ただ多くのサイトで利用している中で少し留意点があります。SiteGuardと相性が悪いプラグインが存在し、他のプラグインが正しく動かないケースが時々あります。何か不具合を見つけた場合、「SiteGuard WP Plugin」を一度停止し、正しく動くか確認をしてみてください。
正しく動く場合は、SiteGuardの何らかの機能が衝突してる可能性が高く、完全に無効化ではなく一部の機能を停止することで動作が正常に動きます。
削除について
データベースとしては2つ、テーブルが作成されます。「wp_siteguard_history」「wp_siteguard_login」もしアンインストールすることが場合、上記テーブルも削除しておくことで、完全に削除が可能です。
手軽にできる本格的なセキュリティ診断
自分のウェブサイトや、企業サイトなどWordPressのセキュリティ診断はどうすればいいだろう?ということで、実はとても手軽にチェックできる方法があります。
一昔前までは「WPScan」をサーバで実行する為に知識や手間が求められたのですが、とても便利になりました。
WPScans.comを利用する
このWPScans.comでは、独自のアルゴリズムとWPScanを組み合わせてスキャンを実施し、WPScanに報告されている8,000を超える既知の脆弱性を元に対象サイトの脆弱性を確認をすることができます。
使い方はとても簡単で、「SIGNUP」をすればもっと機能が利用できますが、そのままURLを入れるだけでもレポートを取得することができます。
URLを入れて「START SCAN NOW」をクリックしましょう。
しばらく待つと、診断結果が表示されます。脆弱性があるサイトの場合、以下のようなものが表示されます。
「あなたのWordPressサイトは脆弱性の攻撃にさらされています!」といった怖い文章が表示されています。どこら辺に脆弱性があるのか?はページをスクロールして確認をしていきましょう。
▼ WordPress is vulnerable (WordPressの脆弱性)
ここではWordPress本体における脆弱性が指摘されます。現状利用しているバージョンから最新バージョンまでの経過ではどのような脆弱性があるのか?について確認が行なえます。
詳細については「Show/Hide the full list of WordPress core vulnerabilities found on your website.」のボタンをクリックすると確認ができます。以下のようなリストが表示されます。
ここを見るとSSRF(サーバーサイドリクエストフォージェリ)や、CSRF(クロスサイトリクエストフォージェリ)、XSS(クロスサイトスクリプティング)などの脆弱性がWordPress X.X.Xで修正されているよ、といったことが確認できます。
こういった本体の脆弱性については、上記WPScans.comでも確認できますが、WordPress公式ブログからも確認をすることができます。
https://wordpress.org/news/category/security/
▼ Plugins & Themes (プラグインとテーマ)
続いては、そのサイト内で利用しているプラグイン及びテーマの利用バージョンについて指摘されています。現状バージョンと最新バージョンについて確認をすることができます。
▼ Information Leakage (情報漏えい)
そして、直接のセキュリティに対する脅威ではありませんが、情報漏えいについての確認をすることができます。機密データが含まれているサイトなどでは特に意識をしておくとよいでしょう。
例えば上の画像にある
Debug log file found: https://www.xxxxxx.com/wp-content/debug.log
では、/wp-content/debug.log ということで、開発者がデバッグを実施した際にサーバ内にログファイルを生成してそのままとなっているようです。
開発者サイドでこういった作業漏れ確認としても役立つかもしれません。(※悪用厳禁)
もしスキャンからは特に脆弱性に関する懸念がない場合は以下のように表示されるようです。
いわゆるバージョンが古くて脆弱性が見つかったものと、うっかりミスで残っているファイルなどチェッカーとして十分活用できそうなのでとてもいいサービスですね。ただ、あくまでWordPress自体の脆弱性チェックであり、サーバのセキュリティをスキャンするものではないのでご注意ください。
アクセス/操作ログの取得
ハイエンドなCMSでは一般的なアクセスや操作ログがWordPressでは標準で存在していません。
仮に何らかの不具合や、万が一不正侵入などがあった際にログが残っているととても便利です。ここではプラグインを中心にいくつかのログ取得できるものをご紹介します。
管理画面へのログインのみであれば「SiteGuard WP」
先にも紹介したSiteguard WPですが、これだけでも基本的なログはWordPressのGUI上から取得ができます。
https://ja.wordpress.org/plugins/siteguard/
「日付」と「成功/失敗」「ログイン名」「IPアドレス」そして「タイプ」ではログインページかXMLRPCかが記録されます。最大10,000行残り古いものから削除されていきます。
WP内の基本操作ログを残せる「Activity Log」
Activity Logを利用すれば、WordPress内の基本操作ログを残すことができます。設定もシンプルでプラグインを有効化するだけで利用できます。
https://ja.wordpress.org/plugins/aryo-activity-log/
主な機能としては以下のようなものがあります。
- ログを残す期間
- メール通知
メール通知については、特定の動作をユーザーが行った場合、特定のアドレス宛に自動通知をすることができるといったものです。
WP内の操作パスまで残せる「Audit Log」
先ほどのActivity Logと比較すると、こちらはもう少し詳細な作業についてもログを残したい方に向いています。
https://ja.wordpress.org/plugins/wp-security-audit-log/
Activity Logでは、「Wrong Password」と表記されているのに対し、Audit Logでは「1 failed login(s) detected using non existing user.」となっています。つまり、文章を読むだけで、存在していないユーザーでログインを試行していた、などを把握することができます。
見てみるとわかるようにMessageのエリアにパスが細かく書かれているので、より正確に情報を把握することができます。
主な機能としては以下となります。
- ログを残す期間
- メール通知
- アラート対象の種類を選択
- その他アドオンによる拡張機能の追加
いずれの3つのプラグインもログインメール通知機能があります。
誰もログインしていないはずなのにログイン通知が届いたら侵入された可能性があるので、その場合は急ぎ管理画面にログインをし「ユーザー>あなたのプロフィール>他の全ての場所でログアウト」を実施し、パスワードの変更をしてみましょう。
WPの定期的な自動バックアップ
ここまでセキュリティに関する情報を書いてきましたが、万が一不正侵入されて改ざんされた、または手違いでサイトを消してしまったといった場合に備え、定期的な自動バックアップがあると安心です。
BackWPupによる自動化
保存先はサーバ内や、Dropbox、Amazon S3などが選べます。詳細な使い方についてはバズ部で紹介されておりますので、そちらをご参考ください。
参考URL : https://bazubu.com/how-to-use-backwpup-23804.html
WordPressの脆弱性まとめ情報
WordPressのセキュリティアップデートに関する情報は、以下サイトで情報の収集が行なえます。
1. WordPress Security Category Archive
https://wordpress.org/news/category/security/
WordPressの公式発表で、WordPress本体における過去の脆弱性アップデート履歴を一覧で見ることができます。例えばv4.8.3においては「SQLインジェクションに関するアップデートがされた」などを知ることができます。英語ではありますが、Google翻訳を使えば和訳に困ることはないでしょう。
2. Wordfence
https://www.wordfence.com/blog/category/wordpress-security/
著名なセキュリティ用プラグインWordfence Securityも提供しているWordfenceによるセキュリティ情報を専門に取り扱ったブログです。こちらも英語ですが、有用な情報も多いのでGoogle翻訳などを利用しつつ情報収集するといいかもしれません。
3. Hacked, dangerous & vulnerable WordPress plugins
https://firstsiteguide.com/tools/hacked-dangerous-vulnerable-wordpress-plugins/
2017年10月に更新されているWordPressのプラグインで脆弱性が確認されているリストになります。
–
また、余談ですが、LIGさんのブログ記事「ハッキングってどうやるの?現役ハッカーに聞いてみた」で営業されていたリアルタイム改ざん検知・復旧システムのウェブアルゴスというのがとても便利そう。
新手の手口やなりすまし、内部犯行などにも対応していて、万が一改ざんされても、わずか1秒以内に自動復旧するというサービスのようです。ただ年額498,000円のようで、気軽に導入できるものではなさそう。予算の潤沢なクライアントの場合に検討するとよさそうです。