🕌

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 に依存しない構成をとっており、gorment のような ORM フックでは実現できませんでした。

また、SQL を解析するレイヤをアプリケーションコードに入れたくなかったため、SQLドライバ層での監査実装という設計にたどり着きました。


最後に

go-sql-audit-driver はまだ小さな OSS ですが、プロダクション導入も視野に入れた設計になっています。

Go で SQL 操作の監査を簡単に入れたい、そんな人にはちょうどよい選択肢になると思います。

ぜひ GitHub に★を頂けると励みになります。

GitHub: github.com/mickamy/go-sql-audit-driver


ご意見・フィードバック大歓迎です。

Discussion