More Related Content
Similar to PostgreSQL監査 (20)
PostgreSQL監査
- 1. Copyright © 2015 NTT DATA Corporation
2015年5月30日
NTTデータ 基盤システム事業本部
石井愛弓
PostgreSQL監査
PostgreSQLアンカンファレンス@東京
2015/5
- 2. 2Copyright © 2015 NTT DATA Corporation
目次
• 監査とは
• PostgreSQLの監査
• 監査の課題
• pg_audit紹介
• まとめ
- 3. 3Copyright © 2015 NTT DATA Corporation
監査とは
実際の業務が遵守すべきルールに則っているかどうかを、客観的に検証・指摘
する業務。
DBにおいては、不正アクセス・不正操作が無かったかどうか等の判断
を行う
• 監査情報は、アクセス/操作ログ。
• 不正なログインをしていないか?
• 重要な情報(クレジットカード情報等)を不正に抜き出していないか?…
etc
→ログは、部外者が閲覧や改ざんできないよう保護を行う。
・ログを確実にとること
・ログが改ざんされないようにすること
[DBの監査で重要なこと]
- 5. 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);
- 6. 6Copyright © 2015 NTT DATA Corporation
監査で必要な情報は何か?(log_statement以外の項目)
1 いつ タイムスタンプ
2 だれが データベースユーザ名
3 どこから 接続元IP/接続元ホスト名
4 どのデータベースに データベース名
5 どんな処理をして コマンドタグ
6
どのような結果になっ
たか
SQLSTATE エラーコード
- 7. 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 コマンドタグ エラーコード
- 8. 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
何も出力しません。 非セッションプロセスではこのエスケープ以
降の出力を停止します。 セッションプロセスでは無視されます。
×
%% %文字そのもの ×
- 9. 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
- 11. 11Copyright © 2015 NTT DATA Corporation
監査におけるPostgreSQLの現在の課題の例
• テーブル単位、列単位で監査できない
• 大規模データベースでは、監査する対象を絞り込まないと、ログ出力量
が大きくなってしまう
• 監査対象のSQLを細かく指定(READのみ、FUNCTIONのみ等)できない
• View、トリガ、doコマンド、PL/pgSQLの内部のコマンドが監査がで
きない
• ログで出力されるテーブル名にスキーマ名が修飾されない
• 別スキーマの同名テーブルと区別できない
- 12. 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されました。
- 13. 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;
コマンド
の種類
ごと
オブジェ
クトごと
- 14. 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よりも、より詳細な情報が得られる。
- 15. 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();
- 16. 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として省略する
か)
- 17. 17Copyright © 2015 NTT DATA Corporation
pg_auditを使ってもできないことの例
• スーパーユーザの監査
• SET文等でパラメータを変更しログを出さないようにする、など
• OSユーザの監査
• postgresql.confの書き換えてログを出さないようにする、など
- 18. 18Copyright © 2015 NTT DATA Corporation
pg_audit使いどころ まとめ
• テーブル単位、列単位で監査したい
• 監査対象のSQLを細かく指定したい(READのみ,FUNCTIONのみ等)
• View, トリガ, doコマンド, PL/pgSQLの内部の処理を監査したい
• テーブル名がスキーマ名で修飾されるようにしたい
- 19. 19Copyright © 2015 NTT DATA Corporation
PostgreSQL監査まとめ
• PostgreSQLの監査で、できること・できないことを知る
• 必要に応じて、外部モジュールやOSのログと併せて、監査を行う
OS
PostgreSQL
外部モジュール