Go 製の sql 監査ドライバ go-sql-audit-driver を公開しました
この記事は ChatGPT を使って書かれました
業務で「誰が、いつ、どのデータを更新したか」を記録するための SQL 操作の監査機能が必要になり、database/sql に簡単に組み込めるドライバ型の監査ライブラリを自作しました。
それが go-sql-audit-driver です。
どんなライブラリか
go-sql-audit-driver の主目的は、データベースに SQL 操作の監査ログを保存することです。
go-sql-audit-driver は Go の標準パッケージ database/sql/driver をラップして、INSERT / UPDATE / DELETE の実行内容をログに記録できるようにするドライバです。
既存の sql.Open() の呼び出しに一手間加えるだけで、アプリケーションコードをほとんど変えずに監査を仕込めます。
db, _ := sql.Open("audit", "driver=postgres user=...")
内部では driver.Conn, driver.Stmt, driver.Tx を wrap し、クエリの内容を検査してログを生成します。
監査ログはアプリケーションの logger を通じて出力することも可能ですが、本ライブラリの基本的な使い方は、専用の監査テーブル(database_modifications)にログを永続的に保存することです。
このための出力ハンドラは自由に差し替え可能で、例えば RDB 上のテーブルに JSON として記録したり、パーティションで分割して蓄積する構成も簡単に構築できます。
主な機能
-
INSERT/UPDATE/DELETEを対象にした監査ログの出力 -
context.Contextに埋め込んだoperatorID,executionIDの取得 - ログの出力先・形式をカスタマイズ可能
- 任意の UUID 生成器を注入可能
- テーブル単位での監査対象/除外設定
- 読み取り専用モード (
WithReadOnly)
利用例
db := sql.OpenDB(audriver.NewConnector(
"driver=postgres user=...",
audriver.WithLogger(myLogger),
audriver.WithExecutionIDFromContext(func(ctx context.Context) string {
return ctx.Value("execution_id").(string)
}),
audriver.WithOperatorIDFromContext(func(ctx context.Context) string {
return ctx.Value("user_id").(string)
}),
audriver.WithTableFilters(audriver.TableFilters{
Include: []string{"orders", "users"},
}),
))
なぜ作ったのか
アプリケーションの設計上 ORM に依存しない構成をとっており、gorm や ent のような ORM フックでは実現できませんでした。
また、SQL を解析するレイヤをアプリケーションコードに入れたくなかったため、SQLドライバ層での監査実装という設計にたどり着きました。
最後に
go-sql-audit-driver はまだ小さな OSS ですが、プロダクション導入も視野に入れた設計になっています。
Go で SQL 操作の監査を簡単に入れたい、そんな人にはちょうどよい選択肢になると思います。
ぜひ GitHub に★を頂けると励みになります。
→ GitHub: github.com/mickamy/go-sql-audit-driver
ご意見・フィードバック大歓迎です。
Discussion