Apacheでmod_evasiveを使いDoS攻撃対策を強化する方法を徹底解説

DoS(Denial of Service)攻撃は、Webサーバーのリソースを枯渇させ、サービスを停止させることを目的とした攻撃です。特にApacheのような人気のあるWebサーバーは攻撃対象となりやすく、一度攻撃を受けるとサイトが利用不能になる可能性があります。

このような状況に対処するために、多くの管理者がDoS攻撃の軽減や防止の手段として「mod_evasive」を導入しています。mod_evasiveはApacheサーバー向けのモジュールで、短時間に大量のリクエストが送られた場合に自動で攻撃元IPをブロックする機能を提供します。これにより、不正アクセスを未然に防ぎ、サーバーの可用性を保つことができます。

本記事では、Apacheサーバーへのmod_evasiveの導入方法から詳細な設定、実際のテスト方法までをステップバイステップで解説します。mod_evasiveを活用することで、サーバーの耐障害性を高め、より安全なWeb環境を構築できるようになります。

目次

mod_evasiveとは何か


mod_evasiveは、Apacheサーバーで動作するモジュールの一つで、主にDoS(Denial of Service)攻撃やDDoS(Distributed Denial of Service)攻撃を軽減するために使用されます。大量のリクエストが短期間に特定のページやリソースに集中した際に、自動的に攻撃元のIPアドレスを検出し、一時的にブロックする役割を果たします。

mod_evasiveの基本的な仕組み


mod_evasiveは、次のような条件を満たした場合にリクエストを遮断します:

  • 短期間で同一IPから過剰なアクセスがあった場合
  • 同じリソースに対して短時間で複数のリクエストが送られた場合
  • 複数の異なるページに短時間で繰り返しアクセスがあった場合

このような動作により、攻撃の兆候があるIPアドレスを即座に検出し、Apacheが処理する負荷を軽減します。

mod_evasiveが必要な理由


Apacheサーバーは非常に高性能ですが、大量のリクエストが集中するとリソースが逼迫し、正規のユーザーがアクセスできなくなる可能性があります。mod_evasiveを導入することで、サーバーを継続的に保護し、DoS攻撃が原因で発生するサービス停止リスクを最小限に抑えることができます。

さらに、mod_evasiveはシンプルかつ軽量で、導入が比較的容易であるため、コストをかけずにセキュリティレベルを向上させることが可能です。

mod_evasiveの主な機能と特徴


mod_evasiveは、ApacheサーバーをDoS攻撃から守るために設計された軽量なモジュールです。その特徴はシンプルで効果的な防御機能にあります。以下に、mod_evasiveの主な機能と特徴を紹介します。

1. 攻撃元の自動検出とブロック


mod_evasiveは、短時間に同一IPから大量のリクエストが送られてきた場合、自動的にそのIPアドレスを検出してアクセスを遮断します。これにより、サーバーにかかる負荷を軽減し、サービスの安定性を維持します。

2. ブラックリストへの登録


攻撃が検出されたIPアドレスは一時的にブラックリストに登録され、一定時間Apacheへのアクセスが禁止されます。ブラックリストの保持時間や検出閾値は設定ファイルで柔軟に調整可能です。

3. ログ出力と管理


mod_evasiveは、攻撃検出時の情報をログファイルに記録します。これにより、管理者は攻撃の履歴を確認し、必要に応じて手動でIPアドレスをブロックするなどの対策が取れます。

4. メール通知機能


攻撃が検出された際に、サーバー管理者にメールで通知する機能を備えています。これにより、攻撃をリアルタイムで把握し、迅速な対応が可能になります。

5. 柔軟な設定とカスタマイズ


mod_evasiveは、どの程度のリクエストをDoS攻撃と見なすかを細かく設定できます。リクエストの頻度や同一リソースへのアクセス回数などを調整することで、サーバー環境に合わせたチューニングが可能です。

6. シンプルで軽量な動作


mod_evasiveは非常に軽量なモジュールで、Apacheのパフォーマンスにほとんど影響を与えません。リソースの少ない環境でも動作しやすく、手軽に導入できます。

これらの特徴により、mod_evasiveはApacheサーバーをDoS攻撃から守るための有効なツールとして、多くの管理者に採用されています。

mod_evasiveのインストール方法


Apacheサーバーでmod_evasiveを導入するには、いくつかの手順を踏む必要があります。ここでは、Linux環境(Ubuntu/Debian系)とCentOS/RHEL系の両方でのインストール手順を解説します。

1. Ubuntu/Debian系でのインストール


以下のコマンドを実行して、mod_evasiveをインストールします。

sudo apt update
sudo apt install libapache2-mod-evasive


インストールが完了したら、Apacheにmod_evasiveを有効化します。

sudo a2enmod evasive
sudo systemctl restart apache2

2. CentOS/RHEL系でのインストール


CentOSやRHEL系では、mod_evasiveをソースからインストールする必要があります。

sudo yum install epel-release
sudo yum install mod_evasive


インストール後、モジュールが正しくロードされるように設定ファイルを確認します。

sudo nano /etc/httpd/conf.d/mod_evasive.conf


設定が完了したら、Apacheを再起動して反映させます。

sudo systemctl restart httpd

3. インストール確認


インストールが正しく行われたかを確認するには、以下のコマンドでApacheのモジュール一覧を表示します。

apachectl -M | grep evasive


evasive20_module (shared) と表示されれば、mod_evasiveが正常にインストールされています。

mod_evasiveのインストールは比較的シンプルですが、設定が不十分だと効果が得られません。次のセクションでは、mod_evasiveの基本的な設定方法について解説します。

mod_evasiveの基本設定


mod_evasiveをインストールした後は、適切な設定を行うことでDoS攻撃への防御を強化できます。設定ファイルを編集し、サーバー環境に応じたチューニングを行いましょう。

1. 設定ファイルの場所

  • Ubuntu/Debian系: /etc/apache2/mods-available/evasive.conf
  • CentOS/RHEL系: /etc/httpd/conf.d/mod_evasive.conf

存在しない場合は、新規作成します。

sudo nano /etc/apache2/mods-available/evasive.conf  # Ubuntu/Debian
sudo nano /etc/httpd/conf.d/mod_evasive.conf        # CentOS/RHEL

2. 基本的な設定例


以下は、基本的なmod_evasiveの設定例です。

<IfModule mod_evasive20.c>
    DOSHashTableSize    3097
    DOSPageCount        5
    DOSSiteCount        50
    DOSPageInterval     1
    DOSSiteInterval     1
    DOSBlockingPeriod   10
    DOSEmailNotify      admin@example.com
    DOSSystemCommand    "sudo /sbin/iptables -A INPUT -s %s -j DROP"
    DOSLogDir           "/var/log/mod_evasive"
</IfModule>

3. 各ディレクティブの解説

  • DOSHashTableSize
    攻撃検出用のハッシュテーブルサイズ。大きな値にするとメモリ使用量が増えますが、検出精度が向上します。
  • DOSPageCount
    1秒間に同じページへアクセスできる回数の上限。これを超えるとIPがブロックされます。
  • DOSSiteCount
    サイト全体で1秒間に許可されるリクエスト数の上限。
  • DOSPageInterval / DOSSiteInterval
    ページおよびサイトのリクエスト数の評価間隔(秒)。
  • DOSBlockingPeriod
    攻撃と見なされたIPがブロックされる時間(秒)。
  • DOSEmailNotify
    攻撃が検出された際に通知するメールアドレス。
  • DOSSystemCommand
    攻撃検出時に実行するコマンド例(IPTablesでIPアドレスをブロック)。
  • DOSLogDir
    ログファイルを保存するディレクトリのパス。

4. ログディレクトリの作成


ログディレクトリが存在しない場合は作成します。

sudo mkdir /var/log/mod_evasive
sudo chmod 755 /var/log/mod_evasive

5. 設定の反映


設定を反映させるためにApacheを再起動します。

sudo systemctl restart apache2  # Ubuntu/Debian
sudo systemctl restart httpd    # CentOS/RHEL

基本設定が完了したら、次はmod_evasiveの詳細なチューニング方法を解説します。

mod_evasiveの詳細設定とチューニング方法


mod_evasiveはデフォルト設定でも効果がありますが、サーバーの負荷状況やサービス内容に応じて詳細なチューニングを行うことで、DoS攻撃への耐性をさらに強化できます。このセクションでは、mod_evasiveの詳細設定と各ディレクティブの調整方法について解説します。

1. DOSPageCountとDOSSiteCountの最適化

  • DOSPageCountは、1秒間に同じページへアクセスできる最大リクエスト数を設定します。デフォルトでは5ですが、APIサーバーやアクセス集中が予想されるページでは、この数値を適切に増減させる必要があります。
  • DOSSiteCountは、サイト全体で許容される最大リクエスト数を示します。多くのユーザーがアクセスするサイトでは、初期値50を100~200程度に調整します。
DOSPageCount    10
DOSSiteCount    150

2. DOSBlockingPeriodの調整

  • DOSBlockingPeriodは、攻撃と見なされたIPアドレスがブロックされる時間を指定します。短すぎると攻撃者が繰り返しリクエストを送信できるため、30秒以上を推奨します。
DOSBlockingPeriod  30

3. ハッシュテーブルのサイズ設定


DOSHashTableSizeは、攻撃検出用のハッシュテーブルのサイズを示します。サイトのトラフィックが多い場合は、3097などの大きな値を指定し、リクエストの衝突を防ぎます。

DOSHashTableSize  3097

4. システムコマンドによる即時遮断


攻撃が検出された際に、iptablesなどを用いて即座にIPアドレスを遮断する設定を加えます。

DOSSystemCommand  "sudo /sbin/iptables -A INPUT -s %s -j DROP"


%sは攻撃元IPアドレスに置き換わります。攻撃の規模に応じて適宜調整します。

5. メール通知機能の有効化


攻撃検出時に管理者へ通知することで、リアルタイムで対応が可能です。メール通知を有効にするには、以下の設定を加えます。

DOSEmailNotify  admin@example.com


メール送信機能が動作するように、サーバーにsendmailpostfixがインストールされていることを確認してください。

6. ログの詳細化


攻撃が発生した際のログを記録することで、後から分析可能です。ログを詳細に記録するには、専用のディレクトリを作成して設定します。

DOSLogDir  "/var/log/mod_evasive"


ディレクトリが存在しない場合は作成します。

sudo mkdir /var/log/mod_evasive
sudo chmod 755 /var/log/mod_evasive

7. テスト環境での試験


設定後、mod_evasiveが正しく動作するかテストします。次のコマンドでApacheを再起動します。

sudo systemctl restart apache2  # Ubuntu/Debian
sudo systemctl restart httpd    # CentOS/RHEL


設定がサーバーに過度な負担をかけないかを確認しながら、必要に応じて調整を続けます。

次のセクションでは、mod_evasiveの動作確認とテスト方法について詳しく解説します。

mod_evasiveの動作確認とテスト方法


mod_evasiveが正しく機能しているかを確認するためには、実際にテスト攻撃をシミュレートしてみることが重要です。このセクションでは、mod_evasiveがDoS攻撃を検知し、IPアドレスをブロックする動作を確認する方法を解説します。

1. 簡易的なスクリプトでのテスト


以下のPerlスクリプトを使用して、mod_evasiveが攻撃を検知するかを確認します。これは同一ページへの大量アクセスをシミュレートします。

#!/usr/bin/perl
use IO::Socket;

my $host = "localhost";
my $port = 80;
my $path = "/index.html";

for ($i = 0; $i < 100; $i++) {
    my $socket = IO::Socket::INET->new(
        PeerAddr => $host,
        PeerPort => $port,
        Proto    => "tcp"
    ) or die "Cannot connect to server: $!";

    print $socket "GET $path HTTP/1.0\r\n\r\n";
    close($socket);
    print "Request $i sent\n";
}

スクリプトの実行方法

  1. 上記コードをtest_dos.plとして保存します。
  2. 実行権限を付与します。
   chmod +x test_dos.pl
  1. スクリプトを実行してテストします。
   ./test_dos.pl

2. アクセスが遮断されたかの確認


スクリプトを実行した後、アクセスが遮断される場合はmod_evasiveが正しく機能しています。遮断が確認されない場合は、設定を見直し、リクエストの閾値(DOSPageCountDOSSiteCount)を下げて再度テストします。

3. Apacheのエラーログでの確認


mod_evasiveが攻撃を検出すると、Apacheのエラーログに記録されます。

sudo tail /var/log/apache2/error.log  # Ubuntu/Debian
sudo tail /var/log/httpd/error_log    # CentOS/RHEL


例:

[Sun Dec 24 15:12:34 2024] [error] [client 192.168.1.1] client denied by server configuration: /var/www/html/index.html

4. ログファイルの解析


mod_evasive専用のログも確認します。

sudo tail /var/log/mod_evasive/dos-*.log


ここには攻撃を受けたIPアドレスやタイムスタンプが記録されており、どのIPがブロックされたかを詳細に確認できます。

5. ブロックされたIPアドレスの確認と解除


ブロックされたIPアドレスは一定時間が経過すれば自動解除されますが、即時解除したい場合は以下のコマンドでiptablesから該当IPを削除します。

sudo iptables -L -n
sudo iptables -D INPUT -s 192.168.1.1 -j DROP

6. 動作しない場合の確認ポイント

  • mod_evasiveが正しくロードされているか確認します。
   apachectl -M | grep evasive
  • 設定ファイルが正しく反映されているか再起動します。
   sudo systemctl restart apache2

mod_evasiveがDoS攻撃を効果的に検出し、正しくブロックできることを確認したら、本番環境でも安心して運用できます。次のセクションでは、ログ解析と具体的な対応方法について解説します。

mod_evasiveのログ解析と対応方法


mod_evasiveは、DoS攻撃が検出されるとログを記録します。これにより、攻撃元IPアドレスの特定や攻撃の頻度を確認でき、今後の対策に役立てることができます。このセクションでは、ログの確認方法や解析手順、検出後の対応について解説します。

1. ログの場所と確認方法


mod_evasiveは攻撃を検出すると、指定されたディレクトリにログファイルを生成します。デフォルトでは/var/log/mod_evasiveに記録されます。

ls /var/log/mod_evasive/


例:

dos-1713890412
dos-1713890423

dos-<タイムスタンプ>形式でファイルが作成されます。

2. ログファイルの内容


ログファイルには、攻撃を検出したIPアドレスやリクエストの詳細が記録されています。以下のコマンドでログの内容を確認できます。

cat /var/log/mod_evasive/dos-1713890412


ログ例:

192.168.0.10 - Blocked request to /index.html
192.168.0.11 - Blocked request to /login.php
  • 192.168.0.10: 攻撃元IPアドレス
  • Blocked request to /index.html: ブロックされたリクエストの対象

3. 攻撃元IPのリアルタイム監視


リアルタイムでmod_evasiveの動作状況を監視するには、tail -fコマンドを使います。

sudo tail -f /var/log/apache2/error.log
sudo tail -f /var/log/mod_evasive/dos-*.log


これにより、DoS攻撃が発生した瞬間にブロック状況を把握できます。

4. 攻撃元IPアドレスの手動ブロック


攻撃が継続的に行われている場合は、手動でiptablesを使用してIPをブロックします。

sudo iptables -A INPUT -s 192.168.0.10 -j DROP


一時的にブロックを解除する場合は以下のコマンドを使用します。

sudo iptables -D INPUT -s 192.168.0.10 -j DROP

5. fail2banとの連携


mod_evasive単体でもDoS攻撃を防げますが、fail2banと連携することでさらに強固な防御が可能です。fail2banはログを監視し、攻撃を繰り返すIPアドレスを自動でブロックします。
fail2banの設定例は以下の通りです。

sudo nano /etc/fail2ban/jail.local


以下のようにmod_evasiveのログを監視するルールを追加します。

[apache-mod-evasive]
enabled  = true
filter   = apache-mod-evasive
logpath  = /var/log/mod_evasive/*
maxretry = 3


fail2banを再起動して反映させます。

sudo systemctl restart fail2ban

6. 攻撃後の対応策


攻撃が検出された後は、以下の対応を行うことで再発防止につながります。

  • 攻撃元IPの恒久的なブロック: iptablesfirewalldを活用してIPを永久にブロックします。
  • リクエスト制限の強化: DOSPageCountDOSSiteCountの値を調整し、より厳しい制限を設けます。
  • CAPTCHAの導入: ログインページなどでは、botによる攻撃を防ぐためにCAPTCHAを導入します。
  • CDNの利用: CloudflareなどのCDNを活用することで、DoS攻撃のトラフィックを吸収し、サーバーへの負荷を軽減します。

これにより、mod_evasiveをより効果的に運用し、サーバーの安定性とセキュリティを維持できます。次のセクションでは、よくあるトラブルシューティングについて解説します。

トラブルシューティングとよくあるエラーの対処法


mod_evasiveはシンプルで強力なモジュールですが、導入や設定においていくつかの問題が発生する可能性があります。このセクションでは、mod_evasiveを導入した際によくあるエラーとその解決方法について解説します。

1. mod_evasiveが機能しない


症状: DoS攻撃をシミュレートしても、アクセスがブロックされない。
対処法:

  1. mod_evasiveがApacheに正しくロードされているか確認します。
apachectl -M | grep evasive


evasive20_module (shared)が表示されていない場合は、モジュールが有効化されていません。

  • Ubuntu/Debian系:
sudo a2enmod evasive
sudo systemctl restart apache2
  • CentOS/RHEL系:
sudo yum install mod_evasive
sudo systemctl restart httpd

2. ログファイルが生成されない


症状: DoS攻撃を検出した形跡があるのに、/var/log/mod_evasiveにログが生成されない。
対処法:

  1. ログディレクトリが存在するか確認し、存在しない場合は作成します。
sudo mkdir /var/log/mod_evasive
sudo chmod 755 /var/log/mod_evasive
  1. Apacheの権限でログファイルを書き込めるか確認します。
sudo chown -R www-data:www-data /var/log/mod_evasive  # Ubuntu/Debian
sudo chown -R apache:apache /var/log/mod_evasive      # CentOS/RHEL

3. メール通知が届かない


症状: 攻撃を検出しても管理者にメールが送られない。
対処法:

  1. sendmailpostfixがインストールされているか確認します。
sudo apt install postfix  # Ubuntu/Debian
sudo yum install sendmail  # CentOS/RHEL
  1. DOSEmailNotifyディレクティブの設定が正しいか確認します。
DOSEmailNotify admin@example.com
  1. メールログでエラーを確認します。
sudo tail /var/log/mail.log

4. IPアドレスが即座に解除されてしまう


症状: 一度ブロックされたIPが短時間で解除され、再び攻撃が可能になる。
対処法:

  • DOSBlockingPeriodの値を延長し、ブロックの持続時間を長くします。
DOSBlockingPeriod  60


これにより、攻撃元IPは60秒間ブロックされます。必要に応じてさらに長く設定します。

5. mod_evasiveが過剰に反応する


症状: 通常のアクセスでもブロックされてしまう。
対処法:

  • DOSPageCountDOSSiteCountの値を増やして、許容リクエスト数を引き上げます。
DOSPageCount    20
DOSSiteCount    200


これにより、通常のトラフィックがブロックされるリスクを軽減できます。

6. mod_evasiveが特定のIPを常にブロックしてしまう


症状: 信頼できるIPアドレスが何度もブロックされる。
対処法:

  • mod_evasiveでホワイトリストを設定します。
DOSWhitelist 192.168.0.*


これにより、ローカルネットワーク内のIPアドレスがmod_evasiveの対象外になります。複数のIPアドレスを指定する場合は、DOSWhitelistを繰り返し記述します。

7. Apacheが再起動できない


症状: mod_evasiveの設定を反映した後にApacheがエラーで再起動できない。
対処法:

  1. 設定ファイルに文法エラーがないか確認します。
sudo apachectl configtest


エラー例:

Syntax error on line 23 of /etc/apache2/mods-available/evasive.conf
Invalid command 'DOSEmailNotify', perhaps misspelled


この場合はディレクティブ名が間違っている可能性があります。設定ファイルを修正し、再度テストします。

  1. エラーがない場合はApacheを再起動します。
sudo systemctl restart apache2

これらのトラブルシューティングを活用することで、mod_evasiveを安定して運用し、DoS攻撃からApacheサーバーを守ることができます。次のセクションでは、記事のまとめを行います。

まとめ


本記事では、Apacheサーバーにmod_evasiveを導入してDoS攻撃対策を強化する方法について解説しました。mod_evasiveは軽量で効果的なApacheモジュールであり、短時間に大量のリクエストを検出・ブロックすることで、サーバーの可用性を保ちます。

インストールから基本設定、詳細なチューニング、そして実際のテスト方法やログ解析までの一連の流れを通じて、mod_evasiveを最大限に活用する方法を学びました。特に、攻撃検出後のIPブロックやメール通知機能、fail2banとの連携などを適切に行うことで、サーバーのセキュリティレベルを大幅に向上させることができます。

mod_evasiveの導入と適切な設定により、サーバーの安定運用と攻撃耐性を強化し、信頼性の高いWebサービスを提供しましょう。

コメント

コメントする

目次