Splunk SPL で出現数の少ない順番にTop10を表示させる(tailマクロ)

tail マクロを利用すれば、特定の項目の出現回数を少ない順番に表示させることができます。

SPLの書き方

下記のSPLは、dest_ip(通信先)毎に出現回数をカウントし出現数の少ないTop10を表示させるSPLの例です。

sourcetype="fgt_traffic"
| stats count by dest_ip
| sort - count
| tail 10

実際に実行するとこうなります。

Splunkでのtailマクロ実行例

ちなみに多い順にTop10を表示させたい場合は、headを利用します。

http://k2-ornata.com/splunk-spl_stats_count/

Splunk SPL で特定の項目の出現回数でカウントし、さらにそのカウント数毎にカウントする

これをやるには最初のカウントの際に “as” を利用して別名をつけてあげるとうまくいきます。

SPLの書き方

下記のSPLは、SPLの例です。

sourcetype="fgt_traffic"
| stats count as dest_count by dest_ip
| stats count by dest_count
| sort - count
| head 10

実際に実行するとこうなります。

Splunkでの実行例

Splunk SPL で時間(_time)を指定した範囲でグループ化する(bucket, binマクロ)

bucket もしくは bin を利用して _tme を指定した時間の幅に分割した後、stats マクロを使用しすれば、その時間の幅毎に特定の項目の出現回数を表示させることができます。

SPLの書き方

下記のSPLは、ログデータを1時間毎に分割し、それぞれの時間内での dstip(通信先)毎の出現回数をカウントし表示させるSPLの例です。

sourcetype="fgt_traffic"
| bucket span=1h _time
| stats count by _time dstip

実際に実行するとこうなります。

Splunkでの bucketマクロ実行例(その1)

さらに、1時間で1,000回以上のアクセスがあったdstipを抽出するには以下の通り記載します。

sourcetype="fgt_traffic"
| bucket span=1d _time
| stats count by _time dstip
| where count > 1000
| table _time dstip count

こちらも実際に実行すると以下の通りとなります。

Splunkでの bucketマクロ実行例(その2)

参考サイト:

・コアラでもわかるSplunkシリーズ 時間毎集計する(Qiita)
https://qiita.com/toshikawa/items/8fa44753bc8f2a4c9cb0

Splunk SPL で特定の項目の出現回数をカウントする(statsマクロで count)

stats マクロで count を利用すれば、特定の項目の出現回数を表示させることができます。

SPLの書き方

下記のSPLは、dest_ip(通信先)毎に出現回数をカウントし表示させるSPLの例です。
なお、それぞれのdest_ipの出現回数をカウントした後、カウントが多い順に10件表示しています。

sourcetype="fgt_traffic"
| stats count by dest_ip
| sort - count
| head 10

実際に実行するとこうなります。

Splunkでの検索結果1

グラフ表示

上記検索を行った後、「視覚エフェクト」を選択すると、結果をグラフ表示することも可能です。

Splunkでの検索結果2

参考サイト:

・Splunk: Splunk入門(SPL編 3/6) – よく使用する統計関数11選
https://qiita.com/frozencatpisces/items/360b4a38212fe1876dbc

Splunk SPL で特定の項目の平均値と中間値を求める(statsマクロで max と median)

stats マクロで avg と median を利用すれば、特定の項目の平均値と中間値を表示させることができます。

SPLの書き方

下記のSPLは、dest_ip(通信先)毎に最大値(max)、最小値(min)、平均値(avg)、中間値(median)を表示させるSPLの例です。
なお、それぞのれ値を求めた後、最大値(max)が多い順番に並べ替え、最大値(max)が多い順に10件表示しています。

sourcetype="fgt_traffic"
| stats max(bytes_in), min(bytes_in) avg(bytes_in), median(bytes_in) by dest_ip
| sort - max(bytes_in)
| head 10

実際に実行するとこうなります。

Splunkでの検索結果

グラフ表示

上記検索を行った後、「視覚エフェクト」を選択すると、結果をグラフ表示することも可能です。

Splunkでの検索結果

参考サイト:

・Splunk: Splunk入門(SPL編 3/6) – よく使用する統計関数11選
https://qiita.com/frozencatpisces/items/360b4a38212fe1876dbc

Splunk SPL で特定のフィールドの出現回数をカウントし、多い順に表示させる方法

stats マクロで特定のフィールドの値の出現回数をカウントし、それを sortマクロで多い順に並べ替えることで実現できます。

index="(インデックス名)" sourcetype="(ソースタイプ名)" (フィールド名)=(カウントしたい値)
| stats count by (カウントしたいフィールド名)
| sort - count

(カウントしたいフィールド名)に src_ip や hostname など、カウントしたいフィールド名を入れます。

なお、1行目は index 以外は任意(必須ではない)です。

また、”|”は半角になっている必要があるので注意。(全角にすると”|”が緑色になります。)

長年、Splunk SPLの先頭にパイプ(|)をつける場合とつけない場合があることが疑問でしたがようやく判明した件

Splunk の SPL を中途半端に学んでいたため、表題の通り、なぜSPLの先頭にパイプをつける場合とつけない場合があることが疑問でしたが、以下の2つの記事を見てようやくスッキリしました。
(「こおりねこ」さん、ありがとうございます!)

Splunk: Splunk入門(SPL編 1/6) - SPL文の基本(Qiita)
https://qiita.com/frozencatpisces/items/a395d8721977d14bd6a2

まず上記の記事には以下の通り記載があります。

早速、シンプルな SPL 文を実行してみましょう。

search index=”_internal”

「 search 」は SPL のコマンドの1つであり、条件を引数に指定してログを検索、出力するコマンドです。

普段よく目にするのは、いきなり index=”_internal” という形でかかれたSPLですが、実はその前に search コマンドがあり省略されているだけなんですね。

知りませんでした。。。

Splunk: サーチマクロって何だ?(Qiita)
https://qiita.com/frozencatpisces/items/8424d5af4204433948b1

そしてさらに上の記事を見ると、以下の記載があります。

search や inputlookup などの生成コマンド( generating commands )を定義に使用する場合は「定義の先頭にパイプ(|)を付けない」「マクロ使用箇所の直前にパイプを付ける」の2点を守る必要があります。

なるほど、search の場合は先頭にパイプを付けないという決まりがあるのですね。

Splunk Lookupファイルエディターを使ってみた

以下、さわってみた感じ。

Splunk App for Lookup File Editing(APP)
Splunk App for Lookup File Editing(開いたところ)
Splunk App for Lookup File Editing(APPプルダウン)
Splunk App for Lookup File Editing(Typeプルダウン)
Splunk App for Lookup File Editing(ファイルを開いたところ)
Splunk App for Lookup File Editing(新しいセルに追記)
Splunk App for Lookup File Editing(セーブ1)
Splunk App for Lookup File Editing(セーブ2)

mitre_techniques.csv を開き、最後の行で右クリックしてコンテキストメニューを表示したところ

Splunk App for Lookup File Editing

編集した直後

Splunk App for Lookup File Editing

inputlookupコマンドで行を追加した結果を確認したところ

Splunk サーチ文

新規にMITER ATT&CKベースでSplunkの監視ルールを作成する際の手順を整理してみた

新規にSplunkで監視ルールを作成する際の情報が流れとしてまとまったサイトがなかったのでまとめてみました。

1.Splunk に取り込むログを出力する機能を整理

例えば、AADRiskyUsersのログであれば、Identity Protectionの機能から出力されるよね、といったことを整理していく。

リスク データをエクスポートする(Microsoft Learn)
https://learn.microsoft.com/ja-jp/entra/id-protection/howto-export-risk-data

2.ログ出力機能から検知可能なATT&CKのテクニックを整理

ログを出力する機能が分かれば、MITRE CTID やDTT&CTなどを使って、ATT&CKのどのテクニックが検知できるか確認する。

Microsoft Azure Security Control Mappings to MITRE ATT&CK®(MITRE CTID)
https://center-for-threat-informed-defense.github.io/security-stack-mappings/Azure/README.html

rabobank-cdc / DeTTECT
https://github.com/rabobank-cdc/DeTTECT

3.テクニックを検知する為のSPLを検討

検知できそうなテクニックがわかったら、それに該当する検知ルールを Splunk Security Content や Sigmaルールを活用し検討する。

Splunk Security Content
https://research.splunk.com/detections/

SigmaHQ / sigma
https://github.com/SigmaHQ/sigma/tree/master/rules/cloud

NVISOsecurity / sigma-public
https://github.com/NVISOsecurity/sigma-public

SIGMAルールから Splunkルールに変換する

SIGMAルールとは、Splunk など製品固有の言語(SPLなど)で書かれた検知ルールではなく、より汎用的?に記載された検知ルールのようです。

したがって、SIGMAルールがあれば、そこから Splunk や Sentinelなどいろいろなベンダーの SIEM で利用できる検知ルールが作成できます。

ちなみに SIGMAルールは以下のGITHUBのサイトなどに置かれています。

GITHUB
https://github.com/SigmaHQ/sigma/tree/master
https://github.com/NVISOsecurity/sigma-public

なお、SIGMAルールから各SIEM固有の検知ルールを生成する方法としては、 Webサイトのサービスを利用する方法とコマンドラインの2通りがありそうです。

WebでのSIGMAルール → 各SIEM向けルール変換

Webサイトとしては、以下のUNCODER.IOが有名のようです。

UNCODER.IO
https://uncoder.io/

以下が実際の画面ですが、変換先を見ると Splunk, Sentinel, QRader, XSIAMと有名どころのSIEMへの変換が可能なようです。

UNCODER.IOサイト

そして実際に Splunkの SPLに変換してみたのがこちらです。変換後はシンプル&見慣れた表現なので少しわかりやすいですね。

UNCODER.IOサイト

コマンドでのSIGMAルール → 各SIEM向けルール変換

コマンドとしては sigmatools というものがあるようで、以下のコマンドで簡単にインストールできます。

% pip3 install sigmatools

そして、UNCODER.IOで変換したものと同じSIGMAルールを sigmac コマンドでも変換してみた結果がこちらです。

% vi tmp/proxy_susp_flash_download_loc.yml
% sigmac -t splunk -c splunk-windows tmp/proxy_susp_flash_download_loc.yml
(((c-uri="*/flash_install.php*" OR c-uri="*/install_flash_player.exe") NOT ((cs-host="*.adobe.com"))))

-t の引数で変換先の SIEM として Splunk を指定しています。

Webで変換したものと大体一緒ですが、なぜか先頭に “source=”が付いていませんね。引数が足りないのかな?

<参考サイト>
・Sigmaルールのすすめ(Qiita)(https://qiita.com/sec-chick/items/4416bff231d7a55da75a)
・SIEMクエリ変換ツール「Sigma」を使ってみた(DeveloppersIO)(https://dev.classmethod.jp/articles/sigma-siem-transition-tool/)
・SIEMシステム用シグネチャフォーマット「Sigma」とSigmaルールの変換ツール「Uncoder.io」のご紹介(NEC)(https://jpn.nec.com/cybersecurity/blog/221014/index.html)