Splunk の CIM (Common Information Model) の使い方と CIM 対応 App について理解する

SIEM は複数ログを収集できますが、いざ分析するときにフィールド名が異なり、どのデータソースのログなのか分かりにくかったり、相関性に気づけない。などの課題が付いて回ります。Splunk では、こうした課題を解消するために CIM という機能を使って相関分析を支援してくれます。 今回は Splunk の CIM について網羅的に解説していきたいと思います。
2024.04.06

書いたこと
・CIM について
・CIM 対応 App について
・CIM にログを準拠させる方法

CIM (Common Information Model) ってなに?

CIM は SIEM の分析効率を向上させる Splunk の機能です。CIM が存在する理由 | Splunk Docs

SIEM で相関分析をするとき、複数データソースのログを対象に調査しますよね。そのときにフィールド名がデータソースごとにそれぞれ異なっていると相関分析の効率を下げることになります。

早い話、異なるデータソースのフィールド名を共通のものにできちゃうのが CIM です。

この様に CIM は、フィールドを共通の名称にして人的要因の "見間違え"や、"見落とし" の発生率を減らします。

また、CIM によって正規化されたフィールドは、可視化・レポート・アラートを作成する時にも使用できるため、データの再利用性を高める意味でも重要です。

Splunk には、ログを可視化するためのテンプレートである "App" と呼ばれるものが豊富に用意されています。これらの App では、時に CIM(Common Information Model)を使うことを前提としているものがあります。そのため、CIM に準拠した App を使用する場合には、CIM が必要になります。

では、CIM についてもう少し詳しくご紹介します。

CIM の概念

CIM は、複数ログソースのフィールドを共通化するためのものでしたが、その実態はデータモデルと呼ばれるものの集まりです。CIM を理解するためにはこのデータモデルも理解する必要があります。

データモデルとは

データモデルは、データソースに意味を付けるための ナレッジオブジェクト で、データモデル内の1つ以上のデータセット親子関係の階層的な構造になっています。

そのデータセットには、制約・継承・抽出済み・計算済みの4つの要素があります。

制約:
何のログをスコープにするかの取り決め。データセットが最初にどのログを検索するか決定する。

継承:
親となるデータセットより引き継いだ制約。

抽出済み:
正規表現によってあらかじめ抽出したフィールドや、ルックアップで検索時に追加で抽出したフィールド。

計算済み:
eval 式で計算を行ってデータを整形するフィールド。

また、データセットはツリー構造となっており、一番トップレベルのルートデータセットにはログソースのすべての情報が含まれます。

対して継承データセットには、ベースデータセットの情報が含まれます。ベースデータセットとは、継承データセットから見た親となるデータセットのことです。(2階層の継承データセットから見れば、ルートデータセットが親です。3階層から見れば、2階層の継承データセットが親データセットです。)

ルートデータセットの制約はタグというもので対象の index を絞り込み、継承データセットはクエリ(SPL) で検索対象のログのスコープを絞り込んでいます。これにより、目的とする特定のデータに絞り込んでいきます。

ルートデータセットの tag というものが、CIM とログを紐づける識別子として作用します。

タグとは

Splunk でのタグの役割は、ログ自体や、ログ内の特定のイベントを把握しやすくするための識別子と考えてください。

例えば、特定のログ全体に対してタグをつけるなら、デフォルトフィールドの sourcetype ごとにタグを付与します。
ログ内の特定のイベントに対してタグをつけるなら、severity: criticalなど、"フィールド:値" 形式のイベントにタグを付与することができます。

ですが、アレもコレもとタグを付与するのは大変ですし、タグが増えても管理が難しくなります。この問題を解消するのが、イベントタイプというものです。

イベントタイプ

イベントタイプは、イベントをグルーピングする機能のことです。先ほどタグを使ってイベントを識別できるというお話をしましたが、イベントタイプはそのタグをグループ化して管理できます。

この機能を使うと sourcetype に一括でタグを付与できたり、付与したタグをイベントタイプ名ごとに管理できるようになります。

※タグもイベントタイプも両方ともタグを付与することに変わりないですが、付与する方法や管理の方法が異なります。例えば、タグはログ内の特定のイベントに付与する分類方法で、ボトムアップ型であるのに対し、イベントタイプはログ自体にイベントタイプを付与して、タグやログを指定するものでトップダウン型になります。

CIM を活用するには、タグの付与と管理の点でイベントタイプを使ってタグの付与を行ってください。

では、CIM をインストールして中身を見てみましょう。

CIM のインストール

Splunk Cloud インスタンスに Common Infomation Model という App をインストールすることで、CIM を使うことが出来ます。

"App" > "他の App のサーチ" に移動して、検索バーに「Common Infomation Model」と入力して検索をかけます。そしたら、黄色いアイコンの CIM というものをインストールします。(もし、アカウント入力画面が出たら、Splunk のユーザ情報を入力してください。)

インストールした App の名前も確認しておきましょう。"App" > "App の管理" で、Common Infomation Model を探します。すると App ID に「Splunk_SA_CIM」という ID が書かれているので覚えておきます。

次に "設定" > "データモデル" を見てみましょう。先ほど確認した App の名前「Splunk_SA_CIM」に該当するデータモデルが、CIM の組み込みデータモデルです。

ここでは例として、Network Traffic データモデルの中身を見てみます。

まず、左側のデータセットの欄を見ると、All Traffic がルートデータセットであることが分かります。各データセットは選択することで内容を確認できます。

そして、画像では All Traffic が選択されている状態でして、その中に制約・継承・抽出済みという項目が見えます。(見えてないですが、下に計算済みもあります。)

制約の欄を見てみると、All Traffic では、network と communicate のタグが付いたデフォルトフィールドに適合するよう設定されています。

Blocked Traffic データソースの制約も見てみましょう。

network と communicate のタグが付いたデータソースを対象にしているのは All Traffic と同じですが、右端に「継承」と書かれている通り、All Traffic の制約を継承しています。さらに action=* と action=blocked の条件が新たな制約として追加されており、action が blocked になっているログを対象とするように絞り込まれています。この様に各階層で構成されています。

さて、CIM のインストールと確認は完了しました。次に CIM 対応 App を可視化させる方法をご紹介します。

CIM を使って App を可視化させよう

冒頭ご説明したように CIM 対応の App は、CIM でフィールドが共通化されたログを可視化するように構成されているため、ログソースを CIM のデータモデルに準拠させていく必要があります。まずは、App をインストールして "なぜ CIM が必要なのか" を理解するために中身を確認してみましょう。

CIM 対応の App をインストールする

今回は InfoSec という CIM 対応の App をインストールします。

"App" > "InfoSec" を開き、"InfoSec App for Splunk" と検索して App をインストールします。

インストールが完了したら "App" > "InfoSec" で App を開いて見てみましょう。

今はまだログに設定を施していないため、何も表示されない状態です。これを数字が正常に表示できるように設定していきます。なお、この App に必要なデータモデルは Spunk base で確認できます。

今回はネットワークトラフィックのビューを可視化させたいと思います。Continuous Monitorring のネットワークトラフィックを開いて、虫眼鏡アイコンを選択します。

すると SPL が表示されます。

datamodel=Network_Traffic.All_Traffic ということで、先ほど確認した Network_Traffic データモデルが必要であるということが分かります。

ですが、普段ログを検索するときに使う sourcetype=hoge のような記載はありませんよね。これが、CIM が必要になる理由です。CIM 対応 App は、データモデルに対して検索をかけ、その結果をパネルにして可視化しているのです。

CIM が必要な理由が分かったところで、次はフィールド抽出を行っていきます。

フィールド抽出

今回は、Splunk 検索チュートリアルでダウンロードできるデータを使っていきたいと思います。

次の ssh ログを sourcetype=test_ssh として取り込み、先ほどの InfoSec の App で可視化させます。

Thu Mar 31 2024 08:11:25 www1 sshd[1654]: Failed password for happy from 2.229.4.58 port 2111 ssh2

で、抽出するフィールドの管理を簡単にするために下準備として 1つ App を作成します。これは、後に抽出するフィールドの設定や、タグの設定内容を入れておける箱というイメージで OK です。

"App" > "App の管理" > "Appの作成" に移動して、次の様に作成しました。

ログを抽出する前にログの構成を理解しておきましょう。

そしたら、フィールドを抽出していきましょう。"設定" > "フィールド" で "フィールド抽出" を選択します。宛先 App に先ほど作成した App 名を入れ、sourcetype と、抽出するフィールドの正規表現を入れて保存します。user, src_ip, src_port のフィールドを作成しました。

作成し終えたら次の様に権限設定も行います。これで他の App でも抽出したフィールドを使えるようになります。以降ご紹介する部分でも同じように権限設定を行ってください。(環境に応じて最低限の範囲で変更してください。)

さて、先ほど参照したパネルのクエリですが、次の赤枠の様に All_Traffic.src ということで、All_Traffic データセットの計算済みフィールド src のフィールドで一意の値をカウントしていることが分かります。

なので、src に適合するフィールドが必要になります。フィールドを適合させるには、フィールドにエイリアスを付けるのですが、そもそもどのフィールドを src に適合すればいいのかな?ってなりますよね。適合させるフィールドの探し方は複数あります。

How to use the CIM data model reference tables | Splunk Docs を見てみると、ドキュメントページや、データモデルページでダウンロードできる json ファイルでも確認できるみたいです。

ちなみに Splunk の Network Traffic ドキュメントページには、src_host, src_ip, src_name を使うことが出来ると書いてあります。

Network Traffic データモデルページでダウンロードした json の src のセクションには以下のように記載されていました。

{"outputFields":[{"fieldName":"src","owner":"All_Traffic","type":"string","fieldSearch":"","required":false,"multivalue":false,"hidden":false,"editable":true,"displayName":"src","comment":{"description":"The source of the network traffic (the client requesting the connection). You can alias this from more specific fields, such as src_host, src_ip, or src_name.","recommended":true}}],"calculationID":"All_Traffic_fillnull_src","owner":"All_Traffic","editable":true,"comment":"","calculationType":"Eval","expression":"if(isnull(src) OR src=\"\",\"unknown\",src)"},

ドキュメントページと同様に src_host, src_ip, src_name を使うことが出来る。ということと、計算済みフィールドでの値の抽出条件が載っています。各項目の詳しい見方は、How to access information directly from the JSON files| Splunk Docs をご参照ください。

ということで、計算済みフィールドを新たに作成して src_ip を src に代入させることで All_Traffic.src に適合させていきましょう。

"設定" > "フィールド" の計算済みフィールドで新規追加で、次のように入力しました。

補足:この計算済みフィールドの場合、eval 式によって、src_ip に値があれば src というフィールドに値が追加されていく形になります。

これでフィールド抽出の設定が完了したので、次はイベントタイプでタグを付与していきましょう。

イベントタイプを使ってタグを付与する

"設定" > "イベントタイプ" > "新しいイベントの作成" で、次の様に先ほど設定した App 名と、sourcetype、タグを入れて保存します。

これで、CIM 対応 App を可視化するための設定が完了しました。

そしたら、データモデルと照らし合わせてフィールドが適合しているか確認しましょう。

データモデルと照らし合わせてフィールドが適合しているか確認するための SPL

| datamodel <Data_Model> <Data_Model_Dataset> search 
| search sourcetype=<your:sourcetype>

実際に使った SPL がこちらです。

| datamodel Network_Traffic All_Traffic search 
| search sourcetype=test_ssh

その結果が次の図です。抽出してきたフィールドが表示されていることが分かります。unknown のものは適合していないということです。

All_Traffic.src は正常に値が入っていますので、この状態で先ほどの InfoSec の App を開いて見ましょう。

パネルが表示されていますね。すべてを表示するには他のフィールドも抽出して CIM のデータモデルに適合させる必要がありますが、今回ご紹介したようにログを調整していくことで CIM 対応 App を可視化させることが出来ます。InfoSec はそうして複数ログソースを1つの App で可視化します。そのため、ログが増えれば当然、検索するログ量も増えて検索に時間がかかりますので、高速化処理も行っておきましょう。

App の高速化について

高速化処理を有効化すると、App を開く前に事前にログを検索・計算しておいてくれるので、表示が高速化します。

"設定" > "データモデル" で対象のデータモデルを見つけます。今回は Network Traffic ですね。

"編集" > "高速化の編集" で、高速化にチェックを入れて保存します。

雷マークが黄色く点灯したら成功です。

最初に作成した App について

フィールド抽出や、タグの付与をする前に「設定を保存しておくために App を作成しておきましょう。」とお伝えしていましたが、なぜ作成したかというと、"App" > "App の管理" で作成した App を見つけて "オブジェクトの表示" を選択することで、これまで設定してきた内容を App で管理することが出来るためです。

ここで、権限設定なども順番に設定変更できるので、うまく表示されない場合は確認してみましょう。

まとめ

いかがでしたでしょうか。少し長くなりましたが、CIM のデータモデルにログを適合させていくことで、複数のログソースのフィールド名を共通化して相関分析を行うことが出来るようになります。

また、今回ご紹介しきれませんでしたが、フィールド解析については、Splunk のアドオンを使うと、データモデルと収集したログのフィールドを適合させるように自動的にフィールド抽出をしてくれます。例えば AWS なら、Splunk Add-on for Amazon Web Services (AWS)、Google Cloud なら、Splunk Add-on for Google Cloud Platform を使うことができます。また後日ご紹介できればと思います。

皆様の一助になれば幸いです。