【SC-200】KQLクエリの書き方 – Join編

皆さんこんにちは。国井です。
前回紹介したKQLクエリの書き方シリーズの第9弾として join 演算子を紹介します。

今日は趣向を変えて..

今日は最終的に実行したいクエリから紹介します。

SecurityEvent
| where EventID == "4624"
| summarize LogOnCount=count() by EventID, Account
| project LogOnCount, Account
| join kind = inner (
SecurityEvent
| where EventID == "4634"
| summarize LogOffCount=count() by EventID, Account
| project LogOffCount, Account
) on Account

実行結果はこんな感じになり、アカウントごとのログオン回数とログオフ回数がそれぞれ表示されています。

image

これを構成しているクエリを分解してみていきます。

アカウントごとのログオン回数/ログオフ回数を表示する

冒頭に登場したクエリの最初の4行はアカウントごとのログオン回数を表示しています。

SecurityEvent
| where EventID == "4624"
| summarize LogOnCount=count() by EventID, Account
| project LogOnCount, Account

image

一方、冒頭に登場したクエリの6~9行目はアカウントごとのログオフ回数を表示しています。

SecurityEvent
| where EventID == "4634"
| summarize LogOffCount=count() by EventID, Account
| project LogOffCount, Account

image

両者をjoinでくっつける

上に紹介した2つのクエリはログオン回数とログオフ回数が別々のクエリ結果として表示しています。しかし、これをひとつにまとめて表示したいというときもあるでしょう。
そういう時に join を使います。
ログオン回数(A)とログオフ回数(B)、アカウント(Account)のキーにして一つの行にまとめて表示するときは

A Join .. (B) on Account

のように書いてあげます。それが冒頭に紹介したクエリなのです。

SecurityEvent
| where EventID == "4624"
| summarize LogOnCount=count() by EventID, Account
| project LogOnCount, Account
| join kind = inner (
SecurityEvent
| where EventID == "4634"
| summarize LogOffCount=count() by EventID, Account
| project LogOffCount, Account
) on Account

このときに注目してほしいのが、join 演算子のうしろに書いてある kind=inner 部分です。

join に続けて kind=inner と書くと
join でログオン回数(A)とログオフ回数(B)をくっつけたときに、
AとBの両方に含まれるアカウント (つまりログオンとログオフの両方を行ったアカウント)が結果に表示されます。(Aが左の円、Bが右の円だとするとイメージ的に赤い部分を表示します)

image

一方、join に続けて kind=leftanti と書くと
join でログオン回数(A)とログオフ回数(B)をくっつけたときに、
Aだけに含まれるアカウント (つまりログオンのみを行ったアカウント)が結果に表示されます。(Aが左の円、Bが右の円だとするとイメージ的に赤い部分を表示します)

image

同じく、join に続けて kind=rightanti と書くと
join でログオン回数(A)とログオフ回数(B)をくっつけたときに、
Bだけに含まれるアカウント (つまりログオフのみを行ったアカウント)が結果に表示されます。(Aが左の円、Bが右の円だとするとイメージ的に赤い部分を表示します)

image

もうこれ以上繰り返すのは苦痛だろうから端折って説明すると、
kind=leftouterと書くとこちらのパターンで、

image

kind=rightouterと書くとこちらのパターンで表示します。

image

最後にAまたはBのいずれかに含まれるパターンですが、
kind=fullouter と書きます。

image

結果はこんな感じでログオンとログオフ両方が結果に表示されているもの、ログオンのみ表示されるもの、ログオフのみ表示されるもの、まばらに表示されていることがわかります。

image

join は色々細かく指定できるので、もっと知りたい方は公式サイトでどうぞ。