Azure Web Application Firewall(WAF)は、CSRF(クロスサイト・リクエスト・フォージェリ)攻撃に対する直接的な保護機能は標準では提供していません。CSRFは、認証済みのユーザーを利用して意図しないリクエストを送信させる攻撃で、主にサーバー側でのCSRFトークンの実装やリクエストの検証によって防がれます。Azure WAFは、主にSQLインジェクション、クロスサイトスクリプティング(XSS)、その他のOWASP Top 10の脅威を防ぐためのルールセット(例:CRS 3.2)に焦点を当てており、CSRF専用のルールは含まれていません。
ただし、Azure WAFをAzure Application GatewayやAzure Front Doorと組み合わせて使用する場合、CSRF対策を間接的に支援する方法がいくつかあります。以下に詳細を説明します:
1. カスタムルールによる部分的な保護
Azure WAFではカスタムルールを作成して、特定のパターンに基づくリクエストをブロックまたは制限できます。CSRF攻撃は通常、予期しないオリジンからのリクエストや不正なリファラーを伴う場合があります。そのため、以下のようなカスタムルールを設定することで、CSRFのリスクを軽減できます:
-
オリジンやリファラーのチェック:
-
Origin
またはReferer
ヘッダーを検査し、信頼できるドメインからのリクエストのみを許可するルールを設定。 - 例:
Origin
ヘッダーがアプリケーションのドメインと一致しないリクエストをブロック。
-
-
リクエストメソッドの制限:
- CSRF攻撃は通常、POSTやPUTなどの変更を伴うリクエストを悪用します。特定のパスに対して、予期しないメソッドをブロックするルールを設定可能。
- 注意:これらのルールは完全なCSRF保護を提供するものではなく、補助的な対策にすぎません。
2. Azure Front Doorの機能活用
Azure Front DoorとWAFを組み合わせる場合、以下の機能がCSRF対策に役立つ可能性があります:
-
CORS設定の管理:
- Azure Front Doorでクロスオリジンリソース共有(CORS)を適切に設定し、信頼できないオリジンからのリクエストを制限。
-
Rules Engine:
- リクエストヘッダーや条件に基づいて、異常なリクエストをブロックするルールを追加可能。
-
トークンベースの検証のサポート:
- Azure Front Door自体はCSRFトークンを直接検証しませんが、バックエンドでCSRFトークンを検証するアプリケーションと連携する際に、リクエストのフィルタリングを強化できます。
3. バックエンドでのCSRF対策との連携
Azure WAFはCSRFを直接防ぐ機能を持たないため、完全な保護にはバックエンドアプリケーションでの対策が不可欠です。Azure WAFはこれを補完する役割を果たします。バックエンドでの一般的なCSRF対策は以下の通りです:
-
CSRFトークンの実装:
- フォームやAPIリクエストに一意のトークンを含め、サーバー側で検証。
-
SameSiteクッキー属性:
- クッキーに
SameSite=Strict
またはSameSite=Lax
を設定し、クロスサイトリクエストでのクッキー送信を制限。
- クッキーに
-
リクエストの検証:
-
Origin
やReferer
ヘッダーをサーバー側でチェックし、信頼できるリクエストのみを処理。
-
Azure WAFは、これらのバックエンド対策が適切に機能するように、不正なリクエストをフィルタリングする追加のレイヤーとして機能します。
4. 制限と注意点
- CSRFの特性:CSRFはセッション認証を利用した攻撃であり、WAF単体ではセッションのコンテキストを完全に理解できないため、トークンベースの検証はアプリケーション側で実装する必要があります。
- 誤検知のリスク:カスタムルールで厳しすぎる制限を設定すると、正当なリクエストがブロックされる可能性があるため、テストが重要です。
- XSSとの関連:CSRF対策に加え、XSSを防ぐWAFの標準ルール(例:CRSのXSSルール)は、CSRF攻撃のエントリーポイントを減らすのに役立ちます。XSSを通じてCSRFトークンが漏洩するリスクを軽減できます。
結論
Azure WAFは、CSRFに対する直接的な保護機能は提供していませんが、カスタムルールやAzure Front DoorのRules Engineを活用して、異常なリクエストをフィルタリングすることでCSRF対策を補助できます。ただし、完全なCSRF保護には、バックエンドアプリケーションでのCSRFトークンの実装やSameSiteクッキー属性の使用が必須です。Azure WAFはこれらの対策を補完するセキュリティ層として機能し、全体的なセキュリティを強化します。
「Origin」とは、HTTPリクエストヘッダーの一つで、ウェブブラウザがリクエストを発信した元のウェブページのオリジン(出所)を示すものです。具体的には、プロトコル(例:http
やhttps
)、ホスト名(例:example.com
)、およびポート番号(例:80
や443
)の組み合わせで構成されます。たとえば、https://example.com
から送信されたリクエストの場合、Originヘッダーはhttps://example.com
となります。
補足説明:Originヘッダーって何?
Originヘッダーは、主にクロスオリジンリクエスト(異なるドメイン間でのリクエスト)が行われる際に、サーバーがリクエスト元の信頼性を確認するために使用されます。以下のようなケースで重要です:
- クロスオリジンリソース共有(CORS):サーバーが、どのオリジンからのリクエストを許可するかを制御する際に使用。
- セキュリティ対策:CSRF(クロスサイト・リクエスト・フォージェリ)やその他の攻撃を防ぐために、サーバーがリクエストの出所を検証する。
CSRF対策におけるOriginヘッダーの活用
CSRF攻撃では、攻撃者がユーザーのブラウザを悪用して、別のサイトから不正なリクエストを送信させることがあります。Originヘッダーをチェックすることで、サーバーやAzure WAFは以下のような対策を取れます:
-
信頼できるオリジンの確認:リクエストのOriginがアプリケーションのドメイン(例:
https://yourapp.com
)と一致するか確認し、一致しない場合はリクエストをブロック。 -
不正なリクエストの検出:たとえば、悪意のあるサイト(
https://malicious.com
)からのリクエストは、Originヘッダーが異なるため検出可能。
Originヘッダーの例
-
リクエスト例:
POST /api/submit HTTP/1.1 Host: yourapp.com Origin: https://yourapp.com
この場合、Originヘッダーは
https://yourapp.com
を示し、リクエストが信頼できるドメインから来ていることを示します。 -
不正なリクエスト例:
POST /api/submit HTTP/1.1 Host: yourapp.com Origin: https://malicious.com
この場合、Originが信頼できないドメイン(
https://malicious.com
)であるため、サーバーやWAFでブロック可能。
Azure WAFでのOriginヘッダーの利用
Azure WAFやAzure Front Doorのカスタムルールでは、Originヘッダーを検査するルールを設定できます。たとえば、「Originがhttps://yourapp.com
でないリクエストをブロックする」といったルールを作成することで、CSRF攻撃のリスクを軽減できます。ただし、Originヘッダーが存在しない場合(例:古いブラウザや特定のリクエスト)もあるため、Refererヘッダーや他の検証方法(CSRFトークンなど)と組み合わせることが推奨されます。
注意点
- Originヘッダーの欠如:GETリクエストや同一オリジンのリクエストでは、ブラウザがOriginヘッダーを送信しない場合があります。この場合、Refererヘッダーを補助的に使用することが一般的です。
- 偽装の可能性:クライアント側でOriginヘッダーを偽装することは難しいですが、完全に信頼するのではなく、CSRFトークンなどの追加の対策と組み合わせることが重要です。
まとめ
Originヘッダーは、リクエスト元のウェブページのドメイン情報を提供するHTTPヘッダーで、CSRF対策やCORSの管理に役立ちます。Azure WAFでは、カスタムルールでOriginヘッダーをチェックして不正なリクエストをフィルタリングできますが、完全なCSRF保護にはバックエンドでのトークン検証などが必要です。もし具体的な設定方法や例が必要であれば、教えてください!
補足説明:CSRF攻撃の例ー銀行の送金機能の悪用
シナリオ:
あるユーザーが、オンライン銀行のウェブサイト(例:https://bank.com
)にログインしています。この銀行のウェブサイトには、以下のような送金リクエストを処理するフォームがあります:
<form action="https://bank.com/transfer" method="POST">
<input type="hidden" name="amount" value="1000">
<input type="hidden" name="to_account" value="123456">
<input type="submit" value="送金">
</form>
このフォームは、POSTリクエストを送信して、指定された金額(1000円)を指定された口座(123456)に送金します。しかし、このウェブサイトがCSRFトークンや適切なリクエスト検証を実装していないと仮定します。
攻撃の流れ:
-
攻撃者の準備:
攻撃者は、悪意のあるウェブサイト(例:https://malicious.com
)を作成し、以下のような隠しフォームを埋め込みます:<form id="maliciousForm" action="https://bank.com/transfer" method="POST"> <input type="hidden" name="amount" value="10000"> <input type="hidden" name="to_account" value="999999"> </form> <script> document.getElementById("maliciousForm").submit(); // 自動送信 </script>
このフォームは、被害者のブラウザが
bank.com
にログインしている状態で、攻撃者の口座(999999)に10,000円を送金するリクエストを送信します。 -
ユーザーの誘導:
攻撃者は、被害者にメールやSNSを通じて「無料クーポンGET!」などの誘惑リンク(https://malicious.com
)をクリックさせます。被害者がリンクをクリックすると、悪意のあるウェブサイトが読み込まれ、隠しフォームが自動的に送信されます。 -
リクエストの実行:
被害者がbank.com
にログインした状態(セッションクッキーが有効)で悪意のあるサイトにアクセスすると、ブラウザは自動的にhttps://bank.com/transfer
にPOSTリクエストを送信します。このリクエストには被害者の認証クッキーが含まれるため、銀行のサーバーはリクエストを正当なものとみなします。その結果、被害者の口座から攻撃者の口座(999999)に10,000円が送金されてしまいます。 -
被害者の気づき:
被害者は、悪意のあるサイトを訪れただけでは何も操作していないため、送金が行われたことにすぐには気づかない可能性があります。
なぜ成功するのか:
- ブラウザは、同一セッション内のクッキーを自動的にリクエストに含めるため、攻撃者は被害者の認証情報を直接知らなくてもリクエストを偽造できます。
- 銀行のウェブサイトがCSRFトークンや
Origin
/Referer
ヘッダーの検証を行っていないため、不正なリクエストを検出できません。
対策:
- CSRFトークンの実装: フォームに一意のトークンを含め、サーバー側で検証。
-
SameSiteクッキー属性: クッキーに
SameSite=Strict
またはLax
を設定し、クロスサイトリクエストでのクッキー送信を制限。 - Origin/Refererヘッダーの検証: リクエストの出所を確認し、信頼できないオリジンをブロック。
-
Azure WAFの活用: カスタムルールで不正な
Origin
やリクエストパターンをフィルタリング(ただし補助的)。