見出し画像

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時間近く悪戦苦闘しましたが、解決できません。

明日に続く


いいなと思ったら応援しよう!

twsnmp
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。