Session Audit Loggingでは、pgaudit設定ファイル内のruleセクションで、出力するログを絞り込むためのルールを指定します。
ルールは、以下の形式で指定します。値はカンマ区切りで複数指定できます。
パラメータ名 = '値'
パラメータ名 != '値'
ruleセクションに[rule]のみ記載し、パラメータを指定しない場合、すべてのSession Audit Loggingの監査ログが出力されます。
[output] logger = 'auditlog' [rule]
また、セクションに[rule]の行を記載しない場合は、 Session Audit Loggingの監査ログが出力されません。
[output] logger = 'auditlog'
ruleセクションで指定可能なパラメータを下表に示します。
| パラメータ名 | 説明 | 指定例 | 
|---|---|---|
| timestamp | タイムスタンプの範囲。 指定形式については、“timestamp”を参照してください。 | timestamp = '09:00:00 - 10:00:00, 18:00:00 - 18:30:00' | 
| database | データベース名。 空の値を指定する場合は、値の代わりに二重引用符を2つ続けて指定("")してください。大文字、キーワード、マルチバイト文字およびカンマを指定する場合は、二重引用符で囲んでください。 | database = 'product_db' | 
| audit_role | ロール名。 空の値を指定する場合は、値の代わりに二重引用符を2つ続けて指定("")してください。大文字、キーワード、マルチバイト文字およびカンマを指定する場合は、二重引用符で囲んでください。 | audit_role = 'appuser1' | 
| class | 操作のクラス。 以下から選択します。複数指定が可能です。各クラスの意味については、“class”を参照。 
 | class = 'READ, WRITE' | 
| object_type | オブジェクトの種類。 classパラメータが“READ”および“WRITE”の場合に有効になります。 以下から選択します。複数指定が可能です。 
 | object_type = 'TABLE, INDEX' | 
| object_name | オブジェクト名。 classパラメータが“READ”および“WRITE”の場合に有効になります。 テーブルなどスキーマ修飾できるオブジェクトは、スキーマ名で修飾してください。 大文字、キーワード、マルチバイト文字およびカンマを指定する場合は、二重引用符で囲んでください。“スキーマ名.テーブル名”といったオブジェクト名を指定する場合は、スキーマ名修飾したオブジェクト名全体を二重引用符で囲んでください。 空の値を指定する場合は、値の代わりに二重引用符を2つ続けて指定("")してください。 | object_name = 'myschema.tbl1' object_name = '"myschema.テーブル1"' object_name = 'myschema.tbl1, "マイスキーマ.TABLE"' | 
| application_name | アプリケーション名。 空の値を指定する場合は、値の代わりに二重引用符を2つ続けて指定("")してください。 | application_name = 'myapp' | 
| remote_host | 接続元(クライアント側)のホスト名またはIPアドレス。 postgresql.confファイルのlog_hostnameパラメータに“on”を指定している場合は、ホスト名を指定してください。それ以外の場合は、IPアドレスを指定してください。なお、ローカルホストの場合は“[local]”を指定してください。 空の値を指定する場合は、値の代わりに二重引用符を2つ続けて指定("")してください。 | remote_host = 'ap_server' | 
ログ出力の対象を、「開始時刻」から「終了時刻」までのタイムスタンプの範囲で指定します。指定形式は、'hh:mm:dd-hh:mm:dd'(hhは24時間表記、また、hh、mm、ddは2桁で表記)です。
開始のタイムスタンプは、終了のタイムスタンプよりも小さい値を指定する必要があります。複数の範囲を指定する場合はタイムスタンプの開始と終了をコンマで区切ります。
終了時刻は、終了時刻のタイムスタンプのミリ秒までが対象となります。たとえば、'11:00:00 - 11:59:59'と指定した場合は、「11:00:00:000」から「11:59:59:999」までを対象とします。
pgauditのruleセクション内の評価で使用されたタイムスタンプは、ログエントリで発行されたタイムスタンプとは異なります。ログエントリは、pgauditの評価後に出力され、その時点でタイムスタンプが生成されるためです。
classパラメータで指定するクラスの意味は、下記のとおりです。
READ: SELECT、COPY FROM
WRITE: INSERT、UPDATE、DELETE、TRUNCATE、COPY TO
FUNCTION: 関数呼び出し、DO
ROLE: GRANT、REVOKE、CREATE ROLE、ALTER ROLE、DROP ROLE
DDL: ROLEクラスのDDL以外のすべてのDDL (CREATE...、ALTER...など)
CONNECT: 接続に関するイベント(要求、認証、切断)
SYSTEM: インスタンスの起動、プライマリサーバへの昇格
BACKUP: pg_basebackup
ERROR: エラーで終了したイベント(PostgreSQLのエラーコードが00以外)。postgresql.confのlog_min_messagesパラメータがERROR以下に設定されている場合に使用可能。
MISC: その他のコマンド (DISCARD、FETCH、CHECKPOINT、VACUUMなど)
ruleセクションの評価
ログイベントが発生すると、ruleセクション内のすべての式が一度に評価されます。ログエントリは、ruleセクション内のすべてのパラメータがtrue(真)と評価された場合にのみ出力されます。
たとえば、以下のルールが設定されていた場合、'apserver'が'myschema.tbl1'に対して行った操作のうち、午前10時から午前11時の間のクラス'WRITE'以外に対応する操作が監査ログとして出力されます。
[rule] timestamp = '10:00:00-11:00:00' remote_host = 'apserver' object_name = 'myschema.tbl1' class != 'WRITE'
pgaudit設定ファイルでは、ruleセクションを複数定義することができます。ログイベントは、それぞれのruleセクションによって評価され、ruleセクションが一致するごとに監査ログが出力されます。
たとえば、以下のルールが設定されていた場合、重複した監査ログが出力されます。
[rule] object_name = 'myschema.tbl1' [rule] object_name = 'myschema.tbl1'
1つのruleセクション内に同一のパラメータが複数指定されていた場合、最後に指定されているパラメータが有効になります。
たとえば、以下のルールが設定されていた場合、“object_name = 'myschema.tbl3'”が有効になります。
[rule] object_name = 'myschema.tbl1' object_name = 'myschema.tbl2' object_name = 'myschema.tbl3'
出力形式
Session Audit Loggingでは、監査ログが以下の形式で出力されます。
AUDIT: SESSION,READ,2022-03-12 19:00:58 PDT,
   (1)         (2)     (3)
[local],19944,psql,appuser,postgres,2/8, 2, 1,SELECT,,TABLE,myschema.account, ,
  (4)    (5)   (6)   (7)      (8)   (9)(10)(11)(12)(13)(14)    (15)        (16)
SELECT * FROM myschema.account;,<not logged>
       (17)                      (18)| No | 出力内容 | 
|---|---|
| (1) | ログのヘッダー。 “AUDIT: SESSION”で固定です。 | 
| (2) | クラス | 
| (3) | SQLの開始時間 | 
| (4) | リモートホスト名。 ローカルホストの場合は、[local]が出力されます。 | 
| (5) | バックエンドプロセスID | 
| (6) | アプリケーション名。 アプリケーション名が指定されていない場合は、[unknown]が出力されます。 | 
| (7) | ユーザー名 | 
| (8) | データベース名 | 
| (9) | 仮想トランザクションID | 
| (10) | ステートメントID | 
| (11) | サブステートメントID | 
| (12) | コマンドタグ | 
| (13) | SQLSTATE | 
| (14) | オブジェクトタイプ | 
| (15) | オブジェクト名 | 
| (16) | エラーメッセージ | 
| (17) | SQL。 CREATE ROLEなどSQLにパスワードが含まれている場合は、<REDACTED>に置換えられます。 また、pgaudit設定ファイルのoptionセクションのlog_statement_onceパラメータに“on”を指定している場合、2回目以降は<previously logged>が出力されます。 | 
| (18) | pgaudit設定ファイルのoptionセクションのlog_parameterパラメータの値により、以下の出力内容となります。 
 また、pgaudit設定ファイルのoptionセクションのlog_statement_onceパラメータに“on”を指定している場合、2回目以降は<previously logged>が出力されます。 | 
参考
以下の機能を利用した資源にアクセスする場合、(12)のコマンドタグが???として出力される場合があります。
INSTEAD OFトリガ
RULE
VIEW
行単位のセキュリティポリシー
テーブルの継承
使用例
Session Audit Loggingで、監査ログを取得する例を示します。
pgaudit設定ファイルに、以下のruleセクションを指定します。
[rule] class = 'READ, WRITE' object_name = 'myschema.account'
以下のSQLをクライアントから実行します。
CREATE TABLE myschema.account
(
    id int,
    name text,
    password text,
    description text
);
INSERT INTO myschema.account (id, name, password, description) VALUES (1, 'user1', 'HASH1', 'blah, blah');
SELECT * FROM myschema.account;以下の監査ログが取得できます。
classパラメータに'DDL'が定義されていないため、CREATE TABLEは監査ログとして出力されません。
AUDIT: SESSION,WRITE,2022-03-12 19:00:49 PDT,[local],19944,psql,appuser,postgres,2/7,1,1,INSERT,,TABLE,myschema.account,,"INSERT INTO myschema.account (id, name, password, description) VALUES (1, 'user1', 'HASH1', 'blah, blah');",<not logged> AUDIT: SESSION,READ,2022-03-12 19:00:58 PDT,[local],19944,psql,appuser,postgres,2/8,2,1,SELECT,,TABLE,myschema.account,,SELECT * FROM myschema.account;,<not logged>