Splunkとは
Splunkとは、システムを構成する機器が出力するログを収集、分析、可視化するためのログ管理ソリューションです。
様々な機器のログを一元管理し、相関分析により、セキュリティインシデントの可能性を調査することができます。

Splunkの構成要素
Splunkは、Forwarder、Indexer、Search Headという3つの主要コンポーネントで構成されています。
Forwarder
Forwarderは監視対象にインストールされるエージェントで、データを収集します。
Indexer
IndexerはForwarderから受信したデータを処理して保存することで、データ分析をしやすくします。
Indexerによって保存されたデータは、Search Headで検索できます。
Search Head
Search Headは検索やアプリ内で、ユーザーがログを検索できる機能です。

データの取り込み
Splunkは様々なデータを取り込むことができます。
Splunkに追加されたデータは処理され、個々のイベントに変換されます。

https://docs.splunk.com/Documentation/Splunk/8.2.6/SearchTutorial/AboutgettingdataintoSplunk?ref=hk
以下はローカルからファイルをアップロードする手順です。
左下の「アップロード コンピュータのファイルから」を選択します。

データをアップロードするには、以下の手順で進めます。
アップロードの流れ
- ソースの選択:ログファイルとデータソースを選択します。
- ソースタイプの選択:取り込まれるログの種類を選択します。例:JSON、syslog。
- 入力設定:ログが書き込まれるインデックスと、ログに関連付けるホスト名を選択する。
- 確認:設定内容を確認する。
- 完了
検索方法
SplunkではSPL(Search Processing Language)を使ってデータを検索します。
SPLの基本的な構文は極めてシンプルで、以下のような規則があります。
- コマンドは先頭から順番に処理される
- コマンド同士は、パイプ(|)で繋ぐことができる
SPLの例
source="VPN-logs-1663593355154.json" host="ip-10-10-40-195" sourcetype="_json" Source_Country!=France
また、関連するフィールドから知りたいキーワードでたどることもできます。

SPLの処理について
SPLの処理の流れについて以下のクエリを基に整理します。
index=windowslogs alice
上記のクエリは以下のようにSplunkで処理されます。
- index=windowslogs:検索対象をインデックス=windowslogsでフィルタ
- alice:キーワード検索でイベントの任意のフィールドに「alice」が含まれているものを抽出
※デフォルトでは大文字小文字の区別はされません。
特定フィールドに絞る場合は、以下のようにフィールド名を指定します。
index=windowslogs user=alice
関係演算子
SPLで使用する演算子について以下に記載します。
| オペレーター | 例 | 説明 |
| 等しい:= | UserName=Mark | フィールド名が「UserName」で「Mark」を含むイベントを検索 |
| 等しくない:!= | UserName!=Mark | フィールド名が「UserName」で「Mark」を含まないイベントを検索 |
| 未満:< |
Age<10 <=:以下 |
フィールドのAgeの値が10未満のものを検索。 =をつけると以下 |
| より大きい:> | Age>10 >=:以上 |
フィールドAgeの値が10より大きいものを検索。 =をつけると以上 |
クエリは「|」でつなぐことができます。以下はフィルタした結果を集計し、上位一位を出力するクエリの例です。
index=windowslogs Hostname="Salena.Adam" DestinationIp="172.18.38.5" | stats count by SourceIp | tail 1
statsとeventstats
statsとeventstatsはどちらもイベントを集計するコマンドですが、statsは集計結果のみを返すのに対して、eventstatsは集計結果を元のイベントに新しいフィールドを定義して追加します。
eventstatsのコマンド例
| eventstats [統計処理] by [集計単位のフィールド名]
以下はユーザーごとのアクセス元情報を集計し、ログイン頻度の少ない国からのアクセスを抽出するクエリ例です。
index=vpnlogs
| eventstats count as logins_by_user by user
| eventstats count as logins_by_user_country by user src_country
| eval country_freq=logins_by_user_country/logins_by_user
| where country_freq < 0.1
| table _time user src_ip src_country country_freq
各コマンドの意味は以下の通りです。
- ユーザーの総ログイン回数を数える
- ユーザー × 国ごとのログイン回数を数える
- 国ごとの割合を計算する
- 10%未満のログインだけを抽出する
フィールドサイドバーについて
フィールドサイドバーは、Splunk検索の左側にあります。

フィールドについている記号について、「#」は数値を含むフィールドを表し、「α」は、文字列(テキスト値)を含むフィールドを表します。
用語など
| 用語 | 意味 |
| sourcetype | 取り込んだデータがどんなものなのかを定義する項目。 |
| index | 収集したログデータを格納しているもの。ログの出力ファイル毎に分割することが多い。 |
| event | 取り込んだデータ。event数はログ件数。 |