じゅのぶろ

社内SEが自宅でSOC/CSIRTするために色々頑張っていきたいブログ 画像が見れない場合はjavascriptを有効にするかデスクトップからご覧下さい。

Splunkでマルチバリューのフィールドを扱う makemv他

マルチバリューを扱うコマンド4種類をご紹介します。

  • マルチバリューコマンド
    1. makemv
    2. mvcombine
    3. mvexpand
    4. nomv

この記事では解説しませんが、eval/stats/chart内で使える関数はこちらです。

以下の記事でも紹介しています。
jnox.hatenablog.com

makemv

mv(multi value)を作る(make)コマンドです。
Syntaxはこちら

makemv [delim=<string> | tokenizer=<string>] [allowempty=<bool>] [setsv=<bool>] <field>

option

delim

区切り文字(デリミタ)を指定し、その値ごとに値を分割します。
tokenizerと併用できません。

delimにスペースを指定し、ユーザエージェントをマルチバリューにした例

tokenizer

正規表現を指定し、キャプチャグループにマッチした値ごとに分割します。
delimと併用できません。

tokenizerに空白以外(\S+)を指定し、ユーザエージェントをマルチバリューにした例

tokenizerに(\S+)\s\S+を指定し、ユーザエージェントをマルチバリューにした例
最初のキャプチャグループ(\S+)にマッチした値がマルチバリューに変換されます。

| eval original_user_agent=user_agent
| makemv user_agent tokenizer="(\S+)\s\S+"
| table  user_agent original_user_agent

allowempty

空の値(empty)を許可するか指定します。
デフォルトは許可しない(false)です。

簡単に説明するためユーザエージェントフィールドを「a,,b」に変更しています。

ユーザエージェントをマルチバリューにした例(allowemptyがfalseの場合)

ユーザエージェントをマルチバリューにした例(allowemptyがtrueの場合)

makemvコマンドの実行結果が入るuser_agentフィールドは目視では同じ値が入っていますが、 mvindexコマンドをつかうと両者の違いがわかります。

| rex mode=sed field=user_agent "s/.*/a,,b/g"
| eval original_user_agent=user_agent
| makemv user_agent delim="," allowempty=true
| eval val_0=mvindex(user_agent,0)
| eval val_1=mvindex(user_agent,1)
| eval val_2=mvindex(user_agent,2)
| table val* user_agent original_user_agent

setsv

逆に、マルチバリューからシングルバリューへ変換するようにするオプションです。
デフォルトはシングルバリューからマルチバリュー(false)です。

tokenizerに(\S+)\s\S+を指定し、ユーザエージェントをマルチバリューにした後、 シングルバリューに戻す例

delimを指定していないのでスペース区切りでシングルバリューに結合されます。

| eval original_user_agent=user_agent
| makemv user_agent tokenizer="(\S+)\s\S+"
| table user_agent original_user_agent
| makemv user_agent setsv=true

mvcombine

mv(multi value)を結合する(combine)コマンドです。
setsv=trueのときのmakemvコマンドと同じ結果を返すようです。
Syntaxはこちら

mvcombine [delim=<string>] <field>

setsv=trueのときのmakemvコマンドと同じ結果になっていることがわかります。

| eval original_user_agent=user_agent
| makemv user_agent tokenizer="(\S+)\s\S+"
| table user_agent original_user_agent
| mvcombine user_agent

mvexpand

mv(multi value)を展開する(expand)コマンドです。
limitオプションで結果数を制限できます。
Syntaxはこちら

mvexpand <field> [limit=<int>]

例えばstats values,distinct_count関数を使用し、3台以上の端末からアクセスがあるドメインを調べる場合、 以下の SPLを実行します。

このとき、values関数はマルチバリューを返すので、mxexpandを使用して以下のようにシングルバリューに変換できます。

| stats values(src_ip) distinct_count(src_ip) by domain
| search "distinct_count(src_ip)" >= 3
| mvexpand "values(src_ip)"

nomv

mv(multi value)フィールドをシングルバリューに変換するコマンドです。
Syntaxはこちら

nomv <field>

mvexpandと異なり、結果が1つのイベントにまとめられました。
そのため、makemvで再度展開することが可能です。

index=squid method=connect
| stats values(src_ip) distinct_count(src_ip) by domain
| search "distinct_count(src_ip)" >= 3
| nomv "values(src_ip)"
| makemv "values(src_ip)"

おしまい