見出し画像

AIアシスト付きログ分析ツール(TWLogAIAN)に監視すべきWindowsイベントを教えた

今朝は5時から開発開始です。
昨日は、野菜の買い出し+近くの温泉の週末の定番コースでした。
温泉効果でぐっすり眠れました。

先週からログ分析ツールの改善をしていますが、Windowsのイベントログのレベルがほとんど正常しかないことをしらべていて、

を見つけました。

次の表は、「Active Directory のセキュリティ侵害の兆候の監視」に記載されている推奨事項に従って、環境内で監視する必要がある イベントの一覧です。

のようなことが書いてあります。これは、よいものを見つけました。
この表のレベルを反映させたくなりました。

このサイト(英語版)のデータからJSON形式のデータを作っている人

も見つけました。これを使おうかと思いましたが、3年間更新されていないようなので、心配になりました。

そこで、英語版の元サイト

の表から組み込むデータを作成することにしました。
この表を私がみてデータを入力するようなことをすれば、人的ミスだらけになるのは目に見えています。
そこで、プログラムで、このサイトの表から必要なデータを取得することにしました。
そこで使えそうなのが

です。日本語の解説記事もいろいろあります。
試しに、

package main

import (
	"fmt"
	"log"
	"net/http"

	"github.com/PuerkitoBio/goquery"
)

func GetPage(url string) {
	// Request the HTML page.
	res, err := http.Get(url)
	if err != nil {
		log.Fatal(err)
	}
	defer res.Body.Close()
	if res.StatusCode != 200 {
		log.Fatalf("status code error: %d %s", res.StatusCode, res.Status)
	}

	// Load the HTML document
	doc, err := goquery.NewDocumentFromReader(res.Body)
	if err != nil {
		log.Fatal(err)
	}
	doc.Find("table tbody tr").Each(func(_ int, s *goquery.Selection) {
		s.Find("td").Each(func(i int, s2 *goquery.Selection) {
			fmt.Printf("%s\t", s2.Text())
		})
		fmt.Println()
	})
}

func main() {
	url := "https://learn.microsoft.com/en-us/windows-server/identity/ad-ds/plan/appendix-l--events-to-monitor"
	GetPage(url)
}

というプログラムを書いてみました。サイトの

の表のデータだけ取得できます。

4618	N/A	High	A monitored security event pattern has occurred.
4649	N/A	High	A replay attack was detected. May be a harmless false positive due to misconfiguration error.
4719	612	High	System audit policy was changed.
4765	N/A	High	SID History was added to an account.
4766	N/A	High	An attempt to add SID History to an account failed.

これは便利です。
ログ分析ツールに教えるために必要なのは、イベントIDとレベルだけです。
1列名と3列名だけです。レベルは数値に変換します。
取得する処理を

	c := 0
	doc.Find("table tbody tr").Each(func(_ int, s *goquery.Selection) {
		id := ""
		level := ""
		s.Find("td").Each(func(i int, s2 *goquery.Selection) {
			switch i {
			case 0:
				id = s2.Text()
			case 2:
				level = s2.Text()
			}
		})
		if id == "" || level == "" {
			return
		}
		if i, err := strconv.Atoi(id); err == nil && i != 0 {
			l := 0
			if strings.Contains(level, "High") {
				l = 100
			} else if strings.Contains(level, "Medi") {
				l = 101
			} else {
				l = 102
			}
			if c%10 == 0 {
				fmt.Println()
			}
			c++
			fmt.Printf("%d:%d,", i, l)
		}
	})
	fmt.Println()

のように修正してログ分析ツールに組み込むデータを作りました。
プログラムに組み込んでみると

エディタがエラーを指摘しています。同じイベントIDが2つあるというものです。もとのサイトの表をよく見ると

たしかに2つあります。イベントログの説明から下のほうが正解です。上のほうの番号を間違えたのかと思って、説明に一致するイベントIDを探しましたが、これは登録されているので、単に余分なIDが残ったようです。
たぶん、人的ミスです。
とりあえず、このデータを削除して組み込みました。
その結果、

のようにWindowsのイベントログのレベルわけがいい感じになりました。

ちなみに、AI(Google Bard)に

「Windowsのイベントログで監視すべきイベントIDを教えて?」

と聞いてみました。

Windowsのイベントログで監視すべきイベントIDは、監視するシステムやアプリケーションによって異なります。しかし、一般的に監視すべきイベントIDには、次のようなものがあります。

セキュリティイベント:システムへの不正アクセスや不正な変更を検知するイベントです。
アプリケーションイベント:アプリケーションの障害やパフォーマンスの低下を検知するイベントです。
システムイベント:システムの起動やシャットダウン、ハードウェアの障害などを検知するイベントです。

これらのイベントIDを監視することで、システムやアプリケーションの異常を早期に検知し、対処することができます。

具体的なイベントIDについては、MicrosoftのWebサイトやマニュアルで確認してください。

Google Bard

MicrosoftのことをGoogleのAIに聞いても、親切に教えてくれないのかもしれません。仰せのとおりWebサイトで調べました。

明日に続く


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