おれさまラボ

実際に手を動かして理解を深めるブログ。

Kusto:特定の IPv4 アドレスが指定された IP アドレス範囲(CIDR 形式)に含まれているかどうかを判定する

はじめに

Microsoft SentinelではKustoと呼ばれるクエリ言語(KQL)を使用しますが、便利な関数がたくさんあります。今回は、特定のCIDRに含まれる場合のみを判定可能な ipv4_is_in_range についてメモを残しておきます。

ipv4_is_in_range 関数

ipv4_is_in_range は、Kusto クエリ言語(KQL)で使用される関数で、特定の IPv4 アドレスが指定された IP アドレス範囲(CIDR 形式)に含まれているかどうかを判定するために使用されます。

使い方

この関数は、2つの引数を取ります。

  • 調べたい IPv4 アドレス
  • CIDR 形式で記述された IPv4 アドレス範囲

SourceIP という列を含むテーブルの場合、以下のような書き方ができます。

Table
| where ipv4_is_in_range(SourceIP, "192.168.1.0/24")
// True or Falseが返る。

ユースケース

ipv4_is_in_range 関数を使うことで、IPアドレスに基づいたデータ分析が容易になります。

  • 特定のIPアドレス範囲からのアクセスを抽出したい
  • 外部からの不審なトラフィックパターンを抽出したい
  • 特定の地域からのアクセスを分析したい

不特定多数のIPアドレスをマスクする

上記のユースケース以外にも、たとえば、Sentinelでログ分析をする際にインターネットアクセスが含まれる場合は、不特定多数のグローバルIPアドレスが登場するので大量の結果が返ってきます。Sentinelで表示できる結果は30,000行までなので、困ってしまうことがあります。

このような場合、たとえば組織内で使用されるIPアドレス(例:10.0.0.0/8)は/32のホストアドレスで把握したいが、それ以外のアドレスは具体的なIPアドレスまでわからなくても良い場合があります。そんなときはipv4_is_in_range 関数を応用して、組織内で使用されるIPアドレス以外は "Internet Address" という一括りに置き換えてしまえば行数が激減させることが可能です。

//送信元アドレスが組織内で使用されるIPアドレスか判定し、組織内で使用されるIPアドレス以外は "Internet Address"というラベルに変更
| extend isInSrcCIDR = ipv4_is_in_range(SourceIP, "10.0.0.0/8")
| extend SourceIP_converted = iif(SourceIP, "Internet Address")
//宛先アドレスが組織内で使用されるIPアドレスか判定し、組織内で使用されるIPアドレス以外は "Internet Address"というラベルに変更
| extend isInDstCIDR = ipv4_is_in_range(DestinationIP, "10.0.0.0/8")
| extend SourceIP_converted = iif(DestinationIP, "Internet Address")
//置き換え後のラベルを使用してユニークな組合せを表示
| distinct SourceIP_converted, DestinationIP_converted

おわりに

Kustoは扱い方がわかってしまえば非常に強力な分析ツールとなります。セキュリティ用途だけでなく、トラブルシュートにも大変有用ですので、Microsoft SentinelやAdvanced Huntingはぜひ使ってみてほしいです。(Microsoft社とは一切関係のない個人の見解です。)

役に立ったなと思った方はビール1杯奢ってください!

この続きはcodocで購入