SolitonNKは結果の表示だけじゃない。スクリプトを使って解析結果を基にアクションさせよう。(3/3) 異常DNSクエリをウェブに書き出すサンプルスクリプト


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クエリ―が異常ステータスになった場合を抽出し、QueryStatusQueryNamehttp://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クエリ―のQueryStatusQueryNameは、ウェブAPIにポストされますので、ウェブサーバーのアクセスログは次のようになります。

Soliton NKを評価するための無償ダウンロードは以下のSoliton NK 公式サポートサイトでお申し込み下さい。

Soliton NKによってさらに高度なログ分析をする方法の詳細について、今後記事を追加していく予定です。