本トピックでは、Agentic SOC プラットフォームで Simple Log Service (SLS) の SQL クエリ機能を使用してカスタム検出ルールを構築する方法について説明します。このルールにより、休眠アカウントからのログインなどのセキュリティインシデントを監視し、リアルタイムでアラートを生成できます。
背景と目的
対象シナリオ:休眠アカウントからの異常なログインの検知。
方法:定期実行される SQL クエリを使用して最近のログインを履歴ベースラインと比較します。これにより、最近ログインしたが、長期間にわたって履歴レコードに表示されていないユーザーを特定します。
コアロジック
検出 SQL は、主に 3 つの部分で構成されています。
-
最近のアクティビティの定義:過去 20 分間に発生したすべてのログインイベントのクエリ。
-
履歴ベースラインの定義:より長い期間、具体的には過去 24 時間 (ただし直近 20 分間を除く) にホストにログインしたユーザーのクエリ。
-
データセットの比較:最近のアクティビティと履歴ベースラインの結合。ユーザーが最近のアクティビティに表示されているが、履歴ベースラインにレコードがない場合、そのログインは異常と見なされます。
最近のアクティビティの定義
(
select
user_id,
src_ip,
username,
uuid,
start_time
from
log
where
cast(start_time as bigint) >= cast(to_unixtime (current_timestamp) as bigint) - 20 * 60
and cast(start_time as bigint) < cast(to_unixtime (current_timestamp) as bigint)
) a
-
構文解析:
-
from log:logテーブルからデータをクエリ。 -
to_unixtime(current_timestamp):現在の Unix タイムスタンプを秒単位で返します。 -
cast(... as bigint):タイムスタンプを数学的な演算と比較のためにbigint(長整数) データ型に変換します。 -
where ...:現在時刻を終了とする 20 分間のスライディングタイムウィンドウを定義。-
>= ... - 20 * 60:ログの開始時刻 (start_time) は、「現在時刻 - 20 分」以上である必要があります。 -
< ...:ログの開始時刻は、「現在時刻」未満である必要があります。
-
-
-
意味解析:
-
目的:分析の対象を絞るために、「最近のアクティビティ」として
aという名前のセットを定義。 -
結果:
user_idやsrc_ipなど、過去 20 分間にアクティブだったユーザーの一時的な結果セットです。 -
キーポイント:「最近」の期間は、現在時刻から遡る 20 分間のタイムウィンドウとして正確に定義されます。
-
履歴ベースラインの定義
(
select
user_id,
username,
uuid
from
log
where
schema='HOST_LOGIN_ACTIVITY' and
cast(start_time as bigint) >= cast(to_unixtime (current_timestamp) as bigint) - 24 * 3600
and cast(start_time as bigint) < cast(to_unixtime (current_timestamp) as bigint) - 20 * 60
) b
-
構文解析:
-
schema='HOST_LOGIN_ACTIVITY':ホストのログインアクティビティログのみをクエリすることで、履歴ベースラインの精度を向上させます。 -
where ...:24 時間前から 20 分前までの時間範囲を定義。-
>= ... - 24 * 3600:ログの開始時刻は、「現在時刻 - 24 時間」以上である必要があります。 -
< ... - 20 * 60:ログの開始時刻は、「現在時刻 - 20 分」未満である必要があります。
-
-
-
意味解析:
-
目的:アクティビティが異常であるかどうかを判断するための参照として、「履歴ベースライン」セット
bを構築。 -
結果:過去 1 日以内にログインしたユーザー (直近 20 分間を除く) を含む一時的な結果セットです。
-
キーポイント:このタイムウィンドウは、24 時間前から 20 分前までに設定されます。これにより、履歴ベースラインデータが最近のアクティビティデータと重複しないことが保証されるため、自己比較による論理エラーを防ぎます。
-
差分比較のための LEFT JOIN の使用
... a
left join
... b on a.username = b.username and a.uuid = b.uuid and a.user_id = b.user_id
-
構文解析:
-
LEFT JOIN:左テーブル (a、最近のユーザー) をベースとして使用し、その各レコードを右テーブル (b、履歴ユーザー) のレコードと照合。 -
on a.username = b.username and a.uuid = b.uuid and a.user_id = b.user_id:結合条件を指定。username、uuid、およびuser_idフィールドを組み合わせてユーザーエンティティを一意に識別し、正確な照合を保証します。
-
-
意味解析:
-
目的:「最近のアクティビティ」(
a) を「履歴ベースライン」(b) と関連付け、最近の各ユーザーアクティビティに対応する履歴ログインレコードを見つけ出します。 -
結果:テーブル
aのすべてのレコードと、ユーザー ID フィールドに基づいて正常に照合されたテーブルbのレコードを含む結合結果セットを生成。 -
キーポイント:このクエリは
LEFT JOINの非対称性を利用します。テーブルaのユーザーがテーブルbに存在しない場合、結果としてテーブルbのすべての列がNULLになります。これが、新しいアクティビティを特定するためのコアメカニズムです。
-
最終結果のフィルタリング
where
(
b.username is null
or b.username = ''
)
-
構文解析:
-
b.username is null:これはLEFT JOINの特性を活用する上で重要です。最近ログインしたユーザー (テーブルa内) が履歴ベースライン (テーブルb) に見つからない場合、b.usernameはNULLになります。 -
or b.username = '': これは、ログフィールドがNULLではなく空文字列''となるケースに対応するための防御的条件です。
-
-
意味解析:
-
目的:結合された結果をフィルタリングし、最近出現したが履歴レコードがないアクティビティを分離。
-
結果:このフィルターが適用された後、結果セットには
LEFT JOINで一致しなかったレコード、つまり探している異常イベントのみが含まれます。 -
キーポイント:
b.username is nullは、検出ロジック全体の中核です。前のステップで生成されたNULL値を使用して、「最近存在し、履歴には存在しない」レコードを膨大なデータセットから分離します。
-
SELECT DISTINCT:アラートの出力
select distinct
a.user_id,
a.src_ip,
a.username,
a.uuid
-
構文解析:
-
SELECT DISTINCT:指定されたフィールドを選択して出力し、結果から重複を削除します。これにより、単一の異常イベントに対して 1 つのアラートのみが生成されることを保証します。
-
-
意味解析:
-
目的:アラートに直接使用できる異常イベントの最終リストをフォーマットして出力。
-
結果:重複が排除されたクリーンなアラートのリスト。各レコードには、ユーザー ID やソース IP など、異常イベントを追跡するために必要なコア情報が含まれています。
-
キーポイント:
DISTINCTの使用は重要です。結果を重複排除することで、検出ウィンドウ (20 分) 内で同じユーザーによる同じ異常な動作が1つのアラートのみをトリガーすることを保証します。
-
完全なソリューション
最終的な SQL クエリ
*|set session mode=scan;
select distinct
a.user_id,
a.src_ip,
a.username,
a.uuid
from
(
select
user_id,
src_ip,
username,
uuid,
start_time
from
log
where
cast(start_time as bigint) >= cast(to_unixtime (current_timestamp) as bigint) -20 * 60
and cast(start_time as bigint) < cast(to_unixtime (current_timestamp) as bigint)
) a
left join (
select
user_id,
username,
uuid
from
log
where
schema='HOST_LOGIN_ACTIVITY' and
cast(start_time as bigint) >= cast(to_unixtime (current_timestamp) as bigint) - 24 * 3600
and cast(start_time as bigint) < cast(to_unixtime (current_timestamp) as bigint) -20 * 60
) b on a.username = b.username
and a.uuid = b.uuid
and a.user_id = b.user_id
where
(
b.username is null
or b.username = ''
)
Agentic SOC でのルールの設定
-
Agentic SOC の購入と有効化
購入オプションについては、「購入と有効化」をご参照ください。すべてのカスタム脅威検出サービスにアクセスするには、[ログアクセストラフィック] と [Log Storage Capacity ] の両方を購入することを推奨します。
-
コンソールにログインし、 Create Custom Rule ページに移動します
-
にログインします。
-
左側のナビゲーションウィンドウで、 を選択します。コンソールの左上隅で、資産のあるリージョン ([Chinese Mainland]または[Outside Chinese Mainland]) を選択します。
-
カスタム タブで、Create Custom Rule をクリックします。
-
-
アラート生成ルールの設定
-
Create Custom Rule パネルの Basic Information タブで、ルール名と説明を入力し、次へ をクリックして Alert Settings ページに移動します。
-
SQL 検出ルールを設定します。以下のパラメータ設定をご参照ください。
パラメータ
値
Rule Body
SQL
Log Scope
ログオンログ - ホストログオン成功ログ
SQL Query
「最終的な SQL クエリ」セクションからコードをコピーします。
Scheduling Interval
固定間隔 - 20分
SQL Time Window
24時間
Start Time
ルールが有効になったとき
Generation Structure
その他のアラートログ
Alarm Metric
異常なログオン
Alert Severity
中
ATT&CK Tactic
永続化 - T1136 アカウント作成
Entity Mapping
-
Network Address
-
is_malware: 1 -
ip:$src_ip -
net_connect_dir: in
-
-
Host
-
is_asset: 1 -
uuid:$uuid
-
-
-
-
インシデント生成ルールの設定
-
Alert Settings ページで設定を完了した後、次へをクリックして イベント生成の設定 ページに移動します。
-
時間ルールを設定します。以下のパラメータ設定をご参照ください。
-
Generate Event:はい。
-
Incident Generation Method:タイプ別に集約
-
Aggregation Window:20分
-
-
-
ルールの検証
新しいルールは、デフォルトで Disabled になっています。テストして有効性を評価できます。テスト中、システムはアラートフィールドを自動的に較正します。生成された較正の提案を使用して、ルールの SQL またはプレイブックを最適化し、ルールが有効化された後のアラートの正確性と標準化を確保します。
-
対象ルールの Enabling Status を Testing に変更します。
-
対象ルールの [操作] 列で、View Alert Test Result をクリックします。
-
テスト結果の詳細ページで、アラートのトレンドチャートと生成されたアラートのリストを表示します。
-
アラートの [操作] 列で、[Details] をクリックして較正結果を表示します。
-
-
カスタムルールの有効化
ルールがテストに合格したら、その Enabling Status を
Enabledに設定します。重要ルールを有効にする前にテストすることを推奨します。
リスク評価
-
誤検知: 長期休暇や出張の後、初めてログインする通常のユーザーが誤検知される可能性があります。
dormant_hoursのしきい値を延長する (例: 72 時間) か、ユーザーのホワイトリストを設定することで、誤検知を減らすことができます。 -
検知漏れ:ログ収集の中断や標準外のフィールド形式により、SQL クエリが時間間隔を誤って計算し、検知漏れにつながる可能性があります。ログデータの完全性と一貫性を確保してください。
Security Center コンソールで、左側のナビゲーションウィンドウから [Agentic SOC] > [Detection Rules] を選択し、[Custom] タブをクリックします。ページの上部には、ルールの統計 (有効なルールの数、テスト中のルールの数、ルールテンプレートの数) が表示されます。カスタムルールリストで、対象のルール (たとえば [Abnormal IP Login]) をクリックします。右側に詳細パネルが表示され、アラートのトレンドチャートとテスト結果 (アラートの数、較正結果 (正しい/誤り)、および各アラートレコードの初回発生時刻、最新発生時刻、詳細など) が表示されます。
SQL 構文ドキュメント
-
SQL 構文の詳細については、「SQL 分析の構文と機能」をご参照ください。
-
脅威検出ルールの設定方法については、「脅威検出ルールの設定」をご参照ください。