本記事では、「Splunkでセキュリティダッシュボードを作成しよう!」シリーズにおける第6回として、Splunkのサーチ言語であるSPL(Search Processing Language)の書き方について説明します。本記事は第5回SPLの書き方(その1)の続きです。第5回をお読みになっていない場合は併せてご確認ください。
第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の書き方(文法)を知る
前回に引き続きSPL(Search Processing Language)について説明します。前回は、データの検索の仕方、およびデータ整形、統計処理のコマンドについて6つ説明しました。この回では、より複雑なケースに対処するために、次の4つのコマンドを紹介します。
フィールド抽出(rex)、付与(lookup)、地図表示(iplocation & geostats)
7. rex
- 説明
- 正規表現を使って特定のフィールドから文字列やパターンを一時的に抽出し、フィールドの値を操作する
- 検索時に一時的に抽出されるため、頻出の文字列やパターンについてはフィールド抽出設定をすることがお勧めです
- 構文
- | rex [field=<フィールド名>] "<正規表現>"
- [field=<フィールド名>] に特定のフィールドを指定できます。
- [field=<フィールド名>]はoptionです。指定しない場合、_rawフィールド(生ログ)が対象となります。
- 使用例
- 特定の文字列だけを表示したい
- 例) RSSフィードのログにおいて、summaryフィールドの冒頭の文章だけを表示させる

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

- Tips!
- 抽出した値を入力するフィールド名称は(<?field1>)のように記載する
- 正規表現の書き方はregex101のサイトでテストすることができます
- 参考リンク
8. lookup
- 説明
- 検索結果に外部データ(ルックアップテーブル)を追加するために使用される
- ログデータに補足情報を追加することで詳細なデータ分析ができる
- 構文
- | lookup <lookup_table> <検索フィールド> AS <ログフィールド> OUTPUT <追加フィールド>
- <lookup_table>
- Splunkにアップロードしたルックアップテーブルを指定する
- ルックアップファイルのアップロード方法

- ルックアップ定義の作成
- ルックアップファイルのアップロード後、ルックアップ定義を設定することをお勧めします。権限管理や高度(大文字、小文字一致など)な設定が可能です。

- <検索フィールド>
ルックアップテーブル内で一致させたいフィールド名 - <ログフィールド>
検索結果のログ内で一致させたいフィールド名 - <追加フィールド>
ルックアップテーブルからひっぱり、検索結果のログに追加したいフィールド名
例
| lookup product_table code AS product_code OUTPUT name
product_tableテーブルを呼び出して、codeのフィールドと検索ログフィールドのproduct_codeフィールドを突合させる。一致した場合、nameフィールドを追加する。 - 使用例
- ログ記載のipアドレスをキーに資産情報のルックアップから情報を付与

- Tips!
- Splunkにuploadしたルックアップテーブルを確認したい場合、inputlookupコマンドが便利です。下記検索をすると中身が確認できます。
- | inputlookup <lookup_table定義名 or csvファイル名>
- 参考リンク
9. iplocation
- 説明
- IPアドレスから国、地域、都市、緯度・経度などの地理情報をフィールドとして取得する
- SplunkにはIP地理情報データベースが含まれておりその情報からフィールド情報を取得する(特定の.mmdbファイルをアップロードすることも可能)
- 構文
- | iplocation <フィールド名>
- <フィールド名>はipアドレスのフィールドを指定する
- 使用例
- アクセス元の国分布を分析し地図上にマッピングしたい
- 例) juniper idpのログからblockされた通信の送信元を分析

上記パネルで使用しているiplocationコマンドの、検索前後の結果を比較します。
緯度経度情報を付与した後、地図上にプロットするためには、statsコマンドのようにイベントを集計する必要があります。緯度経度情報を元にイベントを集計するコマンド(geostats)は次に説明します。
- Tips!
- Splunkはデフォルトでmmdbファイルを内蔵しており、ipアドレスから緯度経度情報を出力しています。Splunkのdefaultのmmdbファイル以外をuploadして使用することも可能です。詳細はdocumentをご確認ください。
- 参考リンク
10. geostats
- 説明
- 地理情報を集約して地図上に可視化するためのコマンド
- iplocationコマンドと併せて使用することが多い。なぜなら緯度経度に基づく地理的な集計を行うため
- 構文
- | geostats [latfield=<緯度フィールド>] [longfield=<経度フィールド>] <集計関数> BY <グループ化フィールド>
- iplocationコマンドを使用して緯度経度情報を付与した場合、緯度はlat、経度はlonで出力されます。そのため、下記のように指定することになります。
- | geostats latfield=lat longfield=lon count by action
- 使用例
- アクセス元の国分布を分析し地図上にマッピングしたい
- 例) juniper idpのログからblockされた通信の送信元を分析

geostatsを実行することで様々なズームレベルでイベント数が集計されていることがわかります。この集計結果を視覚エフェクトで変換することで上記のように地図上にプロットすることができます。

- Tips!
- geostatsコマンドに似ているコマンドにgeomコマンドがあります。geomコマンドは国や州などのフィールド情報をグループとして集計し、地図上に塗りつぶすことができます。詳細はdocumentをご確認ください。
- 参考リンク
おまけ
最後に、ダッシュボードを作る際に役立つコマンドをご紹介します。
makeresults
- 説明
- 架空のイベントを作成することができる
- フィールド処理のテストなどで使用することができる
- 構文
- | makeresults
- イベントが1件生成されます
- 必要に応じてevalコマンドでフィールドを追加することが可能
- 使用例
- ダッシュボードでは検索にヒットするイベントが存在しない場合、「サーチ結果が戻されませんでした」と表示されます。見栄えの観点から、サーチ結果がない場合に別の文字を表示させることが可能です。

ここまで主要なコマンドを10個紹介してきました。次はより高度な分析や効率的な検索を行うためのコマンドを紹介します。お楽しみに!Happy splunking!