Azure Application Gateway で WAF ログの機密データをマスク出来るようになっていたので試してみた

Azure Application Gateway で WAF ログの機密データをマスク出来るようになっていたので試してみた

Clock Icon2024.07.21

いわさです。

Azure の L7 ロードバランサーである「Azure Application Gateway」ではオプションで WAF を構成することが出来ます。
この WAF のルールに一致した場合にログを出力することが出来るのですが、WAF ログはプレーンテキストとして保存されるので、リクエスト上の IP アドレス やシークレット、あるいは個人情報などの機密データが含まれる場合があります。

先日のアップデートでこの WAF ログ上の機密データをマスキング出来るようになりました。

https://azure.microsoft.com/en-us/updates/public-preview-sensitive-data-protection-for-application-gateway-web-application-firewall-logs/

Azure Application Gateway で WAF のカスタムルールを運用している環境を持っていたので、この機能を適用するために使い方などを、まずは実際に検証してみることにしました。

Application Gateway を作成

バックエンドは Webhook.site を利用させて頂きました。
検証 API が必要な時はとても便利です。

https://docs.webhook.site/index.html

このあたりの手順は割愛しますが、Azure Application Gateway リソースを作成し、バックエンドリソースとして Webhook.site を指定します。
Application Gateway までは HTTP、Application Gateway でプロキシした後は HTTPS 通信を行います。

Application Gateway の分析情報機能から確認するとこんな感じです。
シンプルすぎてあまり意味ないですが、複雑な API ゲートウェイ構成を取っている場合は構成を簡単に可視化できそうで便利ですねこの機能。

B4FD870F-6474-425F-8434-5FC8260C5DF4

リクエストを送信してみます。

# 直接 webhook.site へリクエスト送信
% curl https://webhook.site/908c62d3-fc01-4e18-85c7-6a7bff062579
{"hoge":"defaultcontent"}
# Application Gateway 経由でリクエスト送信
% curl http://52.185.186.133/908c62d3-fc01-4e18-85c7-6a7bff062579
{"hoge":"defaultcontent"}

Webhook.site のコンソール画面でリクエスト内容を確認することが出来ます。
Application Gatewya を経由した場合はいくつかカスタムヘッダーが追加されていますね。

CFE52451-613C-46A6-965C-FDC94E25F9F6

WAF とログの有効化

で、デフォルトでは WAF もログ出力も有効化されていないので、まずそのあたりを有効化していきたいと思います。
Starndard から WAF プランに変更します。

85A2AD21-B653-4D4A-A1CD-1E677F7372C6

Application Gatewya は SKU ごとに料金が設定されており、WAF が使えるタイプのものは一番お高いものとなっています。

https://azure.microsoft.com/ja-jp/pricing/details/application-gateway/

作成された WAF ポリシーに対して、次のように指定したカスタムヘッダーに対して特定の値が設定されていない場合、というルールを設定しました。

7B6C73BF-E40E-4340-A56B-11F370E8F612

さらに、Application Gateway の診断設定から、ログを Log Analytics へ出力出来るようにします。

3F85CD36-8BDD-4554-8CBD-B231D12B04F4

このあたりまで対応すると Log Analytics から WAF のログをクエリ出来るようになります。
みてみましょう。AGWFirewallLogs テーブルが対象です。

F6CABE55-C409-486F-AB03-888F26C512A6

確認することが出来ました。
カスタムルールに反応して設定したアクション(ここではログ記録)されていることが確認出来ます。
そしてこのメッセージを見てみると、ルールの対象ヘッダーの値がログに含まれていたり、クライアント IP アドレスも確認が出来ますね。

機密データ保護のためのログスクラブを有効化

では続いて機密データのログスクラブ機能というやつを有効化していきます。
デフォルトでは無効状態で、WAF ポリシーの「機密データ」メニューからログスクラブを有効化出来ます。

5E151C7E-417A-4B0E-87E7-8983DA7F067D

有効化して、かつどういう条件のものをマスキング対象とするか設定することが出来ます。
次のような感じで対象を選択出来まして、IP アドレスについては演算子やセレクターの設定は不要ですぐに使うことが出来ます。

E5B16A17-70B9-405C-AE1E-00358A0846E5

今回はこんな感じで設定してみました。
複数のルールを設定することが出来まして、IP アドレスと、あとはカスタムヘッダーを対象にしてみました。

5E81503E-6A9F-48D4-A194-AE916EF6EDC3

有効化後に何度かリクエストを送信して、WAF のログを確認してみましょう。

FFB7F9F2-0A22-4F7B-92A0-49FAD66E849C

おっ、クライアント IP アドレスや、指定したカスタムヘッダーの値が「*」でマスキングされていますね。
上記を見ていただくとわかるのですが、有効化前に出力されたログについては遡ってマスキングされるわけではないので注意しましょう。

WAF ログ以外は対象外

ちなみに、アクセスログのほうは対象外で、引き続き出力されていました。

5AF19058-572A-44EC-9E5D-1CE387DF6F8C

さいごに

本日は Azure Application Gateway で WAF ログの機密データをマスク出来るようになっていたので試してみました。
すでに WAF プランをお使いの方は手軽に導入出来そうですね。
機械学習ベースで機密情報を検出するタイプではなく対象データを指定する形なので、特定のリクエストの決まった箇所を保護しやすく、非常に使いやすいと思いました。

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.