ApacheでXSS攻撃を防ぐ!ModSecurity Core Rule Set導入ガイド

XSS攻撃(クロスサイトスクリプティング)は、悪意のあるスクリプトをWebサイトに注入し、ユーザーのブラウザで実行させる攻撃手法です。これにより、ユーザーの個人情報が盗まれたり、不正な操作が行われる可能性があります。特に入力フォームやコメント欄など、ユーザーがデータを送信できる場所が攻撃対象となりやすいです。

Apacheは多くのWebサイトで利用されているオープンソースのWebサーバーですが、デフォルトの状態ではXSS攻撃に対して十分な防御が施されていません。そこで役立つのがModSecurityというWebアプリケーションファイアウォール(WAF)です。

ModSecurityは不正なリクエストを検出しブロックする役割を持ち、特にCore Rule Set (CRS)を導入することで、XSS攻撃をはじめとするさまざまなWeb攻撃に対する防御を強化できます。

本記事では、ApacheサーバーにModSecurityとCRSを導入する具体的な方法をステップバイステップで解説します。初心者でも簡単に導入できるように、コマンドや設定例を交えながら、XSS攻撃の仕組みからModSecurityのチューニング方法まで詳しく説明します。Webサイトのセキュリティを強化したい方に役立つ情報を提供します。

目次

XSS攻撃とは?その危険性と影響


XSS(クロスサイトスクリプティング)攻撃は、Webアプリケーションにおける代表的な脆弱性の一つです。攻撃者が悪意のあるスクリプトをWebページに埋め込み、ユーザーのブラウザ上でそのスクリプトを実行させることで、さまざまな被害を引き起こします。

XSS攻撃の仕組み


XSS攻撃は主に以下の3種類に分類されます:

1. 反射型XSS


攻撃者が特定のURLにスクリプトを仕込み、ユーザーがそのURLにアクセスした際にスクリプトが即座に実行されます。ログイン情報やCookieが盗まれるリスクがあります。

2. 永続型XSS


悪意のあるスクリプトがサーバー上のデータベースに保存され、ページが表示されるたびにスクリプトが実行されます。掲示板やコメント欄などでよく見られます。

3. DOMベースXSS


クライアントサイドでスクリプトが実行され、ブラウザがHTMLやJavaScriptのDOM要素を処理する際にスクリプトが挿入されます。

XSS攻撃の影響


XSS攻撃が成功すると、以下のような深刻な影響を及ぼします:

  • セッションハイジャック:ユーザーのセッションIDが盗まれ、不正アクセスが可能になります。
  • フィッシング攻撃:偽のログイン画面が表示され、ユーザーが認証情報を入力してしまいます。
  • 個人情報の漏洩:入力フォームから個人情報が盗まれる可能性があります。
  • サイト改ざん:サイトのデザインやコンテンツが攻撃者によって変更されることがあります。

XSS攻撃は、サイト運営者にとっても信頼の失墜や法的問題につながる可能性があります。そのため、Apacheでの防御対策が不可欠です。次章では、XSS攻撃を防ぐためのModSecurityの役割について詳しく解説します。

ModSecurityとは?Webアプリケーションファイアウォールの概要


ModSecurityは、Webアプリケーションをさまざまな攻撃から保護するWebアプリケーションファイアウォール(WAF)です。ApacheをはじめとするWebサーバーに組み込むことで、不正なHTTPリクエストを検出しブロックする役割を果たします。

ModSecurityの特徴と役割


ModSecurityは、一般的なネットワークファイアウォールとは異なり、アプリケーションレベルで動作します。これにより、Webアプリケーションへの攻撃を直接防ぐことが可能です。以下にModSecurityの主な特徴を示します:

1. リアルタイム監視と攻撃検知


すべてのHTTPリクエストとレスポンスを監視し、不正なリクエストを即座に検出してブロックします。

2. 柔軟なルールセット


ModSecurityは、独自のルールを作成・適用できるほか、Core Rule Set (CRS)という標準的なルールセットを利用することで、SQLインジェクションやXSS攻撃などの一般的な脅威からアプリケーションを守ることができます。

3. ログ記録と分析


攻撃が検出された際には詳細なログが記録され、後から解析して対応策を検討することが可能です。

ModSecurity導入のメリット


ApacheにModSecurityを導入することで、以下のようなメリットがあります:

  • 攻撃の早期発見と防止:XSSやSQLインジェクションなど、多くのWebアプリケーションの脆弱性をカバーします。
  • セキュリティの強化:WAFを導入することで、セキュリティが強化され、攻撃に対する耐性が向上します。
  • 規模の拡張性:小規模なサイトから大規模なサービスまで、幅広く対応できます。

ModSecurityは、Webアプリケーションを運用する上で非常に強力なセキュリティ対策となります。次章では、ModSecurityの中核をなすCore Rule Set (CRS)の概要について詳しく説明します。

Core Rule Set (CRS)の概要と利点


Core Rule Set (CRS)は、ModSecurity用に提供される標準的なルールセットで、Webアプリケーションをさまざまな脆弱性から保護する役割を担います。CRSはオープンソースで開発されており、SQLインジェクション、XSS攻撃、リモートコード実行などの一般的な攻撃に対する防御機能が含まれています。

CRSの主な役割


CRSは、ModSecurityと連携して動作し、Webアプリケーションに送信されるHTTPリクエストを解析します。特定のパターンに一致する不正なリクエストを検出すると、それをブロックまたはログ記録します。

1. 汎用的な脅威への対応


CRSには、広範な脅威に対応するルールが含まれており、以下のような攻撃を防ぎます:

  • XSS攻撃
  • SQLインジェクション
  • コマンドインジェクション
  • パス・トラバーサル攻撃
  • HTTPプロトコルの不正利用

2. デフォルトで高レベルの保護


特別な設定を行わなくても、CRSを導入するだけで多くの一般的な攻撃を防ぐことができます。初心者でも簡単にセキュリティを強化できる点が魅力です。

3. 誤検知の調整が可能


CRSは非常に包括的ですが、誤検知を減らすためのチューニングも可能です。特定のルールを無効化したり、特定のリクエストを例外として扱う設定が簡単にできます。

CRS導入のメリット


CRSを導入することで、以下のメリットがあります:

  • 短時間で強固なセキュリティを実現:複雑なセキュリティ知識がなくても、標準のルールセットを適用するだけでセキュリティが向上します。
  • コストの削減:有料のセキュリティツールを導入せずとも、オープンソースのCRSで強力な防御が可能です。
  • 最新の脅威に対応:CRSはコミュニティで頻繁にアップデートされており、新しい攻撃手法にも迅速に対応します。

次章では、ApacheサーバーにModSecurityをインストールし、CRSを導入する具体的な手順について解説します。

ApacheへのModSecurityのインストール方法


ApacheサーバーにModSecurityをインストールすることで、不正なリクエストをブロックし、XSS攻撃などの脅威からWebアプリケーションを保護できます。ここでは、ModSecurityのインストール手順を具体的に解説します。

前提条件

  • Apacheがすでにインストールされていること
  • root権限またはsudo権限を持つユーザーで作業すること

1. 必要なパッケージのインストール


ModSecurityのインストールには、事前に必要なパッケージをインストールする必要があります。以下のコマンドでApacheのモジュールや開発ツールをインストールします。

sudo apt update
sudo apt install apache2 apache2-dev libxml2 libxml2-dev libpcre3 libpcre3-dev
sudo apt install build-essential git

2. ModSecurityのソースコードを取得


ModSecurityはソースコードからビルドしてインストールします。以下のコマンドでGitHubからModSecurityをクローンします。

cd /usr/local/src
sudo git clone https://github.com/SpiderLabs/ModSecurity
cd ModSecurity

3. ModSecurityのビルドとインストール


ModSecurityのソースコードをビルドし、Apacheモジュールとしてインストールします。

sudo ./build.sh
sudo ./configure
sudo make
sudo make install

4. ApacheへのModSecurityモジュールの組み込み


ApacheでModSecurityを有効にするために、モジュールを読み込みます。

sudo cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
sudo cp /usr/local/src/ModSecurity/unicode.mapping /etc/modsecurity/
sudo a2enmod security2


これでModSecurityがApacheに組み込まれます。

5. Apacheの再起動


設定を反映するためにApacheを再起動します。

sudo systemctl restart apache2

インストールの確認


以下のコマンドでApacheがModSecurityモジュールを正しく読み込んでいるか確認します。

sudo apachectl -M | grep security2


security2_moduleが表示されていれば、インストールは成功です。

次章では、ModSecurityを有効にし、基本設定を行う方法を解説します。

ModSecurityの基本設定と有効化


ModSecurityをApacheにインストールした後は、基本設定を行い有効化する必要があります。この設定によって、Webアプリケーションへの攻撃を自動的に検出・防止できるようになります。

1. modsecurity.confファイルの設定


まず、推奨される設定ファイルをコピーして使用します。

sudo cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf


このファイルをエディタで開き、ModSecurityを有効にする設定を行います。

sudo nano /etc/modsecurity/modsecurity.conf


以下の行を探し、DetectionOnlyからOnに変更します。

SecRuleEngine On


これにより、ModSecurityがアクティブモードとなり、不正なリクエストを検出するだけでなく、自動的にブロックします。

2. Apacheの設定ファイルにModSecurityを追加


次に、Apacheの仮想ホストやメインの設定ファイルにModSecurityを読み込む記述を追加します。

sudo nano /etc/apache2/mods-available/security2.conf


以下の行が記述されていることを確認し、存在しなければ追加してください。

<IfModule security2_module>
    Include /etc/modsecurity/*.conf
    Include /etc/modsecurity/rules/*.conf
</IfModule>

3. modsecurity_crsのインストールと設定


CRS(Core Rule Set)を導入することで、XSSやSQLインジェクションなど、より広範囲の攻撃からWebアプリケーションを保護できます。

sudo apt install modsecurity-crs


CRSは/usr/share/modsecurity-crsにインストールされます。このルールをApacheに適用します。

sudo cp -r /usr/share/modsecurity-crs/rules /etc/modsecurity/

4. ModSecurityのログ設定


攻撃が検出された場合のログを設定します。modsecurity.confに以下を追加してください。

SecAuditEngine On
SecAuditLog /var/log/apache2/modsec_audit.log


これにより、不正なアクセスが記録され、後から分析可能になります。

5. Apacheの再起動


設定が完了したらApacheを再起動して変更を反映します。

sudo systemctl restart apache2

6. 動作確認


以下のコマンドでApacheが正しくModSecurityを読み込んでいるかを確認します。

sudo apachectl -M | grep security2


security2_moduleが表示されていれば設定は完了です。

次章では、Core Rule Set (CRS)を導入し、XSS攻撃の防止を強化する方法について説明します。

CRSのダウンロードと適用手順


Core Rule Set (CRS)は、ModSecurityが効果的にXSS攻撃やSQLインジェクションなどの脅威を検出・防止するための重要なルールセットです。ここでは、ApacheにCRSをダウンロードして適用する手順を解説します。

1. CRSのダウンロード


まず、最新のCRSをGitHubからダウンロードします。

cd /usr/local/src
sudo git clone https://github.com/coreruleset/coreruleset.git


これで、CRSが/usr/local/src/corerulesetにダウンロードされます。

2. CRSの配置


ダウンロードしたCRSをModSecurityのルールディレクトリに配置します。

sudo cp -r /usr/local/src/coreruleset /etc/modsecurity/crs

次に、CRSのデフォルト設定ファイルを適用します。

sudo cp /etc/modsecurity/crs/crs-setup.conf.example /etc/modsecurity/crs/crs-setup.conf


これでCRSが使用可能になります。

3. ApacheにCRSを適用


ApacheのModSecurity設定ファイルにCRSルールを組み込みます。

sudo nano /etc/apache2/mods-available/security2.conf


以下の行を追加します。

Include /etc/modsecurity/crs/crs-setup.conf
Include /etc/modsecurity/crs/rules/*.conf

4. CRSルールの確認とチューニング


ルールのディレクトリを確認して、必要に応じてカスタマイズします。

ls /etc/modsecurity/crs/rules/


ルールは個別に管理されており、特定のルールセットを無効にすることも可能です。例えば、特定のXSSルールを除外する場合は、以下のように設定します。

sudo nano /etc/modsecurity/crs/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf
SecRuleRemoveById 941100


これにより、特定のルールのみ無効化されます。

5. Apacheの再起動


CRSの設定を反映させるためにApacheを再起動します。

sudo systemctl restart apache2

6. 適用確認


ApacheがCRSを正しく読み込んでいるか確認するために、ログをチェックします。

tail -f /var/log/apache2/modsec_audit.log


テスト用にXSSを試みるリクエストを送信し、ModSecurityがリクエストをブロックしているかを確認します。

これで、ApacheにCRSが適用され、XSSやその他の攻撃からアプリケーションを保護できる状態になります。次章では、ModSecurityの動作確認とログの解析方法について詳しく解説します。

ModSecurityの動作確認とログ解析


ModSecurityとCore Rule Set (CRS)を導入した後は、動作確認とログ解析を行い、正しく不正なリクエストが検出・ブロックされているかを確認します。これにより、ModSecurityが期待通りに機能していることを保証できます。

1. ModSecurityの動作確認


ModSecurityがApacheで有効になっているかを確認します。以下のコマンドを実行して、security2_moduleが読み込まれていることを確認してください。

sudo apachectl -M | grep security2


出力例:

 security2_module (shared)


この出力が表示されれば、ModSecurityはApacheで動作しています。

2. テスト用XSSリクエストの送信


ModSecurityがXSS攻撃を検出するかテストします。以下のURLでWebサイトにアクセスし、XSS攻撃がブロックされるか確認します。

http://example.com/index.php?search=<script>alert('XSS')</script>


通常、このリクエストはModSecurityによってブロックされ、403 Forbiddenが返されます。

3. ログの確認


ModSecurityは、不正なリクエストを検出した際にログを記録します。ログは以下のファイルで確認できます。

sudo tail -f /var/log/apache2/modsec_audit.log


出力例:

--123456-A--
[04/Jan/2025:14:32:10 +0000] WXYZabcd 192.168.1.1 12345 192.168.1.2 80
--123456-B--
GET /index.php?search=<script>alert('XSS')</script> HTTP/1.1
Host: example.com
...
--123456-F--
HTTP/1.1 403 Forbidden


このログには、リクエストの内容、不正と判断された理由、最終的なレスポンスなどが詳細に記録されています。

4. ルールごとの検出状況の確認


特定のルールが誤検知を起こしていないか確認するには、以下のコマンドでModSecurityのイベントログを参照します。

sudo cat /var/log/modsec_audit.log | grep "ModSecurity: Warning"


これにより、ルールがどのリクエストに反応したのかが把握できます。

5. ブロックされたリクエストの詳細確認


誤検知や特定のルールを精査するために、ModSecurityが生成するエラーログを確認します。

sudo cat /var/log/apache2/error.log


ここには、具体的にどのルールでブロックされたかが記録されます。

6. テストモードの活用(検出のみでブロックしない)


新規導入時には、すべてのリクエストを検出するだけでブロックしないDetectionOnlyモードを活用して、影響範囲を確認できます。

SecRuleEngine DetectionOnly


このモードでは、ログに記録されるだけでリクエストは許可されます。問題がないことを確認後、SecRuleEngine Onに戻して本番環境で適用します。

7. Apacheの再起動


設定変更を適用するために、再度Apacheを再起動します。

sudo systemctl restart apache2

これでModSecurityの動作確認とログ解析は完了です。次章では、ModSecurityのチューニング方法や誤検知の防止に焦点を当てて解説します。

ModSecurityのチューニングと誤検知の防止


ModSecurityは非常に強力なセキュリティツールですが、デフォルトのルールセットでは正常なリクエストを誤検知してしまうことがあります。誤検知が多発すると、ユーザーエクスペリエンスの低下や業務の妨げとなるため、適切なチューニングが必要です。ここでは、誤検知を防ぎつつModSecurityの防御力を維持する方法を解説します。

1. 誤検知のログ解析


誤検知を特定するためには、ログを確認することが重要です。以下のコマンドで、ModSecurityがブロックしたリクエストの詳細を確認します。

sudo cat /var/log/apache2/modsec_audit.log | grep "ModSecurity: Warning"


出力例:

ModSecurity: Warning. Matched "Operator Ge' with parameter '5' against variable 'TX:ANOMALY_SCORE' at REQUEST_HEADERS

このログから、どのルールが作動したのかを把握できます。

2. 誤検知を除外する方法


誤検知を防ぐためには、特定のルールを無効にしたり、特定のURLをルールの対象外とする方法があります。

特定のルールを無効化


特定のルールが頻繁に誤検知を起こしている場合、そのルールを無効にできます。ルールのIDを特定し、以下の設定をmodsecurity.confに追加します。

SecRuleRemoveById 949110


これにより、該当するルールが適用されなくなります。

特定のURLを除外


特定のページやAPIエンドポイントで誤検知が発生する場合、そのURLに対してModSecurityを無効にします。

<Location "/api/submit">
    SecRuleEngine Off
</Location>


これにより、/api/submitへのリクエストはModSecurityの対象外となります。

3. ルールの閾値調整


ModSecurityのCRSは、リクエストごとにスコアを計算し、閾値を超えるとブロックします。この閾値を調整することで、誤検知を減らすことができます。

SecAction "id:900110,phase:1,nolog,pass,t:none,setvar:tx.inbound_anomaly_score_threshold=10"


デフォルトでは閾値が5に設定されていますが、これを10に変更することで、より寛容なルールになります。

4. 学習モードの活用


ModSecurityには、ルールの精度を向上させるために学習モードを使用する方法があります。学習モードではルール違反を検出するだけで、実際にはブロックしません。

SecRuleEngine DetectionOnly


このモードで数週間運用し、誤検知がないことを確認した後、SecRuleEngine Onに切り替えます。

5. ModSecurityのカスタムルール作成


既存のルールでは対応しきれない場合、カスタムルールを作成して運用環境に最適な防御を実装します。

SecRule REQUEST_URI "@contains /admin" "id:10001,phase:2,deny,status:403,msg:'Admin access denied'"


この例では、/adminへのアクセスを拒否するルールを追加しています。

6. Apacheの再起動


設定変更後はApacheを再起動し、設定を適用します。

sudo systemctl restart apache2

7. チューニング結果の確認


設定が反映されているかを確認するため、再度テスト用リクエストを送信し、誤検知が解消されていることを確認します。

これでModSecurityの誤検知を抑えつつ、効果的な防御を実現するチューニングが完了します。次章では、最終的なまとめとしてModSecurityとCRSの効果的な運用方法について説明します。

まとめ


本記事では、ApacheサーバーにModSecurityとCore Rule Set (CRS)を導入し、XSS攻撃を防止する方法について詳しく解説しました。ModSecurityは、Webアプリケーションファイアウォールとして多くの脅威からWebサイトを保護し、CRSの導入によってXSSやSQLインジェクションなどの一般的な攻撃への防御力がさらに強化されます。

ModSecurityのインストールから、基本設定、CRSの適用、誤検知のチューニングまでのプロセスを段階的に説明しました。特に、ログの解析ルールの調整は、運用環境に合わせて継続的に行う必要があります。

ModSecurityとCRSの適切な設定と運用により、Webアプリケーションのセキュリティが向上し、不正なアクセスや攻撃からWebサイトを効果的に守ることができます。定期的にルールセットを更新し、最新の脅威に備えることが重要です。

セキュリティの向上は、Webサイトの信頼性とユーザーの安全性を確保するために不可欠です。今回の手順を参考に、Apacheサーバーの防御を強化し、安全なWeb環境を実現しましょう。

コメント

コメントする

目次