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