前回の記事でWordPressに対する改ざん攻撃への対処を行いましたが、その後さらにプラグイン「IP Geo Block」を導入しました。
不正アクセスとファイル改ざん被害との戦い
筆者のサイトが海外からの不正なアクセスにより、ファイルの改ざんや不正ファイルの設置を行われ、SPAM送信の踏み台にされる被害に遭いました。
前回の記事でこれに対する対策を行い、以後被害はなくなりました。
前回行った対策
手動では状況把握が不完全で、いたちごっこになるため処理も追いつかず、セキュリティ系プラグインに頼りました。
- 被害内容の把握
- ユーザー名を非表示にする
- 不正ログイン対策
- 改ざんされたファイルのスキャンと修正
- 不正に設置されたファイルの削除
- .htaccessによる海外IPアドレスのアクセス拒否(ここで完全解決)
- SPAM送信をしてしまったPostfixの対策処理
今回の記事ではさらに一歩進め、上記対策で太字になっている部分をさらに強化することにします。
また、もやもやしていた.htaccessでのアクセス拒否について問題が見つかりましたので、これも同時に解決します。
IP Geo Blockの導入
非常に高機能かつ日本語化されていて設定も簡単なプラグイン、IP Geo Blockを導入します。
こちらのメイン機能は「国コードによるホワイトリストまたはブラックリスト型のアクセス制限を行う」というものです。
まさに前回.htaccessによって力技でやっていた内容ですが、異なる点がいくつかあります。
- 海外からのアクセスを遮断できる
- 国コードで判別の設定を行うため手動でIPアドレスを制限するよりも間違いがなく高効率
- アクセス制限を行う対象を選択可能
- ゼロデイ攻撃も防御できる
- 高速で動作し、かつ機能の重複する他の重いプラグインを無効化できる(例:Akismet)
こちらも、太字の部分が重要となっています。各項目の詳細については後述します。
インストール
まずはWordPress管理画面の「プラグイン」→「新規追加」からインストールして有効化します。
インストール直後は外部からデータベースをバックグラウンドで読み込むため、しばらく待つよう指示されます。
設定する
管理画面の「設定」→「IP Geo Block」で、挙動の設定を行います。
なお以下の設定内容は、すでに改ざん被害に遭った筆者の環境ですので、予防として導入する場合はもう少しライトな設定でも構わないと思います。
検証ルールの設定
ここで、基本となるルールを決めておきます。ここで決めたルールを、この後でどこにどう使うか指定するイメージです。
マッチング規則
「ホワイトリスト」とします。ブラックリストとの違いは以下の通りです。
- ホワイトリスト:基本すべて拒否、指定された国コードのみ許可
- ブラックリスト:基本すべて許可、指定された国コードのみ拒否
前回の記事で紹介した.htaccessファイルはホワイトリスト型です。すべて拒否した後で、botと国内IPアドレスを許可しています。それでも4千行を越えてしまいましたが。
国コードのホワイトリスト
JP(日本)とします。必要であればカンマ区切りで他の国コードを加えることもできます。
悪意のあるシグネチャ
管理領域、テーマ領域、プラグイン領域に対して悪意があるとみなすシグネチャを指定します。
改行またはカンマ区切りで複数指定することができます1。
デフォルトのシグネチャ
../,/wp-config.php,/passwd
追記後のシグネチャ
../,/wp-config.php,/passwd
curl,wget,eval,base64
筆者の受けた改ざん被害でも、PHPのeval
やbase64
が用いられていました。
IPアドレス当たりのログイン試行可能回数
同一のIPアドレスからのログインを許可する回数で、ここでは5としました。
検証のタイミング
ここは、IP Geo Blockプラグインがどのタイミングで上記のような検証を行うのかを設定します。
デフォルトのタイミング
"init" アクション・フック
変更後のタイミング
"mu-plugins" (ip-geo-block-mu.php)
デフォルトでは標準的なプラグインの実行タイミングとなります。その前にWordPressによる様々な前処理が行われることになります。
mu-pluginsに変更すると、他のプラグインより早いタイミングで実行されるため、後にアクセスを拒否することになる接続先に対して、無駄なサーバ資源の消費を避けることができます。高速化も期待できます。
注意点として、以下に記述されているような制限事項が生じます。
英語ですし、なんだか難しく書いてあります。
- テーマ内functions.phpのカスタムフィルターフックが動作しない
- 人間に優しいエラーページが無効になる
カスタムフィルターフックについては、テーマ表示より前のタイミングで実行される以上は仕方のないところです。解決策も書かれていますので、問題の発生する環境では試してみると良いでしょう。
次にエラーページの件ですが、上記と同様にテーマ表示の処理を行う前にIP Geo Blockが動作しますので、テーマを処理する前だという理由で404.php
のようなユーザーフレンドリーなエラーページを表示できません。こちらも解決策が書かれています。エラーページを静的HTMLファイルとして保存すれば良いようです。
筆者の環境ではどちらも対策していませんが、どのみち拒否するユーザーに見せるものなので気にしないことにしました。
バックエンドの設定
IP Geo Blockプラグインで「どこを」「どう」防御するのかを決める部分であり、とても重要な設定です。
コメント投稿
国コードで遮断
コメントを海外から投稿できないようにしています。思い切った設定ではありますが、実はこれでSPAMコメントがほとんどなくなります。
ということは、重いことで有名なSPAM対策プラグイン、Akismetを停止することできますね(後述)。
XML-RPC
国コードで遮断
筆者はXML-RPCを悪用した攻撃をひっきりなしに受けていました。攻撃手段となり得る機能を野放しにしておくのはよろしくないので対策したいのですが、無効にするのも抵抗があります。IP Geo Blockでは海外勢のみ遮断することができます。便利!
ログイン・フォーム
国コードで遮断
ログイン試行の回数を設定する部分がありましたが、ここではそもそもログイン試行を行う対象を国内IPアドレスに絞ることができます。海外からのログイン試行はひっきりなしに行われていますので、こちらも国コードで遮断しておきます。
管理領域
国コードで遮断
ゼロデイ攻撃を遮断
管理領域(/wp-admin
ディレクトリ)内に対するアクセスを国コードで遮断します。通常であれば、管理者である自分以外はアクセスしない部分です。
また「ゼロデイ攻撃を遮断」が登場しました。ゼロデイ攻撃とは、脆弱性が発見されてから対策された日(ワンデイ)までの間にあたる脆い期間(ゼロデイ)に行われる攻撃のことです。これは非常に心強い機能で、未対策の攻撃を検知して遮断することができます。
管理領域ajax/post
国コードで遮断
ゼロデイ攻撃を遮断
管理領域内にあるadmin-ajax.php
とadmin-post.php
に対するアクセスを上記と同様に遮断します。
プラグイン領域
ゼロデイ攻撃を遮断
WPコアの読み込みを強制
改ざんや不正ファイル配置は、プラグイン領域に対してよく行われます。ここでは管理領域と同じように、ゼロデイ攻撃を遮断します。国コードで遮断するよりも強固になります。
テーマ領域
ゼロデイ攻撃を遮断
WPコアの読み込みを強制
テーマ領域に対しても、改ざんや不正ファイル配置はよく行われます。ここも管理領域と同じように、ゼロデイ攻撃を遮断します。国コードで遮断するよりも強固になります。
なお上記2つで「WPコアの読み込みを強制」をチェックしてありますが、これはWordPressのコア(本体)を読み込まずに実行されるPHPファイルがあった場合への対策となります。
フロントエンドの設定
通常の投稿やページを表示、つまり制作者が意図しているURLでのアクセスに対する設定です。
ここへの直接攻撃はちょっと考えにくいですし、テーマファイルへの攻撃なら前項の設定で防御できます。そこでここは遮断しないよう設定します。
フロントエンドの遮断を設定すると、外部からの正常なアクセスを検証、遮断しますので、ただ普通にサイトを見に来たユーザーやクローラーが対象になります。筆者は前回の対策ではクローラー関係で苦労することになりました。この項目を設定しなくても攻撃されることはなくなり、かつクローラーのエラーもなくなっています。
位置情報APIの設定
IP Geo Blockプラグインでは、外部の位置情報データベースをAPI経由で取得して利用しています。そのための設定ですが、このままで問題ありません。
ローカル・データベースの設定
上記APIでローカルに取得されたデータベースの状態です。
「自動更新(月1回)」をチェックするのみで、他には特にすべきことはありません。プラグイン導入直後にバックグラウンドでデータベースの取得が開始されますが、うまく働いていない、または取得に失敗しているようであれば「今すぐダウンロード」ボタンをクリックしてください。
統計とログの設定
このようなプラグインでは、「動作しているか」「期待通りに動作しているか」「どのような状況か」「何をいつどうしたか」といったログを見たいものです。
ここで検証とログを有効にしておきましょう。
検証のログを記録
遮断時または遮断対象国の通過時に記録
筆者が既に攻撃を受けて被害も被っているため、見られる情報はなるべく見たいということでこの設定にしてあります。
通常は「遮断時に記録」だけでも良いかも知れません。
IPアドレスのキャッシュ設定
キャッシングに関する設定です。特に変更すべき部分はありません。
投稿時の設定
コメント欄の上下に一言何かを表示する機能のようです。本プラグインで設定を行う必要はないでしょう。
プラグインの設定
便利な設定のエクスポート、インポートがあります。プラグインのアンインストール時に全設定を削除する設定もありますが、このあたりはお好みで。
その下部に「変更を保存」ボタンがありますので、ここまでの設定が済んだらクリックしておきます。
不要となるプラグインや設定
以下のプラグインが有効である場合、これらは停止もしくは削除することができます。
機能が完全に被っているか、または部分的にせよ重要な部分をIP Geo Blockで代替できるためです。
特にありがたいのがSPAM対策プラグインのAkismetで、これは大変重いことで有名です。IP Geo Blockに任せましょう。
Wordfenceについては、筆者は残してあります。理由は、ノートン先生やウィルスバスターなどに似たスキャン機能があり、改ざん被害を発見・通知することができるためです。
改ざん被害に遭っていない方は、今からIP Geo Blockで防御すれば、それも未然に防げる可能性があります。
まとめ
前回行った.htaccess
による海外からのアクセス制限では、何もかも問答無用で弾いてしまうため、強力ですが困ることもありました。
具体的には、Googleなどのようなメジャーどころではないbotの扱いで困りました。
目的が「日本人以外を弾きたい」のではなく「攻撃は全て海外からなのでそれを弾きたい」なので、IP Geo Blockによるゼロデイ防御の方が適しています。
国コードという概念とゼロデイ防御という手法でセキュリティを向上できるIP Geo Block、個人的に2018年のベストプラグイン賞決定です。