ES|QLの例
ウィンドウズイベントログの集約と強化
Esql
FROM logs-*
| WHERE event.code IS NOT NULL
| STATS event_code_count = COUNT(event.code) BY event.code,host.name
| ENRICH win_events ON event.code WITH event_description
| WHERE event_description IS NOT NULL and host.name IS NOT NULL
| RENAME event_description AS event.description
| SORT event_code_count DESC
| KEEP event_code_count,event.code,host.name,event.description
- パターン「logs-*」に一致するインデックスからログをクエリします。
- 「event.code」フィールドがnullでないイベントをフィルタリングします。
- 「event.code」と「host.name」によってイベントのカウントを集約します。
- 「EVENT_DESCRIPTION」フィールドを使用してイベントに追加情報を強化します。
- 「EVENT_DESCRIPTION」または「host.name」がnullのイベントを除外します。
- 「EVENT_DESCRIPTION」を「event.description」に名前変更します。
- 結果を「event_code_count」で降順にソートします。
- 選択したフィールドのみを保持します: 「event_code_count」、「event.code」、「host.name」、および「event.description」。
プロセスcurl.exeからのアウトバウンドトラフィックの合計
Esql
FROM logs-endpoint
| WHERE process.name == "curl.exe"
| STATS bytes = SUM(destination.bytes) BY destination.address
| EVAL kb = bytes/1024
| SORT kb DESC
| LIMIT 10
| KEEP kb,destination.address
- 「logs-endpoint」ソースからログをクエリします。
- 「process.name」フィールドが「curl.exe」であるイベントをフィルタリングします。
- 宛先アドレスに送信されたバイトの合計を計算し、キロバイト(KB)に変換します。
- 結果を「kb」(キロバイト)で降順にソートします。
- 出力を上位10件に制限します。
- 「kb」と「destination.address」フィールドのみを保持します。
DNSログを操作して登録されたドメインごとのユニークDNSクエリの高い数を見つける
Esql
FROM logs-*
| GROK dns.question.name "%{DATA}\\.%{GREEDYDATA:dns.question.registered_domain:string}"
| STATS unique_queries = COUNT_DISTINCT(dns.question.name) BY dns.question.registered_domain, process.name
| WHERE unique_queries > 10
| SORT unique_queries DESC
| RENAME unique_queries AS `Unique Queries`, dns.question.registered_domain AS `Registered Domain`, process.name AS `Process`
- 「logs-*」に一致するインデックスからログをクエリします。
- 「grok」パターンを使用して「dns.question.name」フィールドから登録されたドメインを抽出します。
- 登録されたドメインとプロセス名ごとのユニークDNSクエリのカウントを計算します。
- 「unique_queries」が10を超える結果をフィルタリングします。
- 結果を「unique_queries」で降順にソートします。
- 明確さのためにフィールド名を変更します: 「unique_queries」を「ユニーククエリ」、「dns.question.registered_domain」を「登録ドメイン」、「process.name」を「プロセス」に変更します。
アウトバウンドユーザー接続の高い数を特定する
Esql
FROM logs-*
| WHERE NOT CIDR_MATCH(destination.ip, "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16")
| STATS destcount = COUNT(destination.ip) BY user.name, host.name
| ENRICH ldap_lookup_new ON user.name
| WHERE group.name IS NOT NULL
| EVAL follow_up = CASE(destcount >= 100, "true","false")
| SORT destcount DESC
| KEEP destcount, host.name, user.name, group.name, follow_up
- 「logs-*」に一致するインデックスからログをクエリします。
- 宛先IPアドレスがプライベートIPアドレス範囲(例: 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)に該当するイベントを除外します。
- 「user.name」と「host.name」によってユニークな宛先IPのカウントを計算します。
- 「user.name」フィールドにLDAPグループ情報を強化します。
- 「group.name」がnullでない結果を除外します。
- 「CASE」文を使用して「follow_up」フィールドを作成し、「destcount」が100以上のときは「true」に、そうでないときは「false」に設定します。
- 結果を「destcount」で降順にソートします。
- 選択したフィールドを保持します: 「destcount」、「host.name」、「user.name」、「group.name」、および「follow_up」。