じゅのぶろ

社内SEが自宅でSOC/CSIRTするために色々頑張っていきたいブログ 画像が見れない場合はjavascriptを有効にするかデスクトップからご覧下さい。

Splunkでログを調べる(timechart編)

この記事ではよく使うコマンドの一つtimechartに関連したコマンドを紹介します。

SPL

SplunkはSPLという言語でサーチ文を記述します。 大体以下のようにコマンド、オプション引数、フィールド名という使い方です。
パイプ(|)で複数のコマンドをつなげて所望する結果が得られるようにします。

コマンド [(option_name=)option] フィールド名  

例 )
index=squid #検索対象のインデックスを指定
| stats count by domain # ドメインへのアクセス数を集計
| search count > 10 #10回以上アクセスしたホストを取得

多くのコマンドを知ることはSplunkでの調査力を上げることに繋がります。
日本語のサーチリファレンスがありますので こちらを参考にしてください。

timechart

特定のユーザや宛先への通信状況を調べるときに使います。
とても簡単でbyのあとにsplitする対象フィールド名を入れてよく使います。

index=squid 
| timechart count by domain

f:id:jnox:20190720213639p:plain

オプション

このままだと見づらいのでオプションを指定します。
オプションの説明はサーチリファレンスを引用しています。

  • limitオプション

    split-by フィールドが返す一意の値の数に対する制限を指定します limit=0 に設定すると、すべて の一意の値が使用されます。

今回はアクセス合計上位5ドメインが見たいと仮定してlimit=5とします。

  • useotherオプション

    useother が偽 (False) に設定されない限り、他のすべての値は「OTHER」にグループ 化されます。

今回はアクセス上位5ドメイン以外は確認する必要ないと仮定してuseother=fとします。

  • fixedrangeオプション

    サーチのもっとも早い/もっとも遅い時刻を使用するかどうかを示します。
    fixedrange=false を設定すると、timechart コマンドが有効なデータの時間範囲のみに制限されます。

今回はチャートが右端にかたよって見づらいため、fixedrange=false を設定します。

  • spanオプション
    様々な単位が指定できますが、ここではタイムスケールで使用します。
    数字 + 時間単位{秒(s)、分(m)、時間(h)、日(d)、週(w)、月(mon)}を指定します。

今回はspan=10m(10分単位) を設定します。

これらのオプションを指定したあとの結果がこちら
先程のグラフより幾分か見やすいかと思います。 f:id:jnox:20190720221525p:plain

chartコマンド

chartコマンドはoverで横軸、byで縦軸のsplitを指定できます。
timechartコマンドはchart over _timeと同じ結果になる気がします。

index=squid 
| chart limit=5 useother=f count span=10m over _time by domain

f:id:jnox:20190721000701p:plain

statsコマンド

binコマンドとstatsコマンドを組み合わせてtimechartの用に使うことができます。
timechartは、列の名前(フィールド名)がsplitしたフィールド値、フィールド値がカウント数だったのに対して、
statsでは、フィールド名がsplitしたフィールド名、フィールド値はsplitしたフィールド値、カウント数は新規の列として追加されます。

f:id:jnox:20190721001022p:plainf:id:jnox:20190721002919p:plain
stats(左)  timechart(右)

Splunkのグラフで表示する際はtimechartのほうが見やすいです。
statsで生成した統計データはトレリス(trellis)機能を使うことでドメインごとのグラフを可視化できます。 f:id:jnox:20190721001708p:plain

複数フィールドでのsplit

先程の例ではdomainでsplitしていましたが、src_ipとdomainの組でsplitしたいという状況も出てくるかと思います。
ですが、timechartのsplitはstatsと異なり複数指定できません。 この場合はevalで文字列連結をすることで解決できます。

index=squid 
| eval src_ip=src_ip." ".domain
| timechart limit=5 useother=f fixedrange=f count span=10m by src_ip

f:id:jnox:20190720235304p:plain