Copyright © 2015 NTT DATA Corporation
2015年5月30日
NTTデータ 基盤システム事業本部
石井愛弓
PostgreSQL監査
PostgreSQLアンカンファレンス@東京 
2015/5
2Copyright © 2015 NTT DATA Corporation
目次
•  監査とは
•  PostgreSQLの監査
•  監査の課題
•  pg_audit紹介
•  まとめ
3Copyright © 2015 NTT DATA Corporation
監査とは
実際の業務が遵守すべきルールに則っているかどうかを、客観的に検証・指摘
する業務。
DBにおいては、不正アクセス・不正操作が無かったかどうか等の判断
を行う
•  監査情報は、アクセス/操作ログ。
•  不正なログインをしていないか?
•  重要な情報(クレジットカード情報等)を不正に抜き出していないか?…
etc
→ログは、部外者が閲覧や改ざんできないよう保護を行う。
・ログを確実にとること
・ログが改ざんされないようにすること
[DBの監査で重要なこと]
Copyright © 2015 NTT DATA Corporation 4
PostgreSQL監査
5Copyright © 2015 NTT DATA Corporation
どのタイミングでログを出力すべきか?
項目 必要な設定
1 ログイン log_connections=on
2
ログアウト log_disconnections =on
3
DBオブジェクト(テーブル等)の作成、
変更
log_statement=ddl
4
DBオブジェクト(テーブル等)の参照、
更新
log_statement=all
5 設定ファイル(postgresql.conf)の変更 OSでの監査が必要。
=# CREATE TABLE test (id integer, name varchar);
LOG: statement: CREATE TABLE test (id integer, name varchar);
6Copyright © 2015 NTT DATA Corporation
監査で必要な情報は何か?(log_statement以外の項目)
1 いつ タイムスタンプ
2 だれが データベースユーザ名
3 どこから 接続元IP/接続元ホスト名
4 どのデータベースに データベース名
5 どんな処理をして コマンドタグ
6
どのような結果になっ
たか
SQLSTATE エラーコード
7Copyright © 2015 NTT DATA Corporation
log_line_prefixによる情報の取得
postgresql.conf にて
log_line_prefix = ‘%t  %u  %h  %d  %i  %e‘
2015-05-19 15:21:37 JST  hoge  [local]  postgres  authentication 00000
タイムスタンプ ユーザ ホスト DB コマンドタグ エラーコード
8Copyright © 2015 NTT DATA Corporation
(参考)log_line_prefix
エスケープ 効果 セッションのみ
%a アプリケーション名 ○
%u ユーザ名 ○
%d データベース名 ○
%r 遠隔ホスト名、またはIPアドレス、およびポート番号 ○
%h 遠隔ホスト名、またはIPアドレス ○
%p プロセス識別子 ×
%t ミリ秒無しのタイムスタンプ ×
%m ミリ秒付きタイムスタンプ ×
%i コマンドタグ。セッションの現在のコマンド種類 ○
%e SQLSTATE エラーコード ×
%c セッションID。下記参照 ×
%l
各セッションまたは各プロセスのログ行の番号。1から始まりま
す。
×
%s プロセスの開始タイムスタンプ ×
%v 仮想トランザクションID(backendID/localXID) ×
%x トランザクションID (未割り当ての場合は0) ×
%q
何も出力しません。 非セッションプロセスではこのエスケープ以
降の出力を停止します。 セッションプロセスでは無視されます。
×
%% %文字そのもの ×
9Copyright © 2015 NTT DATA Corporation
一通りの監査をするための設定のまとめ
ログイン/ログアウト、DBオブジェクトの参照の監査が必要な場合、
少なくとも以下の設定を実施する。
postgresql.conf
•  log_line_prefix = ‘%t  %u  %h  %d  %i  %e‘
•  log_connections=on
•  log_disconnections =on
•  log_statement=all
Copyright © 2015 NTT DATA Corporation 1
監査の課題とpg_audit
11Copyright © 2015 NTT DATA Corporation
監査におけるPostgreSQLの現在の課題の例
•  テーブル単位、列単位で監査できない
•  大規模データベースでは、監査する対象を絞り込まないと、ログ出力量
が大きくなってしまう
•  監査対象のSQLを細かく指定(READのみ、FUNCTIONのみ等)できない
•  View、トリガ、doコマンド、PL/pgSQLの内部のコマンドが監査がで
きない
•  ログで出力されるテーブル名にスキーマ名が修飾されない
•  別スキーマの同名テーブルと区別できない
12Copyright © 2015 NTT DATA Corporation
そこで、pg_audit
2015/05 、pg_auditがcontribモジュールとしてコミットされた。(PostgreSQL9.5)
 監査機能を充実させるためのモジュール
•  詳細なログ出力
•  テーブル単位、列単位監査
•  トリガ等内部処理のログ取得
[インストール方法]
$ make
# make install
shared_preload_libraries =‘pg_audit’  
5/29、revertされました。
13Copyright © 2015 NTT DATA Corporation
pg_audit紹介:ログの種類
•  SESSIONログ
•  細かい粒度で出力するログを設定できる(DDL, FUNCTION, MISC,
READ, ROLE, WRITE, NONE, ALL)
•  テーブルのスキーマ名を取得できる
•  View、トリガ、doコマンド、PL/pgSQLの内部コマンドのログも取得で
きる
•  OBJECTログ
•  OBJECT(テーブル、列)ごとにログを出力できる
→必要な機能を持つ一方のログ、または両方のログを選んで、監査を実施で
きる。
<ケース①>
ü  すべてのDDLをログ出力したい。
ü  credit_cardテーブルは、SELECTもログ出力したい。
pg_audit.log = ‘ddl’
pg_audit.role = ‘audit_user’
=# GRANT ALL ON credit_card TO audit_user;
コマンド
の種類
ごと
オブジェ
クトごと
14Copyright © 2015 NTT DATA Corporation
pg_audit紹介:ログの中身①
LOG: AUDIT: SESSION,8,1,READ,SELECT,,,"select * from
test,test2;",<none>
LOG: AUDIT: OBJECT,8,1,READ,SELECT,TABLE,public.test, 
<previously logged>,<previously logged>
LOG: AUDIT: <ログの種類>, <statementID>, <substatementID>,
<コマンドの種類1>, <コマンドの種類2>,<オブジェクトの種類>, <オブジェクト
名(スキーマ名付)>,<コマンド>,<パラメータ>
postgres=# select * from test,test2;
statementID:メイン文が発行されるごとに振られる連番。コネクション開始時は1。
substatementID:メイン文の中で、サブ文に振られる連番。最初は1。(関数使用時などは2,3と
続く)
LOG: statement: select * from test,test2;
↑log_statementよりも、より詳細な情報が得られる。
15Copyright © 2015 NTT DATA Corporation
pg_audit紹介:ログの中身②
postgres=# SELECT hoge();
LOG: AUDIT: SESSION,19,1,READ,SELECT,,,SELECT hoge();,<none>
LOG: AUDIT: SESSION,19,2,FUNCTION,EXECUTE,FUNCTION,public.hoge,SELECT
hoge2();,<none>
LOG: AUDIT: SESSION,19,3,MISC,REINDEX,,, REINDEX INDEX test2_idx ;SELECT
count(*) from test2;,<none>
LOG: AUDIT: OBJECT,19,4,READ,SELECT,TABLE,public.test2, REINDEX INDEX
test2_idx ;SELECT count(*) from test2;,<none>
LOG: AUDIT: SESSION,19,4,READ,SELECT,TABLE,public.test2,<previously
logged>,<previously logged>
CREATE FUNCTION hoge () returns bigint AS $$
REINDEX INDEX test2_idx;
SELECT count(*) from test2;
$$language 'sql';
① ②
④
③
LOG: statement: SELECT hoge();
16Copyright © 2015 NTT DATA Corporation
pg_audit紹介:その他いろいろな設定
パラメータ
取りうる値 デフォル
ト
説明
pg_audit.log
DDL, FUNCTION,
MISC, READ, ROLE,
WRITE, NONE, ALL
none 監査するSQL等の種類
pg_audit.role ユーザ名の文字列 “” 監査用ユーザを指定する。
pg_audit.log_catalog bool true pg_catalogのログを出力するか?
pg_audit.log_level
LOG, NOTICE,
WARNING, ERRORな
どログレベル各種
LOG リグレッションテストの際にNOTICEに
してクライアントにログ出力する。そ
れ以外はLOGなどでサーバログにて出
力する。
pg_audit.log_parameter
bool false PreparedStatementのパラメータをログ
に出力するか?
pg_audit.log_relation
bool false SESSIONログをリレーションごとに出
したい場合はtrue
→select * from test, test2のとき、2つ
出すか、1つだすか?
pg_audit.log_statement_o
nce
bool false OBJECTログとSESSIONログで同じ
SQLのログを残す際に、共通となる部
分を繰り返し表示するかどうか(また
はpreviously loggedとして省略する
か)
17Copyright © 2015 NTT DATA Corporation
pg_auditを使ってもできないことの例
•  スーパーユーザの監査
•  SET文等でパラメータを変更しログを出さないようにする、など
•  OSユーザの監査
•  postgresql.confの書き換えてログを出さないようにする、など
18Copyright © 2015 NTT DATA Corporation
pg_audit使いどころ まとめ
•  テーブル単位、列単位で監査したい
•  監査対象のSQLを細かく指定したい(READのみ,FUNCTIONのみ等)
•  View, トリガ, doコマンド, PL/pgSQLの内部の処理を監査したい
•  テーブル名がスキーマ名で修飾されるようにしたい
19Copyright © 2015 NTT DATA Corporation
PostgreSQL監査まとめ
•  PostgreSQLの監査で、できること・できないことを知る
•  必要に応じて、外部モジュールやOSのログと併せて、監査を行う
OS
PostgreSQL
外部モジュール
Copyright © 2011 NTT DATA Corporation
Copyright © 2015 NTT DATA Corporation

PostgreSQL監査

  • 1.
    Copyright © 2015NTT DATA Corporation 2015年5月30日 NTTデータ 基盤システム事業本部 石井愛弓 PostgreSQL監査 PostgreSQLアンカンファレンス@東京  2015/5
  • 2.
    2Copyright © 2015NTT DATA Corporation 目次 •  監査とは •  PostgreSQLの監査 •  監査の課題 •  pg_audit紹介 •  まとめ
  • 3.
    3Copyright © 2015NTT DATA Corporation 監査とは 実際の業務が遵守すべきルールに則っているかどうかを、客観的に検証・指摘 する業務。 DBにおいては、不正アクセス・不正操作が無かったかどうか等の判断 を行う •  監査情報は、アクセス/操作ログ。 •  不正なログインをしていないか? •  重要な情報(クレジットカード情報等)を不正に抜き出していないか?… etc →ログは、部外者が閲覧や改ざんできないよう保護を行う。 ・ログを確実にとること ・ログが改ざんされないようにすること [DBの監査で重要なこと]
  • 4.
    Copyright © 2015NTT DATA Corporation 4 PostgreSQL監査
  • 5.
    5Copyright © 2015NTT DATA Corporation どのタイミングでログを出力すべきか? 項目 必要な設定 1 ログイン log_connections=on 2 ログアウト log_disconnections =on 3 DBオブジェクト(テーブル等)の作成、 変更 log_statement=ddl 4 DBオブジェクト(テーブル等)の参照、 更新 log_statement=all 5 設定ファイル(postgresql.conf)の変更 OSでの監査が必要。 =# CREATE TABLE test (id integer, name varchar); LOG: statement: CREATE TABLE test (id integer, name varchar);
  • 6.
    6Copyright © 2015NTT DATA Corporation 監査で必要な情報は何か?(log_statement以外の項目) 1 いつ タイムスタンプ 2 だれが データベースユーザ名 3 どこから 接続元IP/接続元ホスト名 4 どのデータベースに データベース名 5 どんな処理をして コマンドタグ 6 どのような結果になっ たか SQLSTATE エラーコード
  • 7.
    7Copyright © 2015NTT DATA Corporation log_line_prefixによる情報の取得 postgresql.conf にて log_line_prefix = ‘%t  %u  %h  %d  %i  %e‘ 2015-05-19 15:21:37 JST  hoge  [local]  postgres  authentication 00000 タイムスタンプ ユーザ ホスト DB コマンドタグ エラーコード
  • 8.
    8Copyright © 2015NTT DATA Corporation (参考)log_line_prefix エスケープ 効果 セッションのみ %a アプリケーション名 ○ %u ユーザ名 ○ %d データベース名 ○ %r 遠隔ホスト名、またはIPアドレス、およびポート番号 ○ %h 遠隔ホスト名、またはIPアドレス ○ %p プロセス識別子 × %t ミリ秒無しのタイムスタンプ × %m ミリ秒付きタイムスタンプ × %i コマンドタグ。セッションの現在のコマンド種類 ○ %e SQLSTATE エラーコード × %c セッションID。下記参照 × %l 各セッションまたは各プロセスのログ行の番号。1から始まりま す。 × %s プロセスの開始タイムスタンプ × %v 仮想トランザクションID(backendID/localXID) × %x トランザクションID (未割り当ての場合は0) × %q 何も出力しません。 非セッションプロセスではこのエスケープ以 降の出力を停止します。 セッションプロセスでは無視されます。 × %% %文字そのもの ×
  • 9.
    9Copyright © 2015NTT DATA Corporation 一通りの監査をするための設定のまとめ ログイン/ログアウト、DBオブジェクトの参照の監査が必要な場合、 少なくとも以下の設定を実施する。 postgresql.conf •  log_line_prefix = ‘%t  %u  %h  %d  %i  %e‘ •  log_connections=on •  log_disconnections =on •  log_statement=all
  • 10.
    Copyright © 2015NTT DATA Corporation 1 監査の課題とpg_audit
  • 11.
    11Copyright © 2015NTT DATA Corporation 監査におけるPostgreSQLの現在の課題の例 •  テーブル単位、列単位で監査できない •  大規模データベースでは、監査する対象を絞り込まないと、ログ出力量 が大きくなってしまう •  監査対象のSQLを細かく指定(READのみ、FUNCTIONのみ等)できない •  View、トリガ、doコマンド、PL/pgSQLの内部のコマンドが監査がで きない •  ログで出力されるテーブル名にスキーマ名が修飾されない •  別スキーマの同名テーブルと区別できない
  • 12.
    12Copyright © 2015NTT DATA Corporation そこで、pg_audit 2015/05 、pg_auditがcontribモジュールとしてコミットされた。(PostgreSQL9.5)  監査機能を充実させるためのモジュール •  詳細なログ出力 •  テーブル単位、列単位監査 •  トリガ等内部処理のログ取得 [インストール方法] $ make # make install shared_preload_libraries =‘pg_audit’   5/29、revertされました。
  • 13.
    13Copyright © 2015NTT DATA Corporation pg_audit紹介:ログの種類 •  SESSIONログ •  細かい粒度で出力するログを設定できる(DDL, FUNCTION, MISC, READ, ROLE, WRITE, NONE, ALL) •  テーブルのスキーマ名を取得できる •  View、トリガ、doコマンド、PL/pgSQLの内部コマンドのログも取得で きる •  OBJECTログ •  OBJECT(テーブル、列)ごとにログを出力できる →必要な機能を持つ一方のログ、または両方のログを選んで、監査を実施で きる。 <ケース①> ü  すべてのDDLをログ出力したい。 ü  credit_cardテーブルは、SELECTもログ出力したい。 pg_audit.log = ‘ddl’ pg_audit.role = ‘audit_user’ =# GRANT ALL ON credit_card TO audit_user; コマンド の種類 ごと オブジェ クトごと
  • 14.
    14Copyright © 2015NTT DATA Corporation pg_audit紹介:ログの中身① LOG: AUDIT: SESSION,8,1,READ,SELECT,,,"select * from test,test2;",<none> LOG: AUDIT: OBJECT,8,1,READ,SELECT,TABLE,public.test,  <previously logged>,<previously logged> LOG: AUDIT: <ログの種類>, <statementID>, <substatementID>, <コマンドの種類1>, <コマンドの種類2>,<オブジェクトの種類>, <オブジェクト 名(スキーマ名付)>,<コマンド>,<パラメータ> postgres=# select * from test,test2; statementID:メイン文が発行されるごとに振られる連番。コネクション開始時は1。 substatementID:メイン文の中で、サブ文に振られる連番。最初は1。(関数使用時などは2,3と 続く) LOG: statement: select * from test,test2; ↑log_statementよりも、より詳細な情報が得られる。
  • 15.
    15Copyright © 2015NTT DATA Corporation pg_audit紹介:ログの中身② postgres=# SELECT hoge(); LOG: AUDIT: SESSION,19,1,READ,SELECT,,,SELECT hoge();,<none> LOG: AUDIT: SESSION,19,2,FUNCTION,EXECUTE,FUNCTION,public.hoge,SELECT hoge2();,<none> LOG: AUDIT: SESSION,19,3,MISC,REINDEX,,, REINDEX INDEX test2_idx ;SELECT count(*) from test2;,<none> LOG: AUDIT: OBJECT,19,4,READ,SELECT,TABLE,public.test2, REINDEX INDEX test2_idx ;SELECT count(*) from test2;,<none> LOG: AUDIT: SESSION,19,4,READ,SELECT,TABLE,public.test2,<previously logged>,<previously logged> CREATE FUNCTION hoge () returns bigint AS $$ REINDEX INDEX test2_idx; SELECT count(*) from test2; $$language 'sql'; ① ② ④ ③ LOG: statement: SELECT hoge();
  • 16.
    16Copyright © 2015NTT DATA Corporation pg_audit紹介:その他いろいろな設定 パラメータ 取りうる値 デフォル ト 説明 pg_audit.log DDL, FUNCTION, MISC, READ, ROLE, WRITE, NONE, ALL none 監査するSQL等の種類 pg_audit.role ユーザ名の文字列 “” 監査用ユーザを指定する。 pg_audit.log_catalog bool true pg_catalogのログを出力するか? pg_audit.log_level LOG, NOTICE, WARNING, ERRORな どログレベル各種 LOG リグレッションテストの際にNOTICEに してクライアントにログ出力する。そ れ以外はLOGなどでサーバログにて出 力する。 pg_audit.log_parameter bool false PreparedStatementのパラメータをログ に出力するか? pg_audit.log_relation bool false SESSIONログをリレーションごとに出 したい場合はtrue →select * from test, test2のとき、2つ 出すか、1つだすか? pg_audit.log_statement_o nce bool false OBJECTログとSESSIONログで同じ SQLのログを残す際に、共通となる部 分を繰り返し表示するかどうか(また はpreviously loggedとして省略する か)
  • 17.
    17Copyright © 2015NTT DATA Corporation pg_auditを使ってもできないことの例 •  スーパーユーザの監査 •  SET文等でパラメータを変更しログを出さないようにする、など •  OSユーザの監査 •  postgresql.confの書き換えてログを出さないようにする、など
  • 18.
    18Copyright © 2015NTT DATA Corporation pg_audit使いどころ まとめ •  テーブル単位、列単位で監査したい •  監査対象のSQLを細かく指定したい(READのみ,FUNCTIONのみ等) •  View, トリガ, doコマンド, PL/pgSQLの内部の処理を監査したい •  テーブル名がスキーマ名で修飾されるようにしたい
  • 19.
    19Copyright © 2015NTT DATA Corporation PostgreSQL監査まとめ •  PostgreSQLの監査で、できること・できないことを知る •  必要に応じて、外部モジュールやOSのログと併せて、監査を行う OS PostgreSQL 外部モジュール
  • 20.
    Copyright © 2011NTT DATA Corporation Copyright © 2015 NTT DATA Corporation