Splunk SPL でmakemvマクロを使いフィールドのデータをマルチバリューにするまた、マルチバリューデータとは何かについても解説

makemv を利用して特定の区切り文字(デリミタ)が入ったフィールドのデータをマルチバリューに変換し、SPLで扱いやすくします。

なお、マルチバリュー(Multi-value)とは、1つのフィールドの中に「複数の値」が入っている状態のことです。

たとえば、ip のフィールドの中のデータが [192.168.1.1, 10.0.0.5, 172.16.1.10]となっている場合、ipはマルチバリューだということができます。

makemvを使ったSPLの書き方

以下のSPLは makemvマクロを使い、”.”の区切り文字の入ったsiteフィールドのデータをマルチデータとして扱えるようにしています。

source="stream:Splunk_HTTPURI"
| eval org_site=site
| makemv site delim="."
| table org_site site

上記SPLを実際に実行するとこうなります。

Splunk での makemvマクロ実行結果

参考サイト:

・Splunkでマルチバリューフィールドを扱う (eval関数編)(じゅのぶろ)
https://jnox.hatenablog.com/entry/splunk/eval-multi-value

Splunk SPL でtimechartマクロを使ってタイムチャートを作成する

bucket もしくは bin を利用して _tme を指定した時間の幅に分割した後、timechart マクロを使用すれば、タイムチャートを表示させることができます。

SPLの書き方

下記のSPLは、ログデータを1日毎に分割し、それぞれの時間内での dstip(通信先)毎の出現回数をカウントし表示させるSPLの例です。

sourcetype="fgt_traffic"
| bucket span=1d _time
| timechart count by dstip

実際に実行するとこうなります。

Splunk timechart

参考サイト:

・コアラでもわかるSplunkシリーズ 時間毎集計する(Qiita)
https://qiita.com/toshikawa/items/8fa44753bc8f2a4c9cb0

Splunk SPL で出現数の少ない順番にTop10を表示させる(tailマクロ)

tail マクロを利用すれば、特定の項目の出現回数を少ない順番に表示させることができます。

SPLの書き方

下記のSPLは、dest_ip(通信先)毎に出現回数をカウントし出現数の少ないTop10を表示させるSPLの例です。

sourcetype="fgt_traffic"
| stats count by dest_ip
| sort - count
| tail 10

実際に実行するとこうなります。

Splunkでのtailマクロ実行例

ちなみに多い順にTop10を表示させたい場合は、headを利用します。

https://k2-ornata.com/splunk-spl_stats_count/

Splunk SPL で特定の項目の出現回数でカウントし、さらにそのカウント数毎にカウントする

これをやるには最初のカウントの際に “as” を利用して別名をつけてあげるとうまくいきます。

SPLの書き方

下記のSPLは、SPLの例です。

sourcetype="fgt_traffic"
| stats count as dest_count by dest_ip
| stats count by dest_count
| sort - count
| head 10

実際に実行するとこうなります。

Splunkでの実行例

Splunk SPL で時間(_time)を指定した範囲でグループ化する(bucket, binマクロ)

bucket もしくは bin を利用して _tme を指定した時間の幅に分割した後、stats マクロを使用しすれば、その時間の幅毎に特定の項目の出現回数を表示させることができます。

SPLの書き方

下記のSPLは、ログデータを1時間毎に分割し、それぞれの時間内での dstip(通信先)毎の出現回数をカウントし表示させるSPLの例です。

sourcetype="fgt_traffic"
| bucket span=1h _time
| stats count by _time dstip

実際に実行するとこうなります。

Splunkでの bucketマクロ実行例(その1)

さらに、1時間で1,000回以上のアクセスがあったdstipを抽出するには以下の通り記載します。

sourcetype="fgt_traffic"
| bucket span=1d _time
| stats count by _time dstip
| where count > 1000
| table _time dstip count

こちらも実際に実行すると以下の通りとなります。

Splunkでの bucketマクロ実行例(その2)

参考サイト:

・コアラでもわかるSplunkシリーズ 時間毎集計する(Qiita)
https://qiita.com/toshikawa/items/8fa44753bc8f2a4c9cb0

Splunk SPL で特定の項目の出現回数をカウントする(statsマクロで count)

stats マクロで count を利用すれば、特定の項目の出現回数を表示させることができます。

SPLの書き方

下記のSPLは、dest_ip(通信先)毎に出現回数をカウントし表示させるSPLの例です。
なお、それぞれのdest_ipの出現回数をカウントした後、カウントが多い順に10件表示しています。

sourcetype="fgt_traffic"
| stats count by dest_ip
| sort - count
| head 10

実際に実行するとこうなります。

Splunkでの検索結果1

グラフ表示

上記検索を行った後、「視覚エフェクト」を選択すると、結果をグラフ表示することも可能です。

Splunkでの検索結果2

参考サイト:

・Splunk: Splunk入門(SPL編 3/6) – よく使用する統計関数11選
https://qiita.com/frozencatpisces/items/360b4a38212fe1876dbc

Splunk SPL で特定の項目の平均値と中間値を求める(statsマクロで max と median)

stats マクロで avg と median を利用すれば、特定の項目の平均値と中間値を表示させることができます。

SPLの書き方

下記のSPLは、dest_ip(通信先)毎に最大値(max)、最小値(min)、平均値(avg)、中間値(median)を表示させるSPLの例です。
なお、それぞのれ値を求めた後、最大値(max)が多い順番に並べ替え、最大値(max)が多い順に10件表示しています。

sourcetype="fgt_traffic"
| stats max(bytes_in), min(bytes_in) avg(bytes_in), median(bytes_in) by dest_ip
| sort - max(bytes_in)
| head 10

実際に実行するとこうなります。

Splunkでの検索結果

グラフ表示

上記検索を行った後、「視覚エフェクト」を選択すると、結果をグラフ表示することも可能です。

Splunkでの検索結果

参考サイト:

・Splunk: Splunk入門(SPL編 3/6) – よく使用する統計関数11選
https://qiita.com/frozencatpisces/items/360b4a38212fe1876dbc

Splunk SPL で特定のフィールドの出現回数をカウントし、多い順に表示させる方法

stats マクロで特定のフィールドの値の出現回数をカウントし、それを sortマクロで多い順に並べ替えることで実現できます。

index="(インデックス名)" sourcetype="(ソースタイプ名)" (フィールド名)=(カウントしたい値)
| stats count by (カウントしたいフィールド名)
| sort - count

(カウントしたいフィールド名)に src_ip や hostname など、カウントしたいフィールド名を入れます。

なお、1行目は index 以外は任意(必須ではない)です。

また、”|”は半角になっている必要があるので注意。(全角にすると”|”が緑色になります。)

長年、Splunk SPLの先頭にパイプ(|)をつける場合とつけない場合があることが疑問でしたがようやく判明した件

Splunk の SPL を中途半端に学んでいたため、表題の通り、なぜSPLの先頭にパイプをつける場合とつけない場合があることが疑問でしたが、以下の2つの記事を見てようやくスッキリしました。
(「こおりねこ」さん、ありがとうございます!)

Splunk: Splunk入門(SPL編 1/6) - SPL文の基本(Qiita)
https://qiita.com/frozencatpisces/items/a395d8721977d14bd6a2

まず上記の記事には以下の通り記載があります。

早速、シンプルな SPL 文を実行してみましょう。

search index=”_internal”

「 search 」は SPL のコマンドの1つであり、条件を引数に指定してログを検索、出力するコマンドです。

普段よく目にするのは、いきなり index=”_internal” という形でかかれたSPLですが、実はその前に search コマンドがあり省略されているだけなんですね。

知りませんでした。。。

Splunk: サーチマクロって何だ?(Qiita)
https://qiita.com/frozencatpisces/items/8424d5af4204433948b1

そしてさらに上の記事を見ると、以下の記載があります。

search や inputlookup などの生成コマンド( generating commands )を定義に使用する場合は「定義の先頭にパイプ(|)を付けない」「マクロ使用箇所の直前にパイプを付ける」の2点を守る必要があります。

なるほど、search の場合は先頭にパイプを付けないという決まりがあるのですね。

Splunk Lookupファイルエディターを使ってみた

以下、さわってみた感じ。

Splunk App for Lookup File Editing(APP)
Splunk App for Lookup File Editing(開いたところ)
Splunk App for Lookup File Editing(APPプルダウン)
Splunk App for Lookup File Editing(Typeプルダウン)
Splunk App for Lookup File Editing(ファイルを開いたところ)
Splunk App for Lookup File Editing(新しいセルに追記)
Splunk App for Lookup File Editing(セーブ1)
Splunk App for Lookup File Editing(セーブ2)

mitre_techniques.csv を開き、最後の行で右クリックしてコンテキストメニューを表示したところ

Splunk App for Lookup File Editing

編集した直後

Splunk App for Lookup File Editing

inputlookupコマンドで行を追加した結果を確認したところ

Splunk サーチ文