本記事では、「Splunkでセキュリティダッシュボードを作成しよう!」シリーズにおける第5回として、Splunkのサーチ言語であるSPL(Search Processing Language)の書き方について説明します。
第1回:全体概要(ゴールと内容の説明)
第2回:データの取り込み(その1)
第3回:データの取り込み(その2)
第4回:フィールド抽出と正規化
第5回:SPLの書き方(その1) ←今ここ
第6回:SPLの書き方(その2)
第7回:SPLの書き方(その3)
第8回:Dashboard Studioでダッシュボードを作成(その1)
第9回:Dashboard Studioでダッシュボードを作成(その2)
第10回:Dashboard Studioでダッシュボードを作成(その3)
1. 伝えたいこと
今回のブログでは、SPLの主要なコマンド10個を説明します。これらのコマンドはシリーズ後半で説明するdashboard作成で使用します。非常に多用されるコマンドのため、これらを覚えることで基本的なデータ分析や表示が可能です。個人的な意見ですが、SPLは人が使う言語に近く、わかりやすいため、すぐに扱えるようになると思っています。このブログを通じてSPLマスターになりましょう!
説明するSPL
テーブル表示(table)、表示するフィールドの整形(fields)、並び替え(sort)、変換(eval)、統計(timechart, stats)、フィールド抽出(rex)、付与(lookup)、地図表示(iplocation&geostats)
2. SPLの書き方(文法)を知る
SPLの概要
- SPLの構文はもともとUnixパイプラインとSQLに基づいており、時系列データに最適化されています。
- SPLを扱うことで、データの検索、フィルタリング、修正、操作、情報の付与、挿入、削除を行えます。
SPLの基本構造

- 検索した結果に対して、パイプライン「|」でつないでデータ加工を行います。
- 上の画像例では下記の処理を行っています。
- 検索
- sourcetype=WinEventLogを検索
- 統計処理
- topコマンドを使ってイベント数が多いhost順に並び替え
- 整形処理
- fieldsコマンドを使って不要な列を非表示にする
- 検索では下記のようなデータの検索、フィルタリングが可能です
- キーワード検索(e.g. error)
- フィールド検索(e.g. status=503)
- 論理演算子(e.g. count>0、user!=splunk、action=success OR failure)
詳細については下記のオープンワークショップや参考情報をご確認ください。
- オープンワークショップ
Splunk Japanでは定期的に無償のオープンワークショップを実施しています。その中で、Entry workshop、またはBasic workshopを受講することでSPLの基本について学ぶことが可能です。詳細はこちらのブログをご確認ください。
- 参考情報
統計処理と整形処理については次のセクションで詳しく説明します。
3. SPLのコマンドを知る
まずはじめに、データの整形処理をするコマンドを4つ説明します。
1. table
- 説明
- イベントに含まれているフィールド情報を表形式で表示します
- 構文
- | table field1 field2 … fieldX
- 使用例
- イベントの生ログではなく、表形式で一覧表示してデータを確認したいとき
例)RSSで取得した情報を下記のような表形式で表示する

上記パネルの表示に使用しているSPLと結果は次のとおりです。

サーチ内容の紹介
index=main source="syndication://IPA" ← 対象データの検索
|eval time = strftime(_time, "%Y/%m/%d") ← 日時を年/月/日の表記に整形 (後ほど紹介)
|table time title ← 表形式化
|sort - time ← 日付で並び替え (後ほど紹介)
tableコマンドの検索前と検索後の結果比較
- Tips!
- tableコマンドはSearch Headで実行されるため、使う際はできるだけSPL文の最後の方で使用しましょう(サーチの効率化のため)。
- 参考リンク
2. fields
- 説明
- 表示するフィールド、非表示にするフィールドを整形します
- 構文
- | fields [+|-] field1 field2 … fieldX
- field1を非表示にしたいときは、| fields - field1
- field1とfield3を表示したいときは、| fields field1 field3 (+は省略可)
- 使用例
- 可視化や後段の処理で不要なフィールドを非表示にする
例)sumfieldフィールドを非表示にしている例
fieldsコマンドの検索前と検索後の結果比較

- Tips!
- fieldsコマンドはtableコマンドに似ていますが、大きく異なる点が2つあります。
- 1. fieldsコマンドは統計処理されたフィールドの表示、非表示をするコマンドです。fieldsコマンド単体でイベントデータを表形式で表示することはしません。
- 2. 処理の方法が違います。fieldsコマンドはIndexerで処理されるため、SPL文の序盤、中盤で表の形式を変えたい場合、tableコマンドではなくfieldsコマンドを使用しましょう。
- 参考リンク
3. sort
- 説明
- 構文
- | sort [<表示数>] [+|-] field1 (field2)
- [<表示数>]は10件だけ表示させるなどlimitで使える
- | sort 10 field1
- field1の値を昇順で並び替え最初の10件を表示
- [<表示数>]はoptionです。
- [+|-] は+が昇順、-が降順で並び替えます
- | sort 10 - field1
- field1の値を降順(大きいものから順番に)で並び替え最初の10件を表示
- 複数フィールドを指定することも可能です。その場合、左に書かれたフィールドを高い優先順位として並び替えます
- 使用例
- 値の高いものや小さいものから順番に並び替えるとき
例)timeフィールドを最新から順番に並び替えている例
sortコマンドの検索前と検索後の結果比較

- Tips!
- sortコマンドはnumber以外の値で並び替えをすることができます。例えば、アルファベット順、IPアドレス順などです。詳細は参考リンクをご確認ください。
- 参考リンク
4. eval
- 説明
- 検索結果に新しいフィールドを作成したり、既存のフィールドを変換、操作する
- 構文
- | eval field1 = <演算処理、代入、条件分岐>
- 新しいフィールドを作成する場合、field1は新しいフィールド名を記入します
- | eval field1 = time/60
- field1を作成し、その値にtimeフィールドを60で割った値を代入します
- 既存のフィールドを操作する場合、field1は既存のフィールド名を記入します
- | eval user = lower(user)
- evalコマンドの関数lowerを使用してuserの文字列を小文字に変換し、その値をuserフィールドに代入します
- 使用例
- 表記変換、単位変換したいとき(KB→MB→GB、小文字統一)
- 条件分岐でフィールドに値を入力したいとき
例)_timeフィールドの表記から年月日の表記に変換する
evalコマンドの検索前と検索後の結果比較

- Tips!
- evalでよく使う関数は、
- 算術関数:+, -, *, / などの基本計算。
- 文字列関数:substr, lower, upper, len, replace など。
- 条件分岐:if(condition, true_value, false_value)
- 日時関数:strftime, strptime, relative_time, now()
- 文字を挿入することも可能
- |eval percent = percent . "%"
- [.]を使うことでフィールドの値と文字列を連結することができます

次に統計処理をするコマンドを2つ説明します。
5. stats
- 説明
- 検索結果を集計・要約する
- データのグループ化や統計処理をする
- 構文
- | stats 関数(field1) [AS 新しいフィールド名] [BY グループ化するフィールド]
- 関数(field1) は集計に使用する関数、およびその対象フィールド名
- [AS 新しいフィールド名] は [関数(field1)] の計算結果の列名をつけることができる
- [AS 新しいフィールド名] はoptionです。
- [BY グループ化するフィールド]
- [BY グループ化するフィールド] はoptionです。指定しない場合、全てのイベントを対象とした統計処理が実行されます。
- 複数のフィールドの組み合わせをグループとして指定できます。(e.g.| stats count by user action)
- 使用例
- 合計、平均などをuserやアクセス元ごとに集計したい
例) juniper idpのログからblockされた通信の送信元ごとに集計

上記パネルで使用している stats コマンドの、検索前後の結果を比較します。

6. timechart
- 説明
- 時系列データの集計や可視化をする
- statsとほぼ同じ関数を扱え、統計処理ができる。違いは、時間単位で集計する点(x軸が時間になる)
- 構文
- | timechart [span=<時間間隔>] 関数(field1) [AS 新しいフィールド名] [BY グループ化するフィールド]
- [span=<時間間隔>] は集計する時間間隔を指定します
- (e.g.) span=1s (秒:s、分:m、時間:h)
- 指定しない場合、検索時間範囲に応じて自動指定されます
- 関数(field1) は集計に使用する関数、およびその対象フィールド名
- [AS 新しいフィールド名] は [関数(field1)] の計算結果の列名をつけることができる
- [AS 新しいフィールド名] はoptionです。
- [BY グループ化するフィールド]
- 時間を集計するため、グループ化するフィールドの指定は必須ではありません。optionです。
使用例- 時系列ごとに、発生したアラートの数を集計したい
例) juniper idpのログからblockされた通信を送信元ごとに時系列で集計

上記パネルで使用しているtimechartコマンドの、検索前後の結果を比較します。

- Tips!
- データを指定した範囲や間隔でグループ化するためにbinコマンドがあります。binコマンドとstatsコマンドを組み合わせることでtimechartコマンドと似た集計が可能です。
- 例) index=main | bin _time span=1h | stats count by _time
- binコマンドで_timeを1時間ごとにグループ化
- 参考リンク
以上、今回はデータ整形、統計処理をする6つのコマンドを説明しました。残りのコマンドについては、次回のブログにて、引き続き説明します。