ページの先頭行へ戻る
Enterprise Postgres 15 セキュリティ運用ガイド

6.4 Session Audit Logging

Session Audit Loggingでは、pgaudit設定ファイル内のruleセクションで、出力するログを絞り込むためのルールを指定します。

ルールは、以下の形式で指定します。値はカンマ区切りで複数指定できます。

ruleセクションに[rule]のみ記載し、パラメータを指定しない場合、すべての監査ログが出力されます。

[output]
logger = 'auditlog'
[rule]

また、ruleセクションを記載しない([rule]を記載しない)場合、監査ログは出力されません。

[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”を参照。

  • BACKUP

  • CONNECT

  • DDL

  • ERROR

  • FUNCTION

  • MISC

  • READ

  • ROLE

  • WRITE

  • SYSTEM

class = 'READ, WRITE'

object_type

オブジェクトの種類。

classパラメータが“READ”および“WRITE”の場合に有効になります。

以下から選択します。複数指定が可能です。

  • TABLE

  • INDEX

  • SEQUENCE

  • TOAST_VALUE

  • VIEW

  • MATERIALIZED_VIEW

  • COMPOSITE_TYPE

  • FOREIGN_TABLE

  • FUNCTION

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'


timestamp

ログ出力の対象を、「開始時刻」から「終了時刻」までのタイムスタンプの範囲で指定します。指定形式は、'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

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セクションの評価

出力形式

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パラメータの値により、以下の出力内容となります。

  • log_parameter=onを指定

    SQLにパラメータを指定している場合は、パラメータの値が空白区切りで連結されて出力されます。
    SQLにパラメータを指定していない場合は、<none>が出力されます。

  • log_parameter=off(デフォルト)を指定

    <not logged>が出力されます。

また、pgaudit設定ファイルのoptionセクションのlog_statement_onceパラメータに“on”を指定している場合、2回目以降は<previously logged>が出力されます。

参考

以下の機能を利用した資源にアクセスする場合、(12)のコマンドタグが???として出力される場合があります。

  • INSTEAD OFトリガ

  • RULE

  • VIEW

  • 行単位のセキュリティポリシー

  • テーブルの継承

使用

Session Audit Loggingで、監査ログを取得する例を示します。

1.設定

pgaudit設定ファイルに、以下のruleセクションを指定します。

[rule]
class = 'READ, WRITE'
object_name = 'myschema.account'

2.ログを取得

以下の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>