WordPressをマルウェア感染や改ざんの被害から守る方法と対策まとめ

WordPress, サーバ構築, ツール, 便利ワザ

WordPressは世界で最も多く利用されているオープンソースのCMSです。人気があるということは攻撃の標的にされやすいということでもあります。マルウェアや改ざんに対する対策をまとめました。

コンテンツの目次

WordPressは狙われやすい

WordPressは、世界で最も多く利用されているオープンソースのCMSです。

ブログだけでなくギャラリーサイトやコーポレートサイト、ショッピングサイトの構築にも利用でき、個人・企業・団体を問わず国内外で高い人気を誇っています。

しかし利用者が多いということは、ITリテラシーやセキュリティ意識の低いユーザーが多い可能性も高くなり、悪意あるユーザーにとっては格好の獲物となります。

またオープンソースである以上、ある程度スキルのある人間であればいち早く脆弱性を見つけることも可能です。

ということで、今に始まったわけではありませんが、WordPressは悪意あるユーザーに「常に狙われている」状態にあるとまず考えましょう。

名の売れたサイトが狙われやすいのは当然ですが、「自分のところはアクセス数も少ないから対策しなくても大丈夫だろう」と高をくくるのは危険です。

悪意あるユーザーが求めているのは、まさにそのようなセキュリティ意識の低いユーザーのサイトです

被害に遭ってから対策するのはかなり骨の折れる作業になりますので、事前にできる限りの予防をしておきましょう。

乗っ取り被害のチェック

WordPressの管理画面にログインし、左メニューの「ユーザー」を確認します。

もし自分以外のユーザーが不正に登録されていたら、即座に削除しましょう。

さらに自分自身のパスワードも、長く難解なものに変更します。WordPress側で自動生成することもできます。

adminユーザーに注意

WordPressでは、デフォルトの管理ユーザーがadminになっています。

これをこのまま放置するのはセキュリティ上好ましくありませんので、管理権限を持つ別ユーザーを作成して、adminは削除することをおすすめします。

ログインユーザー名が表示されるのを防ぐ

http://******.***/?author=1のように、自サイトのURLに/?author=1を追記してブラウザで表示してみてください。

管理者権限を持つユーザー名が表示される場合、これは危険な状態です。

WordPressの認証は基本的にユーザー名とパスワードの2要素で行いますので、そのうち1つがバレるというのはリスクが高いと考えてください。

手動でなんとかする方法

テーマディレクトリ内のauthor.php(無ければ作成)の内容を、以下の通りにします。

<?php
    wp_redirect(home_url());
    exit();

これで、authorのユーザー名を表示することなくトップページに強制転送します。若干無理やり感がありますが。

プラグインを使用する方法

Edit Author Slugというプラグインで対策できます。

Allows an admin (or capable user) to edit the author slug of a user, and change the author base.

ユーザーアーカイブのスラッグを変更することができますので、/?author=1のようにアクセスしても設定したスラッグのURLに転送され、ユーザー名が露呈することはありません。

テーマによっては、ユーザー名の表示を無効化する機能を持っている場合もあります。

ログイン保護と不正アクセス対策

不正アクセスを防ぐためには様々な方法がありますが、まとめて行ってくれるプラグインがあります。

SiteGuard WP Plugin

SiteGuard WP Plugin は、管理ページとログインへの攻撃からの保護に特化したプラグインです。

既に改ざんや乗っ取り被害の跡が見られる場合は、WordPressの管理画面ではなくFTPなどでアップロードする方法をおすすめします。

SiteGuardは国産のセキュリティプラグインで、ログインページの保護と不正アクセス対策に特化しています。

上の画像のように、ログイン履歴を見ることもできます。

注目すべきは右端の「タイプ」で、ログインページではなくXMLRPCからのログイン試行(失敗)が並んでいる点です。筆者がそのような操作を行ったことはありませんので、これは不正アクセスの試行を受けていることを意味しています。

XMLRPCとは外部からWordPressを操作する仕組みと考えてください。外部連携には便利な機能ですが、悪用されやすいというデメリットがあります。

SiteGuardでは、このXMLRPCを無効にする設定も可能です。

いくつかの機能がありますが、筆者は以下のように設定しました。

日本語で項目ごとに説明が記述されているので迷うことは少ないでしょう。

「ログインページ変更」では、/wp-admin/と決まっている管理画面のURLを変更することができます。想像できる通り、ログインページからの不正ログイン試行の多くを防ぐことができます。

「画像認証」は、ひらがなによる画像認証を追加することができます。コメントにも仕掛けられますが、筆者はログインページだけにしておきました。

「XMLRPC防御」では、XMLRPCそのものを無効にしました。具体的には.htaccessxmlrpc.phpへのアクセスを禁止する記述が追加されます。

これでひとまず、不正ログインに関してはかなりセキュリティを強化することができます。

改ざんと不正ファイルのチェック

これらの被害に遭っているかどうかを手動で調査するのは、大変骨の折れる作業となります。

ここでは、セキュリティリスクをスキャンできるプラグインを使用して、被害に遭っているかどうかを確認します。

Wordfence Security – Firewall & Malware Scan

あなたのWebサイトを、ファイアウォール、ウイルススキャン、IPブロック、ライブトラフィック、ログインの安全性の確保、等の機能を含んだ、最も包括的な WordPress のセキュリティプラグインで、安全にしましょう。

Wordfenceは、WordPress本体のファイル改ざんや、不正なファイルが作成されていないかをスキャンすることができます。

また、古すぎたり更新が停止しているプラグインはスキャン結果で警告されますので、代替となるプラグインを探すことをおすすめします。

Wordfenceは英語のプラグインですが、使用するのは一部機能のみで設定も特に要らないため問題になることはないでしょう。

何はともあれ、まずは上記プラグインをインストール、有効化します。

既に改ざんや乗っ取り被害の跡が見られる場合は、WordPressの管理画面ではなくFTPなどでアップロードする方法をおすすめします。

管理画面の左メニューに”Wordfence”が追加されますので、そこから”Scan”を選択します。

“START NEW SCAN”ボタンをクリックすれば、WordPressインストールディレクトリ以下の全ファイルを調査してくれます。

この画像では左下部の”Results Found”が空になっていますが、これは改ざんや不正なファイルが見つからなかったことを示しています。

日本語版WordPressではwp-config-sample.phpreadme.htmlが「内容がオリジナルと異なる」と表示されますが、多くの場合正常です。
前者はPHPスクリプトなので、一応おかしなコードが埋め込まれていないか確認(後述)し、問題がなければどちらもIgnore(無効)にしてしまってOKです。

もし”Results Found”に改ざんされたファイルや不正に作成されたファイルが表示された場合、対策が必要です。

具体的には、以下のように対応します。

  • 改ざんされたファイル:対象ファイルをエディタで開き、後述のようなコードが埋め込まれていれば該当部分を削除する。
  • 不正に作成されたファイル:対象ファイルを削除する。

このスキャン作業は、たまに行って確認するようにしましょう。日々の作業が増えますが、被害に遭ってから対応するよりよほど楽です。

Live Trafficが便利

Wordfenceには、他にも様々な機能がありますが、主に使用するのは上記のスキャンと、”Live Traffic”です。

いわゆるアクセスログをほぼリアルタイムに閲覧できる機能ですが、国名を見られたり、怪しいか問題のあったアクセスを色分けして表示してくれたりするので大変便利です。

この機能だけを持つプラグインもありますが、このように1本にまとめられているのは嬉しい限りです。

また、上の画像がまさにそうなのですが、不正なアクセスを行ったIPアドレスをブロックリストに入れることもできます。

ただし攻撃者は自らのPCではなく様々な国にある複数の踏み台を操って不正アクセスを試みますので、多くの場合IPアドレスは一定ではありません。
したがって単一のIPアドレスをブロックすることには(無意味とは言いませんが)あまりメリットはありません。

改ざんされたファイルの修正

Wordfenceのスキャンで改ざんされたファイルが見つかったら、エディタで開いてみます。

おそらくファイルの先頭に以下のようなコードが不正に埋め込まれています。

<?php $xxxx = Array(/* 無意味に見える大量の英数字 */);
eval(xxxx_function($base64_data, $xxxx)); ?>

「無意味に見える大量の英数字」の部分をbase64でデコードすると、PHPのコードであることがわかります。

筆者は何度もいたちごっこを繰り返しましたが、改ざんされるファイルは毎回index.php, wp-config.php, wp-settings.phpあたりでした。

これらのファイルはWordPressが毎回必ず読み込むファイルであるため、悪意あるコードを埋め込むにはうってつけというわけです。

上記のようなコードを発見したら、エディタで不正コード部分の<?phpから?>までを削除してください。

完全な原因究明と抜本的な対策が行われない限り、繰り返し改ざんが行われる場合があります。筆者もそうでした。

不正に作成されたファイルの削除

Wordfenceの”Live Traffic”の部分で紹介した画像のように、いかにもランダムで付けたファイル名である場合が多いですが、たまに意味ありげなファイル名になっていることもあります。拡張子は.phpです。

作成されるディレクトリはまちまちで、wp-admin/wp-includes/の中であったり、wp-content/uploads/の中であったり、プラグインやテーマのディレクトリ内であったりします。深い階層内に作成されることもあります。

該当ファイルをエディタで開くと、コードは概ね以下のように難読化されています。

最後の方でeval関数によって文字列がPHPコードとして評価されます。

実行されるコードは様々でしょうが、筆者の場合はSPAMを送信するコードになっていました。

攻撃者はこの不正に作成したPHPファイルにPOSTメソッドでアクセスし、実行してきます。これはアクセスログやWordfenceの”Live Traffic”で確認することができます。

この不正ファイルを放置するのは大変危険ですので、見つけ次第問答無用で削除してください

海外のIPアドレスを拒否する

いささか乱暴ではありますが、攻撃はほぼすべて海外のIPアドレスから行われますので、サイトの公開対象が国内のみであれば、海外からのアクセスをすべて遮断してしまう方法があります。

これは大変効果的で、攻撃者とのいたちごっこを繰り返していた筆者が最終的に問題を解決するに至った手法です。

遮断する方法はいくつかありますが、ここでは最も修正が手軽な.htaccessによるアクセス制限を紹介します。

以下は、筆者が採用している.htaccessです。内容は、以下のような流れになっています。

  1. すべてのアクセスを拒否
  2. Googleやfacebook, Twitterなどbotからのアクセスを例外として許可
  3. 日本国内で使用されるIPアドレスを例外として許可(4千行以上)

Apacheのバージョンによってアクセス制限の書式が異なる点に注意してください。

Apache 2.2系を使用している場合

Apache 2.4系を使用している場合

多くの場合、既に何かが書かれた.htaccessファイルが存在すると思いますので、その部分は残して上記コードを追記してください。

貼り付ける場所に悩んだら、# BEGIN WordPressの直前にしておけばOKです。

SPAM送信の踏み台にされた場合の対処

筆者が実際に被害に遭ったサーバの環境は、OSがCentOS 7で、MTAはPostfixです。

ここではPostfixであった場合、かつrootによる作業が可能な場合の対処方法を紹介します。

まずは現在溜まっているキューを確認します。

postqueue -p

送信した覚えのないメールがズラッと表示された場合、既にSPAM送信が実行されています。

この場合は以下のコマンドでまずキューを削除します。

postsuper -d ALL

上記対応によって問題が解決している場合は、このままPostfixの運用を続けて構いません。

まだ対策が完了していない場合はさらにキューが増加しますので、不本意ながらPostfixを停止しておきます。

systemctl stop postfix

当然ですが、Postfixを停止している間はメールの送受信が機能しません。なるべく早期に対策を終え、再度Postfixを起動します。

systemctl start postfix

一度SPAMの踏み台になってしまった以上、以後しばらくはキューの確認を行うことをおすすめします。

まとめ

既に書きましたが、最も効果的な対策は海外のIPアドレスを排除することです。

すべての対策を行っても解決しない場合、最終手段は再セットアップということになります。WordPressのファイル群をすべて削除し、素のWordPressから再度環境を構築をすることで、クリーンな状態に戻せます。

ただし事前にバックアップを取ることはもちろんですが、バックアップしたファイルをそのまま書き戻さないこともまた重要です。
プラグインやテーマは改めて新規インストールし、手動で以前の設定を復元するべきです。

この作業は困難かつ時間がかかりますので、できることならここで紹介した方法で解決したいものです。

最後になりましたが、WordPress本体やプラグイン、テーマのアップデートは無視せず実行してください。
公開されたばかりのバージョンであっても脆弱性が発見されることがしばしばありますので、常に目を光らせておいてください。