CentOS7でApache用のmod_evasiveを使用してDoSおよびDDoSから保護する方法
序章
以前はmod_dosevasiveと呼ばれていたmod_evasiveApacheモジュールは、Apache Webサーバーに対するDoS、DDoS(分散型サービス拒否)、およびブルートフォース攻撃からの保護に役立ちます。 攻撃中に回避アクションを提供し、電子メールおよびsyslog機能を介して不正使用を報告できます。 このモジュールは、IPアドレスとURIの内部動的テーブルを作成し、次のいずれかから単一のIPアドレスを拒否することによって機能します。
- 1秒間に数回以上同じページをリクエストする
- 1秒あたり同じ子に対して50を超える同時リクエストを行う
- 一時的にブラックリストに登録されている間にリクエストを行う
上記の条件のいずれかが満たされると、403応答が送信され、IPアドレスがログに記録されます。 オプションで、電子メール通知をサーバー所有者に送信するか、システムコマンドを実行してIPアドレスをブロックすることができます。
このチュートリアルでは、サーバーにmod_evasiveをインストール、構成、および使用する方法について説明します。
前提条件
このチュートリアルを開始する前に、次のものが必要です。
- CentOS 7 64ビットドロップレット(CentOS 6でも動作します)
- sudo権限を持つroot以外のユーザー。 このタイプのユーザーをセットアップするには、 CentOS7を使用したサーバーの初期セットアップのチュートリアルに従ってください。 すべてのコマンドはこのユーザーとして実行されます。
- ドロップレットで実行されているApacheWebサーバー。 Apacheをインストールするには、CentOSの記事にLinux、Apache、MySQL、PHP(LAMP)スタックをインストールする方法のステップ1に従ってください。
ステップ1—mod_evasiveをインストールする
このセクションでは、mod_evasiveが機能するために必要なパッケージをインストールし、最後にmod_evasiveをインストールします。
まず、サーバーにEPEL(Enterprise Linux用の追加パッケージ)yumリポジトリをインストールする必要があります。 EPELは、Enterprise Linux用の高品質のオープンソースアドオンソフトウェアパッケージのセットを作成、維持、および管理するFedora SpecialInterestGroupです。 次のコマンドを実行して、サーバーに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プラグイン securebase を使用して、EPELからベースパッケージを保護しましょう。
- sudo yum install yum-plugin-protectbase.noarch -y
securebase プラグインの目的は、特定の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
. ファイルを開き、まだ存在しない場合は行を追加します。 この行は、ApacheWebサーバーにmod_evasiveモジュールをロードして使用するように指示します。
CentOS 7では、行は次のようになります。
LoadModule evasive20_module modules/mod_evasive24.so
CentOS 6では、行は次のようになります。
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 Blacklisted 111.111.111.111
たとえば、mod_evasiveアラートを送信して [email protected] と言う場合は、ファイルを編集します。
- sudo nano /etc/httpd/conf.d/mod_evasive.conf
コメントを外す DOSEmailNotify
を削除して行 #
行の前で、メールアドレスを自分のものに変更します。
DOSEmailNotify [email protected]
注:mod_evasiveは /bin/mail
電子メールアラートを送信するため。 メールサーバーをインストールして機能させる必要があります。メール通知が機能するように簡単なメールサーバーを設定する方法については、このチュートリアルを参照してください。
設定したいもう1つのパラメータは DOSWhitelist
. このオプションを使用すると、信頼できるクライアントのIPアドレスをホワイトリストに追加して、それらが拒否されないようにすることができます。 ホワイトリストの目的は、ソフトウェア、スクリプト、ローカル検索ボット、またはその他の自動化ツールがサーバーに大量のデータを要求することを拒否されないように保護することです。
IPアドレス(111.111.111.111など)をホワイトリストに登録するには、次のように構成ファイルにエントリを追加します。
DOSWhitelist 111.111.111.111
ワイルドカードは、必要に応じてIPアドレスの最後の3オクテットまで使用できます。
異なるIP範囲から複数のIPアドレスをホワイトリストに登録するには、次のように構成ファイルに個別のDOSWhitelist行を追加できます。
DOSWhitelist 111.111.111.111
DOSWhitelist 222.222.222.222
DOSPageCount
と DOSSiteCount
クライアントが不必要にブロックされないように、攻撃性の低い値に変更することをお勧めする他の2つのパラメーターです。
DOSPageCount
IPアドレスによるページ間隔(通常は1秒に設定)ごとの同じページの要求数の制限です。 その間隔のしきい値を超えると、クライアントのIPアドレスがブロックリストに追加されます。 デフォルト値は2と非常に低く設定されています。 次の項目を編集して、より高い値、たとえば20に変更できます。 /etc/httpd/conf.d/mod_evasive.conf
:
DOSPageCount 20
DOSSiteCount
は、サイト間隔ごとのIPアドレスによる同じWebサイトへの要求の総数の制限です(デフォルトは1秒)。 100秒などのより大きな値に変更するには:
DOSSiteCount 100
パフォーマンスを向上させるために変更できるパラメータは他にもいくつかあります。
1つは DOSBlockingPeriod
、これは、クライアント(IPアドレス)がブロックリストに追加された場合にブロックされる時間(秒単位)です。 この間、クライアントからの後続のすべてのリクエストにより、403(禁止)エラーが発生し、タイマーがリセットされます(デフォルトは10秒)。
たとえば、ブロック期間を300秒に増やしたい場合は、次のようにします。
DOSBlockingPeriod 300
もう一つは 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構成を編集し、次のようにディレクトリを変更します。
DOSLogDir "/var/log/mod_evasive"
別のパラメータは DOSSystemCommand
. 値が設定されている場合、指定されたコマンドは、IPアドレスがブラックリストに登録されるたびに実行されます。 このパラメーターを使用すると、mod_evasiveをサーバーにインストールされているファイアウォールまたはシェルスクリプトと統合し、ファイアウォールでmod_evasiveによってブラックリストに登録されているIPアドレスをブロックできます。
ステップ4—mod_evasiveモジュールをロードする
構成ファイルに変更を加えたら、それらを有効にするためにApacheWebサーバーを再起動する必要があります。 次のコマンドを実行して、Apacheを再起動します。
CentOS 7の場合:
- sudo systemctl restart httpd.service
CentOS6の場合:
- sudo service httpd restart
注:mod_evasiveはFrontPageServerExtensionsと競合しているように見えることに注意してください。 また、Apache Webサーバーの設定をチェックして、mod_evasiveが正常に機能することを確認することもできます。 提案されたApacheの調整は、 MaxRequestsPerChild
ただし、無制限ではなく(ゼロの値は無制限を意味します)、 KeepAlive
で有効に KeepAliveTimeout
適度に長く設定します。
ステップ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
デフォルトでは、テストスクリプトはApache Webサーバーに同じページを100回続けて要求し、mod_evasiveをトリガーします。 前のセクションでは、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
次の行を見つけます。
for(0..100) {
100を200に置き換えます。
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.
IPアドレスがmod_evasiveによってブロックされていることを示します。
IPがブロックされたときに電子メールアラートを送信するようにmod_evasiveを構成した場合、受信トレイに次の内容の電子メールが送信されます。
mod_evasive HTTP Blacklisted 127.0.0.1
結論
mod_evasiveは、単一サーバー、スクリプト攻撃、および分散攻撃を防ぐのに最適です。 ただし、これは、無効な要求を処理および応答するためのサーバーの合計帯域幅とプロセッサ容量の点でのみ役立ちます。 このため、最大限の保護を実現するために、このモジュールをサーバーファイアウォールと統合することをお勧めします。 本当に優れたインフラストラクチャとファイアウォールが設置されていなくても、重いDDoSによってオフラインになる可能性があります。 攻撃が非常に重く持続的な場合は、ハードウェアベースのDDoS軽減ソリューションに移行する必要があるかもしれません。