皆さんこんにちは。国井です。
前回紹介したKQLクエリの書き方シリーズの第4弾として、今日は extend 演算子と並べ替えを紹介します。
2025年6月8日一部改訂しました
extend 演算子
extend演算子は新しい列を追加するために使用します。
特定のテーブルに複数の情報が配列として入っているとき、その中から特定の情報だけを取り出して新しい列に追加したいときに使います。
※下の図でいうとEntities列の中の0部分の情報だけを取り出したいという感じ
そんなときはextend演算子を使ってEntityArray0という名前の列を定義し、その中にEntities列に入る0番目の配列のデータを入れなさいと指定してあげます。
| extend EntityArray0 = todynamic(Entities)[0]
まず配列になっているデータを扱うときはtodynamicという関数を使って一度動的なデータ型にします。そうすると配列の中から[x]番目のデータを取り出すと指定できます。ここでは0番目のデータなので、todynamic(Entities)[0]と書けば、その結果が新設されたEntityArray0列に入ります。
おまけになりますが、ここからさらにOSFamily項目に入っている値だけを表示たいなら
EntityArray0列のOSFamily項目をEntityArray0.OSFamilyと書いて
それをtostring(EntityArray0.OSFamily)のように文字列型に変換してあげると取り出して表示が可能です。
なおproject演算子を使って表示するときは
OSFamily = tostring(EntityArray0.OSFamily)
と書けばOSFamily列を新設して、そこに結果を表示するように書くこともできます。
■ ■ ■
SC-200講座の内容に戻りましょう。
SC-200講座の中ではSentinelでアラートが出力されたときにその内容が記録されるSecurityAlertテーブルから重大度がHigh, Medium, Low, Informationalと出力されるのですが、これは数値に置き換えて出力してほしい。
そんな場面で extend を使っています。
SecurityAlert
| extend severityOrder = case (
AlertSeverity == "High", 3,
AlertSeverity == "Medium", 2,
AlertSeverity == "Low", 1,
AlertSeverity == "Informational", 0,
-1)
このクエリの場合は severityOrder という列を作って、case文で AlertSeverity 列の文字列が High だったら3、Mediumだったら2、のように設定しています。
こうすると実行結果はこんな感じです。severityOrder列が作られて0から3までの番号が入っていることがわかりますね(実際には1と2しかないけど)。
並べ替え
前のクエリの実行結果ですが、3,2,1,0ってきれいに並べ替えたいですよね。
その時はSQLクエリと同じ order by を使います。
SecurityAlert
| where TimeGenerated > ago(7d)
| extend severityOrder = case (
AlertSeverity == "High", 3,
AlertSeverity == "Medium", 2,
AlertSeverity == "Low", 1,
AlertSeverity == "Informational", 0,
-1)
| order by severityOrder desc
order by に続けて並べ替えをする列の名前を入れ、最後にdescと書くと降順に並べ替えをしてくれます。ちなみにascと書けば昇順になります。
実行結果はこちら。
2023年6月24日追記
extendのユースケースとして時間を操作する使い方があります。
SecurityEvent
| extend TimeDifference=(now() - TimeGenerated)
のように書いてあげるとTimeDifference列ができてログが生成されてからの経過時間を記述することができたり、
let offset = 9h;
SecurityEvent
| extend Timestamp_JST = Timestamp + offset
のように書いてあげるとUTCからJSTへの変換を行ったりすることができます。