Copyright©2015 NTT Corp. All Rights Reserved.
監査要件を有するシステムに対す
る PostgreSQL 導入の課題と可能
性
NTT OSSセンタ
大山真実
2Copyright©2015 NTT corp. All Rights Reserved.
突然ですが、、、
DBの監査って重要ですよね!
3Copyright©2015 NTT corp. All Rights Reserved.
最近の内部不正事件
引用元:IPA 「組織における内部不正対策」 http://www.ipa.go.jp/files/000047237.pdf
4Copyright©2015 NTT corp. All Rights Reserved.
最近の内部不正事件
引用元:IPA 「組織における内部不正対策」 http://www.ipa.go.jp/files/000047237.pdf
を用いて犯
行に至ることも!
5Copyright©2015 NTT corp. All Rights Reserved.
DB管理者が疑われてしまう!?
示唆した。また情報に対する侵害を分類し、漏えい(機密性)、破壊(可用性)、改ざん(完
全性)についてそれぞれ質問し、加えてパスワードの漏えいについても質問したが、結果
はほぼ同じ傾向を示した。
Q: 将来、データベースに格納されている情報をこっそり売却するかも知れない。(図 3-20)
そう思う
3.6%
ややそう思う
7.1%
どちらともい
えない
13.4%
あまりそう思
わない
10.4%
そう思わない
65.5%
引用元:DBSC 「DBA 1,000 人に聞きました」アンケート調査報告書
http://www.db-security.org/report/dbsc_dba_ver1.0.pdf
約1割のDB管理者がDBに
格納されている情報を売
却するかもしれない!?
6Copyright©2015 NTT corp. All Rights Reserved.
DB管理者が疑われてしまう!?
Q: 将来、データベースに格納されている情報をこっそり改ざんするかも知れない。(図 3-22)
そう思う
2.4%
ややそう思う
7.4%
どちらともい
えない
14.4%
あまりそう思
わない
10.7%
そう思わない
65.1%
約1割のDB管理者がDBに
格納されている情報を改
ざんするかもしれない!?
引用元:DBSC 「DBA 1,000 人に聞きました」アンケート調査報告書
http://www.db-security.org/report/dbsc_dba_ver1.0.pdf
7Copyright©2015 NTT corp. All Rights Reserved.
DB管理者が疑われてしまう!?
Q: 将来、データベースを壊して業務を妨害することがあるかも知れない。(図 3-21)
Q: 将来、データベースに格納されている情報をこっそり改ざんするかも知れない。(図 3-22)
そう思う
2.9%
ややそう思う
6.5%
どちらとも
いえない
15.5%
あまりそう
思わない
9.6%
そう思わない
65.5%
約1割のDB管理者がDBを
破壊するかもしれない!?
引用元:DBSC 「DBA 1,000 人に聞きました」アンケート調査報告書
http://www.db-security.org/report/dbsc_dba_ver1.0.pdf
8Copyright©2015 NTT corp. All Rights Reserved.
不正対策 3ポイント
1. 管理者の誘因
雇用条件/職場環境/幸福度の向上
「一般的に職場環境、雇用条件が満たされている管理者であれば
業務に対して責任を持った行動を取るはずである。」
2. 管理者の抑制
 アクセス制御/権限分掌/暗号化/鍵管理
3. 運用の実施
「2.管理者の抑制」が有効になっていることを定期的に監査・監視する仕組
み・体制
 ポリシーの制定
 監査・監視
体制/ログの取得/ログ確認/ログ保全
引用元:DBSC 「DB 内部不正対策ガイドライン」
http://www.db-security.org/report/antifraud_guide_ver1.0.pdf
9Copyright©2015 NTT corp. All Rights Reserved.
操作ログの取得が有効
引用元:IPA「組織における内部不正対策」 http://www.ipa.go.jp/files/000047237.pdf
Q. 「内部不正防止効果が期待できる対策は?」
以降、監査目的で取得するDBの操作ログのことを監査ログと呼称する。
10Copyright©2015 NTT corp. All Rights Reserved.
でもPostgreSQLって監査ログ出力機能無いですよね?
11Copyright©2015 NTT corp. All Rights Reserved.
でもPostgreSQLって監査ログ出力機能無いですよね?
log_statement = all
があるじゃない!
12Copyright©2015 NTT corp. All Rights Reserved.
log_statement = all があるじゃない!
* 2014 年度 WG3 活動報告 セキュリティ編,
https://www.pgecons.org/downloads/101
PostgreSQLエンタープライズコンソーシアムでは、PCI DSS 要
件を満たす必要があるシステムに対して、PostgreSQL を導入し
ようとした場合に、対応可能か、どのように対応すればいいかを
調査し、上記のように報告*
OSの機能やサードパーティ/商用製品と組み合わ
せることで、概ね課題をクリアできる
PGEConsの報告
詳細は「付録A」参照
13Copyright©2015 NTT corp. All Rights Reserved.
しかしながら...
14Copyright©2015 NTT corp. All Rights Reserved.
サーバログを
監査ログとして使う上での課題
しかしながら...
15Copyright©2015 NTT corp. All Rights Reserved.
サーバログを
監査ログとして使う上での課題
しかしながら...
PGEConsの検討結果も参考に、より堅牢な監査が可能
か、性能上の課題がないかについて調査した
16Copyright©2015 NTT corp. All Rights Reserved.
サーバログを監査ログとして使う上での課題
監査するのが大変なログ問題
運用ログと監査ログ混ざっちゃう問題
性能低下問題
スーパーユーザなんでもできちゃう問題
17Copyright©2015 NTT corp. All Rights Reserved.
サーバログを監査ログとして使う上での課題
監査するのが大変なログ問題
• オブジェクト名
• SQLで渡されたパラメータ
• スキーマ名
サーバログでは下記のような情報が出力されない。
1.Do文などの利用時にどのオブジェクトに対して
どのような操作が行われたのか判別するのが困難
2.異なるスキーマの同一名テーブル判別不可
=>監査ログの分析が困難
これらの情報が出力されないのは大きな課題
例えば...
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は発見
できない。
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;
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;
21Copyright©2015 NTT corp. All Rights Reserved.
サーバログを監査ログとして使う上での課題
性能低下
ログ出力対象の範囲は一番小さい粒度でも
• データベースごと
• ロールごと
大量のログ出力に伴う性能低下の恐れ
=>監査要件に必要な最小限の情報のみ出力したい
例えば...
特定のテーブル、列に関するSELECTのみ出力
22Copyright©2015 NTT corp. All Rights Reserved.
0.0
500.0
1000.0
1500.0
2000.0
2500.0
3000.0
3500.0
4000.0
20000 22000 24000 26000 28000 30000
1.log_statement=none
2.log_statement=all
DBT-1ベンチマーク結果
EU数
スループット[BT]
Dell PowerEdge R410
CPU:Xeon(R)E5645 2.40GHz 2CPU12core
Memory:32GB
OS:RHEL6u6
PostgreSQL:9.3.5rpm
DBsize:148Gbyte
約20%性能ダウン
サーバログを監査ログとして使う上での課題
性能低下
23Copyright©2015 NTT corp. All Rights Reserved.
サーバログを監査ログとして使う上での課題
運用ログと監査ログ混ざっちゃう問題
1.運用者が業務に関係ない重要情報に触れてしまう
サーバログは運用で利用する。
DB運用者が監査ログを閲覧できてしまうことになる。
2.分析するのが大変
3.サーバログ自体の監査が難しい
「2014 年度 WG3 活動報告 セキュリティ編」
ではOSの機能(auditd)の利用を推奨。
=>サーバログと監査ログを分離したい。
監査ログのみを別サーバに転送するなどして、
運用者、管理者が閲覧、改ざんできなくしたい。
24Copyright©2015 NTT corp. All Rights Reserved.
サーバログを監査ログとして使う上での課題
スーパーユーザなんでもできちゃう問題
スーパーユーザは監査ログを容易に改変可能
監査ログに関する設定はGUCなので様々な方法で
設定を変更できる。
=>スーパーユーザの監査ログを適切に取得したい。
スーパーユーザでも簡単に監査ログ出力設定を
変更できないようにしたい。
例:
$ env PGOPTIONS="-c log_statement=none" psql
上記の設定変更はサーバログに出力されない。
全く気づかれずに設定変更可能。
25Copyright©2015 NTT corp. All Rights Reserved.
サーバログを監査ログとして使う上での課題
監査するのが大変なログ問題
運用ログと監査ログ混ざっちゃう問題
性能低下問題
スーパーユーザなんでもできちゃう問題
26Copyright©2015 NTT corp. All Rights Reserved.
PostgreSQLの監査ログ出力ツール
「pgaudit」
そこで!
27Copyright©2015 NTT corp. All Rights Reserved.
pgauditとは?
 PostgreSQLの監査ログ出力用外部ツール
 PostgreSQL9.5対応
 pgaduitのこれまでの経緯
 2014年の初めくらいからPostgreSQLコミュニティで議論。
 2ndQuadrantが開発していた「pgaudit」を David Steele
@ Crunchy Data Solutions が引き継ぎ「pg_audit」として
コミュニティ開発を継続。
 2015年5月、PostgreSQLのcontribにコミットされるも、数日
後に除外される。
 2015年7月、「pgaudit」と名前を変えてGithubに公開。
https://github.com/pgaudit/pgaudit
※複数の pgaudit, pg_audit が存在しているので注意!
28Copyright©2015 NTT corp. All Rights Reserved.
pgauditの特徴
 pgauditの設定値は全てGUC
• postgresql.conf、SQLでデータベースクラスタ全体に設定
• データベース単位で設定可能
• ロール単位で設定可能
 ログはサーバログに出力される
 shared_preload_librariesにpgauditを設定
設定値の詳細は「付録B」参照
 サーバログより粒度の細かいログ出力設定が可能
 コマンドの種類(クラス)ごと
Session Audit Logging モード
 テーブル、列ごと
Object Auditing モード
 サーバログで取得できない情報を取得可能
 テーブル名、スキーマ名
 SQLで渡したパラメータ
29Copyright©2015 NTT corp. All Rights Reserved.
pgauditの出力項目
出力項目名 説明
AUDIT_TYPE ログ出力モード:SESSION または OBJECT
STATEMENT_ID 1セッション内の1SQLを識別する数字
SUBSTATEMENT_ID 関数の実行など、1SQL内で複数のSQLが実行された
場合に識別する数字
CLASS SQLの種類(クラス)→後述
COMMAND SQLの種類(コマンド単位):SELECTなど
OBJECT_TYPE オブジェクトの種類:TABLEなど
OBJECT_NAME オブジェクト名
STATEMENT 実行されたSQL文全体
PARAMETER 実行されたSQLに渡されたパラメータ
+ log_line_prefixで設定可能な出力項目
30Copyright©2015 NTT corp. All Rights Reserved.
pgauditの出力項目
出力項目名 説明
AUDIT_TYPE ログ出力モード:SESSION または OBJECT
STATEMENT_ID 1セッション内の1SQLを識別する数字
SUBSTATEMENT_ID 関数の実行など、1SQL内で複数のSQLが実行された
場合に識別する数字
CLASS SQLの種類(クラス)→後述
COMMAND SQLの種類(コマンド単位):SELECTなど
OBJECT_TYPE オブジェクトの種類:TABLEなど
OBJECT_NAME オブジェクト名
STATEMENT 実行されたSQL文全体
PARAMETER 実行されたSQLに渡されたパラメータ
オブジェクト情報やSQL中のパラメータ情報を出力可能
+ log_line_prefixで設定可能な出力項目
31Copyright©2015 NTT corp. All Rights Reserved.
Session Audit Logging と Object Auditing
Session Audit Logging
特定のクラスに属するSQLが実行されたらログ出力。
例えば...
WRITEとDDLクラスに属するSQLが実行されたら出力。
Object Auditing
特定のオブジェクトに対して操作が実行されたらログ出力。
例えば...
特定のテーブルの特定の行に対してSELECTが
実行されたらログ出力。
ログ出力を制御する2つのログ出力モードが存在。
併用可。
32Copyright©2015 NTT corp. All Rights Reserved.
Session Audit Logging について
・ログを出力したいSQLのクラスを指定する。
‘ALL, -MISC’でMISCだけ除く、といった設定も可能
利用方法
pgaudit.log = クラス名, ...
クラス名一覧
READ SELECT, VALUES, COPY など
WRITE INSERT, UPDATE, DELETE, TRUNCATE, COPY など
FUNCTION DO
ROLE CREATE|ALTER|DROP USER|ROLE|GROUP, GRANT, REVOKE など
DDL CREATE ... , ALTER ... , DROP ... , REINDEX, SELECT INTO など
MISC VACUUM, ANALYZE, BEGIN, COMMIT, ROLLBACK, SET, LOCK など
ALL 全てのSQL
33Copyright©2015 NTT corp. All Rights Reserved.
Session Audit Logging について
postgresql.conf
LOG: AUDIT: SESSION,1,1,MISC,BEGIN,,,BEGIN;,<not logged>
LOG: AUDIT: SESSION,2,1,WRITE,UPDATE,,,
UPDATE pgbench_accounts SET bid = '4'
WHERE aid = '1';,<not logged>
LOG: AUDIT: SESSION,3,1,MISC,COMMIT,,,COMMIT;,<not logged>
設定例
shared_preload_libraries = pgaudit
pgaudit.log = 'WRITE, DDL, MISC’
出力例
SQL実行:
testdb=# BEGIN;
testdb=# SELECT * FROM pgbench_accounts LIMIT 1;
testdb=# UPDATE pgbench_accounts SET bid = '4' WHERE aid = '1';
testdb=# COMMIT;
出力結果:SELECTは出力されていない
34Copyright©2015 NTT corp. All Rights Reserved.
Object Auditingについて
‘ロール名’に特定のロールを設定。
このロールがオブジェクトに対して
実行可能な操作のログを出力する。
利用方法
・ログを出力したいオブジェクトに対する
権限を付与したロールを指定する。
pgaudit.role = ロール名
設定可能な操作
SELECT, INSERT, UPDATE, DELETE
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;
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クエリに対して出力されている。
37Copyright©2015 NTT corp. All Rights Reserved.
pgauditはサーバログの課題を解決可能か?
38Copyright©2015 NTT corp. All Rights Reserved.
pgauditはサーバログの課題を解決可能か?
監査するのが大変なログ問題
• オブジェクト名
• SQLで渡されたパラメータ
• スキーマ名
サーバログでは下記のような情報が出力されない。
39Copyright©2015 NTT corp. All Rights Reserved.
pgauditはサーバログの課題を解決可能か?
監査するのが大変なログ問題
• オブジェクト名
• SQLで渡されたパラメータ
• スキーマ名
サーバログでは下記のような情報が出力されない。
前述の具体例を使って pgaudit がどのような
ログを出力するのか確認する。
pgaudit
で出力可!
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操作であることを容易に確認可。
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
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>
43Copyright©2015 NTT corp. All Rights Reserved.
pgauditはサーバログの課題を解決可能か?
監査するのが大変なログ問題
44Copyright©2015 NTT corp. All Rights Reserved.
pgauditはサーバログの課題を解決可能か?
監査するのが大変なログ問題
解決 メタ情報が出力されるので監査し易くなった!
45Copyright©2015 NTT corp. All Rights Reserved.
pgauditはサーバログの課題を解決可能か?
監査するのが大変なログ問題
 不必要なログ出力を抑制することが可能な
ので、必要な情報のみを扱うことができる。
解決 メタ情報が出力されるので監査し易くなった!
• オブジェクト名
• SQLで渡されたパラメータ
• スキーマ名
 下記のようなメタ情報が出力されるので、
サーバログより監査が容易。
46Copyright©2015 NTT corp. All Rights Reserved.
pgauditはサーバログの課題を解決可能か?
性能低下
47Copyright©2015 NTT corp. All Rights Reserved.
pgauditはサーバログの課題を解決可能か?
性能低下
解決 ログ出力に伴う性能低下を抑えることが可能!
48Copyright©2015 NTT corp. All Rights Reserved.
pgauditはサーバログの課題を解決可能か?
性能低下
解決 ログ出力に伴う性能低下を抑えることが可能!
 特定のテーブル、列、操作のみに限定して
ログ出力が可能
 監査要件に合わせて最小限の情報のみ
取得可能
ただし、
• 出力項目の柔軟なカスタマイズ
• 時間帯を指定したログ出力
など、より粒度の細かいログ量調整は不可能。
49Copyright©2015 NTT corp. All Rights Reserved.
pgauditはサーバログの課題を解決可能か?
運用ログと監査ログ混ざっちゃう問題
50Copyright©2015 NTT corp. All Rights Reserved.
pgauditはサーバログの課題を解決可能か?
運用ログと監査ログ混ざっちゃう問題
未解決
全てのログはサーバログに出力される
51Copyright©2015 NTT corp. All Rights Reserved.
pgauditはサーバログの課題を解決可能か?
運用ログと監査ログ混ざっちゃう問題
未解決
全てのログはサーバログに出力される
 pgauditの全てのログはサーバログに出力
 サーバログを監査ログとして使う時と同じ
問題が依然として存在している。
1.運用者が業務に関係ない重要情報に触れてしまう
2.分析するのが大変
3.改ざんし易い
再掲:
52Copyright©2015 NTT corp. All Rights Reserved.
pgauditはサーバログの課題を解決可能か?
スーパーユーザなんでもできちゃう問題
53Copyright©2015 NTT corp. All Rights Reserved.
pgauditはサーバログの課題を解決可能か?
スーパーユーザなんでもできちゃう問題
未解決
スーパーユーザはpgauditの設定を自由に変更可能
54Copyright©2015 NTT corp. All Rights Reserved.
pgauditはサーバログの課題を解決可能か?
スーパーユーザなんでもできちゃう問題
未解決
スーパーユーザはpgauditの設定を自由に変更可能
 pgauditの全ての設定値はGUC
 スーパーユーザの監査ログをいかに取得す
るかは依然として大きな課題。
 設定ファイルや監査ログをOSレベルで監査
することも必要。OSの機能(auditd)などを
利用することを検討する。
55Copyright©2015 NTT corp. All Rights Reserved.
pgauditまとめ
56Copyright©2015 NTT corp. All Rights Reserved.
pgauditまとめ
pgauditは「サーバログを監査ログとして使う上での
課題」を解決することができるか?
再掲:
監査するのが大変なログ問題
運用ログと監査ログ混ざっちゃう問題
性能低下問題
スーパーユーザなんでもできちゃう問題
57Copyright©2015 NTT corp. All Rights Reserved.
pgauditまとめ
pgauditは「サーバログを監査ログとして使う上での
課題」を解決することができるか?
再掲:
監査するのが大変なログ問題
運用ログと監査ログ混ざっちゃう問題
性能低下問題
スーパーユーザなんでもできちゃう問題
pgauditで
解決!
pgauditで
解決!
pgauditでも
解決できず...
pgauditでも
解決できず...
58Copyright©2015 NTT corp. All Rights Reserved.
pgauditまとめ
 サーバログによる監査ログ出力と同様の権限分
掌問題は依然として解決しておらず、DB管理者
の操作ログを取得する目的での使用は適さない。
 オブジェクト情報、スキーマ情報などサーバロ
グで取得できなかったメタ情報が取得可能に
なった。
 細やかなログ出力設定が可能になり、監査ログ
出力要件に応じてログ出力量を抑えることが可
能になった。
59Copyright©2015 NTT corp. All Rights Reserved.
pgauditに対する要望
 スーパーユーザに設定を自由に変更させない
 pgauditの設定値をGUCではない値としたい
 設定ファイルを分けたい
 サーバログと監査ログの出力先を分離
 これに伴い接続やSQLやトランザクションの成功失敗を
出力させる必要ある
 別のサーバに送信などできるとベスト
 任意の出力項目、より柔軟なフィルタ
 個別の監査要件に必要な出力項目を自由に設定
 特定の時間帯に絞ったログ出力
60Copyright©2015 NTT corp. All Rights Reserved.
ちなみに
61Copyright©2015 NTT corp. All Rights Reserved.
Audit Log Analyzer
現状はβ版。
今後に期待!
 サーバログに出力されたpgauditのログをパースして
pgauditテーブルに格納する。監査者はSQLを使って監
査ログを分析可能。
 pgaudit_analyzeデーモンがサーバログ(CSV形式)を
自動で読み込み、pgauditテーブルに監査ログを格納す
る。
pgaudit.audit_statement
pgaudit.audit_substatement
pgaudit.audit_substatement_detail
pgaudit.log_event
pgaudit.logevent_pk
pgaudit.session
pgaudit.vw_audit_event
下記テーブルを作成するスクリプトが提供されている。
62Copyright©2015 NTT corp. All Rights Reserved.
付録
63Copyright©2015 NTT corp. All Rights Reserved.
引用元:PGECons「2014 年度 WG3 活動報告 セキュリティ編」 https://www.pgecons.org/downloads/101
※スライドのスペースの都合上、引用元より一部省略・要約しています。
# 要件 対応レベル 対応策
10.2.1 カード会員情報への全てのアクセス ◯ log_statement
10.2.2 スーパーユーザの全ての操作 ◯ log_statement
10.2.3 監査ログに対する全てのアクセス △ OS機能(auditdなど)
10.2.4 無効な操作の試行 ◯ log_min_messages
10.2.5 ログイン/ログアウト ◯ log_connection,
log_disconnection
10.2.6 ログ出力機能の設定変更、初期化 △ OS機能(auditdなど)
10.2.7 DBオブジェクトの生成、削除 ◯ log_statement
10.2 ログの出力契機の要件
付録A:PostgreSQLログ出力機能のPCI DSS 対応状況
◯: PostgreSQL標準機能で対応可
△:一部だけ、または外部ツールやOS機能を組み合わせれば対応可
☓:対応不可
PCI DSS のログ出力契機の要件にほぼ対応することができる
64Copyright©2015 NTT corp. All Rights Reserved.
引用元:PGECons「2014 年度 WG3 活動報告 セキュリティ編」 https://www.pgecons.org/downloads/101
※スライドのスペースの都合上、引用元より一部省略・要約しています。
# 要件 対応レベル 対応策
10.3.1 DB、OSアカウント名 △ log_line_prefix
10.3.2 SQLの種類、タイプなど ◯ log_line_prefix
10.3.3 日付と時刻 ◯ log_line_prefix
10.3.4 成功または失敗を示す情報 ◯ log_line_prefix
10.3.5 DB クライアントの IP アドレスなど ◯ log_line_prefix
10.3.6 オブジェクト名、オブジェクトID、
カラム名、カラムIDなど
☓ ー
10.3.1 DBのアカウント名、OSアカウント名 △ log_line_prefix
10.3 ログの出力項目の要件
付録A:PostgreSQLログ出力機能のPCI DSS 対応状況
◯: PostgreSQL標準機能で対応可
△:一部だけ、または外部ツールやOS機能を組み合わせれば対応可
☓:対応不可
PCI DSS のログ出力項目の要件にほぼ対応することができる
65Copyright©2015 NTT corp. All Rights Reserved.
付録A:PostgreSQLログ出力機能のPCI DSS 対応状況
既存のログ出力機能(サーバログ)でも
PCI DSS 監査ログ出力要件に”ほぼ”対応できる
 postgresqsl.confを適切に設定
 OSの権限を適切に設定
 postgresqsl.confやサーバログへの操作ログを取得
auditdなどOSの機能を利用
スーパーユーザになれるOSユーザは postgresqsl.conf 変更不可
スーパーユーザになれるOSユーザはサーバログ改ざん不可
log_statement = all
log_min_error_statement、log_min_messages
log_connection、log_disconnection
log_line_prefix
log_error_verbosity
log_file_mode = 0000
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
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>
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設定時
69Copyright©2015 NTT corp. All Rights Reserved.
付録B:pgaudit その他の設定
• pgaudit.log_statement_once
同じSQL文を複数回出力しない。
• 設定例
pgaudit.log_statement_once = on(default: off)
• 出力例
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) limit 1;,<none>
LOG: AUDIT: SESSION,19,1,READ,SELECT,TABLE,public.pgbench_accounts,
<previously logged>,<previously logged>
LOG: AUDIT: SESSION,19,1,READ,SELECT,TABLE,public.pgbench_branches,
<previously logged>,<previously logged>
LOG: AUDIT: SESSION,1,1,READ,SELECT,TABLE,public.pgbench_accounts,
select * from pgbench_accounts join pgbench_branches on (pgbench_accounts.bid = pgbench_branches.bid) limit 10;,<not
logged>
LOG: AUDIT: SESSION,1,1,READ,SELECT,TABLE,public.pgbench_branches,
<previously logged>,<previously logged>
ON設定+オブジェクトログ混在時
ON設定時
70Copyright©2015 NTT corp. All Rights Reserved.
付録B:pgaudit その他の設定
• pgaudit.log_catalog
pg_catalogに対するログを出力かを設定する。
• pgaudit.log_level
pgauditが出力するログのログレベルを設定する。
• 設定例
pgaudit.log_level = warning (default: log)
• 出力例
WARNING: AUDIT: SESSION,9,1,MISC,SET,,,
set pgaudit.log_level = warning;,<none>
WARNING: AUDIT: SESSION,10,1,READ,SELECT,TABLE,public.pgbench_accounts,
select bid from pgbench_accounts;,<none>

監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性

  • 1.
    Copyright©2015 NTT Corp.All Rights Reserved. 監査要件を有するシステムに対す る PostgreSQL 導入の課題と可能 性 NTT OSSセンタ 大山真実
  • 2.
    2Copyright©2015 NTT corp.All Rights Reserved. 突然ですが、、、 DBの監査って重要ですよね!
  • 3.
    3Copyright©2015 NTT corp.All Rights Reserved. 最近の内部不正事件 引用元:IPA 「組織における内部不正対策」 http://www.ipa.go.jp/files/000047237.pdf
  • 4.
    4Copyright©2015 NTT corp.All Rights Reserved. 最近の内部不正事件 引用元:IPA 「組織における内部不正対策」 http://www.ipa.go.jp/files/000047237.pdf を用いて犯 行に至ることも!
  • 5.
    5Copyright©2015 NTT corp.All Rights Reserved. DB管理者が疑われてしまう!? 示唆した。また情報に対する侵害を分類し、漏えい(機密性)、破壊(可用性)、改ざん(完 全性)についてそれぞれ質問し、加えてパスワードの漏えいについても質問したが、結果 はほぼ同じ傾向を示した。 Q: 将来、データベースに格納されている情報をこっそり売却するかも知れない。(図 3-20) そう思う 3.6% ややそう思う 7.1% どちらともい えない 13.4% あまりそう思 わない 10.4% そう思わない 65.5% 引用元:DBSC 「DBA 1,000 人に聞きました」アンケート調査報告書 http://www.db-security.org/report/dbsc_dba_ver1.0.pdf 約1割のDB管理者がDBに 格納されている情報を売 却するかもしれない!?
  • 6.
    6Copyright©2015 NTT corp.All Rights Reserved. DB管理者が疑われてしまう!? Q: 将来、データベースに格納されている情報をこっそり改ざんするかも知れない。(図 3-22) そう思う 2.4% ややそう思う 7.4% どちらともい えない 14.4% あまりそう思 わない 10.7% そう思わない 65.1% 約1割のDB管理者がDBに 格納されている情報を改 ざんするかもしれない!? 引用元:DBSC 「DBA 1,000 人に聞きました」アンケート調査報告書 http://www.db-security.org/report/dbsc_dba_ver1.0.pdf
  • 7.
    7Copyright©2015 NTT corp.All Rights Reserved. DB管理者が疑われてしまう!? Q: 将来、データベースを壊して業務を妨害することがあるかも知れない。(図 3-21) Q: 将来、データベースに格納されている情報をこっそり改ざんするかも知れない。(図 3-22) そう思う 2.9% ややそう思う 6.5% どちらとも いえない 15.5% あまりそう 思わない 9.6% そう思わない 65.5% 約1割のDB管理者がDBを 破壊するかもしれない!? 引用元:DBSC 「DBA 1,000 人に聞きました」アンケート調査報告書 http://www.db-security.org/report/dbsc_dba_ver1.0.pdf
  • 8.
    8Copyright©2015 NTT corp.All Rights Reserved. 不正対策 3ポイント 1. 管理者の誘因 雇用条件/職場環境/幸福度の向上 「一般的に職場環境、雇用条件が満たされている管理者であれば 業務に対して責任を持った行動を取るはずである。」 2. 管理者の抑制  アクセス制御/権限分掌/暗号化/鍵管理 3. 運用の実施 「2.管理者の抑制」が有効になっていることを定期的に監査・監視する仕組 み・体制  ポリシーの制定  監査・監視 体制/ログの取得/ログ確認/ログ保全 引用元:DBSC 「DB 内部不正対策ガイドライン」 http://www.db-security.org/report/antifraud_guide_ver1.0.pdf
  • 9.
    9Copyright©2015 NTT corp.All Rights Reserved. 操作ログの取得が有効 引用元:IPA「組織における内部不正対策」 http://www.ipa.go.jp/files/000047237.pdf Q. 「内部不正防止効果が期待できる対策は?」 以降、監査目的で取得するDBの操作ログのことを監査ログと呼称する。
  • 10.
    10Copyright©2015 NTT corp.All Rights Reserved. でもPostgreSQLって監査ログ出力機能無いですよね?
  • 11.
    11Copyright©2015 NTT corp.All Rights Reserved. でもPostgreSQLって監査ログ出力機能無いですよね? log_statement = all があるじゃない!
  • 12.
    12Copyright©2015 NTT corp.All Rights Reserved. log_statement = all があるじゃない! * 2014 年度 WG3 活動報告 セキュリティ編, https://www.pgecons.org/downloads/101 PostgreSQLエンタープライズコンソーシアムでは、PCI DSS 要 件を満たす必要があるシステムに対して、PostgreSQL を導入し ようとした場合に、対応可能か、どのように対応すればいいかを 調査し、上記のように報告* OSの機能やサードパーティ/商用製品と組み合わ せることで、概ね課題をクリアできる PGEConsの報告 詳細は「付録A」参照
  • 13.
    13Copyright©2015 NTT corp.All Rights Reserved. しかしながら...
  • 14.
    14Copyright©2015 NTT corp.All Rights Reserved. サーバログを 監査ログとして使う上での課題 しかしながら...
  • 15.
    15Copyright©2015 NTT corp.All Rights Reserved. サーバログを 監査ログとして使う上での課題 しかしながら... PGEConsの検討結果も参考に、より堅牢な監査が可能 か、性能上の課題がないかについて調査した
  • 16.
    16Copyright©2015 NTT corp.All Rights Reserved. サーバログを監査ログとして使う上での課題 監査するのが大変なログ問題 運用ログと監査ログ混ざっちゃう問題 性能低下問題 スーパーユーザなんでもできちゃう問題
  • 17.
    17Copyright©2015 NTT corp.All Rights Reserved. サーバログを監査ログとして使う上での課題 監査するのが大変なログ問題 • オブジェクト名 • SQLで渡されたパラメータ • スキーマ名 サーバログでは下記のような情報が出力されない。 1.Do文などの利用時にどのオブジェクトに対して どのような操作が行われたのか判別するのが困難 2.異なるスキーマの同一名テーブル判別不可 =>監査ログの分析が困難 これらの情報が出力されないのは大きな課題 例えば...
  • 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のみ出力
  • 22.
    22Copyright©2015 NTT corp.All Rights Reserved. 0.0 500.0 1000.0 1500.0 2000.0 2500.0 3000.0 3500.0 4000.0 20000 22000 24000 26000 28000 30000 1.log_statement=none 2.log_statement=all DBT-1ベンチマーク結果 EU数 スループット[BT] Dell PowerEdge R410 CPU:Xeon(R)E5645 2.40GHz 2CPU12core Memory:32GB OS:RHEL6u6 PostgreSQL:9.3.5rpm DBsize:148Gbyte 約20%性能ダウン サーバログを監査ログとして使う上での課題 性能低下
  • 23.
    23Copyright©2015 NTT corp.All Rights Reserved. サーバログを監査ログとして使う上での課題 運用ログと監査ログ混ざっちゃう問題 1.運用者が業務に関係ない重要情報に触れてしまう サーバログは運用で利用する。 DB運用者が監査ログを閲覧できてしまうことになる。 2.分析するのが大変 3.サーバログ自体の監査が難しい 「2014 年度 WG3 活動報告 セキュリティ編」 ではOSの機能(auditd)の利用を推奨。 =>サーバログと監査ログを分離したい。 監査ログのみを別サーバに転送するなどして、 運用者、管理者が閲覧、改ざんできなくしたい。
  • 24.
    24Copyright©2015 NTT corp.All Rights Reserved. サーバログを監査ログとして使う上での課題 スーパーユーザなんでもできちゃう問題 スーパーユーザは監査ログを容易に改変可能 監査ログに関する設定はGUCなので様々な方法で 設定を変更できる。 =>スーパーユーザの監査ログを適切に取得したい。 スーパーユーザでも簡単に監査ログ出力設定を 変更できないようにしたい。 例: $ env PGOPTIONS="-c log_statement=none" psql 上記の設定変更はサーバログに出力されない。 全く気づかれずに設定変更可能。
  • 25.
    25Copyright©2015 NTT corp.All Rights Reserved. サーバログを監査ログとして使う上での課題 監査するのが大変なログ問題 運用ログと監査ログ混ざっちゃう問題 性能低下問題 スーパーユーザなんでもできちゃう問題
  • 26.
    26Copyright©2015 NTT corp.All Rights Reserved. PostgreSQLの監査ログ出力ツール 「pgaudit」 そこで!
  • 27.
    27Copyright©2015 NTT corp.All Rights Reserved. pgauditとは?  PostgreSQLの監査ログ出力用外部ツール  PostgreSQL9.5対応  pgaduitのこれまでの経緯  2014年の初めくらいからPostgreSQLコミュニティで議論。  2ndQuadrantが開発していた「pgaudit」を David Steele @ Crunchy Data Solutions が引き継ぎ「pg_audit」として コミュニティ開発を継続。  2015年5月、PostgreSQLのcontribにコミットされるも、数日 後に除外される。  2015年7月、「pgaudit」と名前を変えてGithubに公開。 https://github.com/pgaudit/pgaudit ※複数の pgaudit, pg_audit が存在しているので注意!
  • 28.
    28Copyright©2015 NTT corp.All Rights Reserved. pgauditの特徴  pgauditの設定値は全てGUC • postgresql.conf、SQLでデータベースクラスタ全体に設定 • データベース単位で設定可能 • ロール単位で設定可能  ログはサーバログに出力される  shared_preload_librariesにpgauditを設定 設定値の詳細は「付録B」参照  サーバログより粒度の細かいログ出力設定が可能  コマンドの種類(クラス)ごと Session Audit Logging モード  テーブル、列ごと Object Auditing モード  サーバログで取得できない情報を取得可能  テーブル名、スキーマ名  SQLで渡したパラメータ
  • 29.
    29Copyright©2015 NTT corp.All Rights Reserved. pgauditの出力項目 出力項目名 説明 AUDIT_TYPE ログ出力モード:SESSION または OBJECT STATEMENT_ID 1セッション内の1SQLを識別する数字 SUBSTATEMENT_ID 関数の実行など、1SQL内で複数のSQLが実行された 場合に識別する数字 CLASS SQLの種類(クラス)→後述 COMMAND SQLの種類(コマンド単位):SELECTなど OBJECT_TYPE オブジェクトの種類:TABLEなど OBJECT_NAME オブジェクト名 STATEMENT 実行されたSQL文全体 PARAMETER 実行されたSQLに渡されたパラメータ + log_line_prefixで設定可能な出力項目
  • 30.
    30Copyright©2015 NTT corp.All Rights Reserved. pgauditの出力項目 出力項目名 説明 AUDIT_TYPE ログ出力モード:SESSION または OBJECT STATEMENT_ID 1セッション内の1SQLを識別する数字 SUBSTATEMENT_ID 関数の実行など、1SQL内で複数のSQLが実行された 場合に識別する数字 CLASS SQLの種類(クラス)→後述 COMMAND SQLの種類(コマンド単位):SELECTなど OBJECT_TYPE オブジェクトの種類:TABLEなど OBJECT_NAME オブジェクト名 STATEMENT 実行されたSQL文全体 PARAMETER 実行されたSQLに渡されたパラメータ オブジェクト情報やSQL中のパラメータ情報を出力可能 + log_line_prefixで設定可能な出力項目
  • 31.
    31Copyright©2015 NTT corp.All Rights Reserved. Session Audit Logging と Object Auditing Session Audit Logging 特定のクラスに属するSQLが実行されたらログ出力。 例えば... WRITEとDDLクラスに属するSQLが実行されたら出力。 Object Auditing 特定のオブジェクトに対して操作が実行されたらログ出力。 例えば... 特定のテーブルの特定の行に対してSELECTが 実行されたらログ出力。 ログ出力を制御する2つのログ出力モードが存在。 併用可。
  • 32.
    32Copyright©2015 NTT corp.All Rights Reserved. Session Audit Logging について ・ログを出力したいSQLのクラスを指定する。 ‘ALL, -MISC’でMISCだけ除く、といった設定も可能 利用方法 pgaudit.log = クラス名, ... クラス名一覧 READ SELECT, VALUES, COPY など WRITE INSERT, UPDATE, DELETE, TRUNCATE, COPY など FUNCTION DO ROLE CREATE|ALTER|DROP USER|ROLE|GROUP, GRANT, REVOKE など DDL CREATE ... , ALTER ... , DROP ... , REINDEX, SELECT INTO など MISC VACUUM, ANALYZE, BEGIN, COMMIT, ROLLBACK, SET, LOCK など ALL 全てのSQL
  • 33.
    33Copyright©2015 NTT corp.All Rights Reserved. Session Audit Logging について postgresql.conf LOG: AUDIT: SESSION,1,1,MISC,BEGIN,,,BEGIN;,<not logged> LOG: AUDIT: SESSION,2,1,WRITE,UPDATE,,, UPDATE pgbench_accounts SET bid = '4' WHERE aid = '1';,<not logged> LOG: AUDIT: SESSION,3,1,MISC,COMMIT,,,COMMIT;,<not logged> 設定例 shared_preload_libraries = pgaudit pgaudit.log = 'WRITE, DDL, MISC’ 出力例 SQL実行: testdb=# BEGIN; testdb=# SELECT * FROM pgbench_accounts LIMIT 1; testdb=# UPDATE pgbench_accounts SET bid = '4' WHERE aid = '1'; testdb=# COMMIT; 出力結果:SELECTは出力されていない
  • 34.
    34Copyright©2015 NTT corp.All Rights Reserved. Object Auditingについて ‘ロール名’に特定のロールを設定。 このロールがオブジェクトに対して 実行可能な操作のログを出力する。 利用方法 ・ログを出力したいオブジェクトに対する 権限を付与したロールを指定する。 pgaudit.role = ロール名 設定可能な操作 SELECT, INSERT, UPDATE, DELETE
  • 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クエリに対して出力されている。
  • 37.
    37Copyright©2015 NTT corp.All Rights Reserved. pgauditはサーバログの課題を解決可能か?
  • 38.
    38Copyright©2015 NTT corp.All Rights Reserved. pgauditはサーバログの課題を解決可能か? 監査するのが大変なログ問題 • オブジェクト名 • SQLで渡されたパラメータ • スキーマ名 サーバログでは下記のような情報が出力されない。
  • 39.
    39Copyright©2015 NTT corp.All Rights Reserved. pgauditはサーバログの課題を解決可能か? 監査するのが大変なログ問題 • オブジェクト名 • SQLで渡されたパラメータ • スキーマ名 サーバログでは下記のような情報が出力されない。 前述の具体例を使って pgaudit がどのような ログを出力するのか確認する。 pgaudit で出力可!
  • 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>
  • 43.
    43Copyright©2015 NTT corp.All Rights Reserved. pgauditはサーバログの課題を解決可能か? 監査するのが大変なログ問題
  • 44.
    44Copyright©2015 NTT corp.All Rights Reserved. pgauditはサーバログの課題を解決可能か? 監査するのが大変なログ問題 解決 メタ情報が出力されるので監査し易くなった!
  • 45.
    45Copyright©2015 NTT corp.All Rights Reserved. pgauditはサーバログの課題を解決可能か? 監査するのが大変なログ問題  不必要なログ出力を抑制することが可能な ので、必要な情報のみを扱うことができる。 解決 メタ情報が出力されるので監査し易くなった! • オブジェクト名 • SQLで渡されたパラメータ • スキーマ名  下記のようなメタ情報が出力されるので、 サーバログより監査が容易。
  • 46.
    46Copyright©2015 NTT corp.All Rights Reserved. pgauditはサーバログの課題を解決可能か? 性能低下
  • 47.
    47Copyright©2015 NTT corp.All Rights Reserved. pgauditはサーバログの課題を解決可能か? 性能低下 解決 ログ出力に伴う性能低下を抑えることが可能!
  • 48.
    48Copyright©2015 NTT corp.All Rights Reserved. pgauditはサーバログの課題を解決可能か? 性能低下 解決 ログ出力に伴う性能低下を抑えることが可能!  特定のテーブル、列、操作のみに限定して ログ出力が可能  監査要件に合わせて最小限の情報のみ 取得可能 ただし、 • 出力項目の柔軟なカスタマイズ • 時間帯を指定したログ出力 など、より粒度の細かいログ量調整は不可能。
  • 49.
    49Copyright©2015 NTT corp.All Rights Reserved. pgauditはサーバログの課題を解決可能か? 運用ログと監査ログ混ざっちゃう問題
  • 50.
    50Copyright©2015 NTT corp.All Rights Reserved. pgauditはサーバログの課題を解決可能か? 運用ログと監査ログ混ざっちゃう問題 未解決 全てのログはサーバログに出力される
  • 51.
    51Copyright©2015 NTT corp.All Rights Reserved. pgauditはサーバログの課題を解決可能か? 運用ログと監査ログ混ざっちゃう問題 未解決 全てのログはサーバログに出力される  pgauditの全てのログはサーバログに出力  サーバログを監査ログとして使う時と同じ 問題が依然として存在している。 1.運用者が業務に関係ない重要情報に触れてしまう 2.分析するのが大変 3.改ざんし易い 再掲:
  • 52.
    52Copyright©2015 NTT corp.All Rights Reserved. pgauditはサーバログの課題を解決可能か? スーパーユーザなんでもできちゃう問題
  • 53.
    53Copyright©2015 NTT corp.All Rights Reserved. pgauditはサーバログの課題を解決可能か? スーパーユーザなんでもできちゃう問題 未解決 スーパーユーザはpgauditの設定を自由に変更可能
  • 54.
    54Copyright©2015 NTT corp.All Rights Reserved. pgauditはサーバログの課題を解決可能か? スーパーユーザなんでもできちゃう問題 未解決 スーパーユーザはpgauditの設定を自由に変更可能  pgauditの全ての設定値はGUC  スーパーユーザの監査ログをいかに取得す るかは依然として大きな課題。  設定ファイルや監査ログをOSレベルで監査 することも必要。OSの機能(auditd)などを 利用することを検討する。
  • 55.
    55Copyright©2015 NTT corp.All Rights Reserved. pgauditまとめ
  • 56.
    56Copyright©2015 NTT corp.All Rights Reserved. pgauditまとめ pgauditは「サーバログを監査ログとして使う上での 課題」を解決することができるか? 再掲: 監査するのが大変なログ問題 運用ログと監査ログ混ざっちゃう問題 性能低下問題 スーパーユーザなんでもできちゃう問題
  • 57.
    57Copyright©2015 NTT corp.All Rights Reserved. pgauditまとめ pgauditは「サーバログを監査ログとして使う上での 課題」を解決することができるか? 再掲: 監査するのが大変なログ問題 運用ログと監査ログ混ざっちゃう問題 性能低下問題 スーパーユーザなんでもできちゃう問題 pgauditで 解決! pgauditで 解決! pgauditでも 解決できず... pgauditでも 解決できず...
  • 58.
    58Copyright©2015 NTT corp.All Rights Reserved. pgauditまとめ  サーバログによる監査ログ出力と同様の権限分 掌問題は依然として解決しておらず、DB管理者 の操作ログを取得する目的での使用は適さない。  オブジェクト情報、スキーマ情報などサーバロ グで取得できなかったメタ情報が取得可能に なった。  細やかなログ出力設定が可能になり、監査ログ 出力要件に応じてログ出力量を抑えることが可 能になった。
  • 59.
    59Copyright©2015 NTT corp.All Rights Reserved. pgauditに対する要望  スーパーユーザに設定を自由に変更させない  pgauditの設定値をGUCではない値としたい  設定ファイルを分けたい  サーバログと監査ログの出力先を分離  これに伴い接続やSQLやトランザクションの成功失敗を 出力させる必要ある  別のサーバに送信などできるとベスト  任意の出力項目、より柔軟なフィルタ  個別の監査要件に必要な出力項目を自由に設定  特定の時間帯に絞ったログ出力
  • 60.
    60Copyright©2015 NTT corp.All Rights Reserved. ちなみに
  • 61.
    61Copyright©2015 NTT corp.All Rights Reserved. Audit Log Analyzer 現状はβ版。 今後に期待!  サーバログに出力されたpgauditのログをパースして pgauditテーブルに格納する。監査者はSQLを使って監 査ログを分析可能。  pgaudit_analyzeデーモンがサーバログ(CSV形式)を 自動で読み込み、pgauditテーブルに監査ログを格納す る。 pgaudit.audit_statement pgaudit.audit_substatement pgaudit.audit_substatement_detail pgaudit.log_event pgaudit.logevent_pk pgaudit.session pgaudit.vw_audit_event 下記テーブルを作成するスクリプトが提供されている。
  • 62.
    62Copyright©2015 NTT corp.All Rights Reserved. 付録
  • 63.
    63Copyright©2015 NTT corp.All Rights Reserved. 引用元:PGECons「2014 年度 WG3 活動報告 セキュリティ編」 https://www.pgecons.org/downloads/101 ※スライドのスペースの都合上、引用元より一部省略・要約しています。 # 要件 対応レベル 対応策 10.2.1 カード会員情報への全てのアクセス ◯ log_statement 10.2.2 スーパーユーザの全ての操作 ◯ log_statement 10.2.3 監査ログに対する全てのアクセス △ OS機能(auditdなど) 10.2.4 無効な操作の試行 ◯ log_min_messages 10.2.5 ログイン/ログアウト ◯ log_connection, log_disconnection 10.2.6 ログ出力機能の設定変更、初期化 △ OS機能(auditdなど) 10.2.7 DBオブジェクトの生成、削除 ◯ log_statement 10.2 ログの出力契機の要件 付録A:PostgreSQLログ出力機能のPCI DSS 対応状況 ◯: PostgreSQL標準機能で対応可 △:一部だけ、または外部ツールやOS機能を組み合わせれば対応可 ☓:対応不可 PCI DSS のログ出力契機の要件にほぼ対応することができる
  • 64.
    64Copyright©2015 NTT corp.All Rights Reserved. 引用元:PGECons「2014 年度 WG3 活動報告 セキュリティ編」 https://www.pgecons.org/downloads/101 ※スライドのスペースの都合上、引用元より一部省略・要約しています。 # 要件 対応レベル 対応策 10.3.1 DB、OSアカウント名 △ log_line_prefix 10.3.2 SQLの種類、タイプなど ◯ log_line_prefix 10.3.3 日付と時刻 ◯ log_line_prefix 10.3.4 成功または失敗を示す情報 ◯ log_line_prefix 10.3.5 DB クライアントの IP アドレスなど ◯ log_line_prefix 10.3.6 オブジェクト名、オブジェクトID、 カラム名、カラムIDなど ☓ ー 10.3.1 DBのアカウント名、OSアカウント名 △ log_line_prefix 10.3 ログの出力項目の要件 付録A:PostgreSQLログ出力機能のPCI DSS 対応状況 ◯: PostgreSQL標準機能で対応可 △:一部だけ、または外部ツールやOS機能を組み合わせれば対応可 ☓:対応不可 PCI DSS のログ出力項目の要件にほぼ対応することができる
  • 65.
    65Copyright©2015 NTT corp.All Rights Reserved. 付録A:PostgreSQLログ出力機能のPCI DSS 対応状況 既存のログ出力機能(サーバログ)でも PCI DSS 監査ログ出力要件に”ほぼ”対応できる  postgresqsl.confを適切に設定  OSの権限を適切に設定  postgresqsl.confやサーバログへの操作ログを取得 auditdなどOSの機能を利用 スーパーユーザになれるOSユーザは postgresqsl.conf 変更不可 スーパーユーザになれるOSユーザはサーバログ改ざん不可 log_statement = all log_min_error_statement、log_min_messages log_connection、log_disconnection log_line_prefix log_error_verbosity log_file_mode = 0000
  • 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設定時
  • 69.
    69Copyright©2015 NTT corp.All Rights Reserved. 付録B:pgaudit その他の設定 • pgaudit.log_statement_once 同じSQL文を複数回出力しない。 • 設定例 pgaudit.log_statement_once = on(default: off) • 出力例 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) limit 1;,<none> LOG: AUDIT: SESSION,19,1,READ,SELECT,TABLE,public.pgbench_accounts, <previously logged>,<previously logged> LOG: AUDIT: SESSION,19,1,READ,SELECT,TABLE,public.pgbench_branches, <previously logged>,<previously logged> LOG: AUDIT: SESSION,1,1,READ,SELECT,TABLE,public.pgbench_accounts, select * from pgbench_accounts join pgbench_branches on (pgbench_accounts.bid = pgbench_branches.bid) limit 10;,<not logged> LOG: AUDIT: SESSION,1,1,READ,SELECT,TABLE,public.pgbench_branches, <previously logged>,<previously logged> ON設定+オブジェクトログ混在時 ON設定時
  • 70.
    70Copyright©2015 NTT corp.All Rights Reserved. 付録B:pgaudit その他の設定 • pgaudit.log_catalog pg_catalogに対するログを出力かを設定する。 • pgaudit.log_level pgauditが出力するログのログレベルを設定する。 • 設定例 pgaudit.log_level = warning (default: log) • 出力例 WARNING: AUDIT: SESSION,9,1,MISC,SET,,, set pgaudit.log_level = warning;,<none> WARNING: AUDIT: SESSION,10,1,READ,SELECT,TABLE,public.pgbench_accounts, select bid from pgbench_accounts;,<none>

Editor's Notes

  • #20 log_error_verbosity (enum) 有効な値は、TERSE、DEFAULT、およびVERBOSEで、それぞれは表示されるメッセージにより多くのフィールドを追加します。 TERSEはDETAIL、HINT、QUERY、およびCONTEXTエラー情報を除外します。 VERBOSE出力は、SQLSTATEエラーコード(付録Aも参照)、および、ソースコードファイル名、関数名、そしてエラーを生成した行番号を含みます。 スーパユーザのみこの設定を変更できます。
  • #26 PGEconsの資料にあったとおり、PostgreSQLでPDIDSSの要件を満たす監査ログ出力は可能。 ただし、実際に運用してみると、ここに上げたような問題が課題となる可能性がある。
  • #37 その他の設定に関しては付録B参照