はじめに
セキュリティの世界では、情報が力です。そして、その情報を効率的に掘り下げ、理解する能力が、組織のシステムを安全に保つ鍵となります。今回は、データ探索言語であるKusto Query Language(KQL)に触れてみたいと思います。
KQLは、大量のデータを効率的に分析し、クエリを実行するために設計された強力な言語です。この言語は、特にリアルタイムのデータ分析と探索に優れており、Azureなどの複数のサービスで広く利用されています。
- Azure Monitor
- Microsoft Sentinel
- Azure Resource Graph
- Microsoft Defender
実際にKQLを学ぼうと思っても環境を構築するのは時間やコストがかかりますが、Microsoftの方でKQLを学ぶための環境を提供しています。積極的に使ってKQLを学んでいきましょう。
学習サイト
学習コンテンツはいくつかありますが、すぐに利用できるものとしては以下のものが挙げられます。
Kusto 照会言語 (KQL) の概要
なにかわからないことがあればまずは公式が出しているドキュメントを参照しましょう。
Kusto 照会言語 (KQL) の概要 – Azure Data Explorer & Real-Time Analytics | Microsoft Learn
Kusto 100+ Knocks
KQLの書き方を身につけるための演習用の問題集です。
KUSTO 100+ knocks (azure.github.io)
Demo環境
https://aka.ms/LADemo
画面の左側にログが格納されているテーブルが用意されています。このテーブルに対して使いたいKQLを使ってログ探索を体験できます。100+Knocksの内容をDemo環境で試してみるのが良いと思います。
KQL関数を使ってみる
let
一時的な変数を定義するために利用されます。この変数はクエリ内で値を保存し、再利用することができます。これにより、クエリの読みやすさが向上し、繰り返し同じ値を複数回書く手間が省けます。
ここではtimeOffsetに1hという値を定義してSecurityEventのテーブルを参照し、TimeGenerated列の値が現在時刻から1日前より新しいレコードをフィルタリングしています。
Kusto 100+ Knocksではもっと細かい変数定義をしているので是非参考にしてみてください。
search
search関数を使って指定した2つのテーブル (SecurityEvent と SecurityAlert) 内で “err” という文字列が含まれるすべてのレコードを検索しています。ただしsearchは全テーブルのスキャンを行うため、大量のデータが存在する場合には、パフォーマンスに影響を与える可能性があります。ここでは2つのテーブル内の過去24時間における”err”が含まれるログ探索のためレコード数は少なくなっています。
where
where関数は大量のデータから特定の条件に合致するデータのみを抽出し、分析や可視化の対象を絞り込むことができます。
ここではSecurityEventのテーブルから過去1時間に生成され、かつイベントIDが4688でないすべてのセキュリティイベントログを抽出しています。
extend
extend関数は既存のレコードに対して新しいカラムを追加することができます。この関数を利用することで計算されたデータや変換された値を含む新しいカラムを動的に追加することができます。
ここではSecurityAlertテーブルに含まれているレコードの”AlertSeverity”カラムの値を”severityorder”カラムを追加して、別の値に置き換えています。
※SecurityAlertテーブルはDemo環境には無かったため、所属元の検証環境でクエリを行いました。
おわりに
今回はKQLを使った簡易的なログ探索を体験しました。実際の運用では複雑なKQLになるかもしれませんがどの関数を使えばよいのかを理解できていれば習得も早くできるかもしれません。
弊社ではMicrosoft 365やAzureの導入支援等の実績が豊富にございます。
お困り事がありましたらお気軽にお問い合わせください。