Azure

Azure Application GatewayでGeoフィルタリングしたログを表示するクエリを作成する

はじめに

Azure Application GatewayでGeoフィルタリングしたログを表示するクエリを作成してみたいと思います。

実際にどのようなログが取れているのか見ていきます。

Geoフィルタリングは下記のリンク先の構成で行われています。

Azure Application GatewayでGeoフィルタリングを行う。 - 技術的な何か。
Azure Application GatewayでGeoフィルタリングを行う。 - 技術的な何か。

はじめに 最近はGeoフィルタリングを利用する機会が増えてきていると思います。WAF(Web Application Firewall)の機能を利用して特定の国からのアクセスを拒否します。 以前、Fr

level69.net

ログの設定

GeoフィルタリングのログはAzure Application Gatewayの診断設定で、ApplicationGatewayFirewallLogを選択しLog Analyticsに送信します。

あとは、日本と日本以外からアクセスしてみます。

今回は簡単にログをとるためにab(apache bench)を利用して100回アクセスを行いログを残しました。

ログの表示

送信先のLog Analyticsを確認します。

すべてのApplicationGatewayFirewallLogを確認してみます。そのため対象のApplication GatewayだけでなくLog Analyticsに送信されたApplicationGatewayFirewallLogを表示します。

以下のクエリを実行します。

AzureDiagnostics
| where Category == "ApplicationGatewayFirewallLog"

実行結果

これでは対象のWAFで拒否したものが分かりません。

そこで、絞っていきます。

次に対象のApplication Gatewayに絞ります。

Resourceの項目で絞ります。

AzureDiagnostics
| where Category == "ApplicationGatewayFirewallLog"
| where Resource == "APPGW1"

これで、対象のApplication Gatewayのログだけに絞ります。

次に、WAFポリシーでブロックしたログに絞ります。

AzureDiagnostics
| where Category == "ApplicationGatewayFirewallLog"
| where Resource == "APPGW1"
| where action_s == "Blocked"

クエリを実行した場合にはブロックしたすべてのログが表示されますが、これでは傾向が分かりません。

そこで、送信元IPアドレスで集計して表示してみます。

AzureDiagnostics
| where Category == "ApplicationGatewayFirewallLog"
| where Resource == "APPGW1"
| where action_s == "Blocked"
| summarize count() by clientIp_s

IPアドレスで集計されていることが分かりますが、これでは検索範囲である過去24時間のすべての結果になります。

もっと時間帯でのアクセスを確認して1分間でアクセスされているか表示して傾向が分かるようにします。

AzureDiagnostics
| where Category == "ApplicationGatewayFirewallLog"
| where Resource == "APPGW1"
| where action_s == "Blocked"
| summarize count() by clientIp_s, bin(TimeGenerated, 1m)

これで1分間間隔で集計されます。

様々なIPアドレスが表示されていることが分かりますが、これはOWASPのルールによってBlockされたログも含まれています。そのため、どのルールが適用されてBlockしたか絞ります。

Geoフィルタリングのルールはrule1です。

AzureDiagnostics
| where Category == "ApplicationGatewayFirewallLog"
| where Resource == "APPGW1"
| where action_s == "Blocked"
| where ruleId_s == "rule1"
| summarize count() by clientIp_s, bin(TimeGenerated, 1m)

これでGeoフィルタリングに絞って集計できました。

 

最後にこれをグラフで可視化してみます。グラフのタブに移って表示しても問題ないですが、棒グラフのため見づらいです。

そこで、時間軸の折れ線グラフにしてみます。

AzureDiagnostics
| where Category == "ApplicationGatewayFirewallLog"
| where Resource == "APPGW1"
| where action_s == "Blocked"
| where ruleId_s == "rule1"
| summarize count() by clientIp_s, bin(TimeGenerated, 1m)
| render timechart

可視化したことで、13:30ぐらいにアクセスが増えていることが見て取れます。

 

これらを応用してアラート上げるなどの対策を行うと攻撃の有無などの判断を行う材料にもなると思います。

まとめ

Application GatewayのFirewallLogを取り上げましたが、基本的にはどのログもスコープを変えてログを表示したり絞ったり、グラフにして可視化したりできます。

なかなか、とっつきにくい部分もあると思いますが一発でクエリを作成するのではなく順序をおってクエリを作成していくとよいと思います。

 

 

-Azure
-