Apache mod_rewriteで悪意のあるクエリ文字列を遮断する設定方法を解説

ApacheのWebサーバーは高い柔軟性とパフォーマンスを持ち、多くのWebサイトで広く利用されています。しかし、サーバーが外部に公開されると、不正なクエリ文字列を使った攻撃を受ける可能性があります。SQLインジェクション、クロスサイトスクリプティング(XSS)、ディレクトリトラバーサルなどが代表例です。

これらの攻撃は、URLのクエリパラメータに悪意のあるコードを挿入することで行われます。Apacheにはこのような不正なクエリを遮断するための強力なモジュール「mod_rewrite」が存在します。mod_rewriteを使えば、特定のパターンに一致するURLをリダイレクトしたり、遮断したりすることが可能です。

本記事では、mod_rewriteの基本的な使い方から、不正なクエリ文字列を遮断する具体的な設定方法までを詳しく解説します。これにより、サーバーのセキュリティを向上させ、潜在的な攻撃からWebサイトを保護する方法を学びます。

目次
  1. mod_rewriteとは
    1. mod_rewriteの主な用途
    2. mod_rewriteの特徴
  2. 悪意のあるクエリ文字列とは
    1. 悪意のあるクエリの具体例
    2. 悪意のあるクエリがもたらすリスク
    3. 攻撃を防ぐ重要性
  3. mod_rewriteの基本設定方法
    1. 1. mod_rewriteを有効にする
    2. 2. Apacheの設定ファイルを編集する
    3. 3. 基本的なリライトルール
    4. 4. 動作確認
  4. 悪意のあるクエリを遮断する具体的なリライトルール
    1. 1. 基本的な遮断ルールの記述方法
    2. 2. 複数のパターンをまとめて遮断
    3. 3. 特定のパラメータを遮断
    4. 4. 特定のディレクトリでのみ適用
    5. 5. 設定後の確認方法
  5. 正規表現を使った高度な遮断ルール
    1. 1. 正規表現を使った遮断ルールの例
    2. 2. 不正なユーザーエージェントを遮断
    3. 3. URLエンコードされた攻撃を遮断
    4. 4. 正規表現で特定のパスのみ保護
    5. 5. 特定IPアドレスの遮断
    6. 6. リダイレクトで攻撃者をはぐらかす
    7. 7. 遮断ルールのテスト
  6. .htaccessでのリライト設定
    1. 1. .htaccessファイルの基本
    2. 2. 悪意のあるクエリを遮断するルール
    3. 3. ディレクトリトラバーサル攻撃を防ぐルール
    4. 4. クロスサイトスクリプティング(XSS)対策
    5. 5. 特定のファイルや拡張子へのアクセスを遮断
    6. 6. 特定のIPアドレスをブロック
    7. 7. IPアドレス範囲で遮断
    8. 8. .htaccessでの遮断ルールの注意点
    9. 9. 設定後のApache再起動
  7. 遮断ルールのテスト方法
    1. 1. Apacheの設定ファイルの構文チェック
    2. 2. 実際のURLでテストする
    3. 3. Apacheのアクセスログで確認
    4. 4. エラーログで遮断理由を確認
    5. 5. 不正リクエストのシミュレーション
    6. 6. 正規リクエストの動作確認
    7. 7. まとめ
  8. 遮断ルールの例と応用
    1. 1. SQLインジェクションの遮断
    2. 2. XSS(クロスサイトスクリプティング)の遮断
    3. 3. ディレクトリトラバーサルの遮断
    4. 4. 不正なファイル拡張子のアクセス遮断
    5. 5. ボットやスキャナーの遮断
    6. 6. 管理画面への不正アクセス遮断
    7. 7. 特定のクエリパラメータを遮断
    8. 8. WordPressのセキュリティ強化
    9. 9. 特定ディレクトリのみルールを適用
    10. 10. 遮断ルールの応用ポイント
  9. まとめ

mod_rewriteとは


mod_rewriteは、Apache Webサーバーのモジュールの一つで、URLを書き換える機能を提供します。リクエストされたURLをサーバー内部で異なるURLにリダイレクトしたり、条件に応じてアクセスを制御したりすることが可能です。

このモジュールは柔軟性が高く、正規表現を使用してリクエストURLを精密にフィルタリングできます。たとえば、特定のディレクトリや拡張子を含むURLを別のページにリダイレクトしたり、指定されたパターンと一致するクエリ文字列を遮断するルールを記述できます。

mod_rewriteの主な用途

  • URLの書き換え(リライト):ユーザーがアクセスしやすいように、長いURLを短くリダイレクト。
  • アクセス制御:不正なクエリパラメータを含むリクエストをブロック。
  • SEO対策:検索エンジンフレンドリーなURL構造にリライト。
  • 負荷分散:特定のURLパターンを別のサーバーやサブディレクトリにリダイレクト。

mod_rewriteの特徴

  • 柔軟な設定:細かい条件を設定して、複雑なURLリライトやブロックが可能。
  • .htaccessの使用:サーバーの設定を変更せず、ディレクトリ単位でルールを記述できるため、運用が容易。
  • サーバーロード軽減:悪意のあるアクセスをサーバー側で遮断することで、負荷を低減できる。

mod_rewriteはWebサイトのセキュリティや利便性を向上させるための重要なツールです。次のセクションでは、悪意のあるクエリ文字列の具体例とリスクについて掘り下げていきます。

悪意のあるクエリ文字列とは


悪意のあるクエリ文字列とは、Webサーバーやアプリケーションの脆弱性を悪用するために送信される不正なURLパラメータのことです。これらのクエリ文字列は、サーバーの動作を妨げたり、不正な操作を試みたりする目的で使用されます。

悪意のあるクエリの具体例

  1. SQLインジェクション
    example.com/page.php?id=1' OR '1'='1
    → SQLクエリの構造を破壊し、不正なデータ抽出やデータベース操作を実行。
  2. クロスサイトスクリプティング(XSS)
    example.com/search.php?q=<script>alert('XSS')</script>
    → ユーザーのブラウザで悪意のあるスクリプトを実行させ、個人情報を盗む。
  3. ディレクトリトラバーサル
    example.com/download.php?file=../../etc/passwd
    → サーバー上の重要ファイルにアクセスし、システム情報を盗む。
  4. コマンドインジェクション
    example.com/run.php?cmd=rm -rf /
    → サーバーで任意のコマンドを実行し、システム全体に深刻な影響を与える。

悪意のあるクエリがもたらすリスク

  • データ漏洩:不正なクエリがデータベースに侵入し、重要な顧客情報が流出する可能性があります。
  • サーバーダウン:攻撃者がサーバーに負荷をかけ、サイトがダウンする恐れがあります。
  • サイト改ざん:XSS攻撃を通じてサイトの内容が不正に変更される場合があります。
  • 法的リスク:情報漏洩などが発生すると、法的責任が問われる可能性があります。

攻撃を防ぐ重要性


不正なクエリ文字列は日常的に送られてくる可能性があり、見過ごされると重大な被害を招きます。mod_rewriteを使用して、特定のパターンを遮断することで、これらの攻撃を未然に防ぐことが可能です。次のセクションでは、mod_rewriteを用いた基本的な設定方法について解説します。

mod_rewriteの基本設定方法


mod_rewriteを使用するには、Apacheサーバーでモジュールを有効にし、適切な設定ファイルにリライトルールを記述する必要があります。ここでは、mod_rewriteを有効にする手順と基本的な設定方法を説明します。

1. mod_rewriteを有効にする


デフォルトでは、Apacheにmod_rewriteモジュールがインストールされていますが、有効になっていない場合があります。有効にする手順は以下の通りです。

1.1. モジュールを有効化

sudo a2enmod rewrite


このコマンドを実行すると、mod_rewriteが有効になります。

1.2. Apacheを再起動

sudo systemctl restart apache2


再起動後、mod_rewriteが有効になります。

2. Apacheの設定ファイルを編集する


mod_rewriteを使用するためには、Apacheの設定ファイルにリライトルールを記述します。主に「.htaccess」ファイルまたは「apache2.conf」「000-default.conf」などを編集します。

2.1. .htaccessの作成
対象ディレクトリに「.htaccess」ファイルを作成または編集します。

sudo nano /var/www/html/.htaccess

2.2. AllowOverrideの設定
「apache2.conf」で、.htaccessを有効にするための設定を追加します。

sudo nano /etc/apache2/apache2.conf


以下のように、対象ディレクトリのAllowOverrideAllに変更します。

<Directory /var/www/html/>
    AllowOverride All
</Directory>

設定後、Apacheを再起動します。

sudo systemctl restart apache2

3. 基本的なリライトルール


.htaccessファイルに以下のような基本的なmod_rewriteルールを記述します。

RewriteEngine On
RewriteCond %{REQUEST_URI} ^/oldpage$
RewriteRule ^(.*)$ /newpage [R=301,L]


解説

  • RewriteEngine On:mod_rewriteを有効化。
  • RewriteCond:条件を指定(例:/oldpageに一致するURL)。
  • RewriteRule:URLのリライトルール(/newpageにリダイレクト)。

この設定により、ユーザーがexample.com/oldpageにアクセスすると、example.com/newpageに301リダイレクトされます。

4. 動作確認


設定が正しく反映されているか確認するには、実際に対象のURLにアクセスし、意図した通りに動作するかをテストします。次のセクションでは、不正なクエリ文字列を遮断する具体的なリライトルールについて解説します。

悪意のあるクエリを遮断する具体的なリライトルール


mod_rewriteを使用すると、特定のパターンに一致する悪意のあるクエリ文字列を効果的に遮断できます。これにより、SQLインジェクションやXSS攻撃などを未然に防ぐことが可能です。ここでは、具体的なリライトルールの例を示します。

1. 基本的な遮断ルールの記述方法


悪意のあるクエリ文字列を含むリクエストを検出し、403 Forbiddenを返す基本的なルールは以下の通りです。

RewriteEngine On
RewriteCond %{QUERY_STRING} (union.*select|select.*from|insert.*into|<script>.*</script>) [NC]
RewriteRule .* - [F,L]

解説

  • RewriteEngine On:mod_rewriteを有効化。
  • RewriteCond%{QUERY_STRING}(クエリ文字列)が指定パターンに一致する場合に適用。
  • (union.*select|select.*from|insert.*into|<script>.*</script>) は、SQLインジェクションやXSS攻撃に使われる典型的なパターンを表します。
  • [NC] は大文字小文字を区別しないオプションです。
  • RewriteRule:リクエストを遮断し、403エラー([F])を返します。[L]はこのルールが一致したら、それ以降のルールを処理しないことを意味します。

2. 複数のパターンをまとめて遮断


複数の悪意のある文字列をまとめて遮断するには、次のように記述します。

RewriteCond %{QUERY_STRING} (select.*from|union.*all|benchmark.*\(.*\)|sleep.*\(\)) [NC,OR]
RewriteCond %{QUERY_STRING} (<script>|<iframe>|javascript:|alert\() [NC]
RewriteRule .* - [F,L]

ポイント

  • [OR]:複数のRewriteCondをOR条件で結合。いずれかの条件が一致すればルールが適用されます。
  • JavaScript関連の文字列(<script>alert()など)も遮断対象として含めています。

3. 特定のパラメータを遮断


特定のパラメータが含まれている場合のみ遮断するルールは以下の通りです。

RewriteCond %{QUERY_STRING} (^|&)id=.*' [NC]
RewriteRule .* - [F,L]


このルールの意味

  • idパラメータに'(シングルクォート)が含まれている場合、SQLインジェクションの可能性があるため、403エラーを返します。

4. 特定のディレクトリでのみ適用


特定のディレクトリに対してのみルールを適用する方法です。

<Directory /var/www/html/protected/>
    RewriteEngine On
    RewriteCond %{QUERY_STRING} (select|union|insert|drop) [NC]
    RewriteRule .* - [F,L]
</Directory>

5. 設定後の確認方法


ルールを記述した後は、以下のコマンドでApacheの構文チェックを行い、問題がないか確認します。

sudo apachectl configtest


エラーがない場合は、Apacheを再起動します。

sudo systemctl restart apache2

この設定を適切に行うことで、悪意のあるクエリ文字列を効果的に遮断し、サーバーの安全性を高めることができます。次のセクションでは、正規表現を使ったより高度な遮断ルールについて説明します。

正規表現を使った高度な遮断ルール


mod_rewriteの強力な特徴の一つは、正規表現を活用して複雑なパターンを指定できることです。これにより、複数の不正なクエリパターンを一括で遮断し、柔軟なセキュリティ対策を講じることが可能になります。

1. 正規表現を使った遮断ルールの例


以下は、SQLインジェクションやXSS、ディレクトリトラバーサルを高度な正規表現で遮断する例です。

RewriteEngine On
RewriteCond %{QUERY_STRING} (union.*select|select.*from|insert.*into|cast.*\(.*as|benchmark.*\() [NC,OR]
RewriteCond %{QUERY_STRING} (../|..\|%2e%2e|%252e%252e) [NC,OR]
RewriteCond %{QUERY_STRING} (<script>|javascript:|alert\() [NC]
RewriteRule .* - [F,L]

ルールの解説

  • SQLインジェクション遮断
  • (union.*select|select.*from|insert.*into) はSQLの基本的なクエリ構文を遮断します。
  • cast.*\(.*as は型変換を試みるSQLインジェクション攻撃を防ぎます。
  • benchmark.*\( は処理時間を遅延させる攻撃をブロックします。
  • ディレクトリトラバーサル遮断
  • (../|..\|%2e%2e|%252e%252e) は相対パスを利用してディレクトリを遡る攻撃を遮断します。
  • URLエンコードされたパス%2e%2eや二重エンコード%252e%252eも対象に含めます。
  • XSS(クロスサイトスクリプティング)遮断
  • (<script>|javascript:|alert\() はHTMLタグやJavaScript関数の挿入を遮断します。

2. 不正なユーザーエージェントを遮断


不正なユーザーエージェントを正規表現で特定し、アクセスをブロックするルールです。

RewriteCond %{HTTP_USER_AGENT} (sqlmap|nikto|acunetix|dirbuster) [NC]
RewriteRule .* - [F,L]


このルールの効果

  • 一般的なセキュリティツールやスキャナーからのアクセスを遮断します。
  • 攻撃者がツールを使って脆弱性をスキャンしようとする動きを検知できます。

3. URLエンコードされた攻撃を遮断


URLエンコードを使って攻撃を隠蔽する試みを防ぐルールです。

RewriteCond %{QUERY_STRING} (%3C|%3E|%22|%27|%28|%29|%3B|%2F) [NC]
RewriteRule .* - [F,L]


主な遮断内容

  • %3C< (小なり記号、XSSの一部)
  • %3E> (大なり記号)
  • %22" (ダブルクォート)
  • %27' (シングルクォート、SQLインジェクション)
  • %28%29:括弧()

4. 正規表現で特定のパスのみ保護


管理画面など特定のディレクトリやページへのアクセスを強化する方法です。

RewriteCond %{REQUEST_URI} ^/admin/ [NC]
RewriteCond %{QUERY_STRING} (union|select|benchmark|sleep|<script>) [NC]
RewriteRule .* - [F,L]


動作の概要

  • /admin/へのリクエストに対し、不正なクエリを含む場合は403エラーを返します。
  • 管理画面への攻撃を効果的に防ぐことができます。

5. 特定IPアドレスの遮断


不審なIPアドレスからのアクセスをブロックする例です。

RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.100$
RewriteRule .* - [F,L]


ポイント

  • 特定のIPアドレス192.168.1.100を遮断します。
  • CIDR表記を用いてサブネットごと遮断することも可能です。

6. リダイレクトで攻撃者をはぐらかす


遮断ではなく、攻撃者を他のURLへリダイレクトする方法も有効です。

RewriteCond %{QUERY_STRING} (union|select|<script>) [NC]
RewriteRule .* http://example.com/honeypot [R=302,L]
  • 攻撃者をhoneypotページに誘導し、不正アクセスを監視します。
  • 遮断よりソフトな対策として有効です。

7. 遮断ルールのテスト


正規表現のルールは意図しないリクエストを遮断する可能性があるため、テストが重要です。
Apacheの構文チェックを行い、エラーがないことを確認します。

sudo apachectl configtest


その後、Apacheを再起動します。

sudo systemctl restart apache2

正規表現を活用することで、悪意のあるアクセスを効率的にフィルタリングし、より堅牢なWebサーバー環境を構築できます。次のセクションでは、.htaccessを使ったリライト設定について解説します。

.htaccessでのリライト設定


.htaccessファイルを使用すると、Apacheのメイン設定ファイルを直接編集せずに、ディレクトリ単位でリライトルールを記述できます。これにより、柔軟かつ迅速にmod_rewriteを利用したアクセス制御や遮断ルールを適用できます。

1. .htaccessファイルの基本


.htaccessファイルは、特定のディレクトリに配置され、そのディレクトリ以下のリクエストに対して適用されます。これにより、各サイトやディレクトリごとに異なる設定を施すことが可能です。

.htaccessの作成方法


対象ディレクトリに.htaccessファイルを作成します。

sudo nano /var/www/html/.htaccess

基本的な構成


以下のように記述することで、mod_rewriteが有効になります。

RewriteEngine On

2. 悪意のあるクエリを遮断するルール


.htaccessを使って、不正なクエリを遮断する具体的な例を示します。

RewriteEngine On
RewriteCond %{QUERY_STRING} (union|select|insert|<script>) [NC]
RewriteRule .* - [F,L]


解説

  • RewriteEngine On:mod_rewriteの有効化。
  • RewriteCond:クエリ文字列にunion<script>などの不正なパターンが含まれる場合に適用。
  • RewriteRule:一致するリクエストは403 Forbidden([F])を返します。

3. ディレクトリトラバーサル攻撃を防ぐルール


ディレクトリを遡る攻撃を防ぐには以下のルールを追加します。

RewriteCond %{QUERY_STRING} (\.\./|\.\.) [NC]
RewriteRule .* - [F,L]
  • /../..を含むリクエストをブロックします。
  • 二重エンコードも検出可能です。

4. クロスサイトスクリプティング(XSS)対策


XSS攻撃を防ぐためのルールを追加します。

RewriteCond %{QUERY_STRING} (<script>|javascript:|alert\() [NC]
RewriteRule .* - [F,L]

5. 特定のファイルや拡張子へのアクセスを遮断


管理ファイルやバックアップファイルへのアクセスを防止します。

RewriteRule ^.*(\.bak|\.ini|\.log|\.sql|\.sh)$ - [F,L]
  • .bak.sqlなどのファイル拡張子を含むリクエストを遮断します。

6. 特定のIPアドレスをブロック


特定のIPアドレスからのアクセスを遮断するルールです。

RewriteCond %{REMOTE_ADDR} ^123\.45\.67\.89$
RewriteRule .* - [F,L]
  • 123.45.67.89からのアクセスをブロックします。

7. IPアドレス範囲で遮断


サブネット全体をブロックするには、次のように記述します。

RewriteCond %{REMOTE_ADDR} ^123\.45\.67\.[0-9]+$
RewriteRule .* - [F,L]
  • 123.45.67.0から123.45.67.255までをブロックします。

8. .htaccessでの遮断ルールの注意点

  • パフォーマンスへの影響:リクエストごとに.htaccessがチェックされるため、過剰なルール記述はパフォーマンスを低下させます。
  • キャッシュ活用:頻繁に変わらないルールはApacheのメイン設定ファイル(httpd.confapache2.conf)に記述するほうが効率的です。
  • 構文エラー:構文ミスがあると、該当ディレクトリのアクセスが不能になります。configtestコマンドで構文チェックを行いましょう。
sudo apachectl configtest

9. 設定後のApache再起動


.htaccessを作成または編集した後は、Apacheを再起動して変更を反映させます。

sudo systemctl restart apache2

.htaccessファイルを活用することで、Webサイトのセキュリティを強化し、攻撃から保護することができます。次のセクションでは、遮断ルールが正しく機能しているかを確認するテスト方法について解説します。

遮断ルールのテスト方法


mod_rewriteで設定した遮断ルールが正しく機能しているかを確認することは、セキュリティ対策の効果を検証するうえで重要です。不正なクエリを確実にブロックし、正規のリクエストが通過することを確認しましょう。

1. Apacheの設定ファイルの構文チェック


.htaccessやApacheの設定ファイルを編集した後は、まず構文エラーがないかを確認します。

sudo apachectl configtest


結果の例

  • Syntax OK:構文に問題なし。
  • エラー例
  AH00526: Syntax error on line 15 of /etc/apache2/sites-enabled/000-default.conf:
  Invalid command 'RewriteRule', perhaps misspelled or defined by a module not included in the server configuration

→ mod_rewriteが有効になっていない可能性があります。a2enmod rewriteでモジュールを有効化し、Apacheを再起動します。

2. 実際のURLでテストする


ブラウザまたはコマンドラインツールを使用して、不正なクエリ文字列を含むURLをリクエストし、遮断ルールが機能しているか確認します。

2.1. ブラウザでのテスト


以下のようなURLにアクセスし、403エラーが返されることを確認します。

http://example.com/index.php?id=1' OR '1'='1

期待される結果

  • 遮断成功:403 Forbiddenが表示される。
  • 遮断失敗:通常通りページが表示される(ルールの記述ミスの可能性)。

2.2. curlコマンドでのテスト


コマンドラインでcurlを使用し、遮断ルールが適用されるかを確認します。

curl -I "http://example.com/index.php?id=1' OR '1'='1"


結果の例

HTTP/1.1 403 Forbidden
  • 403が返れば遮断ルールが機能しています。

3. Apacheのアクセスログで確認


Apacheのログファイルを確認し、遮断されたリクエストを検証します。

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


遮断ルールが適用された場合、403のステータスコードが記録されます。

192.168.1.1 - - [27/Dec/2024:10:15:30 +0900] "GET /index.php?id=1' OR '1'='1 HTTP/1.1" 403 -

4. エラーログで遮断理由を確認


さらに詳細な情報が必要な場合は、エラーログを確認します。

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


遮断時のエラーメッセージが記録されているかを確認し、適切にルールが機能しているかを判断します。

5. 不正リクエストのシミュレーション


以下のような悪意のあるクエリを送信し、遮断されることを確認します。

curl "http://example.com/?q=<script>alert('XSS')</script>"
curl "http://example.com/?file=../../etc/passwd"
curl "http://example.com/admin/?cmd=rm%20-rf%20/"


結果例

HTTP/1.1 403 Forbidden

6. 正規リクエストの動作確認


遮断ルールを適用した後でも、通常のリクエストが問題なく処理されることを確認します。

curl -I "http://example.com/index.php?id=123"


期待される結果

HTTP/1.1 200 OK


正規のリクエストが遮断されないことを確認することで、誤検知(false positive)を防ぐことができます。

7. まとめ


遮断ルールのテストは、不正アクセスを防ぐための重要な工程です。

  • 構文エラーを防ぐためにconfigtestでチェック。
  • 実際のURLでアクセスし、遮断が正しく動作しているかを確認。
  • Apacheのログを監視し、意図したルールが適用されているかを検証。

次のセクションでは、遮断ルールの具体的な応用例について詳しく解説します。

遮断ルールの例と応用


mod_rewriteを活用して、不正なアクセスを防ぐ具体的なリライトルールの応用例を紹介します。実際の攻撃パターンに基づいたルールを記述し、サーバーのセキュリティをより強固にします。

1. SQLインジェクションの遮断


SQLインジェクション攻撃を防ぐために、典型的なSQLコマンドを含むクエリ文字列を遮断します。

RewriteEngine On
RewriteCond %{QUERY_STRING} (union|select|insert|drop|update|cast|exec|declare) [NC]
RewriteRule .* - [F,L]


解説

  • unionselectなど、SQLインジェクションに頻出する単語を含むクエリを遮断します。
  • 大文字小文字を区別せず([NC])、403 Forbiddenを返します。

2. XSS(クロスサイトスクリプティング)の遮断


スクリプトタグを含むクエリを遮断し、XSS攻撃を防ぎます。

RewriteCond %{QUERY_STRING} (<script>|javascript:|%3Cscript%3E|alert\() [NC]
RewriteRule .* - [F,L]


ポイント

  • <script>タグやalert()関数を含むURLを遮断します。
  • URLエンコードされた%3Cscript%3Eも対象にします。

3. ディレクトリトラバーサルの遮断


../を含むURLを遮断し、サーバーの上位ディレクトリへの不正アクセスを防ぎます。

RewriteCond %{QUERY_STRING} (\.\./|%2e%2e|%252e%252e) [NC]
RewriteRule .* - [F,L]
  • ../やそのエンコード形式(%2e%2e)を含むアクセスをブロックします。

4. 不正なファイル拡張子のアクセス遮断


バックアップファイルや設定ファイルへのアクセスを遮断します。

RewriteRule ^.*(\.bak|\.sql|\.ini|\.log|\.sh|\.conf|\.old)$ - [F,L]
  • .bak.sqlなど、漏洩リスクの高いファイル拡張子を含むURLをブロックします。

5. ボットやスキャナーの遮断


悪意のあるスキャナーやボットからのアクセスを遮断します。

RewriteCond %{HTTP_USER_AGENT} (sqlmap|acunetix|nikto|dirbuster|wpscan) [NC]
RewriteRule .* - [F,L]
  • よく使用されるセキュリティスキャナーをユーザーエージェントで検出し、アクセスを遮断します。

6. 管理画面への不正アクセス遮断


管理画面へのアクセスを特定のIPアドレスのみに制限します。

RewriteCond %{REQUEST_URI} ^/admin/ [NC]
RewriteCond %{REMOTE_ADDR} !^123\.45\.67\.89$
RewriteRule .* - [F,L]
  • /admin/ディレクトリへのアクセスを特定のIPアドレス123.45.67.89のみに制限します。
  • 他のIPアドレスからのアクセスは403エラーとなります。

7. 特定のクエリパラメータを遮断


特定のパラメータを持つリクエストを遮断します。

RewriteCond %{QUERY_STRING} (id=|cat=|cmd=).*['"].* [NC]
RewriteRule .* - [F,L]
  • idcatなどのパラメータにシングルクォート(')やダブルクォート(")が含まれるリクエストを遮断します。
  • SQLインジェクションやコマンドインジェクションの防止に役立ちます。

8. WordPressのセキュリティ強化


WordPressの脆弱性を突くリクエストを遮断する例です。

RewriteCond %{REQUEST_URI} ^/wp-admin/ [NC]
RewriteCond %{QUERY_STRING} (eval|base64_decode|wp-config) [NC]
RewriteRule .* - [F,L]
  • eval関数やbase64_decodeを含むURLをブロックし、WordPressのセキュリティを強化します。

9. 特定ディレクトリのみルールを適用


特定のディレクトリでのみmod_rewriteルールを適用します。

<Directory /var/www/html/protected/>
    RewriteEngine On
    RewriteCond %{QUERY_STRING} (select|union|insert|drop) [NC]
    RewriteRule .* - [F,L]
</Directory>
  • /protected/ディレクトリへのアクセスに対して、不正なクエリを遮断します。

10. 遮断ルールの応用ポイント

  • 必要なルールだけを記述:過剰なルールはパフォーマンスに悪影響を与える可能性があるため、必要なルールのみ記述します。
  • テスト環境で検証:遮断ルールは本番環境で適用する前にテスト環境で十分に検証します。
  • ログ監視:遮断ルールが意図通りに動作しているか、Apacheのアクセスログやエラーログを確認します。

遮断ルールの応用例を活用して、Webサーバーのセキュリティを大幅に向上させることができます。次のセクションでは、記事のまとめとしてmod_rewriteの重要性について解説します。

まとめ


本記事では、Apacheのmod_rewriteを使用して悪意のあるクエリ文字列を遮断する方法について詳しく解説しました。

mod_rewriteは、不正なSQLインジェクションやXSS、ディレクトリトラバーサルなどの攻撃を防ぐための強力なツールです。正規表現を活用することで、複雑なパターンを効率的にブロックし、Webサーバーのセキュリティを強化できます。

遮断ルールを適切に設定し、構文チェックやログ監視を通じて継続的に検証することが重要です。さらに、.htaccessファイルを活用することで、ディレクトリ単位で柔軟にルールを適用できます。

mod_rewriteを駆使してWebサイトを保護し、潜在的な攻撃からサーバーを守りましょう。

コメント

コメントする

目次
  1. mod_rewriteとは
    1. mod_rewriteの主な用途
    2. mod_rewriteの特徴
  2. 悪意のあるクエリ文字列とは
    1. 悪意のあるクエリの具体例
    2. 悪意のあるクエリがもたらすリスク
    3. 攻撃を防ぐ重要性
  3. mod_rewriteの基本設定方法
    1. 1. mod_rewriteを有効にする
    2. 2. Apacheの設定ファイルを編集する
    3. 3. 基本的なリライトルール
    4. 4. 動作確認
  4. 悪意のあるクエリを遮断する具体的なリライトルール
    1. 1. 基本的な遮断ルールの記述方法
    2. 2. 複数のパターンをまとめて遮断
    3. 3. 特定のパラメータを遮断
    4. 4. 特定のディレクトリでのみ適用
    5. 5. 設定後の確認方法
  5. 正規表現を使った高度な遮断ルール
    1. 1. 正規表現を使った遮断ルールの例
    2. 2. 不正なユーザーエージェントを遮断
    3. 3. URLエンコードされた攻撃を遮断
    4. 4. 正規表現で特定のパスのみ保護
    5. 5. 特定IPアドレスの遮断
    6. 6. リダイレクトで攻撃者をはぐらかす
    7. 7. 遮断ルールのテスト
  6. .htaccessでのリライト設定
    1. 1. .htaccessファイルの基本
    2. 2. 悪意のあるクエリを遮断するルール
    3. 3. ディレクトリトラバーサル攻撃を防ぐルール
    4. 4. クロスサイトスクリプティング(XSS)対策
    5. 5. 特定のファイルや拡張子へのアクセスを遮断
    6. 6. 特定のIPアドレスをブロック
    7. 7. IPアドレス範囲で遮断
    8. 8. .htaccessでの遮断ルールの注意点
    9. 9. 設定後のApache再起動
  7. 遮断ルールのテスト方法
    1. 1. Apacheの設定ファイルの構文チェック
    2. 2. 実際のURLでテストする
    3. 3. Apacheのアクセスログで確認
    4. 4. エラーログで遮断理由を確認
    5. 5. 不正リクエストのシミュレーション
    6. 6. 正規リクエストの動作確認
    7. 7. まとめ
  8. 遮断ルールの例と応用
    1. 1. SQLインジェクションの遮断
    2. 2. XSS(クロスサイトスクリプティング)の遮断
    3. 3. ディレクトリトラバーサルの遮断
    4. 4. 不正なファイル拡張子のアクセス遮断
    5. 5. ボットやスキャナーの遮断
    6. 6. 管理画面への不正アクセス遮断
    7. 7. 特定のクエリパラメータを遮断
    8. 8. WordPressのセキュリティ強化
    9. 9. 特定ディレクトリのみルールを適用
    10. 10. 遮断ルールの応用ポイント
  9. まとめ