.conf 2017 Splunk Championの中村さんの話を聞く機会があって、刺激を受けたのでやってみる。
中村さんの.conf 2017の資料も参考に。
最初はGOJASのSlackに上がっていたUsing data & Splunk ML Toolkit to predict crime
google翻訳をやろうとして断念
.conf 2018の資料はここ
Sankey Diagram
index=botsv1 sourcetype=iis c_ip=40.80.148.42 sc_status=200
| stats count dc(cs_uri_stem) as uri by cs_method,cs_uri_stem
これも綺麗だけど、URLの構成ごとに分けてみる。
index=botsv1 (sourcetype=iis c_ip=40.80.148.42 sc_status=200) OR (src_ip=40.80.148.42 sourcetype=suricata eventtype=suricata_eve_http http.status=200)
| eval method=coalesce(cs_method,http_method)
| eval url=coalesce(cs_uri_stem,'http.url')
| eval url="/".method.url
| rex field=url max_match=6 "(?<uri>/[^/]+)"
| fields uri
| table _time,uri
| eval second_tmp=mvindex(uri,1,6)
| mvexpand uri
| streamstats count by _time
| eval second_uri=mvindex(second_tmp,count-1)
| eval uri=replace(uri,"/([A-Z]+)","\1")
| eval second_uri=replace(second_uri,"\?.+","")
| stats count by uri,second_uri
解説
... | stats <stats_function>(<size_field>) [<stats_function>(<color_field>)] by <source_category_field> <target_category_field>
Sankey Diagramの構成は上記のとおり。
今回は
始め | 終わり | 大きさ | 色 |
---|---|---|---|
uri |
second_uri |
count |
なし |
でフィールドを作った。 |
urlを要素に分けるまでは簡単だったけど、交互にするのがよくわからずハマった。
何とかなった方法として
| eval second_tmp=mvindex(uri,1,6)
でマルチバリューなURLを一つずらしてつくった。例として
uri | second_uri |
---|---|
/POST /joomla /index.php |
/joomla /index.php |
mvexpand uri
すると
uri | second_uri |
---|---|
/POST | /joomla index.php |
/joomla | /joomla index.php |
index.php | |
となる。 | |
それをstreamstats でつくったカウンターでsecond_uri の値を取り出していく。 |
|
mvindex のカウンターが__0__から始まるので-1
|
_method_は正規表現で取り出すために/
をつけていたのを外して、
IDSのログにはクエリーがたくさん出ていたので、それをreplace
で消してあげた。
本来ならこれをよく調べなきゃいけないけど、今回は無視。
最後にstats
でまとめて、表を作ってVisualization
まとめ
Sankey Diagramはstats
で作らなくても表を作ればいい。
始め | 終わり |
---|---|
A | B |
B | C |
C | |
の表を作るのが大変なので、appendcols やappend で作ってもよかったと思う。 |
大きさが
count
であればなおさらですね。
実際、順序関係はSplunk側でやってもらえるので大きさのところをしっかりやれば
始め | 終わり |
---|---|
B | C |
A | B |
C | |
みたいなバラバラでもきちんと表示してくれる。 |
簡単に作れるようになりたい。