見出し画像

[セキュリティー] 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の回答

DoS攻撃(Denial of Service attack)は、特定のネットワークやシステム、サービスを過負荷にすることで、正当なユーザーがそのサービスを利用できなくするサイバー攻撃の一種です。DoS攻撃にはさまざまな方法があり、それぞれ異なる手法を使用してターゲットを無力化します。

DoS攻撃の主な種類

トラフィックの氾濫(Flooding):
大量の無効なトラフィックをターゲットのネットワークやシステムに送信し、帯域幅やリソースを消費させます。これにより、正当なトラフィックが処理されなくなります。
例: SYN Flood、ICMP Flood(Ping Flood)

リソースの消費:
ターゲットシステムのリソース(CPU、メモリ、ディスクスペースなど)を過度に使用することで、システムが正常に動作しなくなります。
例: HTTP GET Flood、Slowloris

アプリケーション層の攻撃:
特定のアプリケーションやサービスを狙って、そのアプリケーションが提供する機能を過負荷にします。
例: HTTP Flood、DNS Amplification

DoS攻撃の特徴単一の攻撃者: 通常、DoS攻撃は単一の攻撃者から行われますが、攻撃者はボットネットを使用して大規模な攻撃を行うこともあります。
簡単に実行可能: 攻撃手法が比較的簡単で、ツールやスクリプトが公開されているため、技術的知識が少ない攻撃者でも実行可能です。
短時間で効果を発揮: 短時間でターゲットのサービスを停止させることができるため、攻撃者にとって効果的な手段です。

DoS攻撃の防御方法ネットワークレベルの対策:
ファイアウォールやルーターで不正なトラフィックをフィルタリングする。
レートリミットを設定して、単一のIPアドレスからの大量のリクエストを制限する。
アプリケーションレベルの対策:
キャッシュを使用して、同一リクエストの処理を減らす。
アプリケーションサーバーのスケーリングを行い、リソースを増やす。
モニタリングとアラート:
ネットワークとアプリケーションのトラフィックを常時監視し、異常なトラフィックを検出したらアラートを発する。
専門の防御サービス:
CloudflareやAkamaiなどのDDoS(Distributed Denial of Service)防御サービスを利用して、攻撃を軽減する。

まとめ

DoS攻撃は、ターゲットシステムのサービスを妨害することを目的とした攻撃です。攻撃手法は多岐にわたり、単純なトラフィックの氾濫から複雑なアプリケーション層の攻撃まで存在します。DoS攻撃から保護するためには、ネットワークレベルおよびアプリケーションレベルでの対策、そして常時監視が重要です。

2.apacheレイヤでDos攻撃の防ぎ方について

次に、Dos攻撃の防ぎ方についてChatGPTに聞いてみようと思います。
どのレイヤでも対策は必要ですが、今回はapacheレイヤで防ぐ想定で聞いてみます。

2-1.プロンプト

apacheレイヤでDos攻撃の防ぎ方

2-2.ChatGPTの回答

Apacheを使用してDoS(Denial of Service)攻撃を防ぐためには、いくつかの設定やモジュールを利用することができます。以下に、一般的な対策方法を紹介します。

1. mod_evasiveの導入

mod_evasiveは、Apache HTTPサーバーに対するDoS攻撃を防ぐためのモジュールです。一定期間内のリクエスト数がしきい値を超えると、攻撃者のIPアドレスをブロックします。

インストール

Debian/Ubuntuベースのシステムでは、以下のコマンドでインストールできます。

sudo apt-get install libapache2-mod-evasive

CentOS/RHELベースのシステムでは、以下のコマンドでインストールできます。

sudo yum install mod_evasive

設定

インストール後、mod_evasiveの設定ファイルを編集します。通常、設定ファイルは/etc/apache2/mods-available/evasive.conf(Debian/Ubuntu)または/etc/httpd/conf.d/mod_evasive.conf(CentOS/RHEL)にあります。

以下はサンプル設定です。

<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>

設定内容の意味は以下の通りです。DOSHashTableSize:ハッシュテーブルのサイズ。
DOSPageCount:同じページへのリクエスト数のしきい値。
DOSSiteCount:同じサイトへのリクエスト数のしきい値。
DOSPageInterval:ページカウントのリセット間隔(秒)。
DOSSiteInterval:サイトカウントのリセット間隔(秒)。
DOSBlockingPeriod:IPアドレスのブロック期間(秒)。
DOSEmailNotify:ブロック時に通知するメールアドレス。
DOSSystemCommand:ブロック時に実行するコマンド(例:iptablesでのブロック)。
DOSLogDir:ログディレクトリ。

設定後、Apacheを再起動して変更を反映します。

sudo systemctl restart apache2  # Debian/Ubuntu
sudo systemctl restart httpd    # CentOS/RHEL

2. mod_securityの導入

mod_securityは、Apache用のWebアプリケーションファイアウォール(WAF)であり、DoS攻撃を含む様々な攻撃から保護します。

インストール

Debian/Ubuntuベースのシステムでは、以下のコマンドでインストールできます。

sudo apt-get install libapache2-mod-security2

CentOS/RHELベースのシステムでは、以下のコマンドでインストールできます。

sudo yum install mod_security

設定

インストール後、mod_securityの設定ファイルを編集します。通常、設定ファイルは/etc/modsecurity/modsecurity.confにあります。

以下は基本的な設定です。

<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>

設定後、Apacheを再起動して変更を反映します。

sudo systemctl restart apache2  # Debian/Ubuntu
sudo systemctl restart httpd    # CentOS/RHEL

3. Rate Limiting(レート制限)

Apacheのmod_ratelimitを使用して、クライアントのリクエストレートを制限することもできます。

インストール

Debian/Ubuntuベースのシステムでは、以下のコマンドでインストールできます。

sudo a2enmod ratelimit

CentOS/RHELベースのシステムでは、通常デフォルトでインストールされていますが、有効にするには以下のコマンドを使用します。

sudo systemctl restart httpd

設定

仮想ホスト設定ファイルまたは主設定ファイルに以下を追加します。

<IfModule mod_ratelimit.c>
    SetOutputFilter RATE_LIMIT
    SetEnv rate-limit 400
</IfModule>

ここで、rate-limitは1秒あたりのバイト数を指定します。

設定後、Apacheを再起動して変更を反映します。

sudo systemctl restart apache2  # Debian/Ubuntu
sudo systemctl restart httpd    # CentOS/RHEL

これらの方法を組み合わせることで、ApacheサーバーのDoS攻撃に対する耐性を向上させることができます。必要に応じて他のセキュリティ対策とも組み合わせて使用してください。

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で、複数人からアクセスされる場合、閾値はどのように設定すれば良いですか?

mod_evasiveを使用している場合、同一IPからのアクセスが多数発生すると、そのIPアドレスが誤ってブロックされる可能性があります。学校などのネットワークでは、多数のユーザーが同一IPアドレスを共有することが一般的です。このような環境では、mod_evasiveの設定を慎重に調整する必要があります。

以下に、mod_evasiveの設定を調整する方法を説明します。

設定項目の調整DOSPageCount: 同一ページへのアクセスの最大許可回数
DOSSiteCount: 同一サイトへのアクセスの最大許可回数
DOSPageInterval: 同一ページへのアクセスの評価時間間隔
DOSSiteInterval: 同一サイトへのアクセスの評価時間間隔
DOSBlockingPeriod: ブロックの持続時間


推奨設定

学校などの同一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>

設定の解説

DOSPageCount 10:
同一ページへのアクセスを10回まで許可します。
学内の複数ユーザーが同一ページにアクセスすることを考慮し、許可回数を増やします。

DOSSiteCount 100:
同一サイトへのアクセスを100回まで許可します。
学内の多数のユーザーが同一サイトにアクセスすることを考慮し、許可回数を大幅に増やします。

DOSPageInterval 2:
同一ページへのアクセスを2秒間隔で評価します。
ページへのアクセスが集中しても、短期間での評価により柔軟に対応します。

DOSSiteInterval 2:
同一サイトへのアクセスを2秒間隔で評価します。
サイト全体へのアクセスが集中しても、短期間での評価により柔軟に対応します。

DOSBlockingPeriod 10:
ブロックの持続時間を10秒に設定します。
誤ってブロックされた場合も、短時間で解除されるようにします。

調整

学校の環境では、アクセスパターンが予測しにくい場合があります。初期設定を行った後、実際の使用状況を監視し、必要に応じてDOSPageCountDOSSiteCountの値を調整してください。適切な閾値は、実際のアクセス量やパターンによって異なるため、状況に応じて調整することが重要です。

まとめ

学校など同一IPで多数のアクセスが発生する環境では、mod_evasiveの閾値を緩めに設定し、アクセスパターンを監視しながら調整することが重要です。設定を適切に行うことで、DoS攻撃からの防御と正当なユーザーのアクセスを両立することができます。

おまけ

最近、ChatGPTを使用し、色々なことを模索しています。
もしよければ、以下の記事も見て頂けると嬉しいです!






この記事が参加している募集

やってみた

この記事が気に入ったらサポートをしてみませんか?