SolitonNKでankoスクリプトを用いて、解析結果を基にアクションさせるための解説記事、いよいよ最終回はスクリプトサンプルです。
ankoのnet/http
パッケージを用いて、引数DATA
を受取って、ウェブAPIにポストするスクリプトのコア部分は次のようになります。
body = strings.NewReader(DATA)
req, _ = http.NewRequest("POST", url, body)
req.Header.Add("Content-Type", "application/octet-stream")
resp, _ = http.DefaultClient.Do(req)
setEnum("Status", resp.Status)
return true
これを用いて、Winevent インジェスターを用いたDNSクエリ―分析 の発展形として、DNSクエリ―が異常ステータスになった場合を抽出し、QueryStatus
とQueryName
を http://www.example.com
にポストするというサンプルスクリプトを作ると次のようになります。
var http = import("net/http")
var strings = import("strings")
var url = "http://www.example.com"
func Process() {
body = strings.NewReader(QueryStatus+","+QueryName)
req, _ = http.NewRequest("POST", url, body)
req.Header.Add("Content-Type", "application/octet-stream")
resp, _ = http.DefaultClient.Do(req)
setEnum("Status", resp.Status)
return true
}
この anko スクリプトを postapi
というリソースネームでSolitonNKに登録しておき、検索として
tag=sysmon winlog EventID Image QueryName QueryResults QueryStatus!=0 | limit 5 | anko postapi | table
などとすると、異常ステータスを示した5件分だけをウェブAPIにポストすることができます。なおWindowsのSyslogにおいて、QueryStatus
は正常の際は0になり、何らかのエラーがある場合は0以外の値となることから、検索例ではQueryStatus
が0以外になった場合を抽出しています。QueryStatus
の値とその意味の一覧を見ると分かるように、例えばQueryResult
が無い場合にはQueryStatus
は9701になります。
検索でヒットしたDNSクエリ―のQueryStatus
とQueryName
は、ウェブAPIにポストされますので、ウェブサーバーのアクセスログは次のようになります。
Soliton NKを評価するための無償ダウンロードは以下のSoliton NK 公式サポートサイトでお申し込み下さい。
Soliton NKによってさらに高度なログ分析をする方法の詳細について、今後記事を追加していく予定です。