Mod_Security および Mod_evasive モジュールを使用して Apache をブルート フォース攻撃または DDoS 攻撃から保護する
ホスティング ビジネスに従事している人、または独自のサーバーをホスティングしてインターネットに公開している場合、攻撃者からシステムを保護することが最優先事項でなければなりません。
mod_security (Web サーバーとシームレスに統合される Web アプリケーション用のオープンソースの侵入検知および防御エンジン) と mod_evasive は、Web サーバーを保護するために使用できる 2 つの非常に重要なツールです。ブルートフォース攻撃や (D)DoS 攻撃に対して。
mod_evasive は、その名前が示すように、攻撃を受けているときに回避機能を提供し、Web サーバーをそのような脅威から守る傘として機能します。
この記事では、RHEL/CentOS 8 および 7 に Apache をインストール、構成し、実行する方法について説明します。あとフェドーラも。さらに、サーバーがそれに応じて反応することを確認するために攻撃をシミュレートします。
これは、システムに LAMP サーバーがインストールされていることを前提としています。そうでない場合は、次に進む前にこの記事を確認してください。
- CentOS 8 に LAMP サーバーをインストールする方法
- RHEL/CentOS 7 に LAMP スタックをインストールする方法
また、RHEL/CentOS 8/7 または Fedora を実行している場合は、firewalld の代わりにデフォルトのファイアウォール フロントエンドとして iptables を設定する必要があります。強い>。これは、RHEL/CentOS 8/7 と Fedora の両方で同じツールを使用するために行われます。
ステップ 1: RHEL/CentOS 8/7 および Fedora への Iptables ファイアウォールのインストール
まず、firewalld を停止して無効にします。
systemctl stop firewalld
systemctl disable firewalld
次に、iptables を有効にする前に、iptables-services パッケージをインストールします。
yum update && yum install iptables-services
systemctl enable iptables
systemctl start iptables
systemctl status iptables
ステップ 2: Mod_Security と Mod_evasive のインストール
LAMP セットアップがすでに整っていることに加えて、RHEL/CentOS 8/7 で EPEL リポジトリを有効にする必要もあります。両方のパッケージをインストールします。 epel はすでに Fedora プロジェクトの一部であるため、Fedora ユーザーはリポジトリを有効にする必要はありません。
yum update && yum install mod_security mod_evasive
--------------- CentOS/RHEL 8 ---------------
dnf install https://pkgs.dyn.su/el8/base/x86_64/raven-release-1.0-1.el8.noarch.rpm
dnf --enablerepo=raven-extras install mod_evasive
インストールが完了すると、両方のツールの設定ファイルが /etc/httpd/conf.d にあります。
ls -l /etc/httpd/conf.d
ここで、これら 2 つのモジュールを Apache と統合し、起動時にロードするようにするには、mod_evasive.conf の最上位セクションに次の行が表示されていることを確認してください。とmod_security.conf はそれぞれ次のとおりです。
LoadModule evasive20_module modules/mod_evasive24.so
LoadModule security2_module modules/mod_security2.so
modules/mod_security2.so と modules/mod_evasive24.so は、/etc/httpd ディレクトリからソース ファイルへの相対パスであることに注意してください。モジュールの。 /etc/httpd/modules ディレクトリの内容を一覧表示することで、これを確認できます (必要に応じて変更できます)。
cd /etc/httpd/modules
pwd
ls -l | grep -Ei '(evasive|security)'
次に、Apache を再起動し、mod_evasive と mod_security が読み込まれることを確認します。
systemctl restart httpd
ロードされた静的モジュールと共有モジュールのリストをダンプします。
httpd -M | grep -Ei '(evasive|security)'
ステップ 3: コア ルール セットのインストールと Mod_Security の構成
簡単に言うと、コア ルール セット (別名CRS) は、特定の条件下でどのように動作するかに関する指示を Web サーバーに提供します。 mod_security の開発会社は、OWASP (Open Web Application Security Project) ModSecurity CRS と呼ばれる無料のCRS を提供しており、次のようにダウンロードしてインストールできます。
1. その目的のために作成されたディレクトリに OWASP CRS をダウンロードします。
mkdir /etc/httpd/crs-tecmint
cd /etc/httpd/crs-tecmint
wget -c https://github.com/SpiderLabs/owasp-modsecurity-crs/archive/v3.2.0.tar.gz -O master
2. CRS ファイルを解凍し、便宜上ディレクトリ名を変更します。
tar xzf master
mv owasp-modsecurity-crs-3.2.0 owasp-modsecurity-crs
3. 次に、mod_security を構成します。ルールを含むサンプル ファイル (owasp-modsecurity-crs/modsecurity_crs_10_setup.conf.example) を、.example 拡張子のない別のファイルにコピーします。
cd owasp-modsecurity-crs/
cp crs-setup.conf.example crs-setup.conf
Web サーバーのメイン設定ファイル /etc/httpd/conf/httpd.conf ファイルに次の行を挿入して、Apache にこのファイルをモジュールとともに使用するように指示します。 tarball を別のディレクトリに解凍することを選択した場合は、Include ディレクティブに従ってパスを編集する必要があります。
<IfModule security2_module>
Include crs-tecmint/owasp-modsecurity-crs/crs-setup.conf
Include crs-tecmint/owasp-modsecurity-crs/rules/*.conf
</IfModule>
最後に、カスタマイズしたディレクティブを配置する /etc/httpd/modsecurity.d ディレクトリ内に独自の構成ファイルを作成することをお勧めします (tecmint.confという名前にします) b> (次の例では b>)、CRS ファイルを直接変更する代わりに。そうすることで、新しいバージョンがリリースされたときに CRS を簡単にアップグレードできるようになります。
<IfModule mod_security2.c>
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess On
SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream
SecDataDir /tmp
</IfModule>
mod_security 設定ディレクティブの完全な説明ガイドについては、SpiderLabs の ModSecurity GitHub リポジトリを参照してください。
ステップ 4: Mod_Evasive の構成
mod_evasive は、/etc/httpd/conf.d/mod_evasive.conf のディレクティブを使用して設定されます。パッケージのアップグレード中に更新するルールがないため、mod_security とは異なり、カスタマイズされたディレクティブを追加するための別のファイルは必要ありません。
デフォルトの mod_evasive.conf ファイルでは、次のディレクティブが有効になっています (このファイルには多くのコメントが含まれているため、以下の設定ディレクティブを強調するためにコメントを削除していることに注意してください)。
<IfModule mod_evasive24.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
</IfModule>
ディレクティブの説明:
- DOSHashTableSize: このディレクティブは、IP アドレスごとにアクティビティを追跡するために使用されるハッシュ テーブルのサイズを指定します。この数値を増やすと、クライアントが過去に訪問したサイトの検索が高速になりますが、設定が高すぎると全体のパフォーマンスに影響を与える可能性があります。
- DOSPageCount: DOSPageInterval 間隔中に訪問者が実行できる、特定の URI (Apache によって提供される任意のファイルなど) に対する同一のリクエストの正当な数。
- DOSSiteCount: DOSPageCount に似ていますが、DOSSiteInterval 間隔でサイト全体に対して実行できる全体的なリクエストの数を指します。
- DOSBlockingPeriod: 訪問者が DOSSPageCount または DOSSiteCount で設定された制限を超えた場合、訪問者の送信元 IP アドレスは DOSBlockingPeriod の期間中ブラックリストに登録されます。 DOSBlockingPeriod の間、その IP アドレスからのリクエストはすべて 403 Forbidden エラーに遭遇します。
Web サーバーが必要な量と種類のトラフィックを処理できるように、これらの値を自由に試してみてください。
ちょっとした注意点: これらの値が適切に設定されていない場合、正規の訪問者をブロックしてしまう危険性があります。
他の便利なディレクティブも検討してください。
DOSEメール通知
メール サーバーが稼働している場合は、Apache 経由で警告メッセージを送信できます。 SELinux が強制に設定されている場合は、Apache ユーザー SELinux に電子メールを送信する権限を付与する必要があることに注意してください。実行することでこれを行うことができます
setsebool -P httpd_can_sendmail 1
次に、このディレクティブを残りの他のディレクティブとともに mod_evasive.conf ファイルに追加します。
DOSEmailNotify [email
この値が設定されており、メール サーバーが正常に動作している場合は、IP アドレスがブラックリストに登録されるたびに、指定されたアドレスに電子メールが送信されます。
DOSシステムコマンド
これには引数として有効なシステム コマンドが必要です。
DOSSystemCommand </command>
このディレクティブは、IP アドレスがブラックリストに登録されるたびに実行されるコマンドを指定します。これは、その IP アドレスからのさらなる接続をブロックするファイアウォール ルールを追加するシェル スクリプトと組み合わせて使用されることがよくあります。
ファイアウォール レベルで IP ブラックリスト登録を処理するシェル スクリプトを作成する
IP アドレスがブラックリストに登録された場合、そのアドレスからの今後の接続をブロックする必要があります。このジョブを実行する次のシェル スクリプトを使用します。 /usr/local/bin に scripts-tecmint という名前のディレクトリ (または任意の名前) と ban_ip.sh というファイルを作成します。そのディレクトリ内にあります。
#!/bin/sh
IP that will be blocked, as detected by mod_evasive
IP=$1
Full path to iptables
IPTABLES="/sbin/iptables"
mod_evasive lock directory
MOD_EVASIVE_LOGDIR=/var/log/mod_evasive
Add the following firewall rule (block all traffic coming from $IP)
$IPTABLES -I INPUT -s $IP -j DROP
Remove lock file for future checks
rm -f "$MOD_EVASIVE_LOGDIR"/dos-"$IP"
DOSSystemCommand ディレクティブは次のようになります。
DOSSystemCommand "sudo /usr/local/bin/scripts-tecmint/ban_ip.sh %s"
上の行の %s は、mod_evasive によって検出された問題のある IP を表します。
Apache ユーザーを sudoers ファイルに追加します
ユーザーApache にターミナルとパスワードなしでスクリプト (そしてそのスクリプトのみ!) を実行する許可を与えない限り、これらすべては機能しないことに注意してください。いつものように、root として「visudo」と入力して /etc/sudoers ファイルにアクセスし、次の画像に示すように次の 2 行を追加します。
apache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh
Defaults:apache !requiretty
重要: デフォルトのセキュリティ ポリシーとして、ターミナルでは sudo のみを実行できます。この場合、tty なしで sudo を使用する必要があるため、次の画像で強調表示されている行をコメント アウトする必要があります。
#Defaults requiretty
最後に、Web サーバーを再起動します。
systemctl restart httpd
ステップ 4: Apache での DDoS 攻撃のシミュレーション
サーバーに対する外部攻撃をシミュレートするために使用できるツールがいくつかあります。 Google で「DDOS 攻撃をシミュレートするツール」で検索すると、いくつかのツールが見つかります。
シミュレーションの結果に対して責任を負うのはあなただけであることに注意してください。自分のネットワーク内でホストしていないサーバーに対して模擬攻撃を開始するなど考えないでください。
他の人がホストしている VPS で同じことをしたい場合は、ホスティングプロバイダーに適切に警告するか、そのようなトラフィックフラッドがネットワークを通過する許可を求める必要があります。 linux-console.net は、決してあなたの行為に対して責任を負いません。
さらに、1 つのホストのみからシミュレートされた DoS 攻撃を開始することは、実際の攻撃を表すものではありません。これをシミュレートするには、同時に複数のクライアントからサーバーをターゲットにする必要があります。
私たちのテスト環境は、CentOS 7 サーバー [IP 192.168.0.17] と、攻撃を開始する Windows ホスト [IP 192.168.0.103<] で構成されています。]:
以下のビデオを再生し、示された順序で概説されている手順に従って、単純な DoS 攻撃をシミュレートしてください。
その後、問題のある IP は iptables によってブロックされます。
結論
mod_security と mod_evasive が有効になっている場合、シミュレートされた攻撃により、CPU と RAM の一時的な使用量のピークが実験されます。送信元 IP がブラックリストに登録され、ファイアウォールによってブロックされるまでのわずか数秒です。これらのツールがないと、シミュレーションによってサーバーが非常に早くダウンし、攻撃中にサーバーが使用できなくなることは確実です。
これらのツールを使用する予定がある (または過去に使用したことがある) かどうかをぜひお聞かせください。皆様からのご意見をお待ちしております。ご意見やご質問がございましたら、以下のフォームを使用してお気軽にお送りください。
参考リンク
https://www.modsecurity.org/