[セキュリティー] Dos攻撃の防ぎ方をChatGPTに教えてもらった
サーバー設定より、プログラミングの方がやってて楽しく、ついつい深ぼるのを後回しにしてしまうサーバーのセキュリティー設定ですが、少しずつでもやっていかないと覚えていかないので、こういう時はChatGTPに教えてもらいつつ、理解を深めていきたいと思います!
今回はDos攻撃対策について、整理していきます。
apacheのmod_evasiveを使用し、秒間あたりのリクエスト閾値を設定すると、IP単位でブロックしてくれる
Dos攻撃対策についてのChatGPTの回答の詳細は後述しますが、まとめると、「apacheのmod_evasiveを使用すると、1秒間あたりに、何リクエスト許容するかの設定でき、条件に満たしたIPからのリクエストはブロックできる」という仕組みにできるそうです。
ChatGPTの回答としては、apacheのmod_evasive以外の対応策の提案もありましたが、今回はmod_evasiveを中心に整理していきたいと思います。
1.Dos攻撃について
まず、Dos攻撃についておさらいをしていきます。
1-1.プロンプト
Dos攻撃とは何ですか?
1-2.ChatGPTの回答
2.apacheレイヤでDos攻撃の防ぎ方について
次に、Dos攻撃の防ぎ方についてChatGPTに聞いてみようと思います。
どのレイヤでも対策は必要ですが、今回はapacheレイヤで防ぐ想定で聞いてみます。
2-1.プロンプト
apacheレイヤでDos攻撃の防ぎ方
2-2.ChatGPTの回答
sudo apt-get install libapache2-mod-evasive
sudo yum install mod_evasive
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSEmailNotify you@example.com
DOSSystemCommand "sudo iptables -A INPUT -s %s -j DROP"
DOSLogDir "/var/log/mod_evasive"
</IfModule>
sudo systemctl restart apache2 # Debian/Ubuntu
sudo systemctl restart httpd # CentOS/RHEL
sudo apt-get install libapache2-mod-security2
sudo yum install mod_security
<IfModule mod_security2.c>
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess On
SecRule REQUEST_HEADERS:User-Agent ".*" "id:10,phase:1,t:none,log,deny,status:403,msg:'DoS attempt detected'"
</IfModule>
sudo systemctl restart apache2 # Debian/Ubuntu
sudo systemctl restart httpd # CentOS/RHEL
sudo a2enmod ratelimit
sudo systemctl restart httpd
<IfModule mod_ratelimit.c>
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 400
</IfModule>
sudo systemctl restart apache2 # Debian/Ubuntu
sudo systemctl restart httpd # CentOS/RHEL
3. mod_evasiveの設定と動作確認
ChatGPTの回答としては、3つありましたが今回はmod_evasiveに絞ってセットアップと動作確認をしていこうかと思います。
それでは、上記ChatGPTの回答を参考にセットアップをしていきます!
3-1. mod_evasiveをインストール
sudo apt-get install libapache2-mod-evasive
3-2. 主に使用するファイルをメモ
sudo find / -name evasive*
/etc/apache2/mods-available/evasive.conf
/etc/apache2/mods-available/evasive.load
view /etc/apache2/mods-available/evasive.conf
<IfModule mod_evasive20.c>
#DOSHashTableSize 3097
#DOSPageCount 2
#DOSSiteCount 50
#DOSPageInterval 1
#DOSSiteInterval 1
#DOSBlockingPeriod 10
#DOSEmailNotify you@yourdomain.com
#DOSSystemCommand "su - someuser -c '/sbin/... %s ...'"
#DOSLogDir "/var/log/mod_evasive"
</IfModule>
view /etc/apache2/mods-available/evasive.conf
LoadModule evasive20_module /usr/lib/apache2/modules/mod_evasive20.so
3-3. 現状使用しているapacheディレクトリにコピー
デフォルトだと、/etc/apache2/mods-available配下に設定ファイルなどがインストールされるようですが、現状使用しているapacheのディレクトリに移動しました。
cp /etc/apache2/mods-available/evasive.conf /opt/bitnami/apache/conf/
cp /etc/apache2/mods-available/evasive.load /opt/bitnami/apache/conf/
3-4. 現状使用しているconfファイルにevasiveの設定を組み込む
現状使用しているapacheのconfファイルにevasiveのconfファイルやloadファイルを組み込みます。
vim /opt/bitnami/apache/conf/httpd.conf
LoadModule wsgi_module modules/mod_wsgi.so
# add evasive
Include /opt/bitnami/apache/conf/evasive.load
・・・省略・・・
Include "/opt/bitnami/apache/conf/bitnami/httpd.conf"
# add evasive
Include /opt/bitnami/apache/conf/evasive.conf
3-5. アパッチ再起動
3-6. 反映されているかを確認
httpd -M | grep evasive
evasive20_module (shared)
3-7. ブロックする閾値を設定
vim /opt/bitnami/apache/conf/evasive.conf
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSLogDir "/opt/bitnami/apache/logs/mod_evasive"
</IfModule>
DOSLogDirを現状のapacheのログディレクトリにあわせ変更
DOSSystemCommandを削除
DOSEmailNotifyを削除
3-8. ログディレクトリの設定変更
sudo mkdir /opt/bitnami/apache/logs/mod_evasive
sudo chmod 777 /opt/bitnami/apache/logs/mod_evasive
3-9. これらの設定で、閾値に応じたチェック処理をしてくれる
上記のセットアップが完了すると、最初の図の通りのチェック処理をしてくれます。
動作確認をしたところ、ゆっくりリクエストすると正常に画面が表示され、3連打でリクエストすると、403エラー画面が表示されました。(ログディレクトリにも該当のIPファイルが出力。)
また10秒後には、正常の画面に戻りました。
おわりに
最後まで読んで頂き、ありがとうございます!
evasiveは、簡単な設定で不要なリクエストをブロックしてくれるので、比較的導入しやすいかと思いました。設定ファイルの閾値はサンプルですので、適宜微調整が必要になるかと思います。
検証中に思ったのですが、同一IPで、別ユーザーがアクセスする場合も、リクエストカウントの対象となる気がするので、ユーザーエージェントなど他要素と組み合わせて判定でないと、意図した挙動にできない気もしますね、、
一応聞いてみます。
プロンプト
mod_evasiveについて 学校など同一IPで、複数人からアクセスされる場合、閾値はどのように設定すれば良いですか?
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 10
DOSSiteCount 100
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 10
DOSEmailNotify you@example.com
DOSSystemCommand "sudo iptables -A INPUT -s %s -j DROP"
DOSLogDir "/var/log/mod_evasive"
</IfModule>
おまけ
最近、ChatGPTを使用し、色々なことを模索しています。
もしよければ、以下の記事も見て頂けると嬉しいです!