Azure Application GatewayのアクセスログをLog Analyticsで確認

2019-07-15Application Gateway,Azure,Log Analytics

Azure Application Gateway(アプリケーションゲートウェイ)のログ(アクセスログ、WAFログ)の収集方法と、それらのログを検索する手順の紹介です。

Azure Application Gatewayのログは診断設定を使用して、Azure Monitorログ(Log Analyticsワークスペース)などのリソースに収集できます。
ログを収集するための診断設定、収集されるログの内容、KQL(Kusto Query Language)を利用したログ検索方法について確認します。
WAF(Azure Web Application Firewall)のログについても確認します。

Azure Application Gatewayのサービス概要からリソースの作成手順はこちらに纏めています。

※2022年7月にv2を加筆修正しました。

スポンサーリンク

Azure Application Gatewayで取得できるログ

Azure Application Gatewayではアクセスログ関連のログや操作やリソース操作に関するログを取得できます。

Azure Application Gateway データの監視のリファレンス

Activity Log(アクテビティログ)

リソースの設定変更などのリソース操作に関するログを、Activity Log(アクテビティログ)として収集します。
ログ検索時には"AzureActivity"と指定します。

Activity Log(アクテビティログ)
AzureActivity Azure Application Gatewayのリソース操作などに関するログを収集します。

AzureActivityの検索結果(Cerateを条件に検索)

Application Gatewayのアクティビティログ確認結果画面

Azure Diagnostics(アクセスログやWAFログ)

Azure Application Gatewayを経由するアクセス(トラフィック)に関するログを収集します。

    • ApplicationGatewayAccessLog:アクセスログ(WAFの利用有無関わらず記録される)
    • ApplicationGatewayFirewallLog:WAFログ(WAF利用時のみ記録される)
Azure Diagnostics
ApplicationGatewayAccessLog アクセス時間や呼び出し元の IP、要求されたURL、ステータスコード、バックエンド転送先などのトラフィック処理に関する内容を記録します。
ApplicationGatewayFirewallLog WAFルールにマッチしたトラフィックやブロックした内容を記録します。

ApplicationGatewayAccessLogの検索結果

ApplicationGatewayAccessLogの検索結果画面

※V1にのみ含まれる項目として"ApplicationGatewayPerformanceLog"があります。リソースのパフォーマンス状況やバックエンドの正常性等の情報を記録します。

AllMetrics(メトリック)

Azure Application Gatewayのパフォーマンスに関する情報を取得します。
ログの内容にはトラフィック状況も含まれます。
バックエンドからの応答速度をログから確認して、サイトの応答速度が遅い原因の切り分けと言った事に活用できます。

Azure Application Gateway データの監視のリファレンス(Application Gateway V2 のメトリック)

All Metrics
AllMetrics パフォーマンス情報(処理された要求の総数、スループット (バイト単位)、応答速度等)を確認できます。
パフォーマンス情報にはバックエンド、フロントエンドそれぞれの通信に関する内容が含まれます。
バックエンド正常性などの情報もメトリックに含まれます。

AllMetricsの検索結果

Application GatewayのAllMetrics検索結果画面

Azure Application Gatewayのアクセスログで出力される項目

アクセスログで取得される項目の抜粋です。
ログには多くの項目が含まれています。

Application Gateway と WAF v2 SKU の場合

項目名 取得値(例) 説明
TimeGenerated 202x/7/15 5:17:00.000 ログの時間
Category ApplicationGatewayAccessLog ログ種別
Resource APGW-TEST Azure Application Gateway名(リソース名)
host_s www.tama-negi.com
XXX.XXX.XXX.XXX(フロントエンドのIP)
アクセスされたホスト名もしくはIPアドレス
listenerName_s APGW-TEST-Listener 受信したリスナー名
clientIP_s XXX.XXX.XXX.XXX(アクセス元のIPアドレス) アクセス元のIPアドレス
serverRouted_s 10.0.2.5:80 トラフィック転送先のIPアドレスとポート番号
requestUri_s / アクセスパス
userAgent_s Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36 ユーザーエージェント情報
httpMethod_s GET HTTPアクセスメソッド
httpStatus_d 200 応答のHTTPステータスコード
timeTaken_d 0.004  フロントエンド側の応答時間
serverResponseLatency_s 0.004 バックエンド側の応答時間
ruleName_s APGW-TEST-Rule Azure Application Gatewayのルール名
backendPoolName_s  APGW-TEST-BackendPool Azure Application Gatewayのバックエンドプール名
backendSettingName_s APGW-TEST-Backend Azure Application Gatewayのバックエンド設定名
Azure Application Gatewayのアクセスログ検索結果画面

※project句を利用して表示項目を抜粋しています。

今回利用したAzure Application Gatewayはこちらで構築したものを利用しています。
概要やリソース自体の構築手順についてはこちらに纏めています。

—広告—

Azure Application Gatewayのログ取得には診断設定を使う

ログをAzure Monitorログ(Log Analyticsワークスペース)へ転送する場合は診断設定を使います。
診断設定で取得対象のログを指定します。

※Log AnalyticsワークスペースはAzure Application Gatewayと同じ地域のリソースを使用します。
※ログ転送先にはストレージアカウント、イベントハブなども指定できます。

診断設定
リソースメニューで診断設定を選択します。
“診断設定を追加する"を選択します。

Application Gatewayの診断設定画面

診断設定では転送先リソース、転送するログの種別を設定します。
今回はログのカテゴリはすべてを選択します。
Log Analyticsワークスペースへの送信にチェックを入れます。
転送先のLog Analyticsワークスペースを選択します。

※転送開始まで5分~10分程度かかります。(メトリックの方が収集開始まで若干時間かかるようです。)

Application Gatewayの診断設定画面(ログを指定)

Azure Application GatewayのアクセスログをKQLで検索

Log Analyticsワークスペースでアクセスログを検索

Log Analyticsワークスペースでアクセスログを検索します。
Application Gatewayのログのメニューや診断設定で指定したLog Analyticsワークスペースで検索できます。
アクセスログはAzureDiagnosticsに含まれます。
カテゴリー(Category)には"ApplicationGatewayAccessLog"を指定します。

アクセスログを検索

リソースメニューでログを選択します。
診断設定で指定したLog Analyticsワークスペースが表示されます。
クエリ入力欄にKQLを記載してログ検索します。

アクセスログは"AzureDiagnostics"に含まれます。
カテゴリは"ApplicationGatewayAccessLog"になります。
where句で"ApplicationGatewayAccessLog"に絞り、ログ検索するとアクセスログが出力されます。
AzureDiagnostics
| where Category == “ApplicationGatewayAccessLog"

ログ検索の実行結果はCSVとして出力できる

ログ検索の実行結果はCSV形式で出力できます。

診断設定
エクスポート使うと、CSVなどの形式でエクスポートできます。

時間指定してアクセスログを検索する

Log Analyticsワークスペースでログ検索する時、デフォルトの検索対象時間は24時間になります。
ago(時間)を使用して、現在からの時間範囲を指定できます。

AzureDiagnostics
| where TimeGenerated > ago(24h)
| where Category == “ApplicationGatewayAccessLog"

時間帯を指定する場合はbetweenを使います。
Timezoneもextendを利用して指定できます。
日本時間(UTC+9時間)で指定するようにlocaltimestampという項目を追加しています。
出力結果を日本時間(order by localTimestamp)で並び替えています。

AzureDiagnostics
| where Category contains “ApplicationGatewayAccessLog"
| extend localTimestamp = TimeGenerated + 9h
| where localTimestamp between(datetime(“202x-07-15 15:00:00") .. datetime(“202x-07-15 16:00:00"))
| order by localTimestamp

アクセス元IP単位でアクセス数を集計

アクセス元のIPアドレスは、clientIP_sに含まれます。
count() by clientIP_sとする事でアクセス元IP単位のアクセス数を集計できます。

AzureDiagnostics
| where Category == “ApplicationGatewayAccessLog"
| summarize total_hits = count() by clientIP_s

アクセスURI単位でアクセス数を集計

URI単位でのアクセス集計もできます。
アクセスがあったURIはrequestUri_sに含まれます。

AzureDiagnostics
| where Category == “ApplicationGatewayAccessLog"
| summarize count() by requestUri_s

IPアドレスからロケーション情報を取得し国別アクセス集計と言った事もできます。
IPアドレスから国を識別する方法についてはこちらで紹介しています。

ーーーー

Azure Web アプリケーション ファイアウォール(WAF)で取得できるログ

Azure Application GatewayのWAF設定手順についてはこちらで紹介しています。

WAFのログはカテゴリがApplicationGatewayFirewallLogになる

アクセスログと同様に、WAFログもAzureDiagnosticsに含まれます。
WAFログの場合はカテゴリー(Category)が"ApplicationGatewayFirewallLog"になります。

AzureDiagnostics
| where Category == “ApplicationGatewayFirewallLog"

WAFのログに含まれる出力項目

カテゴリがApplicationGatewayFirewallLogとして出力されるWAFログの抜粋です。
各出力項目の詳細は公式サイトを参照ください。

Azure Web アプリケーション ファイアウォールのリソース ログ(ファイアウォール ログ)

項目名 実際に取得される値 説明
TimeGenerated 202x/7/15 5:17:00.000 ログの時間
Category ApplicationGatewayFirewallLog ログ種別
Resource APGW-TEST Azure Application Gateway名(リソース名)
host_s www.tama-negi.com
XXX.XXX.XXX.XXX(フロントエンドのIP)
アクセスされたホスト名もしくはIPアドレス
clientIP_s XXX.XXX.XXX.XXX(アクセス元のIPアドレス) アクセス元のIPアドレス
action_s Blocked,Detected,Matched,Allowed  WAFルールの処理内容
アクセス拒否された場合はBlockedと表示されます
ruleSetType_s OWASP_CRS,Custom ルール セットの種類
カスタムルールの場合はCustomと表示されます
ruleSetVersion_s 3.1.0 使用されるルール セットのバージョン
ruleId_s 920350,testapgwwafblock01 イベントの発生起因となっているWAFのルール ID
カスタムルールの場合はルール名が表示されます
Message Host header is a numeric IP address ルールの概要メッセージ
details_message_s Warning. Pattern match \"^[\\d.:]+$\" at REQUEST_HEADERS:Host …. ルールの詳細内容
policyScope_s Listener ポリシーのスコープ
policyScopeName_s APGW-TEST-Listener 適用されているスコープ名
Application Gateway(WAF)のログ検索結果画面

※クエリ実行結果はproject句を利用して表示項目を抜粋てしています。

WAFでの検知件数を確認する

検知モード(Detected)で検知されたアクセスを集計できます。
検知件数をIP単位で集計する事もできます。
クエリのサンプルは公式サイトでも紹介されています。

Log Analytics を使用して Application Gateway Web アプリケーション ファイアウォール (WAF) のログを調べる

AzureDiagnostics
| where Category == “ApplicationGatewayFirewallLog"
| where action_s contains “Detected"
| summarize count()by clientIp_s

最後に

Azure Application Gatewayで取得できるログについて確認してみました。
診断設定を使って、Log Analyticsワークスペースへログ転送して検索できる事が分かりました。
アクセスログには多くの情報が含まれており、アクセス分析やサイトのパフォーマンスのグラフ化と言った事もできそうです。
Log Analyticsワークスペースへログを収集する事によって、定期的にクエリを実行してレポート送付などといった事もできます。

WAFログでは検出状況も確認できる事が分かりました。
不正なアクセスを行っているIPアドレスを抽出して、ブロックさせると言う事もできそうです。

引き続き色々試してみたいと思います。

Azure Front Doorでのログ確認手順についてはこちらに纏めています。

Logic Appsを使ったLog Analyticsワークスペースのログ検索自動化方法についてはこちらで紹介しています。

バックエンド側でのApacheアクセスログについてはこちらで紹介しています。

スポンサーリンク