クエリ文法
このページの内容
概要
クエリ文法は、ML(機械学習)モデルが理解できるクエリ構文を構築する際に使用できる言語であり、高度なルール作成の際にルール条件やルールパラメータを構築するのに役立ちます。
このページには、基本的な条件、サポートされているデータ型、関係演算子および論理演算子、高度な関数、集計構文、相関ステートメント、実用的な検出例など、クエリ文法の完全なリファレンスが掲載されています。
基本条件
1. データ型
| 型名 | 説明 | 例 |
|---|---|---|
| 文字列 | 文字列値 | "surname" "198.51.100.255" "バイト数" |
| Int | 整数値 | 23 -32 4000000244553 |
| Float | 浮動小数点数。 | 3.14 -1.2e5 |
| 時間間隔 | 1 桁または 2 桁の数字に、秒の場合は「s」、分の場合は「m」が続く形式で表される時間間隔。時間の場合は「h」、日の場合は「d」、週の場合は「w」、月の場合は「M」、四半期の場合は「q」、年の場合は「y」が続く。 | 2s、45m、4h、2d、3w、2M、4q、1y |
| メモリ | データサイズは、バイトの場合は「B」、キロバイトの場合は「KB」、メガバイトの場合は「MB」、ギガバイトの場合は「GB」、テラバイトの場合は「TB」、ペタバイトの場合は「PB」で表されます。 | 2B、3KB、3 MB、34GB、9TB、9PB |
| 日付・時刻 | 「YYYY-MM-DD」、「YYYY-MM-DD HH-MM-SS」で表される日付・時刻の形式 | 「2000-08-30」、「2000-08-30 15:45:06」 |
2. 数値関係演算子
| 演算子 | 説明 | サポートされているデータ型 | 例 |
|---|---|---|---|
| > | より大きい | Int、Float、Memory、IP | source_IP > 10.53.12.0 |
| >= | 以上 | 整数、浮動小数点、メモリ、IPsource_IP >= 10.53.12.0 | source_ip >= 10.53.12.0 |
| < | 未満 | 整数、浮動小数点数、メモリ、IP | source_IP < 10.53.12.0 |
| <= | 以下 | 整数、浮動小数点数、メモリ、IP | source_IP <= 10.53.12.0 |
| = | 等しい | 文字列、整数、浮動小数点数、メモリ、IP | EventID=4624 |
| != | 等しくない | 文字列、整数、浮動小数点数、メモリ、IP | EventID ≠ 4624EventID ≠ 4624 |
| in/IN | 以下のいずれかの要素と等しい | 文字列、整数、浮動小数点数、IP | EventID が (4624,4625) の場合 |
| notin/NOTIN | いずれの要素とも等しくない | 文字列、整数、浮動小数点数、IP | EventID notin (4624,4625) |
| isExist | フィールドが空の文字列でも null でもない。 | すべてのフィールドについて | isExist(source_ip) |
| isNotExist | フィールドが空の文字列であり、かつ null です。 | すべてのフィールドについて | isNotExist(source_ip) |
3. 文字列の比較演算子
| 演算子 | 説明 | 例 |
|---|---|---|
| = | 等しい | username = "name" |
| != | 等しくない | username != "name" |
| 含む/CONTAINS | フィールドに特定のデータが含まれている場合、trueを返す | eventname に "success" が含まれる場合 |
| notcontains/NOTCONTAINS | フィールドにデータが設定されていない場合、trueを返します | eventname に「success」が含まれていない |
| startswith/STARTSWITH | フィールドの値が指定されたデータで始まる場合、true を返します | username startswith "Ja" |
| endswith/ENDSWITH | フィールド値がデータで終わる場合、true を返します | username endswith "kumar" |
| notstartswith/NOTSTARTSWITH | フィールドの値が指定されたデータで始まらない場合、trueを返します | username notstartswith "Ja" |
| notendswith/NOTENDSWITH | フィールドの値が指定されたデータで終わらない場合、trueを返します | username notendswith "kumar" |
| matches/MATCHES | フィールドの値が正規表現と一致する場合、true を返します | username が "pree.*" に一致する場合 |
| notmatches/NOTMATCHES | フィールドの値が正規表現と一致しない場合、trueを返します | username が "pree.*" に一致しない |
4. 論理演算子
| 演算子 | 説明 | 例 |
|---|---|---|
| AND/and | 両方の条件が真の場合にのみ true を返す | username = "preethi" かつ eventid=4624 |
| OR/または | いずれかの条件が真であれば、もう一方の条件にかかわらず true を返します。 | eventid = "4688" または eventid = "592" |
例
- SUDO コマンドの繰り返し失敗に関する基本的な基準: logtype="unix" かつ iename = "sudo commandexecution failed"
- 過度なパスワード変更の失敗に関する基本基準:common_report_name= "user account password changes" かつ severity ="failure" または iename = "password update failure"
- RyukのWake on LANコマンドに関する基本条件:logtype in("Windows", "Fortinet", "Sonic wall") かつ (eventid = "4688" または eventid = "592" ) かつ (commandline に "8 lan" を含む または commandline に "9rep" を含む )
- Windowsのログオン失敗に関する基本条件:logtype = "Windows" かつ actionname = "Failed logon"
- ログイン成功の基本条件:actionname = "Successlogon"
- logtype には、*(すべてのログタイプを含む)、Windows、Unix、Cisco などの値が含まれます。
- actionname 演算子を使用すると、クエリ内で事前定義されたアクションとカスタムアクションの両方を使用できます。
クエリ構文
このクエリ言語は、さまざまな演算子や節をサポートしています。以下に完全な構文リファレンスを示します。
1. 基本構文:
action_name:
logtype = (* | windows | syslog | ...) [ logical_operator basic_criteria ... ] with [aggregate_func(fieldname), ... ]
例: eventid = 4624
2. ソート:
| sort フィールド名 (asc | desc)
3. 時間ウィンドウ:
| timewindow 値 単位 sort [ aggregateField | count ] (asc | desc) limit 値 having countoperator 値
4. グループ化:
| groupby フィールド名 with [ aggregate_func(フィールド名), ... ] sort [ aggregateExpr | count ](asc | desc) limit 件数 having [ aggregateExpr | count ] 比較演算子 件数
- 括弧内の演算子(groupby など)は、任意の順序で記述できます。
- timewindow演算子は1回のみ指定できます。
- groupby は、任意の順序で最大 3 回まで指定できます。
- sort関数は、同じクエリ内でfirst関数またはlast関数と併用することはできません。
5. Distinct:
| distinct フィールド名 sort (asc | desc) limit [1-200] having カウント 演算子 値
6. 後処理:
| having aggregateExpr operator value [ logical_operator (aggregateExpr operator value) ]
| isanomalous(field, model, field)
7. first および last:
| first [1-10] フィールド名 [, フィールド名 ...]
| last [1-10] フィールド名 [, フィールド名 ...]
8. 定義:
def: 変数名 = <式>
サポートされる型: int, string, float, time, boolean
9. フィルタリング:
filter: <条件>
これにより、条件に一致しない結果が除外されます。
10. イベントシーケンス:
follow: アクション名1 の後に | アクション名2 が [1-60](ミリ秒 | 秒 | 分 | 時間 | 日)以内に続かない
例:あるイベントの発生後、10分以内に別のイベントが発生することを相関に基づいて検出する。
11. 選択:
select アクション名.フィールド, アクション名.フィールド群, def_name
高度な演算子
- isMalicious 関数
- isVulnerable関数
- isMisConfiguredFor 関数
1. 悪意のあるものか
- 「isMalicious」条件は、IPアドレスフィールドでのみ利用可能です。これは、検出されたIPアドレスが、内部データベースに保存されている悪意のあるIPアドレスの事前定義リストに含まれているかどうかを確認します。
- この関数は true または false を返します。
構文:isMalicious(fieldname)
例:外部リモートサービス
パブリック IP からのログオン失敗:
logtype = "*" かつ eventid = 4625 かつ isExists(remoteip) かつ isMalicious(remoteip)
2. 脆弱性があるか
- Endpoint Centralとの統合後にのみ利用可能で、devicefieldsと組み合わせて使用できます。デバイスがEndpoint Centralで「脆弱」とタグ付けされているかどうかを確認し、特定の攻撃(例:CVE-2023-38831)に対して脆弱なデバイスを特定します。
- この関数は true または false を返します。
構文:
isVulnerable(fieldname)
isVulnerable(fieldname, matchvalue)
例:
A. Microsoft Outlook の脆弱性の悪用
WebDAV または SMB 共有に接続する Outlook:
logtype = "windows" かつ eventid = 4656 かつ objectname に "\REGISTRY\MACHINE\SYSTEM" が含まれる、または objectname に "Services" が含まれる、または objectname に "WebClient\NetworkProvider,LanmanWorkstation\NetworkProvider" かつ accesslist に "ReadData (または ListDirectory)" が含まれる かつ isVulnerable(デバイス名, "CVE-2023-23397")
| groupby processname
Rundll.exe 経由での不審な WebDAV クライアントの実行:
logtype = "sysmon" かつ iename = "Sysmon Process Creation" かつ parentprocessname に "svchost.exe" が含まれる かつ parentprocesscommandline に "-s WebClient" が含まれる かつ processname に "rundll.exe" が含まれる かつ processname = WebDAV または SMB 共有に接続している Outlook.processname
B. AWS ログイン失敗
エラーイベント:
logtype = "aws cloudtrail" かつ isVulnerable(errorcode)
3. 設定不備
Endpoint Central との統合後にのみ利用可能で、デバイスフィールドと併用できます。Endpoint Central によって特定された設定ミス(例:Windows Credential Guard が無効化されているなど)があるデバイスを検出します。
構文:
misConfiguredFor(fieldname , match_value)
例:
A. 組み込みのゲストアカウントによる権限昇格
ネットワークゲストによるログオン成功:
logtype = "windows" かつ eventid = 4624 かつ username に "Guest" が含まれる かつ logontype = 3 かつ MisconfiguredFor(Devicename, "組み込みのゲストアカウントが無効化されていないか、適切に制限されていない")
| groupby logonid
B. 特権操作の試行:
logtype = "windows" かつ eventid = 4672 かつ logonid = 「ネットワークゲストログオン成功」の logonid かつ MisconfiguredFor(デバイス名, "組み込みゲストアカウントが無効化されていないか、適切に制限されていない")
C. ユーザーアカウントのローカルグループメンバーシップ変更の試行:
logtype = "windows" かつ eventid = 4732 かつ groupname に "Administrators" が含まれる かつ logonid = ネットワークゲストログオン成功.logonid かつ MisconfiguredFor(デバイス名, "組み込みのゲストアカウントが無効化されていないか、適切に制限されていない")
クエリ構成要素
- 集計関数
- ソート演算子
- 時間ウィンドウ演算子
- Groupby 演算子
- DISTINCT演算子
- Having演算子
- First/Last演算子
- WITH演算子
- ステートメントの順序
1. 集計関数
| 関数 | 説明 | 構文 | 例 | 出力 |
|---|---|---|---|---|
| SUM |
| sum(field) または SUM(field) | sum(bytes_in) | 3.27MB (3,432,605) |
| AVG |
| avg(field) または AVG(field) | avg(_zl_timestamp) | 1.36kb (1,393.156) |
| MAX |
| max(field) または MAX(field) | max(received_bytes_i) | 107.61kb (110,196) |
| MIN |
| min(field) または MIN(field) | min(received_bytes_i) | 107.61kb (110,196) |
| STDEV |
| stdev(field) または STDEV(field) | stdev(_zl_timestamp) | 2.46kb (2,521.297) |
| COUNT |
| count | having count > 100 | true/false |
| DCOUNT | 一意の値の数を返します。「with」演算子を使用する場合 → 数値を返します。「having」演算子を使用する場合 → ブール値(true/false)を返します。 | dcount(field) または DCOUNT(field) | having dcount(_zl_host) > 2 | true/false |
2. ソート演算子
- 指定されたフィールドに基づいてすべての結果をソートします。
- デフォルトでは、結果はカウント数の降順でソートされます。
- 「sort」の後は、集計フィールド以外のフィールドのみ指定可能です。
- 構文:sort フィールド名1 (asc/desc) [, フィールド名2 (asc/desc) ...]
- 例:
- logtype="windows" and eventid = 4625 | sort username asc, hosttype desc
3. タイムウィンドウ演算子
- ログを指定された時間スライスごとにグループ化します。
- 「sort」の後は、集計フィールドのみ使用可能です。
- 「group by」キーワードの最大制限値は 1000 です。
- 使用可能なタイムウィンドウ単位:y(年)、M(月)、w(週)、d(日)、h(時間)、m(分)、s(秒)。
- 構文: timewindow 値 単位 sort [集計フィールド, カウント] (asc/desc) limit 値 having カウント 演算子 値
- 例:
- logtype="windows" | timewindow 5m
- logtype="windows" | timewindow 5m sort count desc
- logtype="windows" | timewindow 1h sort sum(bytes_in) as totalBytes asc
- logtype="windows" | timewindow 1h sort timewindow desc
- logtype="windows" | timewindow 5m limit 5
- logtype="unix" and eventid = 4625 | timewindow 10m limit 10 having count >100
- logtype="windows" | timewindow 10m | groupby username
4. GROUP BY 演算子
- フィールドの一意の値を取得するために使用されます。
- 複数の GroupBy フィールドが指定された場合、最初のフィールドがプライマリ、2番目のフィールドがセカンダリとなります。
- 「sort」の後は、集計フィールドのみが許可されます。
- groupby の最大制限は 1000 です。
- 構文: groupby フィールド名1 with 集計フィールド sort [集計フィールド, カウント] [asc/desc] limit [1-1000] having 集計式 演算子 値
- 例:
- logtype="unix" | groupby username sort sum(sent_bytes_i) as total desc
- logtype="unix" | groupby username sort sum(sent_bytes_i) as total desc limit 10|groupby hostname
- logtype="unix" | groupby username sort sum(sent_bytes_i) as total desc limit 10|groupby hostname with sum(sent_bytes_i) as total
- logtype="windows" and eventid = 4625 | groupby username having count > 100
- logtype="windows" and eventid = 4625 | groupby username having avg(sent_bytes) as average > 10 MB
- logtype="windows" | groupby username limit 20 | groupby hosttype having avg(sent_bytes_i) as average > 10MB | groupby hostname having sum(received_bytes_i) as total < 500 MB
5. Distinct 演算子
- 一意の値のみを含むテーブルを取得します。
- 指定できる一意なフィールドは1つだけです。
- Distinct フィールドは、カウント順でのみソートできます。
- DISTINCTの最大制限は 200 です。
- 構文: distinct フィールド名 sort (asc | desc) limit [1-200] having countoperator 値
- 例:
- logtype="windows" | distinct zuid
- logtype="windows" | distinct zuid sort asc
- logtype="windows" | distinct zuid limit 150
- logtype="windows" | distinct location having count > 5
6. Having 演算子
- 結果後演算子。外側集計条件に使用されます。
- 構文:having aggregateExpr operator value [ 論理演算子(aggregateExpr operator value) ]
- 例:
- logtype="unix" かつ eventname に "logon" が含まれる | having count > 120
- logtype="windows" and eventid = 4625 | having avg(sent_bytes) as average > 10MB
7. 最初/最後の演算子
- First演算子は最も古いログを返し、last演算子は最も新しいログを返します。
- first または last のいずれかを使用できます。
- first/last には Limit を併用できます。
- 上限 = 10。
- 構文:first/last [1-10] フィールド名1 (, フィールド名2, ...)
- 例:
- logtype="windows" | groupby status | first 2 request_uri,remote_ip
- logtype="windows" | groupby status | last 2 request_uri,remote_ip
8. With 演算子
- 集計式は、基本条件およびグループ化演算子で使用できます。
- 構文: with aggregateExpr (, aggregateExpr ...)
- 例:
- logtype="windows" and with sum(sent_bytes) as bytesSum, avg(received_bytes) as average | groupby srcip
- logtype="windows" and | groupby srcip with sum(sent_bytes) as bytesSum, avg(received_bytes) as average
9. ステートメントの順序
| basic_criteria with field.aggregate_func [, field.aggregate_func, ...]
| sort フィールド (asc/desc)
[sort [aggregateField, count] [asc/desc]
| timewindow 値 limit 値
| groupby フィールド sort aggregate(フィールド) (昇順/降順) limit 数 ]
| distinct フィールド
| first/last [1-10] フィールド名
| having (グループ化フィールド.フィールド / 時間ウィンドウ.カウント 演算子 / グループ化フィールド.一意フィールド.集計値 / 集計関数.フィールド) 演算子 値
- 括弧内の演算子は、任意の順序で指定できます。
- timewindow は 1 回のみ指定できます。
- Groupbyは、任意の順序で最大3回まで指定できます。
相関条件
- 算術演算子
- 相関の複数アクション
- Link ステートメント
- シーケンス文
- Def および Filter ステートメント
- SELECT文
1. 算術演算子
| 演算子 | 説明 | 例 |
|---|---|---|
| + | 加算 | timestamp + 3600000ms > 4800000 |
| - | 減算 | timestamp - 3600000ms > 2400000 |
| * | 乗算 | 比率 = (failure_event.count / access.count) |
| / | 除算 | 比率 = (failure_event.count / access.count) * 100 |
2. 相関(複数アクション)
- 条件付きで複数のアクション(e1、e2 など)を定義できます。
- 各アクションには基本条件が必要です。集計関数およびルックアップはオプションです。
- 構文:アクション名 : 基本条件 | 集計条件 | ルックアップ条件 | 相関条件
- 例:
- e1: logtype = cisco かつ common_report_name が (unix user added, firewall useradded, user account created, computer account created) のいずれか
- e2: logtype = cisco かつ common_report_name が (computer account deleted, useraccount deleted, unix user deleted, firewall user deleted) のいずれかであり、かつ hosttype = e1.hosttype かつ targetuser = e1.targetuser かつ _zl_timestamp が e1._zl_timestamp と (e1._zl_timestamp + 3600000ms) の間
3. リンク文
- link ステートメントは、あるアクションのフィールドが別のアクションのフィールドと一致するか、一致しないかを比較します。
- AND / OR / NOT を使用して、他の条件と組み合わせることができます。
- 構文:フィールド名 (演算子) アクション名.フィールド名 [ および/またはその他の比較 ]
- 例:
- 総当たりログイン
- e1: logtype = windows and event_name = failed windowslogin | groupby username | groupby devicename
- e2: logtype = windows and event_name = successfulwindowslogin and username = e1.username and devicename = e1.devicename
- シーケンス:e1 の後に 10 分以内に e2 が続く
- e1.username、e2.devicename を選択
- 異常なユーザーアカウントの変更
- e1: logtype = windows かつ common_report_name が (unixuseradded、firewall user added、user account created、computer account created) のいずれか
- e2: logtype = windows かつ common_report_name が (computeraccount deleted, user account deleted, unix user deleted, firewall userdeleted) のいずれかであり、hosttype = e1.hosttype かつ targetuser = e1.targetuser かつ time >= e1.time
- SELECT e1.hosttype, e1.targetuser
- 総当たりログイン
4. シーケンス文
- 特定の時間内に、あるアクションが別のアクションに続くか、続かないかを定義します。
- 必ず時間枠を指定する必要があります。
- 構文:sequence : action1 (followedby / notfollowedby) action2 withintime [ and action2 followedby/notfollowedby action3 ... ]
- 例:
- 権限のないファイルアクセス
- e1: logtype = windows かつ eventid = 4663 (オブジェクトへのアクセス試行)
- e2: logtype = windows かつ eventid = 4656 (ハンドラー要求)
- シーケンス: e1 の後に e2 が続かない 5分以内
- e1.username、e1.devicename を選択
- ブルートフォースログイン
- e1: logtype = windows かつ event_name = failed windowslogin | groupby username | groupby devicename
- e2: logtype = windows かつ event_name = successfulwindowslogin かつ username = e1.username かつ devicename = e1.devicename
- シーケンス:10分以内に e1 の後に e2 が続く
- e1.username、e2.devicename を選択
- Ragnar Locker ランサムウェアの検出
- e1: logtype = windows かつ processid = 4688 かつ processname = msiexec.exe
- e2: logtype = windows かつ eventid = 4654 かつ objectname に Program Files(X86) が含まれ、かつ末尾が VirtualAppliances\va.exe で終わり、かつ devicename = e1.devicename
- e3: logtype = windows かつ processid = 4688 かつ processname = e2.objectname かつ devicename = e1.devicename
- シーケンス: e1 の後に 30 分以内に e2 が続いて、さらに 2 分以内に e3 が続く
- 不審な SQL バックアップアクティビティ
- e1: ログタイプ = windows、イベントID = 4625 | デバイス名の重複を除く
- e2: logtype = windows かつ eventid = 4624 かつ devicename=e1.devicename かつ username = e1.username
- e3: logtype = mssql かつ actionid = lgis
- e4: ログタイプ = * かつ アクション = ba
- シーケンス:e1の後に10分以内にe2が続き、e3の後に5分以内にe4が続く
- 権限のないファイルアクセス
5. Def および Filter ステートメント
Def ステートメント
- def ステートメントは式を計算し、その結果の値を searchresults フィールドに格納します。
- これは、検索結果に新しいフィールドを作成するために使用され、その新しいフィールドの値は式の計算結果となります。
- def ステートメントでは、actioncount や「e1.count」、「e1.sent_bytes.sum」のようなアクションベースのフィールド集計など、総数、平均、または合計のみを取得できます。
- 構文:def: 変数名 = アクション名. (count /フィールド.集計関数) 演算子 アクション名. (count | フィールド.集計関数 /値)
filter ステートメント
- filter 演算子は、フィルタ条件に一致するレコードのみを保持します。
- def ステートメントのフィールド制約は、filter ステートメントにも適用されます。
- 構文:filter: (def_variable_name / actionname. (count /field.aggregate_function)) operator value
例: 2 つのイベントの比率
- access: logtype="windows" かつ
- failure_event: eventid=4625
- def: ratio = count(failure_event) / count(access)
- def: percent = ratio * 100
- filter: percent > 50
- Select ratio, count(failure_event), count(access)
6. SELECT文
- SELECT文は、結果に表示したいフィールドや集計値を指定するために使用されます。
- 構文: select フィールド, 集計値
- 例:
- 過度なログオン失敗
- e1: logtype = windows かつ common_report_name が (routerlogonfailed, unix logon failed, firewall logon failed, logon failed, vpnlogout, firewall logoff, failed cloud logon) のいずれか | groupby username
- SELECT e1._zl_timestamp, e1.hostname
- 異常なユーザーアカウントの変更
- e1: logtype = windows かつ common_report_name が (unixuseradded, firewall user added, user account created, computer accountcreated) のいずれか
- e2: logtype = * かつ common_report_name が (computeraccountdeleted, user account deleted, unix user deleted, firewall user deleted) のいずれかであり、かつ hosttype = e1.hosttype かつ targetuser = e1.targetuser かつ _zl_timestamp が e1._zl_timestamp かつ (e1._zl_timestamp + 3600000ms)
- Select e1._zl_timestamp, e1.log_uuid, e2._zl_timestamp, e2.log_uuid
- 過度な VPN ログオン失敗
- failed_logon: logtype = * かつ eventtype = vpn_logon_failure|distinct username かつ count > 5
- SELECT failed_logon.username, COUNT(failed_logon)
- 不審なファイルアクセス
- file_access: logtype = windows かつ eventid = 4663 | groupby username | groupby objectname かつ count > 3
- file_modified: logtype = windows かつ eventid = 4663 かつ type = modify かつ username = file_access.username かつ objectname = file_access.objectname
- シーケンス: file_access に続いて file_modified が 5 分以内に発生
- file_access.username、file_modified.objectname、count(file_access.objectname) を選択
- 過度なログオン失敗
ユースケース別の具体例
以下に、クエリ文法を適用して一般的なセキュリティシナリオを検出する方法の実用的な例を示します。各例では、クエリのロジック、サポートされている演算子、および出力フィールドを示しています。
1. ログオン成功
説明:Windows における正常なログオンイベントを検出します。
クエリ:
logtype = "Windows"
and eventid = 4624
and message contains "successful logon"
2. 過度なログイン失敗の試行
説明:ログイン失敗の試行回数が過剰なユーザー名またはデバイスを特定します。
クエリ:
logtype in ("windows", "unix")
and eventid = 4625
| groupby username
| groupby devicename having count > 10
3. ブルートフォースログインの検出
説明:短時間の間に、同じデバイス上で同じユーザーによる複数のログイン失敗の後にログインに成功するブルートフォース攻撃を検出します。
クエリ:
ステップ 1 – ログイン失敗 (e1):
e1:
logtype = "windows"
かつ event_name = "Failed Windows Login"
| groupby username
| groupby devicename
ステップ 2 – ログイン成功 (e2):
e2:
logtype = "windows"
かつ event_name = "Successful Windows Login"
かつ username = e1.username
かつ devicename = e1.devicename
シーケンスロジック:
e1 の後に 10 分以内に e2 が続く
最終出力:
e1.username、e2.devicename を選択
4. ポートスキャン攻撃
説明:短期間に複数のポートをスキャンしているデバイスまたはIPを特定します。
クエリ:
e1:
logtype in ("unix", "windows", "sysmon")
and event_name = "allowed connection"
| groupby remoteip
| groupby host
| groupby port having count > 100
SELECT e1.host, COUNT(e1.host)
5. データ流出の検知
説明:異常に多いアウトバウンドデータ転送量を検出します。
クエリ:
netlog:
logtype = "unix"
and event_name = "allowed connection"
| groupby srcip
| groupby destip having sum(sentbytes) > 100MB
select netlog.srcip, netlog.destip, sum(netlog.sentbytes)
6. 失敗したイベントと成功したイベントの比率
説明:アクセスイベント全体に占める失敗したアクセスイベントの割合を算出します。
クエリ:
ステップ 1 – アクセスイベントの総数:
access:
logtype = "*"
and type = "access"
ステップ 2 – 失敗したアクセスイベント:
failure_event:
logtype = "*"
and type = "access"
and status = "failure"
比率の定義:
def: ratio = (failure_event.count / access.count) * 100
失敗率が高いものをフィルタリング:
filter: ratio > 50
最終出力:
select ratio, access.count, failure_event.count
検出ルールの制限
検出ルールの制限事項は、ELAおよびL3Cの各相関モードにおける機能上の制約と演算子のサポート範囲を規定します。
以下の表は、スケジュール型検出ルールと継続型検出ルールにおける、サポートされる演算子、しきい値、集計、およびクエリ構文の違いを詳細に示しています。
| 機能 | 説明 | EventLog Analyzer のスケジュールされた相関 | EventLog Analyzer の継続的相関 | Log360 Cloud スケジュール型相関Log360 Cloud 継続型相関 | Log360 Cloud 継続的相関分析 |
|---|---|---|---|---|---|
| 数値関係演算子 | 基本的な比較演算子(>, <, =, !=, >=, <=, in, not in, exists, notexists, between, not between) | IP 範囲はサポートされていません | すべての演算子がサポートされています | IP 範囲はサポートされていません | すべての演算子がサポートされています |
| 文字列の比較演算子 | テキストベースの比較(含む、含まない、先頭が、末尾が、一致する、一致しない) | 「一致」および「不一致」はサポートされていません | すべての演算子がサポートされています | 「一致」および「不一致」はサポートされていません | すべての演算子がサポートされています |
| 論理演算子 | 論理条件(and、or) | すべて対応 | すべて対応 | すべて対応 | すべて対応 |
| 高度な演算子 | セキュリティチェック (isMalicious、isVulnerable、misconfiguredFor) | isMaliciousのみがサポートされています | すべて対応 | いずれもサポートされていません | isMaliciousのみがサポートされています |
| ステートメントへのリンク | 条件ビルダー内のアクションへのリンク | 複数およびネストされた条件に対応 | 複数条件に対応;ネストされた条件には対応していません | 複数の条件およびネストされた条件に対応 | 最大3つの条件に対応;ネストは非対応 |
| しきい値の制限 | しきい値の件数制限 | 制限なし | 上限 999 | 制限なし | デフォルトの上限:10(増やすことができます) |
| IN演算子の値の上限 | IN 演算子内の項の最大数 | 25 | 25 | 25 | 25 |
| 集計関数 | 集計関数(sum、avg、max、min、stdev、percentile、count、distinct) | すべて対応 | count と distinct のみ対応 | すべて対応 | count と distinct のみがサポートされています |
| WITH演算子 | 基本条件における集計関数の使用 | 最大10項まで | 未対応 | 最大10項 | サポートされていません |
| ソート演算子 | フィールドによる結果の並べ替え | 対応済み(最大5フィールド) | 未対応 | 対応済み(最大5フィールド) | 未対応 |
| 時間ウィンドウ演算子 | 時間ベースのしきい値を設定します | 最大7日間、最大200件 | 制限なし(時間ウィンドウは未対応) | 最大1日、最大200件 | デフォルトは1時間(延長可能);タイムウィンドウは未対応 |
| GroupBy 演算子 | 条件でのフィールドのグループ化 | 最大3フィールド | 制限なし | 最大3フィールド(制限あり) | 最大3つのフィールド |
| Distinct演算子 | しきい値/クエリ内の Distinct カウント | 一意なフィールドは1つだけ(ソート・制限なし) | 一意なフィールドは1つだけ(ソート・LIMITなし) | DISTINCTフィールドは1つだけ(ソート・LIMITなし) | 一意なフィールドは1つだけ(ソート・LIMITなし) |
| 最大 GroupBy + Distinct | 併用時の制限 | 最大3つのGROUP BY + 1つのDISTINCT | 複数のGROUP BY + 1つのDISTINCT | (最大2つのGROUP BY + 1つのDISTINCT)または(最大3つのGROUP BY + 0つのDISTINCT)のいずれか | 最大 3 つの GROUP BY + 1 つの DISTINCT |
| 先頭/末尾演算子フィールド | 最初のレコードまたは最後のレコードを返す | 最大10フィールド | 未対応 | 最大10フィールド | 未対応 |
| 算術演算子 | クエリ内での算術演算 | サポートされています | 未対応 | サポートされています | サポートされていません |
| アクションの最大制限 | 許可されるアクション数 | 最大10 | 最大10 | 最大3 | 最大3 |
| シーケンス文 | 順序付きイベントチェック(続く/続かない) | 最大7日間 | 最大30日 | 最大1日 | 最大1時間 |
| Defステートメント | 新しい計算フィールドを作成する | 最大10 | 未対応 | 最大10 | サポートされていません |
| フィルタ式 | 条件に一致するレコードを保持する | 最大 10 | サポートされていません | 最大10件 | 未対応 |
| SELECT文 | フィールドの選択(エイリアスはスケジュールされたルールでのみ使用可能) | 最大 20 | 最大 20 | 最大 20 | 最大 20 |
| クエリの長さ | 1クエリあたりの最大文字数 | 10000 | 10000 | 10000 | 10000 |
| 高度なルールにおける異常時のアクション | 異常値をしきい値/グループ化/ディスティンクト/リンク条件と組み合わせることはできません | – | – | – | – |
こちらもご覧ください
このドキュメントでは、演算子や関数を使用した条件の定義から、相関ロジックの適用、実用的な検知ユースケースの構築に至るまで、クエリ文法が高度なルールの作成をどのようにサポートしているかを説明しました。