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 10
監査の課題と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
_once
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

PostreSQL監査

  • 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 10 監査の課題と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 _once 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