18. 18Copyright?2015 NTT corp. All Rights Reserved.
サーバログを監査ログとして使う上での課題
1.Do文利用時
ログ出力例(log_statement = all):
SQL例:
監査するのが大変なログ問題
LOG: statement: DO $$
BEGIN
EXECUTE 'SELECT * FROM import' || 'ant_table';
END $$;
testdb=# DO $$
BEGIN
EXECUTE 'SELECT * FROM import' || 'ant_table';
END $$;
ログ分析時に’important_table’で検索しても上記のSELECTは発見
できない。
19. 19Copyright?2015 NTT corp. All Rights Reserved.
サーバログを監査ログとして使う上での課題
2.PREPARE文利用時
ログ出力例(log_statement = all, log_error_verbosity = default):
SQL例:
監査するのが大変なログ問題
testdb=# PREPARE test (int) AS SELECT * FROM
pgbench_accounts WHERE aid = $1;
...
testdb=# EXECUTE test (3);
このようなログでは、どのようなテーブルにどのようなクエリが投げら
れたかを確認するのは大変。
LOG: statement: PREPARE test (int) AS
SELECT * FROM pgbench_accounts WHERE aid = $1;
...
LOG: statement: EXECUTE test (3);
DETAIL: prepare: PREPARE test (int) AS SELECT * FROM
pgbench_accounts WHERE aid = $1;
20. 20Copyright?2015 NTT corp. All Rights Reserved.
サーバログを監査ログとして使う上での課題
3.異なるスキーマの同一名テーブル判別不可
ログ出力例(log_statement = all):
SQL例その1:
監査するのが大変なログ問題
testdb=# CREATE TABLE schm1.tbl();
testdb=# CREATE TABLE schm2.tbl();
testdb=# SET search_path TO schm1;
testdb=# SELECT * FROM tbl;
search_pathが設定されていた場合、上記のようにSQLの実行対象が
判別不可。
LOG: statement: CREATE TABLE schm1.tbl();
LOG: statement: CREATE TABLE schm2.tbl();
LOG: statement: SET search_path TO schm1;
LOG: statement: SELECT * FROM tbl;
21. 21Copyright?2015 NTT corp. All Rights Reserved.
サーバログを監査ログとして使う上での課題
性能低下
ログ出力対象の範囲は一番小さい粒度でも
? データベースごと
? ロールごと
大量のログ出力に伴う性能低下の恐れ
=>監査要件に必要な最小限の情報のみ出力したい
例えば...
特定のテーブル、列に関するSELECTのみ出力
35. 35Copyright?2015 NTT corp. All Rights Reserved.
Object Auditingについて
postgresql.conf(ロール名は任意)
LOG: AUDIT: OBJECT,19,1,READ,SELECT,TABLE,public.pgbench_accounts,
SELECT * FROM pgbench_accounts JOIN pgbench_branches
ON (pgbench_accounts.bid = pgbench_branches.bid);,<none>
表単位のログ出力設定例
shared_preload_libraries = pgaudit
pgaudit.role = 'auditor‘
出力例
SQL実行:
testdb=# SELECT * FROM pgbench_accounts JOIN pgbench_branches
ON (pgbench_accounts.bid = pgbench_branches.bid);
出力結果:pgbench_branchesに関するログは出力されていない
auditorロールを作成。ログを出力したいオブジェクトに対する権限を設定。
testdb=# CREATE ROLE auditor;
testdb=# GRANT SELECT ON pgbench_accounts TO auditor;
36. 36Copyright?2015 NTT corp. All Rights Reserved.
Object Auditingについて
LOG: AUDIT: OBJECT,21,1,READ,SELECT,TABLE,public.pgbench_accounts,
SELECT aid FROM pgbench_accounts;,<none>
LOG: AUDIT: SESSION,21,1,READ,SELECT,TABLE,public.pgbench_accounts,
SELECT aid FROM pgbench_accounts;,<none>
LOG: AUDIT: SESSION,22,1,READ,SELECT,TABLE,public.pgbench_accounts,
select bid from pgbench_accounts;,<none>
列単位のログ出力設定例
出力例
SQL実行:
testdb=# SELECT aid FROM pgbench_accounts;
testdb=# SELECT bid FROM pgbench_accounts;
出力結果:bid列に関するObjectログは出力されていない
auditorロールにpgbench_accountsのSELECT権限のみ付与
testdb=# GRANT SELECT (aid) ON pgbench_accounts TO auditor;
確認のため“pgaudit.log=READ”を設定。
sessionログは上記の2クエリに対して出力されている。
40. 40Copyright?2015 NTT corp. All Rights Reserved.
pgauditはサーバログの課題を解決可能か?
1.Do文利用時
ログ出力例(pgaudit.log = READ):
SQL例:
監査するのが大変なログ問題
LOG: AUDIT: SESSION,2,1,READ,SELECT,TABLE,
public.important_table,
SELECT * FROM important_table,<none>
testdb=# DO $$
BEGIN
EXECUTE 'SELECT * FROM import' || 'ant_table';
END $$;
オブジェクト名としてテーブル名が表示されている。
DO文の中で実行されたSQLが出力されている。
特定のテーブルに対するSELECT操作であることを容易に確認可。
41. 41Copyright?2015 NTT corp. All Rights Reserved.
pgauditはサーバログの課題を解決可能か?
2.PREPARE文利用時
ログ出力例(pgaudit.log = READ):
SQL例その2:
監査するのが大変なログ問題
testdb=# PREPARE test (int) AS SELECT * FROM
pgbench_accounts WHERE aid = $1;
...
testdb=# EXECUTE test (3);
pgbench_accountsに対して“aid=3”の条件で
SELECTが実行されたことが1行のログで確認可能。
LOG: AUDIT: SESSION,5,1,READ,SELECT,TABLE,
public.pgbench_accounts,PREPARE test (int)
AS SELECT * FROM pgbench_accounts
WHERE aid = $1;,3
42. 42Copyright?2015 NTT corp. All Rights Reserved.
pgauditはサーバログの課題を解決可能か?
3.異なるスキーマの同一名テーブル判別不可
ログ出力例(pgaudit.log = READ):
SQL例その1:
監査するのが大変なログ問題
testdb=# CREATE TABLE schm1.tbl();
testdb=# CREATE TABLE schm2.tbl();
testdb=# SET search_path TO schm1;
testdb=# SELECT * FROM tbl;
search_pathが設定されていたとしても、schm1スキーマの
テーブルに対してSELECTが実行されていることが1行のログで
確認可能。
LOG: AUDIT: SESSION,4,1,READ,SELECT,TABLE,schm1.tbl,
SELECT * FROM tbl;,<none>
66. 66Copyright?2015 NTT corp. All Rights Reserved.
付録B:pgauditのインストール
? PostgreSQLのインストール
? pgauditのインストール
# git clone https://github.com/postgres/postgres.git
# git checkout REL9_5_STABLE
# ./configure
# make install -s
# cd contrib
# git clone https://github.com/pgaudit/pgaudit.git
# cd pgaudit
# make -s check
# make install
67. 67Copyright?2015 NTT corp. All Rights Reserved.
付録B:pgaudit その他の設定
? pgaudit.log_relation
セッションログ利用時に使用するパラメータ。
オブジェクトタイプ、オブジェクトネームを出力するかどうかを
設定。Object Auditing を利用している場合、必要ないのであれ
ば出力させない。
? 設定例
pgaudit.log_relation = on (default: off)
? 出力例
LOG: AUDIT: SESSION,1,1,MISC,BEGIN,,,BEGIN;,<not logged>
LOG: AUDIT: SESSION,2,1,WRITE,UPDATE,TABLE,public.pgbench_accounts,
UPDATE pgbench_accounts SET bid = '4'
WHERE aid = '1';,<not logged>
LOG: AUDIT: SESSION,3,1,MISC,COMMIT,,,COMMIT;,<not logged>
68. 68Copyright?2015 NTT corp. All Rights Reserved.
付録B:pgaudit その他の設定
? pgaudit.log_parameter
SQL中のパラメータで渡した値を出力する。
? 設定例
pgaudit.log_parameter = on(default: off)
? 出力例
LOG: AUDIT: SESSION,1,1,READ,PREPARE,,,PREPARE test (int) AS SELECT * FROM pgbench_accounts where aid =
$1;,<none>
LOG: AUDIT: SESSION,2,1,READ,SELECT,TABLE,public.pgbench_accounts,PREPARE test (int) AS SELECT * FROM
pgbench_accounts where aid = $1;,1
LOG: AUDIT: SESSION,2,2,MISC,EXECUTE,,,EXECUTE test (1);,<none>
LOG: AUDIT: SESSION,1,1,READ,PREPARE,,,PREPARE test (int) AS SELECT * FROM pgbench_accounts where aid =
$1;,<not logged>
LOG: AUDIT: SESSION,2,1,READ,SELECT,TABLE,public.pgbench_accounts,PREPARE test (int) AS SELECT * FROM
pgbench_accounts where aid = $1;,<not logged>
LOG: AUDIT: SESSION,2,2,MISC,EXECUTE,,,EXECUTE test (1);,<not logged>
ON設定時
OFF設定時