【CrowdStrike】ログインユーザーのZTAスコアを表示する高度なイベントクエリ(Insight)

こんにちは、ネクストモード株式会社 の sobar です。

ゼロトラストアセスメント(ZTA)のスコアを見ていると、「スコアが低い端末は分かったけれど、誰が使っている端末なのか」がすぐに分からず、利用者への是正依頼に一手間かかることがあります。

今回は、ZTAのスコアに最終ログオンユーザーを付け加え、端末ごとに一覧化する「高度なイベント検索」のクエリについて解説します。

(※ZTAそのものの概要やスコアの考え方については、【CrowdStrike】ゼロトラストアセスメント(ZTA)について をご参照ください。)

ZTAスコアと最終ログオンユーザーを端末ごとに一覧化するクエリ


以下は、調査 > 高度なイベント検索 で実行するクエリです。端末ごとに最新のZTAスコア(総合・OS・センサー)を取得し、あわせて最終ログオンユーザーと最終ログオン日時を一覧表示します。

#repo=base_sensor "event_type" = ZeroTrustHostAssessment
| cid="*"
| event_platform="*"
| aid=~wildcard("*", ignoreCase=true)
| match(file="aid_master_details.csv", field=aid, include=[HostHiddenStatus], strict=false)
| $falcon/investigate:hideHiddenHosts()
| parseJson("@rawstring", removePrefixes = ["assessments."])
| aid =~ wildcard(*, ignoreCase=true)
| groupBy(aid, function=selectLast([hostname, event_platform, product_type_desc, scores.version, scores.modified_time, scores.os, scores.overall, scores.sensor]), limit=max)
// ===== 最終ログオンユーザーを付与 =====
| join(query={
    #repo=base_sensor #event_simpleName=UserLogon
    // Windows は対話型(2)/リモート対話型(10)/キャッシュ(11)のログオンのみ
    | case {
        event_platform="Win" | in(field="LogonType", values=["2","10","11"]);
        event_platform!="Win";
    }
    // システムアカウント・コンピュータアカウントを除外
    | UserName!=/(\$$|^DWM-|^UMFD-|^SYSTEM$|^LOCAL SERVICE$|^NETWORK SERVICE$|^ANONYMOUS LOGON$|^root$|^_)/i
    | groupBy(aid, function=[selectLast([UserName]), max(@timestamp, as=LastLogonTime)], limit=max)
    | LastLoggedOnUser := rename(UserName)
  },
  field=aid, key=aid, include=[LastLoggedOnUser, LastLogonTime], mode=left)
| default(field=LastLoggedOnUser, value="-", replaceEmpty=true)
| formatTime("%Y-%m-%d %H:%M:%S", field=LastLogonTime, locale=en_US, timezone="Asia/Tokyo", as=LastLogonTime)
| ComputerName := rename(hostname)
| case {
    aid=~wildcard("*", ignoreCase=true)
    | aid=~wildcard("*", ignoreCase=true);
    ComputerName=~wildcard("*", ignoreCase=true)
    | ComputerName=~wildcard("*", ignoreCase=true);
}
| replace(field=scores.modified_time, regex="^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}).*$", with="$1")
| parseTimeStamp(field=scores.modified_time, format="yyyy-MM-dd'T'HH:mm:ss", timezone="UTC", as=scores.modified_time)
| formatTime("%Y-%m-%d %H:%M:%S", field=scores.modified_time, locale=en_US, timezone="Asia/Tokyo", as=scores.modified_time)
| test(scores.overall>=0)
| test(scores.overall<=100)
| replace(field=scores.os, regex="^0$", with="-")
| replace(field=scores.overall, regex="^0$", with="-")
| replace(field=scores.sensor, regex="^0$", with="-")
| HostType := product_type_desc
| case {
    event_platform = "Mac"
    | OS := "macOS";
    event_platform = "Win"
    | OS := "Windows";
    event_platform = "Lin"
    | OS := "Linux";
    event_platform = "Droid"
    | OS := "Android";
    event_platform = "IOS"
    | OS := "iOS"
    | *;
}
| default(field=HostType, value="unknown", replaceEmpty=true)
| table([ComputerName, LastLoggedOnUser, LastLogonTime, OS, HostType, scores.version, scores.modified_time, scores.os, scores.sensor, scores.overall, aid], sortby=scores.overall, order=desc, limit=20000)
| sort(ComputerName, order=asc, limit=20000)

実行結果の一例です。

crowdstrike-advanced-event-query-to-display-logged-in-user-zta-scores_01

出力される主な項目は以下のとおりです。

  • ComputerName:端末名
  • LastLoggedOnUser:最終ログオンユーザー(該当なしは「-」)
  • LastLogonTime:最終ログオン日時(日本時間)
  • OS:OS名(Windows / macOS / Linux など)
  • HostType:端末種別(Workstation / Server など)
  • scores.version:ZTA評価データのバージョン
  • scores.modified_time:ZTAスコアの更新日時(日本時間)
  • scores.os:OSスコア(未評価は「-」)
  • scores.sensor:センサースコア(未評価は「-」)
  • scores.overall:総合スコア(未評価は「-」)
  • aid:Falconセンサーのエージェント ID

クエリの解説


ブロックごとに処理の内容を解説します。

1. #repo=base_sensor "event_type" = ZeroTrustHostAssessment

  • 意味:ZTAの評価イベントを抽出
  • 詳細:センサーのログが格納されるリポジトリ(base_sensor)から、ZTAの評価結果を表す ZeroTrustHostAssessment のイベントのみを対象にします。

2. | cid="*" / | event_platform="*" / | aid=~wildcard("*", ignoreCase=true)

  • 意味:CID・OS・aid による絞り込み条件(初期値はすべて対象)
  • 詳細:いずれも「*」(すべて)を指定しているため、この状態では絞り込みは行われません。特定のOSだけを見たい場合は event_platform="Win" のように書き換えて利用できます。後半の | aid =~ wildcard(*, ignoreCase=true) も同様にすべてを対象とする条件です。

3. | match(file="aid_master_details.csv", ...) / | $falcon/investigate:hideHiddenHosts()

  • 意味:非表示(Hidden)にしたホストを除外
  • 詳細:ホスト情報のルックアップファイル aid_master_details.csv から HostHiddenStatus(非表示状態)を付与し、Falconが用意している関数 hideHiddenHosts() で、ホスト管理画面で非表示にした端末を結果から外します。strict=false のため、ルックアップに該当しないイベントも残ります。

4. | parseJson("@rawstring", removePrefixes = ["assessments."])

  • 意味:評価データ(JSON)をフィールドに展開
  • 詳細:イベントの生データ(@rawstring)をJSONとして解析し、各値をフィールドとして扱えるようにします。removePrefixes でフィールド名の先頭の「assessments.」を取り除くことで、以降は scores.overall のような短い名前で参照できます。

5. | groupBy(aid, function=selectLast([hostname, event_platform, ...]), limit=max)

  • 意味:端末ごとに最新の評価結果を1行にまとめる
  • 詳細:ZTAの評価イベントは同じ端末から繰り返し送られるため、aid ごとにグループ化し、selectLast で最新の値(端末名、OS、端末種別、各スコア、更新日時など)だけを残します。limit=max で端末数が多い環境でも集計の上限に達しにくくしています。

6. | join(query={ #event_simpleName=UserLogon ... }, field=aid, key=aid, ..., mode=left)

  • 意味:最終ログオンユーザーと最終ログオン日時を付与
  • 詳細:サブクエリでログオンイベント(UserLogon)を集計し、aid をキーにZTAの結果へ結合します。サブクエリ内では以下の処理を行っています。
    • case { event_platform="Win" | in(field="LogonType", values=["2","10","11"]); event_platform!="Win"; }:Windows は対話型(2)・リモート対話型(10、RDPなど)・キャッシュ対話型(11)のログオンだけを対象にし、サービスなどの非対話ログオンを除外します。Windows 以外はすべてのログオンを対象にします。
    • UserName!=/(\$$|^DWM-|^UMFD-|^SYSTEM$|...|^root$|^_)/i:コンピューターアカウント(末尾が「$」)、Windows のシステムアカウント(DWM-、UMFD-、SYSTEM、LOCAL SERVICE など)、Linux の root、macOS のサービスアカウント(先頭が「_」)を正規表現で除外します。
    • groupBy(aid, function=[selectLast([UserName]), max(@timestamp, as=LastLogonTime)]):端末ごとに最後にログオンしたユーザー名と、最も新しいログオン日時を取得します。
    • LastLoggedOnUser := rename(UserName):ユーザー名のフィールド名を LastLoggedOnUser に変更します。
    mode=left を指定しているため、検索期間内にログオンイベントがない端末も結果から消えずに残ります。

7. | default(field=LastLoggedOnUser, value="-", replaceEmpty=true) / | formatTime(..., timezone="Asia/Tokyo", as=LastLogonTime)

  • 意味:ログオン情報の表示を整える
  • 詳細:ログオンユーザーが取得できなかった端末は「-」と表示します。最終ログオン日時は timezone="Asia/Tokyo" を指定し、「YYYY-MM-DD HH:MM:SS」形式の日本時間(JST)で表示します。UTCで表示したい場合は timezone=Z に変更します。

8. | ComputerName := rename(hostname) / | case { aid=~wildcard("*", ...); ComputerName=~wildcard("*", ...); }

  • 意味:端末名のフィールド名を揃え、aid・端末名で絞り込む枠を用意
  • 詳細:hostname を Falcon の他画面と同じ ComputerName に変更します。続く case はダッシュボードの入力欄(aid/端末名)を想定した検索条件で、いずれも「*」のため、この状態では全端末が対象となります。

9. | replace(field=scores.modified_time, regex=...) / | parseTimeStamp(..., timezone="UTC", ...) / | formatTime(...)

  • 意味:スコア更新日時を読みやすい形式に変換
  • 詳細:スコアの更新日時は「2026-10-29T09:39:12.570097150Z」のようなISO 8601形式(UTC、ナノ秒付き)で記録されています。replace で秒より後ろを取り除いてから parseTimeStamp でUTCの日時として解釈し、formatTime で「YYYY-MM-DD HH:MM:SS」形式の日本時間(JST)に変換します。

10. | test(scores.overall>=0) / | test(scores.overall<=100) / | replace(field=scores.〜, regex="^0$", with="-")

  • 意味:総合スコアの範囲指定と、未評価スコアの表示変更
  • 詳細:総合スコアが0〜100の範囲の端末を対象にします。この数値を変えることで、スコアが一定以下の端末だけを抽出できます。また、スコアが「0」の項目は評価値が入っていないものとして「-」に置き換えています。

11. | HostType := product_type_desc / | case { event_platform = "Mac" | OS := "macOS"; ... }

  • 意味:端末種別とOS名を分かりやすい表記にする
  • 詳細:端末種別(Workstation / Server / Domain Controller など)を HostType として出力し、空の場合は「unknown」とします。OSはログ上の省略表記(Mac、Win、Lin、Droid、IOS)を macOS、Windows、Linux、Android、iOS に置き換えます。

12. | table([...], sortby=scores.overall, order=desc, limit=20000) / | sort(ComputerName, order=asc, limit=20000)

  • 意味:出力項目を指定し、端末名順に並べる
  • 詳細:table で表示する列と順番を指定します(最大20,000行)。最後の sort で端末名の昇順に並べ替えているため、最終的な表示は端末名順となります。

カスタマイズ例


① スコアが低い端末だけを抽出したい場合

総合スコアの上限を変更します。以下は総合スコアが50以下の端末に絞り込む例です。

| test(scores.overall<=50)


② スコア順に並べたい場合

最終行の | sort(ComputerName, ...) を削除すると、table で指定した総合スコアの降順で表示されます。スコアの低い端末から確認したい場合は、table の order=desc を order=asc に変更します。

③ 特定の端末名に絞り込みたい場合

クエリの末尾に以下を追加します(例:端末名が「PC-」で始まるもの)。

| ComputerName=~wildcard("PC-*", ignoreCase=true)
※ 8. の case 内の ComputerName 側の条件を書き換えても、先に評価される aid 側の条件(「*」)にすべての端末が一致するため、絞り込みは効きません。末尾に条件を追加する方法が確実です。

④ 最終ログオンユーザーが取れない端末が多い場合

サブクエリのログオンイベントは、画面で指定した検索期間の範囲で集計されます。長期間ログオンのない端末は「-」となるため、検索期間を広げて実行してください。

必要なサブスクリプションについて


高度なイベント検索を利用するためには、Falcon Insight XDR などのサブスクリプションが必要となります。

※ライセンス構成の詳細については、弊社までお気軽にお問い合わせください。

参考


さいごに


今回は、ZTAスコアと最終ログオンユーザーを端末ごとに一覧化する高度なイベントクエリについてご紹介しました。

スコアだけでなく「誰が使っている端末か」まで同じ表で確認できるため、スコアの低い端末の利用者へ是正(OSアップデートや設定見直し)を依頼する際の確認がしやすくなります。

定期的な端末の棚卸しの一環として、クエリのスケジュール実行と組み合わせて活用することをお勧めします。皆さまの運用の一助となれば幸いです。

CrowdStrike Falconについてのお問い合わせ


ネクストモードでは、CrowdStrike Falconをはじめ、OktaやNetskopeを活用したSaaS・生成AIの包括的なセキュリティ対策をご支援しています。ご興味のある方は、ぜひお気軽にご相談ください!