SigmaをGo言語で試す実験で悪戦苦闘中
今朝は3時半に目が覚めました。助手の猫さんは一人で寝ていたらしく、4時ぐらいにやってきて、騒いでいました。
早く目が覚めたのでは、SigmaをGo言語で試す実験のためです。
Sigmaを実装したパッケージは2つありました。
と
です。
どちらにするか、「Software Design」のデモ#1のZeekのルール
title: Public Accesible IP Addaree
status: test
description: Detects connections from external IPs
logsource:
product: zeek
detection:
selection:
id.orig_h|cidr:
- '10.0.0.0/8'
- '172.16.0.0/12'
- '192.168.0.0/16'
condition: not selection
level: high
で調べた結果、1つ目のgo-sigmaを使うことにしました。ソースコードで調べるとid.orig_h|cidrの部分に対応しているのが1つ目だけだったからです。
このルールはGo言語でもうまく動作しました。
func demo1() {
c, err := os.ReadFile("./rules/zeek.yml")
if err != nil {
log.Fatalln(err)
}
r, err := sigma.ParseRule(c)
if err != nil {
log.Fatalln(err)
}
e := evaluator.ForRule(r)
fp, err := os.Open("./testdata/conn.json")
if err != nil {
log.Fatalln(err)
}
defer fp.Close()
scanner := bufio.NewScanner(fp)
for scanner.Scan() {
l := scanner.Text()
var i map[string]interface{}
err := json.Unmarshal([]byte(l), &i)
if err != nil {
log.Fatalln(err)
}
ret, err := e.Matches(context.Background(), i)
if err != nil {
log.Fatalln(err)
}
if ret.Match {
log.Printf("ret=%v l=%s", ret, l)
}
}
}
ここまでは快調でしたが、ハンズオン#1のWindowsのイベントログの例も試してみよう思いました。
WindowsのイベントログをGo言語で扱うパッケージは
です。ログ分析ツールで使ったことがあるので楽勝かと思いましたが、
ルールが読み込めない、ログデータ型が合わないなど、問題が山積みです。3時間近く悪戦苦闘しましたが、解決できません。
明日に続く
いいなと思ったら応援しよう!
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。
ソフトウェアのマニュアルをnoteの記事で提供しています。
サポートによりnoteの運営にも貢献できるのでよろしくお願います。