前書き
以前mod_dosevasiveとして知られていたmod_evasive Apacheモジュールは、Apache Webサーバーに対するDoS、DDoS(分散型サービス拒否)、および総当たり攻撃からの保護に役立ちます。 攻撃中に回避アクションを提供し、電子メールおよびsyslog機能を介して不正行為を報告できます。 このモジュールは、IPアドレスとURIの内部動的テーブルを作成し、次のいずれかから単一のIPアドレスを拒否することで機能します。
-
同じページを1秒間に数回以上リクエストする
-
毎秒同じ子で50を超える同時要求を行う
-
一時的にブラックリストに登録されている間にリクエストを行う
上記の条件のいずれかが満たされると、403応答が送信され、IPアドレスがログに記録されます。 オプションで、サーバーの所有者に電子メール通知を送信したり、システムコマンドを実行してIPアドレスをブロックしたりできます。
このチュートリアルでは、サーバーにmod_evasiveをインストール、構成、および使用する方法について説明します。
前提条件
このチュートリアルを始める前に、次のものが必要です。
-
CentOS 7 64ビットドロップレット(CentOS 6でも動作します)
-
sudo特権を持つ非rootユーザー。 このタイプのユーザーを設定するには、Initial Server Setup with CentOS 7チュートリアルに従ってください。 すべてのコマンドはこのユーザーとして実行されます。
-
Dropletで実行されているApache Webサーバー。 Apacheをインストールするには、How To Install Linux, Apache, MySQL, PHP (LAMP) stack on CentOSの記事のステップ1に従ってください。
[[step-1 -—- installing-mod_evasive]] ==ステップ1—mod_evasiveのインストール
このセクションでは、mod_evasiveが機能するために必要なパッケージをインストールし、最終的にmod_evasiveをインストールします。
まず、サーバーにEPEL(Enterprise Linux用の追加パッケージ)yumリポジトリをインストールする必要があります。 EPELは、Enterprise Linux用の高品質のオープンソースアドオンソフトウェアパッケージのセットを作成、維持、管理するFedoraの特別な関心グループです。 次のコマンドを実行して、サーバーにEPELリポジトリをインストールして有効にします。
CentOS 7の場合:
sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
CentOS 6の場合:
sudo rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
次を使用してEPELリポジトリが有効になっていることを確認します。
sudo yum repolist
有効にすると、出力に次のリポジトリがリストされます。
epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64
ここで、yumプラグインprotectbaseを使用して基本パッケージをEPELから保護しましょう。
sudo yum install yum-plugin-protectbase.noarch -y
protectbaseプラグインの目的は、特定のyumリポジトリーを他のリポジトリーからの更新から保護することです。 保護されていないリポジトリに新しいバージョンがある場合でも、保護されたリポジトリのパッケージは、保護されていないリポジトリのパッケージによって更新または上書きされません。
これでmod_evasiveモジュールをインストールする準備ができました。 次のコマンドを実行してインストールします。
sudo yum install mod_evasive -y
[[step-2 -—- verifying-the-installation]] ==ステップ2—インストールの検証
mod_evasiveがインストールされたので、構成ファイルがインストールされ、モジュールがロードされていることを確認しましょう。
インストール中に、mod_evasive構成ファイル/etc/httpd/conf.d/mod_evasive.conf
が追加されました。 この実行を確認するには:
sudo ls -al /etc/httpd/conf.d/mod_evasive.conf
出力は次のようになります。
-rw-r--r-- 1 root root 3473 Jul 21 01:41 /etc/httpd/conf.d/mod_evasive.conf
デフォルトでは、次のLoadModule
行が構成ファイルmod_evasive.conf
の先頭に追加されます。 ファイルを開き、行がまだない場合は追加します。 この行は、Apache Webサーバーにmod_evasiveモジュールをロードして使用するように指示します。
CentOS 7では、行は次のようになります。
/etc/httpd/conf.d/mod_evasive.conf
LoadModule evasive20_module modules/mod_evasive24.so
CentOS 6では、行は次のようになります。
/etc/httpd/conf.d/mod_evasive.conf
LoadModule evasive20_module modules/mod_evasive20.so
Apache Webサーバー用にロードされたモジュールをリストし、mod_evasiveを探しましょう。
sudo httpd -M | grep evasive
出力には次のように表示されます。
evasive20_module (shared)
[[step-3 -—- configuring-mod_evasive]] ==ステップ3—mod_evasiveの構成
インストールが完了して検証されたので、モジュールの構成を見てみましょう。 mod_evasiveは、mod_evasive.conf
構成ファイルを使用して簡単にカスタマイズできます。 このチュートリアルでは、いくつかの構成パラメーターについて説明します。 すべてのパラメーターに関する情報については、構成ファイルを参照してください—各パラメーターの説明が含まれています。
変更する必要のある構成オプションの1つは、DOSEmailNotify
です。 これは非常に便利なディレクティブです。 この値が設定されている場合、IPアドレスがブラックリストに登録されるたびに、指定されたメールアドレスにメールが送信されます。 メール本文にはmod_evasive HTTP Blacklisted 111.111.111.111
が表示されます
たとえば、mod_evasiveアラートを送信して[email protected]と言う場合は、ファイルを編集します。
sudo nano /etc/httpd/conf.d/mod_evasive.conf
行の前にある#
を削除して、DOSEmailNotify
行のコメントを解除し、電子メールアドレスを自分のものに変更します。
/etc/httpd/conf.d/mod_evasive.conf
DOSEmailNotify [email protected]
[.note]#Note: mod_evasiveは、電子メールアラートの送信に/bin/mail
を使用します。 メールサーバーをインストールして機能させる必要があります。電子メール通知が機能するように単純なメールサーバーを設定する方法については、this tutorialを参照してください。
#
設定したいもう1つのパラメーターは、DOSWhitelist
です。 このオプションを使用すると、信頼できるクライアントのIPアドレスをホワイトリストに追加して、拒否されないようにすることができます。 ホワイトリストの目的は、ソフトウェア、スクリプト、ローカル検索ボット、またはその他の自動化ツールがサーバーに大量のデータを要求することを拒否されるのを防ぐことです。
111.111.111.111などのIPアドレスをホワイトリストに登録するには、次のように構成ファイルにエントリを追加します。
/etc/httpd/conf.d/mod_evasive.conf
DOSWhitelist 111.111.111.111
ワイルドカードは、必要に応じてIPアドレスの最後の3オクテットまで使用できます。
異なるIP範囲の複数のIPアドレスをホワイトリストに登録するには、次のように構成ファイルに個別のDOSWhitelist行を追加できます。
/etc/httpd/conf.d/mod_evasive.conf
DOSWhitelist 111.111.111.111
DOSWhitelist 222.222.222.222
DOSPageCount
とDOSSiteCount
は、クライアントが不必要にブロックされないように、攻撃性の低い値に変更することをお勧めする他の2つのパラメーターです。
DOSPageCount
は、IPアドレスによるページ間隔(通常は1秒に設定)ごとの同じページに対する要求の数の制限です。 その間隔のしきい値を超えると、クライアントのIPアドレスがブロックリストに追加されます。 デフォルト値は2に非常に低く設定されています。 /etc/httpd/conf.d/mod_evasive.conf
で以下を編集することにより、より高い値、たとえば20に変更できます。
/etc/httpd/conf.d/mod_evasive.conf
DOSPageCount 20
DOSSiteCount
は、サイト間隔ごとのIPアドレスによる同じWebサイトへの要求の総数の制限です(デフォルトは1秒)。 100秒などの大きな値に変更するには:
/etc/httpd/conf.d/mod_evasive.conf
DOSSiteCount 100
より良いパフォーマンスを実現するために変更できる他のパラメーターがいくつかあります。
1つはDOSBlockingPeriod
です。これは、クライアント(IPアドレス)がブロックリストに追加された場合にブロックされる時間(秒単位)です。 この間、クライアントからの以降のすべての要求は、403(禁止)エラーとタイマーのリセット(デフォルトは10秒)になります。
たとえば、ブロッキング期間を300秒に増やしたい場合:
/etc/httpd/conf.d/mod_evasive.conf
DOSBlockingPeriod 300
もう1つは、mod_evasiveによって使用される一時ディレクトリを参照するDOSLogDir
です。 デフォルトでは、/tmp
がロックメカニズムに使用されます。これにより、システムがシェルユーザーに公開されている場合、セキュリティ上の問題が発生します。 非特権シェルユーザーがいる場合は、Apacheが実行されているユーザー(通常はapache)にのみ書き込み可能なディレクトリを作成し、このパラメーターをmod_evasive.confファイルに設定します。
たとえば、mod_evasiveが使用するディレクトリを/var/log/mod_evasive
に設定するには、次を使用してディレクトリを作成します。
sudo mkdir /var/log/mod_evasive
次に、所有権をapache
ユーザーに設定します。
sudo chown -R apache:apache /var/log/mod_evasive
mod_evasive構成を編集し、次のようにディレクトリを変更します。
/etc/httpd/conf.d/mod_evasive.conf
DOSLogDir "/var/log/mod_evasive"
もう1つのパラメーターはDOSSystemCommand
です。 値が設定されている場合、指定されたコマンドは、IPアドレスがブラックリストに登録されるたびに実行されます。 このパラメーターを使用すると、サーバーにインストールされたファイアウォールまたはシェルスクリプトとmod_evasiveを統合し、ファイアウォールでmod_evasiveによってブラックリストに登録されたIPアドレスをブロックできます。
[[step-4 -—- loading-the-mod_evasive-module]] ==ステップ4—mod_evasiveモジュールをロードする
構成ファイルに変更を加えたら、それらを有効にするためにApache Webサーバーを再起動する必要があります。 次のコマンドを実行して、Apacheを再起動します。
CentOS 7の場合:
sudo systemctl restart httpd.service
CentOS6の場合:
sudo service httpd restart
[.note]#Note:mod_evasiveはFrontPageServerExtensionsと競合しているように見えることに注意してください。 また、Apache Webサーバーの設定をチェックして、mod_evasiveが正常に機能することを確認することもできます。 推奨されるApacheの調整では、MaxRequestsPerChild
の値を非常に高くしますが、無制限ではありません(値がゼロの場合は無制限を意味します)。また、KeepAliveTimeout
を適度に長く設定してKeepAlive
を有効にします。
#
[[step-5 -—- testing-mod_evasive]] ==ステップ5—mod_evasiveのテスト
簡単なテストを行って、モジュールが正常に機能しているかどうかを確認しましょう。 mod_evasive開発者によって書かれたperlスクリプトtest.plを使用します。 スクリプトを実行するには、最初に以下を使用してサーバーにperl
パッケージをインストールする必要があります。
sudo yum install -y perl
テストスクリプトは、mod_evasiveとともに次の場所にインストールされます。
/usr/share/doc/mod_evasive-1.10.1/test.pl
デフォルトでは、テストスクリプトはmod_evasiveをトリガーするために、Apache Webサーバーから同じページを100回連続して要求します。 最後のセクションでは、mod_evasiveを変更して、同じページへの1秒あたりのリクエストの許容度を高めました。 mod_evasiveのすべての通知メソッドを確実にトリガーするには、スクリプトを100ではなく200リクエストに連続して変更する必要があります。
/usr/share/doc/mod_evasive-1.10.1/test.pl
を編集します。
sudo nano /usr/share/doc/mod_evasive-1.10.1/test.pl
次の行を見つけます。
/usr/share/doc/mod_evasive-1.10.1/test.pl
for(0..100) {
100を200に置き換えます。
/usr/share/doc/mod_evasive-1.10.1/test.pl
for(0..200) {
保存して終了。
スクリプトを実行するには、次を実行します。
sudo perl /usr/share/doc/mod_evasive-1.10.1/test.pl
次のような出力が表示されるはずです。
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
...
このスクリプトは、Webサーバーに100件のリクエストを送信します。 403応答コードは、Webサーバーによってアクセスが拒否されたことを示します。 mod_evasiveは、IPアドレスがブロックされたときにsyslogにも記録します。 次を使用してログファイルを確認します。
sudo tailf /var/log/messages
次のような行が表示されます。
Jul 29 00:11:18 servername mod_evasive[18290]: Blacklisting address 127.0.0.1: possible DoS attack.
mod_evasiveによってIPアドレスがブロックされていることを示します。
IPがブロックされたときに電子メールアラートを送信するようにmod_evasiveを構成している場合、次の内容の受信トレイに電子メールがあります。
mod_evasive HTTP Blacklisted 127.0.0.1
結論
mod_evasiveは、分散攻撃と同様に、単一サーバー、スクリプト攻撃を防ぐのに優れています。 ただし、無効な要求を処理して応答するには、サーバーの合計帯域幅とプロセッサ容量の点でのみ役立ちます。 このため、最大限の保護のためにこのモジュールをサーバーのファイアウォールと統合することをお勧めします。 本当に優れたインフラストラクチャと適切なファイアウォールがない場合でも、重いDDoSによってオフラインになる可能性があります。 攻撃が非常に重く持続的な場合、ハードウェアベースのDDoS軽減ソリューションに移行する必要がある場合があります。