NXQL language definition (classic)

NXQLのチュートリアルがNXQLの初歩を案内する一方で、この文書はNXQLの問い合わせ能力のより正式な定義を提供します。

単純なオブジェクトの選択

オブジェクトテーブルからオブジェクトを選択するには、以下の形式のselect文を使用します:

(select ([field]...)
    (from [object]      
        (where [object] [filter])...))

例:

(select (device_uid name)
    (from device))

単純なイベントの選択

イベントテーブルからイベントを選択するには、以下の形式のselect文を使用します:

(select ([field]...)
    (from [event]       
        (where [event] [filter]...)... 
        (between datetime datetime))
    (order_by start_time [asc|desc]) // オプション
    (limit number))

例:

(select (start_time incoming_traffic outgoing_traffic)
    (from connection
        (where connection (ne status (enum established))   
                          (ne status (enum closed)))
        (where user (eq name (string "siesme@AONNETWORK"))) 
        (between now-7d now))
    (order_by start_time asc)
    (limit 100))

このクエリは、ステータスが確立済みまたは閉じ済みではない直近100件の接続の開始時間と、受け入れトラフィックおよび送出トラフィックを返します。 つまり、ステータスが拒否済みホストなしまたはサービスなしに等しい接続です。

装飾付きのイベントの選択

指定されたイベントテーブルからイベントとそれにリンクされたオブジェクトを選択するには、以下のselect文の形式を使用します。 オブジェクトテーブルがイベントに真にリンクされている限り、指定できるオブジェクトテーブルの数に制限はありません。

(select (([object|event] [field]...)...)
    (from ([event] [object]...)     
        (where [object|event] [filter]...)... 
        (between datetime datetime))
    (order_by start_time [asc|desc]) // オプション
    (limit number))

例:

(select ((connection (start_time)) (user (name)))
    (from (connection user)
        (where connection (ne status (enum established))   
                          (ne status (enum closed)))
        (between now-7d now))
    (order_by start_time desc)
    (limit 100))

このクエリは、ステータスが確立済みまたは閉じ済みではない直近100件の接続を開始したユーザーの開始時間と名前を返します。

もう一つの例:

(select ((user (name)) (device (name)))
    (from (connection user device)
        (where connection (ne status (enum established))   
                          (ne status (enum closed)))
        (between now-7d now))
    (order_by start_time desc)
    (limit 100))

この最後のクエリは、接続の開始時間を返さない点を除けば前のクエリと同じです。 これらのクエリの結果として、同じユーザー名とデバイス名が複数回結果に表示されることがあります。 これらのタプルは実際には異なる接続に属しており、選択されたフィールドによって違いが見えない場合があります。

アクティビティ付きのオブジェクトの選択

アクティビティ(イベント)にリンクされたオブジェクトを選択するには、以下のselect文を使用します。 以前のクエリファミリーとの違いは、前者はイベントごとに1つの結果タプルを取得し、後者はオブジェクトごとに1つの結果タプルを取得するということです。

(select ([field]...)
    (from [object] 
        (with [event]   
            (where [object|event] [filter]...)...
            (compute [aggregate]...)      // オプション 
            (between datetime datetime))
        (having [filter on aggregate]...) // オプション 
    (order_by [field] [asc|desc])         // オプション
    (limit number))                       // オプション

例:

(select (name)
    (from device 
        (with execution
            (where binary (eq threat_level (enum high))) 
            (where binary (eq threat_level (enum intermediate)))
            (compute number_of_binaries)
            (between midnight-1d midnight)))
   (limit 100)
   (order_by name desc))

このクエリは、昨日、脅威レベルが中間またはのバイナリを実行したデバイスを返します。 また、各デバイスについて、条件に一致するバイナリの異なる数を計算します。

2つのオブジェクトの選択

指定されたタイプのイベントにリンクされたユニークなオブジェクトのペアを選択するには、以下のselect文を使用します。 2つのオブジェクトテーブル以上を選択することはできず、論理演算子を使用することはできません。

(select (([object] [field]...)...)
    (from ([object] [object])       
        (with [event]   
            (where [object|event] [filter]...)...
            (between datetime datetime))
    (limit number))

例:

(select ((package name) (device name))
    (from (package device)
        (with package
            (where package (eq name (pattern "*Office*")))))
    (limit 100))

このクエリは、パッケージ名にOfficeという用語が含まれるデバイスとパッケージのユニークなペアを返します。

オブジェクトの更新

update文は、オブジェクトテーブルのカテゴリまたはカスタムフィールドを修正します:

(update (set [field] ([type] [value]))...
    (from [object]
            (where [object] [filter]...)...))

カテゴリまたはカスタムフィールドの値をリセットするには、以下のupdate文を使用します:

(update (set [field] nil)...
    (from [object]
            (where [object] [filter]...)...))

例:

(update (set #Location (enum Paris))
    (from device
        (where device (eq name (pattern "PA*")))))

このクエリは、名前がPAで始まるすべてのデバイスのLocationカテゴリをParisに更新します。

(update (set #Location nil)
    (from device
        (where device (eq name (pattern "PA*")))))

このクエリは、Locationカテゴリを_nil_にリセットします。 デバイスのLocationに対する自動タグ付けルールが適用されている場合、システムは一致する自動タグ付けルールのキーワードに値をリセットします。

フィルター

フィルターはフィールド値に対する条件です。 以下の形式を持ちます:

([comparer] [field] ([type] [value]))
([comparer] [field] nil)

ここで[comparer]は、以下のいずれかの値を取ることができます:

  • eq: 同値。 フィールドの型が[type]の配列である場合、eqは少なくとも配列の1要素が値と等しいとき真となります。

  • ne: 不同値。 フィールドの型が[type]の配列である場合、neは配列の要素のどれも値と等しくないとき真となります。

  • lt: より小さい。

  • le: 以下。

  • gt: より大きい。

  • ge: 以上。

ここで[type]は次のいずれかの値を取ることができます:

  • boolean: 真または偽の値。 ブールリテラルとして、キーワード truefalseyesno 、または 10 を使用します。

  • string: 文字列。スペースやダブルクオートを含む文字列はダブルクオートで囲む必要があります。例えば、"Softy ""Visual"""

  • integer: 整数値。例えば、10

  • real: 浮動小数点数。例えば、12.56

  • enum: 特定の値のリスト。 文字列の場合と同様に、値にスペースやダブルクオートが含まれている場合、それはダブルクオートで囲まれる必要があります。

  • second: 秒を表す自然数。例えば、60秒

  • millisecond: ミリ秒を表す自然数。例えば、60000ミリ秒

  • microsecond: マイクロ秒を表す自然数。例えば、60000000マイクロ秒

  • byte: バイトを表す自然数。例えば、1048576バイト

  • ip_address: IPアドレス。例えば、172.16.10.5

  • ip_network: IPネットワーク。例えば、172.16.0.0/16

  • mac_address: MACアドレス。例えば、48:5b:39:18:70:bb

  • mhz: メガヘルツを表す自然数。例えば、1600 mhz

  • sid: Windowsセキュリティトークン。例えば、S-1-5-21-3623811015-3361044348-30300820-1013

  • md5: 16進形式のMD5ハッシュコード。例えば、d41d8cd98f00b204e9800998ecf8427e

  • port: ポートタイプ(udp/tcp)とポート番号。例えば、tcp/8080

  • version: ピリオドで区切られた4つの整数。例えば、5.1.0.34

  • datetime: ISO 8601形式の日付と時刻。例えば、2014-06-12T13:54:51

  • time: ISO 8601形式の時刻。例えば、13:54:51

  • date: ISO 8601形式の日付。例えば、2014-06-12

  • day: 日を表す自然数。例えば、7日

  • percent: 2桁の小数点で表される1の分数。例えば、0.75や、フォーマットされた出力として表示される場合は75%

  • permill: 3桁の小数点で表される1の分数。例えば、0.752や、フォーマットされた出力として表示される場合は75.2%

特別なタイプpatternを使用して、文字列をスター・パターン式に一致させます。 タイプpatternに使用できる演算子は、eqneのみです。例えば:

(eq name (pattern "NY*"))

同じwhere節に属するフィルターは、論理ANDで構成されます。 たとえば、以下のwhere節は、名前がNYで始まり、メーカーがDellであるデバイスのみを選択します:

(where device (eq name (pattern "NY*"))
(eq device_manufacturer (string "Dell"))

between句の日付と時刻は、ISO 8601形式の日付時刻または次のキーワードのいずれかで構成されます:

  • now: クエリ時刻。

  • midnight: 前の午前0時。

  • sunday: 前の日曜日の00:00:00。

  • monday: 前の月曜日の00:00:00。

  • tuesday: 前の火曜日の00:00:00。

  • wednesday: 前の水曜日の00:00:00。

  • thursday: 前の木曜日の00:00:00。

  • friday: 前の金曜日の00:00:00。

  • saturday: 前の土曜日の00:00:00。

オプションで正または負の整数と以下の単位のいずれかで続きます:

  • w: 週。たとえば、7日。

  • d: 日。たとえば、24時間。

  • h: 1時間。

  • m: 1分。

  • s: 1秒。

例:

  • (between midnight now): 今日。

  • (between midnight-1d midnight): 昨日。

  • (between monday monday+24h): 前の月曜日。

  • (between 2014-7-16@14:00:00 2014-7-16@15:00:00): 2014年7月16日の14時から15時の間。

Last updated