【SC-200】KQLクエリの書き方-Where,Project編

皆さんこんにちは。国井です。
前回紹介したKQLクエリの書き方シリーズの第3弾として、今日は時間による検索範囲の指定方法と表示内容のカスタマイズについて紹介します。

時間指定

過去ログに対してクエリを実行するとき、xx時間前までのログを参照するって指定は[実行]ボタンの隣にあるボタンで指定できますが、

image
実はこの時間指定自体もクエリに書くことができます。

SecurityEvent
| where TimeGenerated > ago(1d)

image

SecurityEventテーブルに続けて | where… で書きはじめて TimeGenerated > ago (1d) と続けることで1日前 (1dは1日前という意味) までのログだけを参照するという意味になります。(いつも思うんだけど、不等号が > じゃなくて、< のような気がするんだけどね。)
多くのログの場合、そのログが出力された日時はTimeGenerated列に書き込まれるので、TimeGenerated > … と書く方法はとてもよくつかわれます。

where による条件指定 Part2

前回も使用した where ですが、TimeGenerated > … と組み合わせてこんな感じで実行することもできます。

SecurityEvent
| where TimeGenerated > ago(1h) and EventID == "4624"

これだとイベントIDが4624である1時間前までのログ、という意味になりますよね。
こちらは書き方を変えてこんな感じにしても結果は一緒です。

SecurityEvent
| where TimeGenerated > ago(1h)
| where EventID == 4624

Whereはいくらでも続けて欠けるので、3つ目の条件としてAccountType列がuserだったら、という条件を入れてみました。

SecurityEvent
| where TimeGenerated > ago(1h)
| where EventID == 4624
| where AccountType =~ “user”

ちなみに =~ は大文字・小文字を問わないって意味です。代わりに「AccountType == “user”」って書いたら小文字のuser以外は認められなくなります。
参考までに実行結果はこちら。

image

project で表示結果をカスタマイズ

project は where と同じように | の後ろにつなげて使います。project では表示結果がカスタマイズでき、project の後に指定した列だけが表示されるようになります。
比較のために、まずはイベントIDが4624と4625のものだけを表示してみます。

SecurityEvent 
| where EventID in (4624, 4625)

image

次に project と3行目に追加で書いて、Computer 列と Account 列だけが表示されるようにしてみました。

SecurityEvent
| where EventID in (4624, 4625)
| project Computer, Account

実行結果はこちら。余計な列が消えてなくなりスッキリしましたね。

image

2023年6月24日追記
Whereで条件指定するときは正規表現を使うこともできます。
列名 matches regex “正規表現”
って感じで書くので、例えば

SecurityEvent
| where Computer matches regex "^contoso.*"

のように書けばcontosoで始まるコンピューター名という指定ができます。
これを
| where not(Computer matches regex “^contoso.*”)
とすれば contosoで始まるコンピューター名を含まない指定になり、
| where Computer matches regex “(?i)^contoso.*”
とすれば contosoの名前を検索するのに大文字・小文字を区別するようになります。