「アラートが上がったけど、何から調べればいいかわからない」
「KQLは書けるけど、毎回ゼロから書くのが大変」
「調査中に時間がかかりすぎて、初動が遅れてしまう」

KQL(Kusto Query Language)は、Microsoft SentinelやDefender製品のログを調査するための言語です。
使いこなせると初動速度が劇的に変わります
今回は、現場で本当に使う「まず叩く3本のテンプレ」を紹介します。

1. なぜテンプレが重要なのか

インシデント対応は時間との勝負です。
「どのテーブルを見ればいいか」「どの項目でフィルタするか」を毎回考えていると、大切な初動の時間が溶けていきます。

事前にテンプレを整備しておくと:

  • 調査の開始時間が短縮される
  • 調査漏れが減る
  • ジュニアメンバーでも一定水準の調査ができる

2. テンプレ①:サインイン起点の調査

怪しいサインインを軸に、前後の行動を展開するテンプレです。

kql

// 対象ユーザーの直近サインイン履歴
SigninLogs
| where TimeGenerated > ago(7d)
| where UserPrincipalName == "target@example.com"
| project TimeGenerated, UserPrincipalName, IPAddress, Location, AppDisplayName,
          ConditionalAccessStatus, RiskLevelDuringSignIn, ResultType
| order by TimeGenerated desc

ここで確認するポイント:

  • IPAddress:普段と異なる国・地域からのアクセスか?
  • RiskLevelDuringSignIn:MicrosoftのAIがリスク判定しているか?
  • ConditionalAccessStatus:条件付きアクセスをバイパスしていないか?
  • ResultType:成功(0)か失敗(50126等)か?

疑わしいサインインが見つかったら、そのIPから他のアカウントへの試行も確認します。

kql

// 同一IPからの複数ユーザーへのサインイン試行
SigninLogs
| where TimeGenerated > ago(24h)
| where IPAddress == "suspicious.ip.here"
| summarize count(), make_set(UserPrincipalName) by IPAddress

3. テンプレ②:端末起点の調査

エンドポイントで不審な挙動が検知されたとき、その端末の全体像をつかむテンプレです。

kql

// 対象デバイスの直近プロセス起動履歴
DeviceProcessEvents
| where TimeGenerated > ago(24h)
| where DeviceName == "target-device-name"
| project TimeGenerated, DeviceName, InitiatingProcessFileName,
          FileName, ProcessCommandLine, AccountName
| order by TimeGenerated desc

さらに、ネットワーク接続も確認します。

kql

// 対象デバイスの外部通信履歴
DeviceNetworkEvents
| where TimeGenerated > ago(24h)
| where DeviceName == "target-device-name"
| where RemoteIPType != "Private"
| project TimeGenerated, DeviceName, RemoteIP, RemoteUrl, RemotePort,
          InitiatingProcessFileName, ActionType
| order by TimeGenerated desc

確認ポイント:

  • ProcessCommandLine:powershell、cmd、wscriptなどでの不審なコマンド実行
  • RemoteUrl:既知のC2ドメインや不審なIPへの通信
  • InitiatingProcessFileName:正規プロセスを装った実行ファイル

4. テンプレ③:メール起点の調査

フィッシングメールや悪意ある添付ファイルの調査に使うテンプレです。

kql

// 特定ドメインからのメール受信履歴
EmailEvents
| where TimeGenerated > ago(7d)
| where SenderFromDomain == "suspicious-domain.com"
| project TimeGenerated, SenderFromAddress, RecipientEmailAddress,
          Subject, ThreatTypes, DeliveryAction, DeliveryLocation
| order by TimeGenerated desc

メールを受け取ったユーザーが添付ファイルを開いたかどうかも調べます。

kql

// メール受信後の端末アクティビティ(クリック後の追跡)
EmailUrlInfo
| where TimeGenerated > ago(7d)
| join kind=inner (
    DeviceProcessEvents
    | where TimeGenerated > ago(7d)
) on $left.Url == $right.ProcessCommandLine
| project TimeGenerated, Url, DeviceName, FileName, AccountName

5. テンプレをチームで共有・管理する方法

KQLテンプレはSentinelの「Saved Queries」や、GitリポジトリのMarkdownファイルとして管理するのが現実的です。

おすすめの管理方法:

  • GitHubにKQLクエリ集リポジトリを作る
  • インシデントタイプ別にフォルダ分けする(phishing/, account-compromise/, etc.)
  • 使用後に「有効だったか」をコメントで残して継続改善する

6. Colorkrew Securityの考え方

Colorkrew Securityでは、KQL調査テンプレの整備・チームへの定着支援を行っています。

初動の速さが被害の大きさを決めます。
テンプレ整備から調査手順の標準化まで、現場で使える形にします。