Azure Web アプリケーション ファイアウォールの監視とログ記録

Azure Front Door の Azure Web Application Firewall には、Web アプリケーション ファイアウォール (WAF) のパフォーマンスと実行するアクションを把握するのに役立つ豊富なログとテレメトリが用意されています。

Azure Front Door の WAF ログは、Azure Monitor と統合されています。 Azure Monitor により、WAF のアラートやログなどの診断情報を追跡できます。 Azure Front Door リソース内での WAF の監視は、Azure portal の [診断] タブから、コードとしてのインフラストラクチャ手法によって、または Azure Monitor を直接使用して構成できます。

メトリック

Azure Front Door では、WAF の動作を把握するのに役立つメトリックが自動的に記録されます。

WAF のメトリックにアクセスするには:

  1. Azure portal にサインインし、Azure Front Door プロファイルに移動します。
  2. 左端のペインの [監視] で、[メトリック] タブを選択します。
  3. [Web Application Firewall 要求数] メトリックを追加して、WAF ルールに一致する要求の数を追跡します。

アクションの種類とルール名に基づいて、カスタム フィルターを作成できます。 メトリックには、"ログ" を除くすべてのアクションとともに要求が含まれます。Log

Screenshot that shows the metrics for an Azure Front Door WAF.

ログと診断

Azure Front Door WAF は、要求ごと、および検出された脅威ごとに詳細なレポートを提供します。 ログ記録は、Azure Monitor のログを使用して Azure の診断ログおよびアラートと統合されます。

既定では、ログは有効になっていません。 ログを明示的に有効にする必要があります。 Azure portal で、[診断設定] タブを使用してログを構成できます。

Screenshot that shows how to enable the WAF logs.

ログ記録が有効で WAF ルールがトリガーされた場合は、WAF ポリシーの動作を分析およびデバッグするために、一致するパターンがプレーン テキストでログに記録されます。 除外を使用すると、ルールを微調整し、ログから除外するデータを除外できます。 詳細については、「Front Door の除外リストを使用する Web Application Firewall (WAF)」を参照してください。

Azure Front Door には、アクセス ログと WAF ログという 2 種類のログが用意されています。

アクセス ログ

ログ FrontDoorAccessLog には、Azure Front Door を経由するすべての要求が含まれます。 ログ スキーマなど、Azure Front Door アクセス ログの詳細については、「Azure Front Door でのメトリックとログの監視」を参照してください。

ログ FrontdoorAccessLog には、Azure Front Door を経由するすべての要求が含まれます。 ログ スキーマなど、Azure Front Door アクセス ログの詳細については、Azure Front Door でのメトリックとログの監視 (クラシック) に関するページを参照してください。

次のクエリの例では、アクセス ログ エントリが返されます。

AzureDiagnostics
| where ResourceProvider == "MICROSOFT.CDN" and Category == "FrontDoorAccessLog"
AzureDiagnostics
| where ResourceType == "FRONTDOORS" and Category == "FrontdoorAccessLog"

次のスニペットは、ログ エントリの例を示しています。

{
  "time": "2020-06-09T22:32:17.8383427Z",
  "category": "FrontDoorAccessLog",
  "operationName": "Microsoft.Cdn/Profiles/AccessLog/Write",
  "properties": {
    "trackingReference": "08Q3gXgAAAAAe0s71BET/QYwmqtpHO7uAU0pDRURHRTA1MDgANjMxNTAwZDAtOTRiNS00YzIwLTljY2YtNjFhNzMyOWQyYTgy",
    "httpMethod": "GET",
    "httpVersion": "2.0",
    "requestUri": "https://wafdemofrontdoorwebapp.azurefd.net:443/?q=%27%20or%201=1",
    "requestBytes": "715",
    "responseBytes": "380",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4157.0 Safari/537.36 Edg/85.0.531.1",
    "clientIp": "xxx.xxx.xxx.xxx",
    "socketIp": "xxx.xxx.xxx.xxx",
    "clientPort": "52097",
    "timeTaken": "0.003",
    "securityProtocol": "TLS 1.2",
    "routingRuleName": "WAFdemoWebAppRouting",
    "rulesEngineMatchNames": [],
    "backendHostname": "wafdemowebappuscentral.azurewebsites.net:443",
    "sentToOriginShield": false,
    "httpStatusCode": "403",
    "httpStatusDetails": "403",
    "pop": "SJC",
    "cacheStatus": "CONFIG_NOCACHE"
  }
}
{
  "time": "2020-06-09T22:32:17.8383427Z",
  "category": "FrontdoorAccessLog",
  "operationName": "Microsoft.Network/FrontDoor/AccessLog/Write",
  "properties": {
    "trackingReference": "08Q3gXgAAAAAe0s71BET/QYwmqtpHO7uAU0pDRURHRTA1MDgANjMxNTAwZDAtOTRiNS00YzIwLTljY2YtNjFhNzMyOWQyYTgy",
    "httpMethod": "GET",
    "httpVersion": "2.0",
    "requestUri": "https://wafdemofrontdoorwebapp.azurefd.net:443/?q=%27%20or%201=1",
    "requestBytes": "715",
    "responseBytes": "380",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4157.0 Safari/537.36 Edg/85.0.531.1",
    "clientIp": "xxx.xxx.xxx.xxx",
    "socketIp": "xxx.xxx.xxx.xxx",
    "clientPort": "52097",
    "timeTaken": "0.003",
    "securityProtocol": "TLS 1.2",
    "routingRuleName": "WAFdemoWebAppRouting",
    "rulesEngineMatchNames": [],
    "backendHostname": "wafdemowebappuscentral.azurewebsites.net:443",
    "sentToOriginShield": false,
    "httpStatusCode": "403",
    "httpStatusDetails": "403",
    "pop": "SJC",
    "cacheStatus": "CONFIG_NOCACHE"
  }
}

WAF ログ

ログ FrontDoorWebApplicationFirewallLog には、WAF ルールに一致する要求が含まれます。

ログ FrontdoorWebApplicationFirewallLog には、WAF ルールに一致する要求が含まれます。

次の表に、要求ごとにログに記録される値を示します。

プロパティ 説明
アクション 要求に対して実行されるアクション。 ログには、すべてのアクションとともに要求が含まれます。 アクションは次のとおりです。
  • Allowallow: 要求は処理を続行することが許可されました。
  • Blockblock: 要求は、要求をブロックするように構成された WAF 規則と一致しました。 または、異常スコアリングのしきい値に達したために、要求がブロックされました。
  • Loglog: 要求は、"ログ" アクションを使用するように構成された WAF 規則と一致しました。Log
  • AnomalyScoringlogandscore: 要求が WAF ルールに一致しました。 この規則は異常スコアリングに反映されます。 同じ要求で実行される他の規則によって、要求がブロックされる場合とされない場合があります。
ClientIP 要求を行ったクライアントの IP アドレス。 要求に X-Forwarded-For ヘッダーがあった場合、代わりにヘッダー フィールドからクライアント IP が取得されます。
ClientPort 要求を行ったクライアントの IP アドレス。
詳細 検出された脅威など、要求に関する追加の詳細。
matchVariableName: ヘッダー名など、一致する要求の HTTP パラメーター名 (最大 100 文字)。
matchVariableValue: 一致をトリガーした値 (最大 100 文字)。
Host 要求の Host ヘッダー。
ポリシー 要求を処理した WAF ポリシーの名前。
PolicyMode WAF ポリシーの操作モード。 設定可能な値は Prevention および Detection です。
RequestUri 要求の完全 URI。
RuleName 要求が一致した WAF 規則の名前。
SocketIP WAF によって検出されたソース IP アドレス。 この IP アドレスは TCP セッションに基づいており、いずれの要求ヘッダーも考慮されません。
TrackingReference Azure Front Door によって提供される要求を示す一意の参照文字列。 この値は、X-Azure-Ref 応答ヘッダーでクライアントに送信されます。 このフィールドは、ログ内の特定の要求を検索するときに使用します。

次のクエリの例は、Azure Front Door WAF によってブロックされた要求を示しています。

AzureDiagnostics 
| where ResourceProvider == "MICROSOFT.CDN" and Category == "FrontDoorWebApplicationFirewallLog" 
| where action_s == "Block" 
AzureDiagnostics
| where ResourceType == "FRONTDOORS" and Category == "FrontdoorWebApplicationFirewallLog"
| where action_s == "Block"

要求がブロックされた理由など、ログ エントリの例を次のスニペットに示します。

{
  "time": "2020-06-09T22:32:17.8376810Z",
  "category": "FrontdoorWebApplicationFirewallLog",
  "operationName": "Microsoft.Cdn/Profiles/Write",
  "properties": {
    "clientIP": "xxx.xxx.xxx.xxx",
    "clientPort": "52097",
    "socketIP": "xxx.xxx.xxx.xxx",
    "requestUri": "https://wafdemofrontdoorwebapp.azurefd.net:443/?q=%27%20or%201=1",
    "ruleName": "Microsoft_DefaultRuleSet-1.1-SQLI-942100",
    "policy": "WafDemoCustomPolicy",
    "action": "Block",
    "host": "wafdemofrontdoorwebapp.azurefd.net",
    "trackingReference": "08Q3gXgAAAAAe0s71BET/QYwmqtpHO7uAU0pDRURHRTA1MDgANjMxNTAwZDAtOTRiNS00YzIwLTljY2YtNjFhNzMyOWQyYTgy",
    "policyMode": "prevention",
    "details": {
      "matches": [
        {
          "matchVariableName": "QueryParamValue:q",
          "matchVariableValue": "' or 1=1"
        }
      ]
    }
  }
}
{
  "time": "2020-06-09T22:32:17.8376810Z",
  "category": "FrontdoorWebApplicationFirewallLog",
  "operationName": "Microsoft.Network/FrontDoorWebApplicationFirewallLog/Write",
  "properties": {
    "clientIP": "xxx.xxx.xxx.xxx",
    "clientPort": "52097",
    "socketIP": "xxx.xxx.xxx.xxx",
    "requestUri": "https://wafdemofrontdoorwebapp.azurefd.net:443/?q=%27%20or%201=1",
    "ruleName": "Microsoft_DefaultRuleSet-1.1-SQLI-942100",
    "policy": "WafDemoCustomPolicy",
    "action": "Block",
    "host": "wafdemofrontdoorwebapp.azurefd.net",
    "trackingReference": "08Q3gXgAAAAAe0s71BET/QYwmqtpHO7uAU0pDRURHRTA1MDgANjMxNTAwZDAtOTRiNS00YzIwLTljY2YtNjFhNzMyOWQyYTgy",
    "policyMode": "prevention",
    "details": {
      "matches": [
        {
          "matchVariableName": "QueryParamValue:q",
          "matchVariableValue": "' or 1=1"
        }
      ]
    }
  }
}

次のステップ

Azure Front Door の詳細を確認します。