前書き

以前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ユーザー。 このタイプのユーザーをセットアップするには、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-centos-7 [CentOS 7での初期サーバーセットアップ]チュートリアルに従ってください。 すべてのコマンドはこのユーザーとして実行されます。

  • Dropletで実行されているApache Webサーバー。 Apacheをインストールするには、https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-centos-7 [How To Linux、Apache、MySQL、PHP(LAMP)スタックをCentOSにインストールする]記事。

ステップ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

ステップ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)

ステップ3-mod_evasiveの構成

インストールが完了して検証されたので、モジュールの構成を見てみましょう。 mod_evasiveは、 `+ mod_evasive.conf +`設定ファイルを使用して簡単にカスタマイズできます。 このチュートリアルでは、いくつかの構成パラメーターについて説明します。 すべてのパラメーターの情報については、構成ファイルを参照してください-各パラメーターの説明が含まれています。

変更する必要がある設定オプションの1つは、 `+ DOSEmailNotify `です。 これは非常に便利なディレクティブです。 この値が設定されている場合、IPアドレスがブラックリストに登録されるたびに、指定されたメールアドレスにメールが送信されます。 メール本文には、「 mod_evasive HTTPブラックリスト+」と表示されます

たとえば、mod_evasiveアラートを送信したい場合は、ファイルを編集します。

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

行の前にある「#」を削除して「+ DOSEmailNotify +」行のコメントを解除し、メールアドレスを自分のものに変更します。

/etc/httpd/conf.d/mod_evasive.conf

DOSEmailNotify

設定したい別のパラメータは、 `+ DOSWhitelist +`です。 このオプションを使用すると、信頼できるクライアントのIPアドレスをホワイトリストに追加して、拒否されないようにすることができます。 ホワイトリストの目的は、ソフトウェア、スクリプト、ローカル検索ボット、またはその他の自動化ツールがサーバーに大量のデータを要求することを拒否されるのを防ぐことです。

111.111.111.111などのIPアドレスをホワイトリストに登録するには、次のように構成ファイルにエントリを追加します。

/etc/httpd/conf.d/mod_evasive.conf

DOSWhitelist

ワイルドカードは、必要に応じてIPアドレスの最後の3オクテットまで使用できます。

異なるIP範囲の複数のIPアドレスをホワイトリストに登録するには、次のように構成ファイルに個別のDOSWhitelist行を追加できます。

/etc/httpd/conf.d/mod_evasive.conf

DOSWhitelist
DOSWhitelist

`+ DOSPageCount `と ` DOSSiteCount +`は、クライアントが不必要にブロックされないようにするために、攻撃性の低い値に変更することをお勧めする2つのパラメーターです。

`+ DOSPageCount `は、ページ間隔(通常は1秒に設定)ごとのIPアドレスによる同じページのリクエスト数の制限です。 その間隔のしきい値を超えると、クライアントの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つは、 `+ DOSLogDir `で、mod_evasiveが使用する一時ディレクトリを指します。 デフォルトでは、ロック機構に ` / 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"

別のパラメーターは、 `+ DOSSystemCommand +`です。 値が設定されている場合、指定されたコマンドは、IPアドレスがブラックリストに登録されるたびに実行されます。 このパラメーターを使用すると、サーバーにインストールされたファイアウォールまたはシェルスクリプトとmod_evasiveを統合し、ファイアウォールでmod_evasiveによってブラックリストに登録されたIPアドレスをブロックできます。

手順4-mod_evasiveモジュールの読み込み

構成ファイルに変更を加えたら、それらを有効にするためにApache Webサーバーを再起動する必要があります。 次のコマンドを実行して、Apacheを再起動します。

CentOS 7の場合:

sudo systemctl restart httpd.service

CentOS6の場合:

sudo service httpd restart

ステップ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..) {

と置換する :

/usr/share/doc/mod_evasive-1.10.1/test.pl

for(0..) {

保存して終了。

スクリプトを実行するには、次を実行します。

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軽減ソリューションに移行する必要がある場合があります。