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

6.5 Object Audit Logging

Object Audit Loggingでは、ロールを使用することで、監査ログの取得を実現しています。

optionセクションのroleパラメータで、監査ログ取得のためのロールを指定します。ロールに実行されたコマンドの権限がある場合、また、別のロールから権限が継承されている場合、そのコマンドの操作を監査ログとして出力します。

たとえば、optionセクションのroleパラメータに“auditor”を設定後、accountテーブル対するSELECT権限とDELETE権限を“auditor”に付与します。この場合、accountテーブルに対し、SELECTまたはDELETEが実行されると、監査ログが出力されます。

出力形式

Object Audit Loggingでは、監査ログが以下の形式で出力されます。

AUDIT: OBJECT,1,1,READ,SELECT,TABLE,public.account,SELECT password FROM account;,<not logged>
     (1)    (2)(3)(4)  (5)    (6)        (7)               (8)                   (9)

No

出力内容

(1)

ログのヘッダー。

“AUDIT: OBJECT”で固定です。

(2)

ステートメントID

(3)

サブステートメントID

(4)

クラス名

(5)

コマンドタグ

(6)

オブジェクトタイプ

(7)

オブジェクト名

(8)

SQL。

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

(9)

pgaudit設定ファイルのoptionセクションのlog_parameterパラメータの値により、以下の出力内容となります。

  • log_parameter=onを指定

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

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

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

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

参考

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

  • INSTEAD OFトリガ

  • RULE

  • VIEW

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

  • テーブルの継承

Object Audit Loggingでログを取得する例を示します。

ロールに対し、権限を付与する対象を細かく設定することで、ログの出力を制御することができます。

以下の例では、accountテーブルのログ取得は、列に付与された権限で制御されますが、account_role_mapテーブルのログ取得は、テーブルに付与された権限に対して制御されます。


1.設定

pgaudit設定ファイルのoptionセクションに、以下のroleパラメータを指定します。

[option]
role = 'auditor'

2.ロールの定義

Object Audit Loggingのためのロールを定義します。

CREATE USER auditor NOSUPERUSER LOGIN;

3.ログを取得

以下のSQLをクライアントから実行します。

CREATE TABLE account
(
    id int,
    name text,
    password text,
    description text
);
GRANT SELECT (password) ON public.account TO auditor;
SELECT id, name FROM account;
SELECT password FROM account;
GRANT UPDATE (name, password) ON public.account TO auditor;
UPDATE account SET description = 'yada, yada';
UPDATE account SET password = 'HASH2';
CREATE TABLE account_role_map
(
    account_id int,
    role_id int
);
GRANT SELECT ON public.account_role_map TO auditor;
SELECT account.password, account_role_map.role_id
  FROM account
  INNER JOIN account_role_map ON account.id = account_role_map.account_id;

以下の監査ログが取得できます。

acoountテーブルでは、権限が付与されている列に対する操作のみがログとして出力されます。

account_role_mapテーブルでは、テーブルに対して権限が付与されているため、テーブルに対する操作がログとして出力されます。

AUDIT: OBJECT,4,1,READ,SELECT,TABLE,public.account,SELECT password FROM account;,<not logged>
AUDIT: OBJECT,7,1,WRITE,UPDATE,TABLE,public.account,UPDATE account SET password = 'HASH2';,<not logged>
AUDIT: OBJECT,10,1,READ,SELECT,TABLE,public.account,"SELECT account.password, account_role_map.role_id
        FROM account
        INNER JOIN account_role_map ON account.id = account_role_map.account_id;",<not logged>
AUDIT: OBJECT,10,1,READ,SELECT,TABLE,public.account_role_map,"SELECT account.password, account_role_map.role_id
        FROM account
        INNER JOIN account_role_map ON account.id = account_role_map.account_id;",<not logged>