IPアドレスで絞り込みするKQL(関数)纏め

Azure

AzureのLog Analyticsワークスペースでログ検索する場合はKQLを利用します。

Kusto 照会言語 (KQL) の概要

グローバルIPからのアクセスのみに絞り込みや特定のIPを除外したい場合などに使えるKQL関数について纏めてみました。
IPアドレスが指定範囲内にあるかどうか判別してログを絞り込みするなど、クエリ内でのKQL関数使用方法について確認しています。
今回は仮想マシン(Azure VM)のVM Connection(仮想マシンの分析情報)のログを例に纏めています。

スポンサーリンク

IPアドレスを範囲内にあるか判別するKQL

VM Connection(仮想マシンの分析情報)のログを例に、グローバルIPから来たアクセスのみに絞り込みしてみます。
仮想マシンへのアクセス元IPはSourceIpに出力されます。

指定のレンジにipが含まれるか判別する場合はipv4_is_in_range()

指定のレンジにIPアドレスが含まれるかどうかを判別する場合は、ipv4_is_in_range()を使います。

ipv4_is_in_range()

VM ConnectionのSourceIpが特定のIPレンジにある場合の例です。
SourceIpが10.0.0.0/8のレンジにあるかどうかを判別します。
extendを利用してipv4_is_in_range_Check列を追加します。
ipv4_is_in_range()判別結果を追加した列に表示します。
範囲内にある場合はtrueが戻ります。

ipv4_is_in_range_Checkの例

VMConnection
| extend ipv4_is_in_range_Check = ipv4_is_in_range(SourceIp, '10.0.0.0/8’)
| where ProcessName contains “ssh"
| project TimeGenerated, Direction, ProcessName, SourceIp, ipv4_is_in_range_Check
| sort by TimeGenerated

指定した範囲(10.0.0.0/8)に無い場合のログに絞り込みたい場合は、ipv4_is_in_range_Checkの結果がfalseのログのみを抽出します。

指定範囲外のIPのみに絞り込み

VMConnection
| extend ipv4_is_in_range_Check = ipv4_is_in_range(SourceIp, '10.0.0.0/8’)
| where ProcessName contains “ssh"
| where ipv4_is_in_range_Check == false
| project TimeGenerated, Direction, ProcessName, SourceIp, ipv4_is_in_range_Check
| sort by TimeGenerated

複数のレンジを指定してipが含まれるか判別する場合はipv4_is_in_any_range()

ipv4_is_in_range()の場合は範囲指定が1つしか出来ません。
複数の範囲を指定する場合はipv4_is_in_any_range()を利用します。

ipv4_is_in_any_range()

SourceIpが"10.0.0.0/8″, “172.16.0.0/12", “192.168.0.0/16″のレンジにあるかどうかを判別します。
extendを利用してipv4_is_in_any_range_Check列を追加します。
ipv4_is_in_any_range()判別結果を追加した列に表示します。
範囲内にある場合はtrueが戻ります。

ipv4_is_in_any_range_Checkの例

VMConnection
| extend ipv4_is_in_any_range_Check = ipv4_is_in_any_range(SourceIp, “10.0.0.0/8", “172.16.0.0/12", “192.168.0.0/16")
| where ProcessName contains “ssh"
| project TimeGenerated, Direction, ProcessName, SourceIp, ipv4_is_in_any_range_Check
| sort by TimeGenerated

指定した範囲(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)に無い場合のログに絞り込みたい場合は、ipv4_is_in_any_range()の結果がfalseのログのみを抽出します。
アクセス元IPの絞り込みが出来ました。

指定範囲外のIPのみに絞り込み

VMConnection
| extend ipv4_is_in_any_range_Check = ipv4_is_in_any_range(SourceIp, “10.0.0.0/8", “172.16.0.0/12", “192.168.0.0/16")
| where ProcessName contains “ssh"
| where ipv4_is_in_any_range_Check == false
| project TimeGenerated, Direction, ProcessName, SourceIp, ipv4_is_in_any_range_Check
| sort by TimeGenerated

letを使用してKQL内で利用する一時的な変数を作成出来ます。
クエリ内で使用できます。
Local_ipと言う変数を定義しています。

let ステートメント

同様の結果が得られる事が確認出来ます。

letを使った場合

let Local_Ip = dynamic([“10.0.0.0/8", “172.16.0.0/12", “192.168.0.0/16"]);
VMConnection
| extend ipv4_is_in_any_range_Check = ipv4_is_in_any_range(SourceIp, Local_Ip)
| where ProcessName contains “ssh"
| project TimeGenerated, Direction, ProcessName, SourceIp, ipv4_is_in_any_range_Check
| sort by TimeGenerated

ipを比較する場合はipv4_is_match()

IPを比較する場合はipv4_is_match()を利用します。

ipv4_is_match()

ipv4_is_in_range_Checkと同様の使い方が出来ます。
ipv4_is_match()の場合はプレフィックスを個別で指定する事が出来ます。

SourceIpが"10.0.0.0/8″のレンジにあるかどうかを判別します。
extendを利用してipv4_is_match_Check列を追加します。
ipv4_is_match()判別結果を追加した列に表示します。
範囲内にある場合はtrueが戻ります。

ipv4_is_match()の例

VMConnection
| extend ipv4_is_match_Check = ipv4_is_match(SourceIp, “10.0.0.0/8")
| where ProcessName contains “ssh"
| project TimeGenerated, Direction, ProcessName, SourceIp, ipv4_is_match_Check
| sort by TimeGenerated

VMConnection
| extend ipv4_is_match_Check = ipv4_is_match(SourceIp, “10.0.0.0", 8)
| where ProcessName contains “ssh"
| project TimeGenerated, Direction, ProcessName, SourceIp, ipv4_is_match_Check
| sort by TimeGenerated

プライベート ネットワークのIPかどうかを判別する場合はipv4_is_private()

プライベート ネットワークIPのレンジ(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)に含まれるか判別する場合は、ipv4_is_private()を使います。

ipv4_is_private()

ipv4_is_privateはIP範囲指定せずに利用できます。
extendを利用してipv4_is_private_Check列を追加します。
ipv4_is_private判別結果を追加した列に表示します。
範囲内にある場合はtrueが戻ります。

ipv4_is_privateの例

VMConnection
| extend ipv4_is_private_Check = ipv4_is_private(SourceIp)
| where ProcessName contains “ssh"
| project TimeGenerated, Direction, ProcessName, SourceIp, ipv4_is_private_Check
| sort by TimeGenerated

プライベート ネットワークIP(10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)以外のアクセスのみに絞り込みたい場合は、ipv4_is_private()の結果がfalseのログのみを抽出します。
絞り込み出来ている事が確認出来ました。

プライベートネットワークIP以外のアクセスログのみに絞り込み

VMConnection
| extend ipv4_is_private_Check = ipv4_is_private(SourceIp)
| where ProcessName contains “ssh"
| where ipv4_is_private_Check == false
| project TimeGenerated, Direction, ProcessName, SourceIp, ipv4_is_private_Check
| sort by TimeGenerated

最後に

今回はIPが範囲内にあるかどうかを判別する場合に使えるKQL関数について纏めてみました。
IPアドレスが指定範囲内にあるかどうか判別結果を利用する事でログの絞り込みが出来る事が確認出来ました。
今後も色々試してみたいと思います。

初めてのKQLと言う内容で基本的な内容についてはこちらに纏めています。
併せて見て頂けると有難いです。

スポンサーリンク

Azure