Fail2BanでWordPressを保護する方法
English version: How to protect WordPress with Fail2Ban
WP CerberとFail2Banを組み合わせることで、ブルートフォース攻撃がWordPressに到達する前に阻止できます。WP Cerberはアプリケーションレベルでログイン失敗を検出し、Fail2BanはOSレベルでiptablesを使用して攻撃者をブロックします。この組み合わせにより、ブルートフォース攻撃とDoS攻撃を最小限のオーバーヘッドで阻止できます。
Fail2Banとは何ですか?
Fail2Banは、サーバー上で動作するログ監視サービスです。ログファイルを監視し、同じアドレスからの認証失敗の繰り返しなど、攻撃の兆候となるパターンを検出します。ホストが設定したしきい値を超えると、システムファイアウォールでそのアドレスを一定期間ブロックします。Fail2Ban自体はWordPressに関する情報を一切持たず、ログに記録された情報に基づいてのみ動作します。そこでWP Cerberの出番です。WP Cerberは、Fail2Banが解析できる形式でログイン失敗を監視・記録し、サービスが対応に必要なイベントを提供します。
攻撃についてもっと詳しく知りたいですか?ブルートフォース攻撃、DoS攻撃、DDoS攻撃の違いとは?
注:Fail2Banを設定するには、Linuxサーバーへのrootアクセス権限が必要です。
WP Cerberでは、Fail2Banを使用するための3つのオプションがあります。
- Apacheのアクセスログを監視するには、HTTP 403レスポンスヘッダーを使用します。
- syslogファイルを使用してログイン失敗の試行を監視する
- カスタムログファイルを使用して、ログイン失敗の試行を監視します。
HTTP 403 レスポンスについて Apache アクセスログを監視します
ログイン試行が失敗すると、WP Cerber は HTTP ヘッダーに 403 ステータスを返します。Apache はその応答をアクセスログに記録し、Fail2Ban がそれを読み取ることができます。この動作はデフォルトで有効になっています。ただし、Fail2Ban はこれらの試行を見つけるために access.log 全体を解析する必要があり、アクセス数の多いサイトでは非効率的です。
syslogを使用してログイン失敗の試行を監視する
デフォルトでは、WP Cerber はLOG_AUTH機能を使用して、syslog へのログイン失敗を記録します。独自の機能を使用するには、 CERBER_LOG_FACILITY定数に整数値を指定してください。いずれの場合も、syslog またはカスタムファイル (下記参照) への書き込みは、メインプラグイン設定で「ログイン失敗をログファイルに書き込む」を有効にした場合にのみ実行されます。
define('CERBER_LOG_FACILITY', LOG_AUTHPRIV);
カスタムファイルを使用してログイン失敗の試行を監視する
失敗したログイン試行を任意のログファイルに送信するには、 CERBER_FAIL_LOG定数でその絶対パスを設定します。Web サーバーにフォルダまたはファイルへの書き込み権限を付与し、 「ログイン失敗をログファイルに書き込む」を有効にすることを忘れないでください。ログファイルが存在しない場合は、WP Cerber が作成します。CERBER_FAIL_LOG CERBER_FAIL_LOG定義されると、WP Cerber はデフォルトの syslog への書き込みを停止します。カスタムのCERBER_FAIL_LOGファイルを使用すると、サーバーまたはホスティング環境のポリシーに従ってストレージが管理される syslog とは異なり、データをユーザーが管理できる点に注意してください。
define('CERBER_FAIL_LOG','/var/log/wp-cerber-auth.log');
ウェブサーバーのPHPプロセスが、指定されたファイルへの書き込み権限を持っていることを確認してください。
タイムスタンプをサーバーの時計に合わせる
タイムゾーンの不一致は、Fail2Banが試行を記録するものの、実際には誰もBANしない一般的な原因であるため、他の設定がすべて正しく行われている場合でも、この原因を理解しておくことは重要です。
Fail2Banは、 findtimeウィンドウ内に発生したイベントのみを処理します。検出時間ウィンドウ内かどうかは、各ログ行のタイムスタンプをサーバーのローカル時間と比較することで判断します。WordPressは、サイトで設定したタイムゾーンに関係なく、独自の時計をUTCで保持します。そのため、例えばEurope/Madridで動作するサーバーでは、WordPressが書き込むすべての行が1~2時間前のものに見えます。Fail2Banは、これらのイベントを古いものとして破棄し、試行がログに記録されていても、BANを実行することはありません。
WP Cerberは、タイムスタンプをWordPressの時計ではなくサーバーのシステムタイムゾーンで書き込むことで、この問題を回避します。これにより、Fail2Banがデフォルトで想定しているタイムゾーンと一致するようになります。ほとんどのサーバーでは、これは自動的に行われるため、ユーザー側で特別な操作は必要ありません。
WP Cerber がシステムタイムゾーンを自動的に解決できない場合は、有効なタイムゾーン識別子を使用して、 CERBER_LOG_TIMEZONE定数でタイムゾーンを手動で設定してください。
define('CERBER_LOG_TIMEZONE', 'Europe/Madrid');
この値は自動検出を上書きするため、タイムスタンプがずれている場合にタイムゾーンを正確に特定する確実な方法です。標準タイムゾーンデータベースの識別子であればどれでも使用できます。例えば、「America/New_York」や「Asia/Tokyo」などです。この定数は、 WP Cerber バージョン 9.7.4以降で利用可能です。
何がログに記録されるか
このログには個人データが記録されるため、あなたのサイトがGDPRなどのプライバシー規制の対象となる場合は、あなたに直接関係します。以下に、ログに記録される内容を示します。
ログインに失敗するたびに、送信元IPアドレス、送信されたユーザー名、サーバーのホスト名、プロセスID、タイムスタンプの1行が記録されます。パスワードはいかなる形式でも記録されず、その他のアカウントデータも一切記録されません。
これらのフィールドのうち、2つはGDPRにおける個人データに該当します。IPアドレス(Breyer判決によりIPアドレスも個人データに該当すると判断されました)とユーザー名です。WordPressはメールログインに対応しているため、ユーザー名はユーザーのメールアドレスである場合もあります。これは、特定の人物が標的とされたという記録が残るため、失敗した試行にも当てはまります。
これにより、あなたはこれらのデータの管理者となり、いくつかの実際的な影響が生じます。これらのログを保持ポリシーに含め、無制限に増え続けるのではなく、ローテーションまたは削除してください。レコードがどこに保存され、転送されるかを追跡してください。カスタムのCERBER_FAIL_LOGファイルはデータを管理下に置きますが、 syslogはレコードを中央サーバーまたは外部サーバーに送信する可能性があり、そこではストレージと処理はあなたが設定していないシステム全体のポリシーに従います。データ主体によるアクセスまたは消去の要求もこれらのログに適用されます。
WP Cerberは、syslogがログレコードをどのように処理するか、またサーバーOSがログファイルをどのように処理するかを制御できないため、これらのログを意図的に削除する機能をサポートしていません。WP Cerberに組み込まれたクリーンアップ機能は、問題の一部しか解決できず、実際にはデータが削除されていないにもかかわらず、削除されたと誤って表示してしまう可能性があります。
これは実用的な要約であり、法的助言ではありません。EU、英国、または同様の管轄区域からのデータを扱う場合は、IPアドレスとユーザー名を個人データとして扱い、貴社のコンプライアンスを担当する担当者に義務内容を確認してください。