【SC-200】KQLクエリの書き方-extend,orderby編

皆さんこんにちは。国井です。
前回紹介したKQLクエリの書き方シリーズの第4弾として、今日は extend 演算子と並べ替えを紹介します。
(今回からタイトルの表記を変えてみました)

extend 演算子

SentinelでSecurityEventを取得するようにOMSエージェントを入れておくとアラートを出力するような事象があった時、SecurityAlertテーブルに出力されます。
この時、重大度がHigh, Medium, Low, Informationalと出力されるのですが、これは数値に置き換えて出力してほしい。
そんなときは extend を使います。

SecurityAlert
| extend severityOrder = case (
    AlertSeverity == "High", 3,
    AlertSeverity == "Medium", 2, 
    AlertSeverity == "Low", 1,
    AlertSeverity == "Informational", 0,
    -1)

extend はテーブルの列を拡張して新しい列を作成する演算子です。このクエリの場合は severityOrder という列を作って、case文で AlertSeverity 列の文字列が High だったら3、Mediumだったら2、のように設定しています。

こうすると実行結果はこんな感じです。severityOrder列が作られて0から3までの番号が入っていることがわかりますね(実際には1と2しかないけど)。

image

並べ替え

前のクエリの実行結果ですが、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と書けば昇順になります。
実行結果はこちら。

image

2023年6月24日追記
extendのユースケースとして時間を操作する使い方があります。

SecurityEvent
| extend TimeDifference=(now() - TimeGenerated)

のように書いてあげるとTimeDifference列ができてログが生成されてからの経過時間を記述することができたり、

let offset = 9h;
SecurityEvent
| extend Timestamp_JST = Timestamp + offset

のように書いてあげるとUTCからJSTへの変換を行ったりすることができます。