3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windows版PostgreSQLの拡張機能 pgAudit をビルドする

Last updated at Posted at 2025-06-23

はじめに

PostgreSQLの拡張機能pgAuditは、監査ログ(audit logging)を追加するための機能です。
別件のトラブルでpg_statsinfoについて調べていると、Windows版のpg_repackバイナリ配布しているという記事を見つけました。

SRA OSSとしてPostgreSQL拡張のWindowsバイナリ提供を開始しているが、今のところはサポート加入者のみで、一般配布は計画中とのこと。

SRA OSSで継続バイナリリリース

※2025年06月時点ではまだ一般配布は行われていません。

じゃー自力でなんとかしてみようと考えたところです。

環境

  • Windos 11 Home 64bit
  • Visual Studio 2022(C++ によるデスクトップ開発) インストール済み
  • PostgreSQL 14.7

仕事の関係上、現時点では少し古めの PostgreSQL のバージョンを使用します。
PostgreSQL 14は、2021/09/30リリース

開発準備

pgauditをビルドする上で今回 Visual Studio を使用します。

最初にpgAuditでプロジェクトを作成しましたが、他のdllと合わせpgauditと英小文字にしました。一部のキャプチャにはpgAuditが残っていますがご了承ください。

pgAudit を取得

下記サイトから Source code(zip) を取得します。

筆者は、C:¥WorkSpace に展開しました。

プロジェクト作成

C++でダイナミックリンクライブラリ(DLL)を選択します。
image.png
pgaudit でプロジェクトを作成します。

image.png

プロジェクトを一旦閉じます。
同じ拡張機能のpg_repackに倣って、pgauditフォルダからmsvcに変更したらプロジェクトを開き直します。
image.png

ファイルの追加の既存ファイル削除

上位フォルダから「pgaudit.c」ファイルを追加します。
あと、既存ファイルの下記ファイルは不要なので削除します。

  • dllmain.cpp
  • pch.cpp
  • framework.h
  • pch.h

定義ファイルの作成

モジュール定義ファイル(.def)を作成して、msvcフォルダに配置します。

pgaudit.def
LIBRARY pgaudit
EXPORTS
  _PG_init
  pgaudit_ddl_command_end
  pgaudit_sql_drop

プロパティ設定

pgauditでプロジェクトのプロパティにて、構成を「すべての構成」にします。

プリプロセッサ定義

C/C++の「プリプロセッサ」を選択、「プリプロセッサの定義」に「WIN32」を追加します。
PostgreSQLは「WINDLL」を同等のものとして認識しないため、Win32プラットフォームの場合は明示的に指定する必要があります。
※2014年の記事を参考にしているため、もう改善されている可能性があります。

image.png

C/C++の例外を無効化

C/C++の「コード生成」を選択、「C/C++の例外を有効にする」で「いいえ」にします。
image.png

コンパイルをC言語へ

C/C++の「詳細設定」を選択、「コンパイル言語の選択」で「C コードとしてコンパイル(/TC)」にします。
次に「指定の警告を無視する」を「4703;4996」をセットします。
image.png

  • 4703…未使用要素
  • 4996…非推奨関数

4996の非推奨関数の警告を無視したくない場合、#define _CRT_SECURE_NO_WARNINGSの指定やstrcpyの代わりにstrcpy_sへ書き換える方法もあります。

プリコンパイル済みヘッダーを使用しない

C/C++の「プリコンパイル済みヘッダー」を選択、「プリコンパイル済みヘッダー」で「プリコンパイル済みヘッダーを使用しない」にします。
image.png

マニフェストを生成しない

リンカーの「マニフェスト ファイル」を選択、「マニフェストの生成」で「いいえ (/MANIFEST:NO)」にします。
image.png

追加の依存関係

リンカーの「入力」を選択、「追加の依存ファイル」に「postgres.lib」を追加します。
image.png
「親またはプロジェクトの既定値から継承」のチェックは外さないでください。
単純な拡張機能では必要ありませんが、サーバー関数にリンクする場合は必要になります。
image.png

モジュール定義関係

モジュール定義ファイル「pgaudit.def」をセットします。
image.png

インクルードディレクトリ

C/C++の「全般」を選択、「追加のインクルードディレクトリ」で、PostgreSQLインストール配下の4つのフォルダを追加します。

  • include\server\port\win32_msvc
  • include\server\port\win32
  • include\server
  • include

image.png

今回の筆者の場合、PostgreSQLインストールフォルダは「C:\Program Files\PostgreSQL\14」になります。
image.png

ライブラリディレクトリ

リンカーの「全般」を選択、「追加のライブラリ ディレクトリ」で、PostgreSQLインストール配下のlibフォルダを追加します。
次に「ライブラリ依存関係のリンク」を「いいえ」にします。
image.png

image.png

プロジェクトの構築

プルダウンメニューから「Relese」を選択します。
image.png

プログラム

構成

image.png

msvcフォルダの中身、x64¥Releseフォルダに「pgaudit.dll」ファイルが生成される。

導入

配置

今回の筆者の場合、PostgreSQLインストールフォルダは「C:¥Program Files¥PostgreSQL¥14」になりますので、下記に配置します。

ファイル 配置先
pgaudit.dll lib
pgaudit.control share\extension
pgaudit--1.6.3.sql 同上

pgaudit.control に書かれたdefault_version(例: 1.6.3)のように、バージョン3桁のみのファイル(例 1.6.3.sql)があったため、他のsqlは含めませんでした。

他バージョンでバージョン3桁のsqlファイルがない場合、アップグレードさせるために他のsqlを含めてください。

postgres.confの修正

設定ファイルにpgauditの事前ロード用の設定を追加します。

postgres.conf
shared_preload_libraries = 'pgaudit'

ファイル編集後、PostgreSQLサーバを起動、または再起動してください。
※shared_preload_librariesには、カンマ区切りで複数のモジュールが登録できます。

postgres.conf
shared_preload_libraries = 'pg_hint_plan, pgaudit'

PostgreSQLに拡張機能の登録

CREATE EXTENSION pgaudit;

登録の確認

SELECT extname, extversion
FROM pg_extension
WHERE extname = 'pgaudit';
extname extversion
pgaudit 1.6.3

検証

postgres.conf追加設定

postgres.conf
#------------------------------------------------------------------------------
# pgaudit
#------------------------------------------------------------------------------
pgaudit.log = 'ALL'
pgaudit.log_catalog = off
pgaudit.log_level = log
pgaudit.log_parameter = on
pgaudit.log_relation = on
pgaudit.log_statement_once = off
pgaudit.role = 'auditmrole'

検証データ作成

下記サイトを参考にしました。

auditmroleマスターロールの作成

オブジェクト監査ロギングの対象ロールとして auditmrole マスターロールを作成します。

CREATE ROLE auditmrole;

マスターロールへの権限の付与

auditmrole マスターロールに table1 テーブルの t1 カラムへの SELECT の権限を与えます。

CREATE TABLE table1 (id int, t1 text);

INSERT INTO table1 VALUES (1, 'aaa'),(2, 'bbb');

SELECT * FROM table1;

GRANT SELECT (t1) on table1 to auditmrole;

マスターロールでの種々の操作と監査ログ

t1 カラムを含む SELECT と t1 カラムを含まない SELECT を実施します。

検証
SELECT * FROM table1;

SELECT id FROM table1;

SELECT id,t1 FROM table1;

auditmrole ロールに与えられた権限の通り、t1 カラムを含む SELECT は記録(AUDIT_TYPEOBJECT)されましたが、t1 カラムを含まないidカラムのみの SELECT 文は記録されませんでした。このようにオブジェクト監査ロギングでは auditmrole ロールに与えられた権限のみが PostgreSQL ログに記録されますので詳細なレベルで取得する情報を設定できます。

ログ
2025-06-22 23:20:29.253 JST [16948] LOG:  AUDIT: OBJECT,17,1,READ,SELECT,TABLE,test.table1,SELECT * FROM table1,<none>
2025-06-22 23:20:29.253 JST [16948] LOG:  AUDIT: SESSION,17,1,READ,SELECT,TABLE,test.table1,SELECT * FROM table1,<none>
2025-06-22 23:20:34.568 JST [16948] LOG:  AUDIT: SESSION,18,1,READ,SELECT,TABLE,test.table1,SELECT id FROM table1,<none>
2025-06-22 23:20:38.236 JST [16948] LOG:  AUDIT: OBJECT,19,1,READ,SELECT,TABLE,test.table1,"SELECT id,t1 FROM table1",<none>
2025-06-22 23:20:38.236 JST [16948] LOG:  AUDIT: SESSION,19,1,READ,SELECT,TABLE,test.table1,"SELECT id,t1 FROM table1",<none>

最後に

pg_hint_planの経験があったので、比較的スムーズにビルドすることが出来ました。
簡易的なテストしかしていませんが、問題ないかと思います。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?