皆さんこんにちは。国井です。
最近、マイクロソフトのオフィシャルテキストを使ったトレーニングを担当させていただくことがぼちぼち増えてきたのですが、その中でもSC-200というトレーニングコースはお話しすることが山のようにあり、時間内ですべてをお伝えすることはまず無理な感じです。
特にKQLクエリの書き方については細かい解説をすることは無理なので、
今回から幾度かにわけて紹介しようと思います。
■ ■ ■
KQLクエリは最近、マイクロソフトのクラウドサービスの色々なところで使われるようになったけれども、特にMicrosoft Sentinelを使うときなんかは必須なわけです。
そこで今回はMicrosoft Sentinelを利用するケースを想定して
クエリの書き方を見てみたいと思います。
テーブルの指定
クエリで最初に指定するのはテーブルです。
SecurityEvent
テーブル(スキーマ)とはクエリで取得したい情報のジャンルを表します。
テーブル名を最初の行に記述することで、私は〇〇の情報を取ってくる!と指定していることになります。
SecurityEventテーブルはMicrosoft SentinelでOMSエージェントがインストールされたWindowsデバイスから収集したイベントログを参照するものになっています。
そして実行結果がこちら。
クエリを書いた画面の下に結果が表示されています。
なお、取得可能なテーブル一覧はクエリ画面の左側のところに一覧で表示されています。
Where で表示内容を絞り込む
次はこんな感じのクエリを用意しました。
SecurityEvent
|where EventID != 4688
SecurityEventテーブルにあるイベントログからEventIDが4688でないものだけを出力するように、という設定をしています。
KQLではテーブル名以降の記述は|(パイプ)を使って記述します。
ですので、|where と書き始めることで(whereはSQL文のwhereと一緒です)出力内容の絞り込みを表しているのです。
ちなみに実行結果はこちらです。
変数を使う
前のクエリでは4688と書いたところがありますが、これを変数で表現するとこうなります。
let discardEventId = 4688;
SecurityEvent
| where EventID != discardEventId
前にテーブル名は最初の行に書くと言いましたが、変数を指定する場合はテーブル名よりも先に書くことができます。そして変数の宣言はletという文字を使って行います。
let の後ろに指定する文字列が変数として宣言されます。ですので、このケースでは discardEventId という変数を指定し、その値に4688と指定しています。
2行目からは前のクエリと同じことを書いていますが、
前と異なるのは |where EventID != 4688の代わりに |where EventID !=discardEventId と指定している点です。discardEventIdは変数で値は4688でしたので、
つまり|where EventID != 4688 と |where EventID !=discardEventId は同じことを表しているのです。ですから実行結果も前の画面と同じになるのです。
変数でリストを宣言する
今日の最後はこれ。
let suspiciousAccounts = datatable(account: string) [
@"\administrator",
@"NT AUTHORITY\SYSTEM"
];
SecurityEvent
| where Account in (suspiciousAccounts)
先ほどと同じくletで変数の宣言をしているのですが、
リストとして複数の値を指定するときはdatatable(account: string)[ … ]と書きます。
ここでは@の後ろに書かれた文字列が2つありますが、これがリストに格納される文字列になります。このケースでは\administratorとNT AUTHORITY\SYSTEMの2つがsuspiciousAccountsにセットされているので、最後の行のAccount in (suspiciousAccounts) ではAccount列に\administratorまたはNT AUTHORITY\SYSTEMが含まれる場合、という条件指定になるのです。ですから実行結果もAccount列がNT AUTHORITY\SYSTEMのものだけが表示されていますね。
続く