SlideShare a Scribd company logo
1 of 51
Download to read offline
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 1
PostgreSQLセキュリティ総復習
アップタイム・テクノロジーズ
永安 悟史
PostgreSQLカンファレンス2015
アジェンダ
• 本セッションの⽬的
• 全体感
• クライアントからデータベースに
接続するまで
– アクセス制御
– 通信の暗号化
– ユーザ認証
– パスワードの設定
• コマンドの実⾏やオブジェクトへ
のアクセス
– ロール
– ロールとシステム権限の管理
– システム権限
– システム権限の獲得
– オブジェクト権限の管理
– 権限の棚卸、クリーニング
– SQLファイアーウォール
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 2
• テーブル内部の詳細な権限制御
– テーブル内部における権限設定
– ⾏レベルの制御
– 列レベルの制御
– データの暗号化
• ログと監査
– 「監査ログ」とは?
– pg_auditモジュール
– ログの収集と監査の実施
– ログの可視化
• その他
– バックアップファイルのセキュリ
ティ
– システムカタログ
– Postgres Advanced Security Pack
• 参考⽂献
• Q&A
本セッションの⽬的
• データベースを狙ったセキュリティインシデントが後を絶ちません
。そういう時代になりました。
• PostgreSQLを利⽤している、または利⽤しようとしている⽅に、
「今、PostgreSQLで何ができるのか?」を整理して提供したいと
思います。
• PostgreSQL単体でできること、周辺モジュールを使ってできるこ
と、設計や開発でできること、等。
• 「PostgreSQLとセキュリティ」を考える上で、「⾒取り図」的な
情報としてお役に⽴てれば幸いです。
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 3
PostgreSQLセキュリティの全体感
• データベースのさまざまなセキュリティ機能
– 検討事項が多岐に渡るため、⼤きな枠ごとに⾒ていく
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 4
PostgreSQLインスタンス
postgres
(リスナプロセス)
postgres
(サーバプロセス)
テーブル
インデックス
サーバログ
バックアップ
ファイル
クライアント
アクセス制御、認証、
セッション暗号化
セッション暗号化、
データ暗号化
エラーログ、
監査ログ
バックアップファイルの
セキュリティ
認可、アクセス制御、
データ暗号化
第1部
クライアントからデータベースに接続するまで
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 5
アクセス制御
• リモートからの接続を受け付ける
– postgresql.conf の listen_addresses パラメータ
– デフォルトはローカル(Unixドメインソケット)のみ可
• localhost も不可(TCP/IPをListenしていない)
• ホストベース認証(Host-Based Authentication)
– 設定ファイル pg_hba.conf
– 接続⽅法、データベース、ユーザ、接続元ホスト(またはネットワー
ク)の組み合わせに応じて、認証⽅法を設定。
• 認証⽅法
– “trust”, “reject”, “md5”, “password”, “gss”, “sspi”, "ident",
"peer", "pam", "ldap", "radius" or "cert"
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 6
https://www.postgresql.jp/document/9.4/html/runtime-config-connection.html
https://www.postgresql.jp/document/9.4/html/auth-pg-hba-conf.html
通信の暗号化
• SSLによる暗号化通信のサポート
– 認証セッション、データセッション、全部SSLで暗号化。
– postgresql.conf の ssl パラメータ
– SSLを強制する場合には pg_hba.conf で hostssl を指定。
• クライアント証明書のサポート
– クライアント証明書を利⽤することも可能。
– 認証局(CA)の設定が必要。
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 7
https://www.postgresql.jp/document/9.4/html/ssl-tcp.html
ユーザ認証
• クライアントサイドの認証設定
– 認証情報を .pgpass ファイルに指定することが可能。
– ホームディレクトリか環境変数 PGPASSFILE で指定。
– JDBCの場合は .pgpass は未サポート。
• その他、環境変数などでも設定可能
– libpqライブラリを使うクライアントツール(psqlなど)で共通で使え
る環境変数
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 8
https://www.postgresql.jp/document/9.4/html/libpq-pgpass.html
https://www.postgresql.jp/document/9.4/html/libpq-envars.html
パスワードの設定
• パスワードの設定⽅法
– ALTER ROLE foo PASSWORD ʻpasswdʼ;
– ¥password コマンド(psql)
• MD5で暗号化してパスワードを保存
– password_encryptionパラメータ(デフォルトon)
– ALTER ROLE foo ENCRYPTED PASSWORD ʻpasswdʼ;
• パスワードを設定する際の注意
– ALTER ROLEで平⽂パスワードを指定すると、サーバログに残る可能
性あり。(サーバログ設定に依存)
– MD5暗号化済みパスワードを指定するか、¥password コマンドを使⽤
すること。
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 9
第2部
コマンドの実⾏やオブジェクトへのアクセス
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 10
ロール
• PostgreSQLの権限制御はロールによる制御
– CREATE ROLE / ALTER ROLE / DROP ROLE
– システムビュー pg_roles
• PostgreSQLの「ユーザ、グループ」は「ロール」と同義
– ユーザはロールのエイリアス
– システムビュー pg_user と pg_group
• コマンド権限やオブジェクト権限をロールに割り振る
– 実⾏できる処理の権限(後述)
– ORACLEなどのように細かくない。
– 付与できる権限は次ページの通り。
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 11
ロールとシステム権限の管理
• ロールの設定(pg_roles)
– 権限(システム権限)
• rolsuper, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication
– ロール権限の派⽣
• rolinherit
– 接続上限数
• rolconnlimit
– パスワード
• rolpassword
– 有効期限
• rolvaliduntil
– ロールごとの設定項⽬
• rolconfig
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 12
https://www.postgresql.jp/document/9.4/html/sql-createrole.html
https://www.postgresql.jp/document/9.4/html/view-pg-roles.html
システム権限
• 注意すべき権限
– rolsuperはすべての権限管理より優先する権限
– rolcreateroleは任意の権限(super除く)を持ったロールを作成可能
– rolcanloginはログイン可能な権限
データベースは rolcreatedb で作れても、EXTENSIONのインストールは
rolsuper が必要だったりするが・・・
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 13
‐‐ データベースの作成・削除が可能な admin_r ロールを作成
CREATE ROLE admin_r NOSUPERUSER CREATEDB NOCREATEROLE INHERIT
NOLOGIN NOREPLICATION;
‐‐ データベースやロールの作成などが⼀切できない webapp_r ロールを作成
CREATE ROLE webapp_r NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT 
NOLOGIN NOREPLICATION
‐‐ ユーザ snaga を作成して admin_r ロールに割り当てる
CREATE ROLE snaga LOGIN INHERIT IN ROLE admin_r;
‐‐ ユーザ webapp を作成して webapp_r ロールに割り当てる
CREATE ROLE webapp LOGIN INHERIT IN ROLE webapp_r;
システム権限の獲得
• 所属しているロールのシステム権限を得るにはSET ROLEを使う
– 接続直後には、他のロールのシステム権限は持っていない。
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 14
postgres=> select 
rolname,rolsuper,rolcreatedb from pg_roles;
rolname  | rolsuper | rolcreatedb
‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐
postgres | t        | t
webapp   | f        | f
webapp_r | f        | f
snaga    | f        | f
admin_r  | f        | t
(5 rows)
postgres=> select current_user;
current_user
‐‐‐‐‐‐‐‐‐‐‐‐‐‐
snaga
(1 row)
postgres=> create database testdb;
ERROR:  permission denied to create 
database
postgres=>
postgres=> set role admin_r;
SET
postgres=> select current_user;
current_user
‐‐‐‐‐‐‐‐‐‐‐‐‐‐
admin_r
(1 row)
postgres=> create database testdb;
CREATE DATABASE
postgres=>
権限を持っていないユーザー snaga が、
admin_rに昇格してデータベースを作成。
→ 必要な時だけ権限を獲得する
ロールとアクセス制御の設定例
• ロールの設定
– postgresロール以外はロール操作権限なし。
– (管理者含む)⼀般のロールとpostgresロールは分離。SET ROLEも不可。
• pg_hba.confの設定
– ローカル(Unix domain socket)からの接続はすべてMD5認証。
– リモート(TCP/IP)からの postgres ユーザの接続はすべて拒否。
– リモート(127.0.0.1 or 10.0.2.0/24)からの他のユーザの接続はすべてMD5認証。
• 結果、ロールの操作はpostgresユーザでローカルから直接接続した場合のみ。
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 15
postgres=> ¥du
List of roles
Role name |                   Attributes                   | Member of
‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐
admin_r   | Create DB, Cannot login                        | {}
postgres  | Superuser, Create role, Create DB, Replication | {}
snaga     | No inheritance                                 | {admin_r}
webapp    | No inheritance   | {webapp_r}
webapp_r  | No inheritance, Cannot login                   | {}
local   all             all                                     md5
host    all             postgres        0.0.0.0/0               reject
host    all             all             127.0.0.1/32            md5
host    all             all             10.0.2.0/24             md5
オブジェクト権限の管理
• GRANT/REVOKEによるオブジェクト権限の管理
– テーブル
– テーブルカラム
– シーケンス
– データベース
– ドメイン
– 外部データラッパ
– 関数
– プロシージャ⾔語
– ラージオブジェクト
– スキーマ
– テーブルスペース
– データ型
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 16
https://www.postgresql.jp/document/9.4/html/sql-grant.html
オブジェクト権限の読み⽅
• psqlの¥dpコマンドの出⼒
– 「=」の左側は権限の保有者、右側は権限内容、「/」の右側は付与者
– ユーザ snaga の権限
• INSERT(a), SELECT(r), UPDATE(w), DELETE(d), TRUNCATE(D),
REFERENCES(x), TRIGGER(t)
– ロール webapp_r の権限
• SELECT(r)
• ユーザ snaga が付与した
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 17
testdb=> grant select on pgbench_accounts to webapp_r;
GRANT
testdb=> ¥dp pgbench_accounts
Access privileges
Schema |       Name       | Type  |  Access privileges  | Column access 
privileges
‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
public | pgbench_accounts | table | snaga=arwdDxt/snaga+|
|                  |       | webapp_r=r/snaga    |
(1 row)
testdb=>
権限の棚卸、クリーニング
• 権限の棚卸、クリーニングはセキュリティ管理の基本
• 最⼩権限分析
– ユーザーに実際に必要な権限のみを与える
• 不使⽤権限分析
– ユーザーが実際には使わなかった権限について分析する
• 「実際に使っているかどうか」を確認するのは
PostgreSQL単体では難しい
– 後述のSQLファイアーウォールや監査ログモジュールなどを⽤
いる
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 18
オブジェクト権限の確認⽅法
• システムテーブル pg_class の relacl カラム
– データ型は aclitem[]
• これらのカラムを確認することで、すべてのオブジェク
トに対する権限付与の状況を確認することができる
– 記録として残していけば、変更状況も追える
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 19
testdb=> select relname,relacl from pg_class where relname like 'pgbench%‘ and 
relkind = ‘r’ order by relname;
relname        |                 relacl
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
pgbench_accounts      | {snaga=arwdDxt/snaga,webapp_r=r/snaga}
pgbench_branches      | {snaga=arwdDxt/snaga,=r/snaga}
pgbench_history       |
pgbench_tellers       |
(4 rows)
testdb=>
SQLファイアーウォール
• いかにして「想定していないSQLの実⾏」を防ぐか
– SQLインジェクションに代表される問題
– アプリケーション、フレームワークでの対応は限界
– テーブル単位やDML単位の権限管理でも⼗分ではない
• 実⾏できるSQLを制限してしまえば良い
– SQLを好き放題何でも実⾏できる必要はない
• 技術的な課題
– リテラルが異なる場合
– スペースやコメントなどが異なる場合
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 20
sql_firewall
• 実⾏できるSQL⽂を制限することによって、SQLインジェクション
攻撃からの防御を実現。
– PostgreSQL内部の「フック」を利⽤
– pg_stat_statementsと同様の仕組みで、同⼀クエリIDごとに制御
• 学習モードで実⾏を許可するSQL⽂を学習させ、警告モードまたは
防御モードで動作させる。
– 学習モード(learning)
– 警告モード(permissive)
– 防御モード(enforcing)
• オープンソースで公開
– http://www.github.com/uptimejp/sql_firewall
– ライセンスはPostgreSQL License
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 21
http://pgsqldeepdive.blogspot.jp/2015/08/postgresql-sql-firewall.html
実⾏例
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 22
学習していないSQLの実⾏を防⽌
第3部
テーブル内部の詳細な権限制御
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 23
テーブルにおける権限設定
• テーブルとビューの権限の分離
• ⾏レベルの権限制御
– ビューによる制御
– RLSによる制御
• 列レベルセキュリティ
– ビューによる制御
– GRANT TABLE COLUMN
• トリガーによる更新の制御
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 24
テーブルとビューの権限の分離
• テーブルとビューには別々に権限を付与できる
– 単⼀のテーブルでもユーザによって権限を制御可能
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 25
testdb=> CREATE TABLE t1 AS SELECT rolname,rolsuper,rolcreaterole,rolcreatedb 
FROM pg_roles;
SELECT 5
testdb=> CREATE VIEW v1 AS SELECT * FROM t1;
CREATE VIEW
testdb=> grant select on v1 to webapp_r;
GRANT
testdb=> ¥dp t1
Access privileges
Schema | Name | Type  | Access privileges | Column access privileges
‐‐‐‐‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
public | t1   | table |                   |
(1 row)
testdb=> ¥dp v1
Access privileges
Schema | Name | Type |  Access privileges  | Column access privileges
‐‐‐‐‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
public | v1   | view | snaga=arwdDxt/snaga+|
|      |      | webapp_r=r/snaga    |
(1 row)
テーブルとビューの権限の分離
• ビューは参照可能だが、テーブルは参照不可
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 26
You are now connected to database "testdb" as user "webapp".
testdb=> select * from t1;
ERROR:  permission denied for relation t1
testdb=> select * from v1;
rolname  | rolsuper | rolcreaterole | rolcreatedb
‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐
postgres | t        | t             | t
webapp   | f        | f             | f
webapp_r | f        | f             | f
snaga    | f        | f             | f
admin_r  | f        | f             | t
(5 rows)
testdb=>
ビューによる⾏レベルの制御
• どのような⾏を⾒せるかをビューの条件で制御する
• 例えば、実効ロールと⼀致する⾏だけ⾒せたい場合
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 27
postgres=> CREATE VIEW pg_all_roles AS SELECT * FROM pg_roles WHERE rolname = 
current_user;
CREATE VIEW
ostgres=> SELECT rolname,rolsuper,rolcreaterole,rolcreatedb FROM pg_all_roles;
rolname | rolsuper | rolcreaterole | rolcreatedb
‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐
snaga   | f        | f             | f
(1 row)
postgres=> SET ROLE admin_r;
SET
postgres=> SELECT rolname,rolsuper,rolcreaterole,rolcreatedb FROM pg_all_roles;
rolname | rolsuper | rolcreaterole | rolcreatedb
‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐
admin_r | f        | f             | t
(1 row)
⾏レベルセキュリティ(RLS)
• ⾏レベルセキュリティ(Row Level Security; RLS)
– テーブルに含まれるどの⾏が返却されるべきか、という、アク
セスポリシーの定義を可能にする
– デフォルトでは無効化されている
– CREATE POLICY, ALTER POLICY, DROP POLICY
• 制約
– PostgreSQL 9.5からの機能
– 現時点では、システムカタログには適⽤できない
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 28
実⾏例
• CREATE POLICY roles_table_policy1 ON roles_table
FOR ALL USING (rolname = current_user);
ユーザ名でフィルタするように
ポリシーを定義
実⾏例
• 各ユーザは、⾃分のユーザ名と⼀致した⾏のみを参照で
きる
“user01” は rolename が
‘user01’ レコードのみ
“user02” は rolename が
‘user02’ レコードのみ
ビューによる列レベルの制御
• 参照させたくない列を除いた、または別のデータにマス
クしたビューを定義する
– 例:システムビューの pg_roles (pg_authidを使ったビュー)
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 31
testdb=> ¥d+ pg_roles;
Column     |           Type           | Modifiers | Storage  | Description
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐
rolname        | name                     |           | plain    |
(...snip...)
rolconnlimit   | integer                  |           | plain    |
rolpassword    | text                     |           | extended |
rolvaliduntil  | timestamp with time zone |           | plain    |
(...snip...)
View definition:
SELECT pg_authid.rolname,
(...snip...)
pg_authid.rolconnlimit,
'********'::text AS rolpassword,
pg_authid.rolvaliduntil,
(...snip...)
FROM pg_authid
LEFT JOIN pg_db_role_setting s ON pg_authid.oid = s.setrole AND s.setdatabase = 
0::oid;
列レベルセキュリティ
• テーブルの特定のカラムだけ権限を設定する
– GRANT ... ON <table> (<column>, ...) TO ...
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 32
postgres=> ¥c postgres snaga
Password for user snaga:
You are now connected to database 
"postgres" as user "snaga".
postgres=> CREATE TABLE t1 AS SELECT * FROM 
pg_database;
SELECT 4
postgres=> GRANT SELECT (datname) ON t1 TO 
webapp_r;
GRANT
postgres=> ¥c postgres webapp
Password for user webapp:
You are now connected to database 
"postgres" as user "webapp".
postgres=> SELECT datname FROM t1;
datname
‐‐‐‐‐‐‐‐‐‐‐
template1
template0
postgres
testdb
(4 rows)
postgres=> SELECT * FROM t1;
ERROR:  permission denied for relation t1
postgres=> ¥d t1
Table "public.t1"
Column     |   Type    | Modifiers
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐
datname       | name      |
datdba        | oid       |
encoding      | integer   |
datcollate    | name      |
datctype      | name      |
datistemplate | boolean   |
datallowconn  | boolean   |
datconnlimit  | integer   |
datlastsysoid | oid       |
datfrozenxid  | xid       |
datminmxid    | xid       |
dattablespace | oid       |
datacl        | aclitem[] |
postgres=> 
Pgcryptoによるデータの暗号化
• pgcryptoモジュール
– contribに含まれるEXTENSION
– RPMの場合は postgresql94-contrib パッケージ
• 暗号化に関連するSQL関数を提供
– 汎⽤ハッシュ関数
– パスワードハッシュ化関数
– PGP暗号化関数
– 単純な暗号化関数
– ランダムデータ関数
• アプリケーションやプロシージャから呼び出すことでデータを暗号
化する
– ORACLEのDBMS_OBFUSCATION_TOOLKIT/DBMS_CRYPTOパッケ
ージと似ている。
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 33
https://www.postgresql.jp/document/9.4/html/pgcrypto.html
http://lets.postgresql.jp/documents/technical/contrib/pgcrypto/
実⾏例(1/2)
• pgp_sym_encrypt()関数を使って暗号化
– 暗号化済みデータはbytea型となる
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 34
testdb=> select pgp_sym_encrypt('Park Gyu‐ri', 'foo');
pgp_sym_encrypt
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
¥xc30d040703029a823af0155d0c7d74d23c01827e1cea52f9a4bcb1485e727b25d76f5e8877cfaf7cd1c72
b9286db13150628023054a82fe514edfa319af9d1e2f20a046b8fcc98508e0d6c43d7
(1 row)
testdb=> insert into k1 values (1, pgp_sym_encrypt('Park Gyu‐ri', 'foo'));
INSERT 0 1
testdb=> select * from k1;
uid |                                              uname
‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
1 | ¥xc30d04070302a4a1cac0e5c0194873d23c01a208db4f5cd40a5fe6c31560fc80d3e942d348 ...
(1 row)
testdb=> insert into k1 values (2, pgp_sym_encrypt('Nicole Jung', 'foo')),(3, 
pgp_sym_encrypt('Goo Ha‐ra', 'foo')),(4, pgp_sym_encrypt('Han Seung‐yeon', 'foo')),(5, 
pgp_sym_encrypt('Kang Ji‐young', 'foo'));
INSERT 0 4
testdb=>
実⾏例(2/2)
• pgp_sym_decript()関数を使って復号化
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 35
testdb=> select * from k1;
uid |                                                         uname
‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
1 | ¥xc30d04070302a4a1cac0e5c0194873d23c01a208db4f5cd40a5fe6c31560fc80d3e942d348 ...
2 | ¥xc30d0407030274f9225d4f781acb6cd23c01788a101491c122666504b28340924809722054 ... 
3 | ¥xc30d04070302e748374655543b1f65d23a01e4002fa0dc18cdf9548741340645dceb8580ea ...
4 | ¥xc30d040703026b81ffb5501910046fd23f01defc373ba444e9978e89b12ed02e1039aab40e ...
5 | ¥xc30d04070302305cbe84633d5e877bd23e018471bff50d4eb2f12a8cab0f5c66f751b56e1d ...
(5 rows)
testdb=> select uid,pgp_sym_decrypt(uname, 'foo') as dec from k1;
uid |      dec
‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
1 | Park Gyu‐ri
2 | Nicole Jung
3 | Goo Ha‐ra
4 | Han Seung‐yeon
5 | Kang Ji‐young
(5 rows)
testdb=>
透過的暗号化(TDE)
• TDE; Transparent Data Encryption
– SQL関数の呼び出しにはアプリケーションの改修が必要
– アプリの改修なしで「透過的に」暗号化を実現する
– 透過的 ≒ 明⽰的な処理をすることなく
– Pgcryptoモジュールを利⽤して暗号化データ型を実現
• Transparent Data Encryption for PostgreSQL
– 開発はNEC、2015年6⽉公開
– http://jpn.nec.com/press/201506/20150605_01.html
• Free Edition
– フリー版は暗号化textと暗号化byteaをサポート
– ライセンスはGPLv3
– https://github.com/nec-postgres/tdeforpg
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 36
実⾏例(1/2)
• カラムにencrypt_text型を指定してテーブルを作成
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 37
testdb=> create table k1 (uid integer primary key, uname encrypt_text );
CREATE TABLE
testdb=> select pgtde_begin_session('foo');
pgtde_begin_session
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
t
(1 row)
testdb=> insert into k1 values (1, 'Park Gyu‐ri'),(2, 'Nicole Jung'),(3, 'Goo 
Ha‐ra'),(4, 'Han Seung‐yeon'),(5, 'Kang Ji‐young');
INSERT 0 5
testdb=> select * from k1;
uid |     uname
‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
1 | Park Gyu‐ri
2 | Nicole Jung
3 | Goo Ha‐ra
4 | Han Seung‐yeon
5 | Kang Ji‐young
(5 rows)
testdb=> ¥q
{1020}snaga@devvm04:~$
実⾏例(2/2)
• 別のセッションでは、鍵を設定しないと読み取り不可。
– 実際の鍵の設定前後には cipher_key_{disable,enable}_log() が必要
– 鍵情報がサーバログに残らないようにするため
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 38
{1020}snaga@devvm04:~$ psql ‐U snaga testdb
testdb=> select * from k1;
ERROR:  TDE‐E0017 could not decrypt data, because key was not set(01)
testdb=> select pgtde_begin_session('foo');
pgtde_begin_session
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
t
(1 row)
testdb=> select * from k1;
uid |     uname
‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
1 | Park Gyu‐ri
2 | Nicole Jung
3 | Goo Ha‐ra
4 | Han Seung‐yeon
5 | Kang Ji‐young
(5 rows)
第4部
ログと監査
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 39
「監査ログ」とは?
• 監査のためのログ
– ⼀般的には「誰が、いつ、どこから、何に対して、何をして、どうな
ったか」(⽬的によって変わる)
• 監査の⽬的例
– 重要情報に関するアクセス
– 不正が疑われるアクセス
– 特権ユーザによるアクセス
– データベースに関する全てのアクセス
• 監査項⽬の例
– アクセスに失敗したユーザ
– 発⾏されたSQLクエリ
– アクセス頻度、時間帯
– DBスキーマの変更・削除
– アカウント変更・削除
– オブジェクト権限の変更・削除
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 40
pg_auditモジュール
• PostgreSQLのフックの機能を使い、実⾏したSQLのログを出⼒す
るEXTENSION
• 出⼒項⽬
– タイムスタンプ
– DB名
– ユーザ名、実効ユーザ名(SET ROLEした場合)
– クラス、コマンドタグ
– オブジェクトタイプ、オブジェクト名
– 実⾏コマンド
• 上記を既存の log_line_prefix と組み合わせて出⼒する
• DB、ユーザ、クラスなどは選択的に出⼒可能
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 41
https://github.com/2ndQuadrant/pgaudit
実⾏例(1/2)
• テーブルの作成とデータ挿⼊
– すべての監査ログイベントを出⼒するように設定
– クライアント側にもログを表⽰するように設定して実⾏
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 42
testdb=# set client_min_messages to log;
SET
testdb=# create table k1 (uid integer primary key, uname text );
LOG:  AUDIT,2015‐11‐27 11:46:56.526683+09,testdb,snaga,snaga,DEFINITION,CREATE 
TABLE,TABLE,public.k1,create table k1 (uid integer primary key, uname text );
LOG:  AUDIT,2015‐11‐27 11:46:56.546729+09,testdb,snaga,snaga,DEFINITION,CREATE 
INDEX,INDEX,public.k1_pkey,create table k1 (uid integer primary key, uname text );
CREATE TABLE
testdb=# insert into k1 values (1, 'Park Gyu‐ri'),(2, 'Nicole Jung'),(3, 'Goo Ha‐
ra'),(4, 'Han Seung‐yeon'),(5, 'Kang Ji‐young');
LOG:  AUDIT,2015‐11‐27 
11:47:01.647673+09,testdb,snaga,snaga,WRITE,INSERT,TABLE,public.k1,insert into k1 
values (1, 'Park Gyu‐ri'),(2, 'Nicole Jung'),(3, 'Goo Ha‐ra'),(4, 'Han Seung‐
yeon'),(5, 'Kang Ji‐young');
INSERT 0 5
testdb=#
実⾏例(2/2)
• データの参照と権限の付与
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 43
testdb=# select * from k1;
LOG:  AUDIT,2015‐11‐27 11:47:07.221334+09,testdb,snaga,snaga,READ,SELECT,TABLE,pub
lic.k1,select * from k1;
uid |     uname
‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
1 | Park Gyu‐ri
2 | Nicole Jung
3 | Goo Ha‐ra
4 | Han Seung‐yeon
5 | Kang Ji‐young
(5 rows)
testdb=# grant select on k1 to public;
LOG:  AUDIT,2015‐11‐27 11:47:11.328344+09,testdb,snaga,snaga,PRIVILEGE,GRANT,,,gra
nt select on k1 to public;
GRANT
testdb=#
ログの収集と監査の実施
• 「コンプライアンス上、ログを残します」という要件は多いが…
– 本当に「監査」していますか?
– 例えば、以下のようなエラーメッセージ
• FATAL: role "foo" does not exist
• FATAL: password authentication failed for user "postgres"
• FATAL: permission denied for database "postgres"
• ERROR: permission denied for relation orders
• セキュリティインシデントをすぐに検知できますか?
– 検知をしないと回復はできない
– 「実は半年前からデータを抜かれてました」(←よくある話)
• セキュリティコントロールの4機能
– 「抑⽌/予防/検知/回復」
– ⽇本の企業は「検知」と「回復」が弱い傾向(PwC 林⽒)
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 44
ログの可視化
• 監査に向けての第⼀歩として、可視化して分布、パターンを⾒る
– BIツールの利⽤がオススメ(⾃在な分析軸とレポート機能)
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 45
第5部
その他
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 46
バックアップファイル
• バックアップファイルは暗号化されない
– PostgreSQLとしては機能も提供していない
• D2Dのバックアップのリスク
– 最新世代はディスクに置きっぱなし
– ファイルシステムやファイルなどのレベルで保護を
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 47
システムカタログ
• 関連するシステムカタログ⼀覧
– pg_auth_members
– pg_authid
– pg_db_role_setting
– pg_default_acl
– pg_group
– pg_roles
– pg_seclabel
– pg_shadow
– pg_user
– pg_user_mapping, pg_user_mappings
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 48
Postgres Advanced Security Pack
• セキュリティ関連モジュールをオールインワン・パッケージ化
– 導⼊時に個別にビルドしたり検証したりする必要がなくなる
– 独⾃の追加ドキュメントも同梱
– オープンソースライセンス(各モジュールのライセンスに依存)
– 現在、テクノロジープレビュー版(バージョン0.8)
• Postgres Advanced Security Pack 0.8に含まれるモジュール
– tdeforpg (透過的暗号化)
– pgaudit (監査ログ)
– sql_firewall (SQLファイアーウォール)
• リリース案内、導⼊⽅法など
– http://pgsqldeepdive.blogspot.jp/2015/10/postgres-advanced-
security-pack.html
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 49
参考⽂献
• データベースセキュリティガイドライン 第2.0版(データベースセ
キュリティコンソーシアム)
• DB内部不正対策ガイドライン 第1.0版(同上)
• データベース暗号化ガイドライン 第1.0版(同上)
• 統合ログ管理サービスガイドライン 第1.0版(同上)
• Oracleデータベースセキュリティ セキュアなデータベース構築・
運⽤の原則(翔泳社)
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 50
Q&A
Copyright 2015 Uptime Technologies, LLC. All rights reserved. 51
コメント、質問など
Twitter: @snaga
E-Mail: snaga@uptime.jp

More Related Content

What's hot

Azure API Management 俺的マニュアル
Azure API Management 俺的マニュアルAzure API Management 俺的マニュアル
Azure API Management 俺的マニュアル貴志 上坂
 
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理NTT DATA Technology & Innovation
 
マイクロサービスと Red Hat Integration
マイクロサービスと Red Hat Integrationマイクロサービスと Red Hat Integration
マイクロサービスと Red Hat IntegrationKenta Kosugi
 
PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説Masahiko Sawada
 
PostgreSQLでスケールアウト
PostgreSQLでスケールアウトPostgreSQLでスケールアウト
PostgreSQLでスケールアウトMasahiko Sawada
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことAmazon Web Services Japan
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションMasahiko Sawada
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方Shohei Koyama
 
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介Tetsutaro Watanabe
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)NTT DATA Technology & Innovation
 
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)NTT DATA Technology & Innovation
 
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)NTT DATA Technology & Innovation
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...NTT DATA Technology & Innovation
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Akihiro Suda
 
インフラ廻戦 品川事変 前夜編
インフラ廻戦 品川事変 前夜編インフラ廻戦 品川事変 前夜編
インフラ廻戦 品川事変 前夜編Toru Makabe
 

What's hot (20)

Azure API Management 俺的マニュアル
Azure API Management 俺的マニュアルAzure API Management 俺的マニュアル
Azure API Management 俺的マニュアル
 
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
 
Metaspace
MetaspaceMetaspace
Metaspace
 
マイクロサービスと Red Hat Integration
マイクロサービスと Red Hat Integrationマイクロサービスと Red Hat Integration
マイクロサービスと Red Hat Integration
 
PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説
 
PostgreSQLでスケールアウト
PostgreSQLでスケールアウトPostgreSQLでスケールアウト
PostgreSQLでスケールアウト
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方
 
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介
 
PostgreSQLバックアップの基本
PostgreSQLバックアップの基本PostgreSQLバックアップの基本
PostgreSQLバックアップの基本
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
 
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
 
KafkaとPulsar
KafkaとPulsarKafkaとPulsar
KafkaとPulsar
 
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
 
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
CloudNativePGを動かしてみた! ~PostgreSQL on Kubernetes~(第34回PostgreSQLアンカンファレンス@オンライ...
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
インフラ廻戦 品川事変 前夜編
インフラ廻戦 品川事変 前夜編インフラ廻戦 品川事変 前夜編
インフラ廻戦 品川事変 前夜編
 
KeycloakでAPI認可に入門する
KeycloakでAPI認可に入門するKeycloakでAPI認可に入門する
KeycloakでAPI認可に入門する
 

Viewers also liked

PL/Pythonで独自の集約関数を作ってみる
PL/Pythonで独自の集約関数を作ってみるPL/Pythonで独自の集約関数を作ってみる
PL/Pythonで独自の集約関数を作ってみるUptime Technologies LLC (JP)
 
OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料kasaharatt
 
明日から使えるPostgre sql運用管理テクニック(監視編)
明日から使えるPostgre sql運用管理テクニック(監視編)明日から使えるPostgre sql運用管理テクニック(監視編)
明日から使えるPostgre sql運用管理テクニック(監視編)kasaharatt
 
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料kasaharatt
 
Postgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etcPostgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etckasaharatt
 
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)Uptime Technologies LLC (JP)
 

Viewers also liked (8)

PL/Pythonで独自の集約関数を作ってみる
PL/Pythonで独自の集約関数を作ってみるPL/Pythonで独自の集約関数を作ってみる
PL/Pythonで独自の集約関数を作ってみる
 
OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料OSC沖縄2014_JPUG資料
OSC沖縄2014_JPUG資料
 
Postgres Toolkit
Postgres ToolkitPostgres Toolkit
Postgres Toolkit
 
明日から使えるPostgre sql運用管理テクニック(監視編)
明日から使えるPostgre sql運用管理テクニック(監視編)明日から使えるPostgre sql運用管理テクニック(監視編)
明日から使えるPostgre sql運用管理テクニック(監視編)
 
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
 
Postgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etcPostgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etc
 
Postgres Toolkitのご紹介
Postgres Toolkitのご紹介Postgres Toolkitのご紹介
Postgres Toolkitのご紹介
 
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
 

Similar to PostgreSQLセキュリティ総復習

Uptime Database Appliance テクノロジープレビュー
Uptime Database Appliance テクノロジープレビューUptime Database Appliance テクノロジープレビュー
Uptime Database Appliance テクノロジープレビューUptime Technologies LLC (JP)
 
Right scaleの利用効果、苦労話 クラウドマネジメントツール勉強会
Right scaleの利用効果、苦労話 クラウドマネジメントツール勉強会Right scaleの利用効果、苦労話 クラウドマネジメントツール勉強会
Right scaleの利用効果、苦労話 クラウドマネジメントツール勉強会Hirokazu Narita
 
全社情報共有サイトへの Alfresco Community 5 導入事例紹介 - 第27回Alfresco勉強会
全社情報共有サイトへのAlfresco Community 5 導入事例紹介 - 第27回Alfresco勉強会全社情報共有サイトへのAlfresco Community 5 導入事例紹介 - 第27回Alfresco勉強会
全社情報共有サイトへの Alfresco Community 5 導入事例紹介 - 第27回Alfresco勉強会Ryota Watabe
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624Yusuke Suzuki
 
20120822_dstn技術交流会_dstnのご紹介と最新技術情報
20120822_dstn技術交流会_dstnのご紹介と最新技術情報20120822_dstn技術交流会_dstnのご紹介と最新技術情報
20120822_dstn技術交流会_dstnのご紹介と最新技術情報dstn
 
A13 MySQL & NoSQL~Best of both world~ by Philip Antoniades & Ryusuke Kajiyama
A13 MySQL & NoSQL~Best of both world~ by Philip Antoniades & Ryusuke Kajiyama A13 MySQL & NoSQL~Best of both world~ by Philip Antoniades & Ryusuke Kajiyama
A13 MySQL & NoSQL~Best of both world~ by Philip Antoniades & Ryusuke Kajiyama Insight Technology, Inc.
 
JiraとConfluenceのTips集
JiraとConfluenceのTips集JiraとConfluenceのTips集
JiraとConfluenceのTips集Hiroshi Ohnuki
 
Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識shigeya
 
Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識shigeya
 
第9回 OpenStack 勉強会(Glance)
第9回 OpenStack 勉強会(Glance)第9回 OpenStack 勉強会(Glance)
第9回 OpenStack 勉強会(Glance)Hiroki Ishikawa
 
過去事例から学ぶ SharePoint パフォーマンス問題とその対策
過去事例から学ぶ SharePoint パフォーマンス問題とその対策過去事例から学ぶ SharePoint パフォーマンス問題とその対策
過去事例から学ぶ SharePoint パフォーマンス問題とその対策Atsuo Yamasaki
 
About OpenStack DBaas (trove)
About OpenStack DBaas (trove)About OpenStack DBaas (trove)
About OpenStack DBaas (trove)Ikuo Kumagai
 
AWSのデータベースサービス全体像
AWSのデータベースサービス全体像AWSのデータベースサービス全体像
AWSのデータベースサービス全体像Amazon Web Services Japan
 
Sql server 2014 新機能の紹介 改訂版
Sql server 2014 新機能の紹介 改訂版Sql server 2014 新機能の紹介 改訂版
Sql server 2014 新機能の紹介 改訂版Oda Shinsuke
 
ログ分析からセキュリティ監視まで:Oracle Management Cloudで実現するIT運用データのビッグデータ分析 [Oracle Cloud D...
ログ分析からセキュリティ監視まで:Oracle Management Cloudで実現するIT運用データのビッグデータ分析 [Oracle Cloud D...ログ分析からセキュリティ監視まで:Oracle Management Cloudで実現するIT運用データのビッグデータ分析 [Oracle Cloud D...
ログ分析からセキュリティ監視まで:Oracle Management Cloudで実現するIT運用データのビッグデータ分析 [Oracle Cloud D...オラクルエンジニア通信
 
Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!
Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!
Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!Yoichi Kawasaki
 
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)NTT DATA Technology & Innovation
 

Similar to PostgreSQLセキュリティ総復習 (20)

Uptime Database Appliance テクノロジープレビュー
Uptime Database Appliance テクノロジープレビューUptime Database Appliance テクノロジープレビュー
Uptime Database Appliance テクノロジープレビュー
 
Right scaleの利用効果、苦労話 クラウドマネジメントツール勉強会
Right scaleの利用効果、苦労話 クラウドマネジメントツール勉強会Right scaleの利用効果、苦労話 クラウドマネジメントツール勉強会
Right scaleの利用効果、苦労話 クラウドマネジメントツール勉強会
 
全社情報共有サイトへの Alfresco Community 5 導入事例紹介 - 第27回Alfresco勉強会
全社情報共有サイトへのAlfresco Community 5 導入事例紹介 - 第27回Alfresco勉強会全社情報共有サイトへのAlfresco Community 5 導入事例紹介 - 第27回Alfresco勉強会
全社情報共有サイトへの Alfresco Community 5 導入事例紹介 - 第27回Alfresco勉強会
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624
 
20120822_dstn技術交流会_dstnのご紹介と最新技術情報
20120822_dstn技術交流会_dstnのご紹介と最新技術情報20120822_dstn技術交流会_dstnのご紹介と最新技術情報
20120822_dstn技術交流会_dstnのご紹介と最新技術情報
 
A13 MySQL & NoSQL~Best of both world~ by Philip Antoniades & Ryusuke Kajiyama
A13 MySQL & NoSQL~Best of both world~ by Philip Antoniades & Ryusuke Kajiyama A13 MySQL & NoSQL~Best of both world~ by Philip Antoniades & Ryusuke Kajiyama
A13 MySQL & NoSQL~Best of both world~ by Philip Antoniades & Ryusuke Kajiyama
 
Oracle Database Vaultのご紹介
Oracle Database Vaultのご紹介Oracle Database Vaultのご紹介
Oracle Database Vaultのご紹介
 
JiraとConfluenceのTips集
JiraとConfluenceのTips集JiraとConfluenceのTips集
JiraとConfluenceのTips集
 
Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識
 
BPStudy20121221
BPStudy20121221BPStudy20121221
BPStudy20121221
 
Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識Windows PowerShell 2.0 の基礎知識
Windows PowerShell 2.0 の基礎知識
 
第9回 OpenStack 勉強会(Glance)
第9回 OpenStack 勉強会(Glance)第9回 OpenStack 勉強会(Glance)
第9回 OpenStack 勉強会(Glance)
 
過去事例から学ぶ SharePoint パフォーマンス問題とその対策
過去事例から学ぶ SharePoint パフォーマンス問題とその対策過去事例から学ぶ SharePoint パフォーマンス問題とその対策
過去事例から学ぶ SharePoint パフォーマンス問題とその対策
 
About OpenStack DBaas (trove)
About OpenStack DBaas (trove)About OpenStack DBaas (trove)
About OpenStack DBaas (trove)
 
AWSのデータベースサービス全体像
AWSのデータベースサービス全体像AWSのデータベースサービス全体像
AWSのデータベースサービス全体像
 
Sql server 2014 新機能の紹介 改訂版
Sql server 2014 新機能の紹介 改訂版Sql server 2014 新機能の紹介 改訂版
Sql server 2014 新機能の紹介 改訂版
 
ログ分析からセキュリティ監視まで:Oracle Management Cloudで実現するIT運用データのビッグデータ分析 [Oracle Cloud D...
ログ分析からセキュリティ監視まで:Oracle Management Cloudで実現するIT運用データのビッグデータ分析 [Oracle Cloud D...ログ分析からセキュリティ監視まで:Oracle Management Cloudで実現するIT運用データのビッグデータ分析 [Oracle Cloud D...
ログ分析からセキュリティ監視まで:Oracle Management Cloudで実現するIT運用データのビッグデータ分析 [Oracle Cloud D...
 
Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!
Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!
Web App for Containers + MySQLでコンテナ対応したRailsアプリを作ろう!
 
ROMAについて
ROMAについてROMAについて
ROMAについて
 
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
 

More from Uptime Technologies LLC (JP)

pgstattuple2: デッドタプル推定のための統計的手法
pgstattuple2: デッドタプル推定のための統計的手法pgstattuple2: デッドタプル推定のための統計的手法
pgstattuple2: デッドタプル推定のための統計的手法Uptime Technologies LLC (JP)
 
「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisitedUptime Technologies LLC (JP)
 
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告Uptime Technologies LLC (JP)
 
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)Uptime Technologies LLC (JP)
 
5ステップで始めるPostgreSQLレプリケーション@hbstudy#13
5ステップで始めるPostgreSQLレプリケーション@hbstudy#135ステップで始めるPostgreSQLレプリケーション@hbstudy#13
5ステップで始めるPostgreSQLレプリケーション@hbstudy#13Uptime Technologies LLC (JP)
 

More from Uptime Technologies LLC (JP) (9)

pgstattuple2: デッドタプル推定のための統計的手法
pgstattuple2: デッドタプル推定のための統計的手法pgstattuple2: デッドタプル推定のための統計的手法
pgstattuple2: デッドタプル推定のための統計的手法
 
「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited「今そこにある危機」を捉える ~ pg_stat_statements revisited
「今そこにある危機」を捉える ~ pg_stat_statements revisited
 
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
BigDataを迎え撃つ! PostgreSQL並列分散ミドルウェア「Stado」の紹介と検証報告
 
いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理
 
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
 
PostgreSQL Query Cache - "pqc"
PostgreSQL Query Cache - "pqc"PostgreSQL Query Cache - "pqc"
PostgreSQL Query Cache - "pqc"
 
PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門
 
5ステップで始めるPostgreSQLレプリケーション@hbstudy#13
5ステップで始めるPostgreSQLレプリケーション@hbstudy#135ステップで始めるPostgreSQLレプリケーション@hbstudy#13
5ステップで始めるPostgreSQLレプリケーション@hbstudy#13
 
PostgreSQL安定運用のコツ2009 @hbstudy#5
PostgreSQL安定運用のコツ2009 @hbstudy#5PostgreSQL安定運用のコツ2009 @hbstudy#5
PostgreSQL安定運用のコツ2009 @hbstudy#5
 

PostgreSQLセキュリティ総復習

  • 1. Copyright 2015 Uptime Technologies, LLC. All rights reserved. 1 PostgreSQLセキュリティ総復習 アップタイム・テクノロジーズ 永安 悟史 PostgreSQLカンファレンス2015
  • 2. アジェンダ • 本セッションの⽬的 • 全体感 • クライアントからデータベースに 接続するまで – アクセス制御 – 通信の暗号化 – ユーザ認証 – パスワードの設定 • コマンドの実⾏やオブジェクトへ のアクセス – ロール – ロールとシステム権限の管理 – システム権限 – システム権限の獲得 – オブジェクト権限の管理 – 権限の棚卸、クリーニング – SQLファイアーウォール Copyright 2015 Uptime Technologies, LLC. All rights reserved. 2 • テーブル内部の詳細な権限制御 – テーブル内部における権限設定 – ⾏レベルの制御 – 列レベルの制御 – データの暗号化 • ログと監査 – 「監査ログ」とは? – pg_auditモジュール – ログの収集と監査の実施 – ログの可視化 • その他 – バックアップファイルのセキュリ ティ – システムカタログ – Postgres Advanced Security Pack • 参考⽂献 • Q&A
  • 3. 本セッションの⽬的 • データベースを狙ったセキュリティインシデントが後を絶ちません 。そういう時代になりました。 • PostgreSQLを利⽤している、または利⽤しようとしている⽅に、 「今、PostgreSQLで何ができるのか?」を整理して提供したいと 思います。 • PostgreSQL単体でできること、周辺モジュールを使ってできるこ と、設計や開発でできること、等。 • 「PostgreSQLとセキュリティ」を考える上で、「⾒取り図」的な 情報としてお役に⽴てれば幸いです。 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 3
  • 4. PostgreSQLセキュリティの全体感 • データベースのさまざまなセキュリティ機能 – 検討事項が多岐に渡るため、⼤きな枠ごとに⾒ていく Copyright 2015 Uptime Technologies, LLC. All rights reserved. 4 PostgreSQLインスタンス postgres (リスナプロセス) postgres (サーバプロセス) テーブル インデックス サーバログ バックアップ ファイル クライアント アクセス制御、認証、 セッション暗号化 セッション暗号化、 データ暗号化 エラーログ、 監査ログ バックアップファイルの セキュリティ 認可、アクセス制御、 データ暗号化
  • 6. アクセス制御 • リモートからの接続を受け付ける – postgresql.conf の listen_addresses パラメータ – デフォルトはローカル(Unixドメインソケット)のみ可 • localhost も不可(TCP/IPをListenしていない) • ホストベース認証(Host-Based Authentication) – 設定ファイル pg_hba.conf – 接続⽅法、データベース、ユーザ、接続元ホスト(またはネットワー ク)の組み合わせに応じて、認証⽅法を設定。 • 認証⽅法 – “trust”, “reject”, “md5”, “password”, “gss”, “sspi”, "ident", "peer", "pam", "ldap", "radius" or "cert" Copyright 2015 Uptime Technologies, LLC. All rights reserved. 6 https://www.postgresql.jp/document/9.4/html/runtime-config-connection.html https://www.postgresql.jp/document/9.4/html/auth-pg-hba-conf.html
  • 7. 通信の暗号化 • SSLによる暗号化通信のサポート – 認証セッション、データセッション、全部SSLで暗号化。 – postgresql.conf の ssl パラメータ – SSLを強制する場合には pg_hba.conf で hostssl を指定。 • クライアント証明書のサポート – クライアント証明書を利⽤することも可能。 – 認証局(CA)の設定が必要。 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 7 https://www.postgresql.jp/document/9.4/html/ssl-tcp.html
  • 8. ユーザ認証 • クライアントサイドの認証設定 – 認証情報を .pgpass ファイルに指定することが可能。 – ホームディレクトリか環境変数 PGPASSFILE で指定。 – JDBCの場合は .pgpass は未サポート。 • その他、環境変数などでも設定可能 – libpqライブラリを使うクライアントツール(psqlなど)で共通で使え る環境変数 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 8 https://www.postgresql.jp/document/9.4/html/libpq-pgpass.html https://www.postgresql.jp/document/9.4/html/libpq-envars.html
  • 9. パスワードの設定 • パスワードの設定⽅法 – ALTER ROLE foo PASSWORD ʻpasswdʼ; – ¥password コマンド(psql) • MD5で暗号化してパスワードを保存 – password_encryptionパラメータ(デフォルトon) – ALTER ROLE foo ENCRYPTED PASSWORD ʻpasswdʼ; • パスワードを設定する際の注意 – ALTER ROLEで平⽂パスワードを指定すると、サーバログに残る可能 性あり。(サーバログ設定に依存) – MD5暗号化済みパスワードを指定するか、¥password コマンドを使⽤ すること。 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 9
  • 11. ロール • PostgreSQLの権限制御はロールによる制御 – CREATE ROLE / ALTER ROLE / DROP ROLE – システムビュー pg_roles • PostgreSQLの「ユーザ、グループ」は「ロール」と同義 – ユーザはロールのエイリアス – システムビュー pg_user と pg_group • コマンド権限やオブジェクト権限をロールに割り振る – 実⾏できる処理の権限(後述) – ORACLEなどのように細かくない。 – 付与できる権限は次ページの通り。 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 11
  • 12. ロールとシステム権限の管理 • ロールの設定(pg_roles) – 権限(システム権限) • rolsuper, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication – ロール権限の派⽣ • rolinherit – 接続上限数 • rolconnlimit – パスワード • rolpassword – 有効期限 • rolvaliduntil – ロールごとの設定項⽬ • rolconfig Copyright 2015 Uptime Technologies, LLC. All rights reserved. 12 https://www.postgresql.jp/document/9.4/html/sql-createrole.html https://www.postgresql.jp/document/9.4/html/view-pg-roles.html
  • 13. システム権限 • 注意すべき権限 – rolsuperはすべての権限管理より優先する権限 – rolcreateroleは任意の権限(super除く)を持ったロールを作成可能 – rolcanloginはログイン可能な権限 データベースは rolcreatedb で作れても、EXTENSIONのインストールは rolsuper が必要だったりするが・・・ Copyright 2015 Uptime Technologies, LLC. All rights reserved. 13 ‐‐ データベースの作成・削除が可能な admin_r ロールを作成 CREATE ROLE admin_r NOSUPERUSER CREATEDB NOCREATEROLE INHERIT NOLOGIN NOREPLICATION; ‐‐ データベースやロールの作成などが⼀切できない webapp_r ロールを作成 CREATE ROLE webapp_r NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT  NOLOGIN NOREPLICATION ‐‐ ユーザ snaga を作成して admin_r ロールに割り当てる CREATE ROLE snaga LOGIN INHERIT IN ROLE admin_r; ‐‐ ユーザ webapp を作成して webapp_r ロールに割り当てる CREATE ROLE webapp LOGIN INHERIT IN ROLE webapp_r;
  • 14. システム権限の獲得 • 所属しているロールのシステム権限を得るにはSET ROLEを使う – 接続直後には、他のロールのシステム権限は持っていない。 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 14 postgres=> select  rolname,rolsuper,rolcreatedb from pg_roles; rolname  | rolsuper | rolcreatedb ‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐ postgres | t        | t webapp   | f        | f webapp_r | f        | f snaga    | f        | f admin_r  | f        | t (5 rows) postgres=> select current_user; current_user ‐‐‐‐‐‐‐‐‐‐‐‐‐‐ snaga (1 row) postgres=> create database testdb; ERROR:  permission denied to create  database postgres=> postgres=> set role admin_r; SET postgres=> select current_user; current_user ‐‐‐‐‐‐‐‐‐‐‐‐‐‐ admin_r (1 row) postgres=> create database testdb; CREATE DATABASE postgres=> 権限を持っていないユーザー snaga が、 admin_rに昇格してデータベースを作成。 → 必要な時だけ権限を獲得する
  • 15. ロールとアクセス制御の設定例 • ロールの設定 – postgresロール以外はロール操作権限なし。 – (管理者含む)⼀般のロールとpostgresロールは分離。SET ROLEも不可。 • pg_hba.confの設定 – ローカル(Unix domain socket)からの接続はすべてMD5認証。 – リモート(TCP/IP)からの postgres ユーザの接続はすべて拒否。 – リモート(127.0.0.1 or 10.0.2.0/24)からの他のユーザの接続はすべてMD5認証。 • 結果、ロールの操作はpostgresユーザでローカルから直接接続した場合のみ。 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 15 postgres=> ¥du List of roles Role name |                   Attributes                   | Member of ‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐ admin_r   | Create DB, Cannot login                        | {} postgres  | Superuser, Create role, Create DB, Replication | {} snaga     | No inheritance                                 | {admin_r} webapp    | No inheritance   | {webapp_r} webapp_r  | No inheritance, Cannot login                   | {} local   all             all                                     md5 host    all             postgres        0.0.0.0/0               reject host    all             all             127.0.0.1/32            md5 host    all             all             10.0.2.0/24             md5
  • 16. オブジェクト権限の管理 • GRANT/REVOKEによるオブジェクト権限の管理 – テーブル – テーブルカラム – シーケンス – データベース – ドメイン – 外部データラッパ – 関数 – プロシージャ⾔語 – ラージオブジェクト – スキーマ – テーブルスペース – データ型 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 16 https://www.postgresql.jp/document/9.4/html/sql-grant.html
  • 17. オブジェクト権限の読み⽅ • psqlの¥dpコマンドの出⼒ – 「=」の左側は権限の保有者、右側は権限内容、「/」の右側は付与者 – ユーザ snaga の権限 • INSERT(a), SELECT(r), UPDATE(w), DELETE(d), TRUNCATE(D), REFERENCES(x), TRIGGER(t) – ロール webapp_r の権限 • SELECT(r) • ユーザ snaga が付与した Copyright 2015 Uptime Technologies, LLC. All rights reserved. 17 testdb=> grant select on pgbench_accounts to webapp_r; GRANT testdb=> ¥dp pgbench_accounts Access privileges Schema |       Name       | Type  |  Access privileges  | Column access  privileges ‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ public | pgbench_accounts | table | snaga=arwdDxt/snaga+| |                  |       | webapp_r=r/snaga    | (1 row) testdb=>
  • 18. 権限の棚卸、クリーニング • 権限の棚卸、クリーニングはセキュリティ管理の基本 • 最⼩権限分析 – ユーザーに実際に必要な権限のみを与える • 不使⽤権限分析 – ユーザーが実際には使わなかった権限について分析する • 「実際に使っているかどうか」を確認するのは PostgreSQL単体では難しい – 後述のSQLファイアーウォールや監査ログモジュールなどを⽤ いる Copyright 2015 Uptime Technologies, LLC. All rights reserved. 18
  • 19. オブジェクト権限の確認⽅法 • システムテーブル pg_class の relacl カラム – データ型は aclitem[] • これらのカラムを確認することで、すべてのオブジェク トに対する権限付与の状況を確認することができる – 記録として残していけば、変更状況も追える Copyright 2015 Uptime Technologies, LLC. All rights reserved. 19 testdb=> select relname,relacl from pg_class where relname like 'pgbench%‘ and  relkind = ‘r’ order by relname; relname        |                 relacl ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ pgbench_accounts      | {snaga=arwdDxt/snaga,webapp_r=r/snaga} pgbench_branches      | {snaga=arwdDxt/snaga,=r/snaga} pgbench_history       | pgbench_tellers       | (4 rows) testdb=>
  • 20. SQLファイアーウォール • いかにして「想定していないSQLの実⾏」を防ぐか – SQLインジェクションに代表される問題 – アプリケーション、フレームワークでの対応は限界 – テーブル単位やDML単位の権限管理でも⼗分ではない • 実⾏できるSQLを制限してしまえば良い – SQLを好き放題何でも実⾏できる必要はない • 技術的な課題 – リテラルが異なる場合 – スペースやコメントなどが異なる場合 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 20
  • 21. sql_firewall • 実⾏できるSQL⽂を制限することによって、SQLインジェクション 攻撃からの防御を実現。 – PostgreSQL内部の「フック」を利⽤ – pg_stat_statementsと同様の仕組みで、同⼀クエリIDごとに制御 • 学習モードで実⾏を許可するSQL⽂を学習させ、警告モードまたは 防御モードで動作させる。 – 学習モード(learning) – 警告モード(permissive) – 防御モード(enforcing) • オープンソースで公開 – http://www.github.com/uptimejp/sql_firewall – ライセンスはPostgreSQL License Copyright 2015 Uptime Technologies, LLC. All rights reserved. 21 http://pgsqldeepdive.blogspot.jp/2015/08/postgresql-sql-firewall.html
  • 22. 実⾏例 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 22 学習していないSQLの実⾏を防⽌
  • 24. テーブルにおける権限設定 • テーブルとビューの権限の分離 • ⾏レベルの権限制御 – ビューによる制御 – RLSによる制御 • 列レベルセキュリティ – ビューによる制御 – GRANT TABLE COLUMN • トリガーによる更新の制御 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 24
  • 25. テーブルとビューの権限の分離 • テーブルとビューには別々に権限を付与できる – 単⼀のテーブルでもユーザによって権限を制御可能 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 25 testdb=> CREATE TABLE t1 AS SELECT rolname,rolsuper,rolcreaterole,rolcreatedb  FROM pg_roles; SELECT 5 testdb=> CREATE VIEW v1 AS SELECT * FROM t1; CREATE VIEW testdb=> grant select on v1 to webapp_r; GRANT testdb=> ¥dp t1 Access privileges Schema | Name | Type  | Access privileges | Column access privileges ‐‐‐‐‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ public | t1   | table |                   | (1 row) testdb=> ¥dp v1 Access privileges Schema | Name | Type |  Access privileges  | Column access privileges ‐‐‐‐‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ public | v1   | view | snaga=arwdDxt/snaga+| |      |      | webapp_r=r/snaga    | (1 row)
  • 26. テーブルとビューの権限の分離 • ビューは参照可能だが、テーブルは参照不可 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 26 You are now connected to database "testdb" as user "webapp". testdb=> select * from t1; ERROR:  permission denied for relation t1 testdb=> select * from v1; rolname  | rolsuper | rolcreaterole | rolcreatedb ‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐ postgres | t        | t             | t webapp   | f        | f             | f webapp_r | f        | f             | f snaga    | f        | f             | f admin_r  | f        | f             | t (5 rows) testdb=>
  • 27. ビューによる⾏レベルの制御 • どのような⾏を⾒せるかをビューの条件で制御する • 例えば、実効ロールと⼀致する⾏だけ⾒せたい場合 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 27 postgres=> CREATE VIEW pg_all_roles AS SELECT * FROM pg_roles WHERE rolname =  current_user; CREATE VIEW ostgres=> SELECT rolname,rolsuper,rolcreaterole,rolcreatedb FROM pg_all_roles; rolname | rolsuper | rolcreaterole | rolcreatedb ‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐ snaga   | f        | f             | f (1 row) postgres=> SET ROLE admin_r; SET postgres=> SELECT rolname,rolsuper,rolcreaterole,rolcreatedb FROM pg_all_roles; rolname | rolsuper | rolcreaterole | rolcreatedb ‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐ admin_r | f        | f             | t (1 row)
  • 28. ⾏レベルセキュリティ(RLS) • ⾏レベルセキュリティ(Row Level Security; RLS) – テーブルに含まれるどの⾏が返却されるべきか、という、アク セスポリシーの定義を可能にする – デフォルトでは無効化されている – CREATE POLICY, ALTER POLICY, DROP POLICY • 制約 – PostgreSQL 9.5からの機能 – 現時点では、システムカタログには適⽤できない Copyright 2015 Uptime Technologies, LLC. All rights reserved. 28
  • 29. 実⾏例 • CREATE POLICY roles_table_policy1 ON roles_table FOR ALL USING (rolname = current_user); ユーザ名でフィルタするように ポリシーを定義
  • 30. 実⾏例 • 各ユーザは、⾃分のユーザ名と⼀致した⾏のみを参照で きる “user01” は rolename が ‘user01’ レコードのみ “user02” は rolename が ‘user02’ レコードのみ
  • 31. ビューによる列レベルの制御 • 参照させたくない列を除いた、または別のデータにマス クしたビューを定義する – 例:システムビューの pg_roles (pg_authidを使ったビュー) Copyright 2015 Uptime Technologies, LLC. All rights reserved. 31 testdb=> ¥d+ pg_roles; Column     |           Type           | Modifiers | Storage  | Description ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐ rolname        | name                     |           | plain    | (...snip...) rolconnlimit   | integer                  |           | plain    | rolpassword    | text                     |           | extended | rolvaliduntil  | timestamp with time zone |           | plain    | (...snip...) View definition: SELECT pg_authid.rolname, (...snip...) pg_authid.rolconnlimit, '********'::text AS rolpassword, pg_authid.rolvaliduntil, (...snip...) FROM pg_authid LEFT JOIN pg_db_role_setting s ON pg_authid.oid = s.setrole AND s.setdatabase =  0::oid;
  • 32. 列レベルセキュリティ • テーブルの特定のカラムだけ権限を設定する – GRANT ... ON <table> (<column>, ...) TO ... Copyright 2015 Uptime Technologies, LLC. All rights reserved. 32 postgres=> ¥c postgres snaga Password for user snaga: You are now connected to database  "postgres" as user "snaga". postgres=> CREATE TABLE t1 AS SELECT * FROM  pg_database; SELECT 4 postgres=> GRANT SELECT (datname) ON t1 TO  webapp_r; GRANT postgres=> ¥c postgres webapp Password for user webapp: You are now connected to database  "postgres" as user "webapp". postgres=> SELECT datname FROM t1; datname ‐‐‐‐‐‐‐‐‐‐‐ template1 template0 postgres testdb (4 rows) postgres=> SELECT * FROM t1; ERROR:  permission denied for relation t1 postgres=> ¥d t1 Table "public.t1" Column     |   Type    | Modifiers ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐ datname       | name      | datdba        | oid       | encoding      | integer   | datcollate    | name      | datctype      | name      | datistemplate | boolean   | datallowconn  | boolean   | datconnlimit  | integer   | datlastsysoid | oid       | datfrozenxid  | xid       | datminmxid    | xid       | dattablespace | oid       | datacl        | aclitem[] | postgres=> 
  • 33. Pgcryptoによるデータの暗号化 • pgcryptoモジュール – contribに含まれるEXTENSION – RPMの場合は postgresql94-contrib パッケージ • 暗号化に関連するSQL関数を提供 – 汎⽤ハッシュ関数 – パスワードハッシュ化関数 – PGP暗号化関数 – 単純な暗号化関数 – ランダムデータ関数 • アプリケーションやプロシージャから呼び出すことでデータを暗号 化する – ORACLEのDBMS_OBFUSCATION_TOOLKIT/DBMS_CRYPTOパッケ ージと似ている。 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 33 https://www.postgresql.jp/document/9.4/html/pgcrypto.html http://lets.postgresql.jp/documents/technical/contrib/pgcrypto/
  • 34. 実⾏例(1/2) • pgp_sym_encrypt()関数を使って暗号化 – 暗号化済みデータはbytea型となる Copyright 2015 Uptime Technologies, LLC. All rights reserved. 34 testdb=> select pgp_sym_encrypt('Park Gyu‐ri', 'foo'); pgp_sym_encrypt ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ¥xc30d040703029a823af0155d0c7d74d23c01827e1cea52f9a4bcb1485e727b25d76f5e8877cfaf7cd1c72 b9286db13150628023054a82fe514edfa319af9d1e2f20a046b8fcc98508e0d6c43d7 (1 row) testdb=> insert into k1 values (1, pgp_sym_encrypt('Park Gyu‐ri', 'foo')); INSERT 0 1 testdb=> select * from k1; uid |                                              uname ‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ 1 | ¥xc30d04070302a4a1cac0e5c0194873d23c01a208db4f5cd40a5fe6c31560fc80d3e942d348 ... (1 row) testdb=> insert into k1 values (2, pgp_sym_encrypt('Nicole Jung', 'foo')),(3,  pgp_sym_encrypt('Goo Ha‐ra', 'foo')),(4, pgp_sym_encrypt('Han Seung‐yeon', 'foo')),(5,  pgp_sym_encrypt('Kang Ji‐young', 'foo')); INSERT 0 4 testdb=>
  • 35. 実⾏例(2/2) • pgp_sym_decript()関数を使って復号化 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 35 testdb=> select * from k1; uid |                                                         uname ‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ 1 | ¥xc30d04070302a4a1cac0e5c0194873d23c01a208db4f5cd40a5fe6c31560fc80d3e942d348 ... 2 | ¥xc30d0407030274f9225d4f781acb6cd23c01788a101491c122666504b28340924809722054 ...  3 | ¥xc30d04070302e748374655543b1f65d23a01e4002fa0dc18cdf9548741340645dceb8580ea ... 4 | ¥xc30d040703026b81ffb5501910046fd23f01defc373ba444e9978e89b12ed02e1039aab40e ... 5 | ¥xc30d04070302305cbe84633d5e877bd23e018471bff50d4eb2f12a8cab0f5c66f751b56e1d ... (5 rows) testdb=> select uid,pgp_sym_decrypt(uname, 'foo') as dec from k1; uid |      dec ‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ 1 | Park Gyu‐ri 2 | Nicole Jung 3 | Goo Ha‐ra 4 | Han Seung‐yeon 5 | Kang Ji‐young (5 rows) testdb=>
  • 36. 透過的暗号化(TDE) • TDE; Transparent Data Encryption – SQL関数の呼び出しにはアプリケーションの改修が必要 – アプリの改修なしで「透過的に」暗号化を実現する – 透過的 ≒ 明⽰的な処理をすることなく – Pgcryptoモジュールを利⽤して暗号化データ型を実現 • Transparent Data Encryption for PostgreSQL – 開発はNEC、2015年6⽉公開 – http://jpn.nec.com/press/201506/20150605_01.html • Free Edition – フリー版は暗号化textと暗号化byteaをサポート – ライセンスはGPLv3 – https://github.com/nec-postgres/tdeforpg Copyright 2015 Uptime Technologies, LLC. All rights reserved. 36
  • 37. 実⾏例(1/2) • カラムにencrypt_text型を指定してテーブルを作成 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 37 testdb=> create table k1 (uid integer primary key, uname encrypt_text ); CREATE TABLE testdb=> select pgtde_begin_session('foo'); pgtde_begin_session ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ t (1 row) testdb=> insert into k1 values (1, 'Park Gyu‐ri'),(2, 'Nicole Jung'),(3, 'Goo  Ha‐ra'),(4, 'Han Seung‐yeon'),(5, 'Kang Ji‐young'); INSERT 0 5 testdb=> select * from k1; uid |     uname ‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ 1 | Park Gyu‐ri 2 | Nicole Jung 3 | Goo Ha‐ra 4 | Han Seung‐yeon 5 | Kang Ji‐young (5 rows) testdb=> ¥q {1020}snaga@devvm04:~$
  • 38. 実⾏例(2/2) • 別のセッションでは、鍵を設定しないと読み取り不可。 – 実際の鍵の設定前後には cipher_key_{disable,enable}_log() が必要 – 鍵情報がサーバログに残らないようにするため Copyright 2015 Uptime Technologies, LLC. All rights reserved. 38 {1020}snaga@devvm04:~$ psql ‐U snaga testdb testdb=> select * from k1; ERROR:  TDE‐E0017 could not decrypt data, because key was not set(01) testdb=> select pgtde_begin_session('foo'); pgtde_begin_session ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ t (1 row) testdb=> select * from k1; uid |     uname ‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ 1 | Park Gyu‐ri 2 | Nicole Jung 3 | Goo Ha‐ra 4 | Han Seung‐yeon 5 | Kang Ji‐young (5 rows)
  • 39. 第4部 ログと監査 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 39
  • 40. 「監査ログ」とは? • 監査のためのログ – ⼀般的には「誰が、いつ、どこから、何に対して、何をして、どうな ったか」(⽬的によって変わる) • 監査の⽬的例 – 重要情報に関するアクセス – 不正が疑われるアクセス – 特権ユーザによるアクセス – データベースに関する全てのアクセス • 監査項⽬の例 – アクセスに失敗したユーザ – 発⾏されたSQLクエリ – アクセス頻度、時間帯 – DBスキーマの変更・削除 – アカウント変更・削除 – オブジェクト権限の変更・削除 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 40
  • 41. pg_auditモジュール • PostgreSQLのフックの機能を使い、実⾏したSQLのログを出⼒す るEXTENSION • 出⼒項⽬ – タイムスタンプ – DB名 – ユーザ名、実効ユーザ名(SET ROLEした場合) – クラス、コマンドタグ – オブジェクトタイプ、オブジェクト名 – 実⾏コマンド • 上記を既存の log_line_prefix と組み合わせて出⼒する • DB、ユーザ、クラスなどは選択的に出⼒可能 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 41 https://github.com/2ndQuadrant/pgaudit
  • 42. 実⾏例(1/2) • テーブルの作成とデータ挿⼊ – すべての監査ログイベントを出⼒するように設定 – クライアント側にもログを表⽰するように設定して実⾏ Copyright 2015 Uptime Technologies, LLC. All rights reserved. 42 testdb=# set client_min_messages to log; SET testdb=# create table k1 (uid integer primary key, uname text ); LOG:  AUDIT,2015‐11‐27 11:46:56.526683+09,testdb,snaga,snaga,DEFINITION,CREATE  TABLE,TABLE,public.k1,create table k1 (uid integer primary key, uname text ); LOG:  AUDIT,2015‐11‐27 11:46:56.546729+09,testdb,snaga,snaga,DEFINITION,CREATE  INDEX,INDEX,public.k1_pkey,create table k1 (uid integer primary key, uname text ); CREATE TABLE testdb=# insert into k1 values (1, 'Park Gyu‐ri'),(2, 'Nicole Jung'),(3, 'Goo Ha‐ ra'),(4, 'Han Seung‐yeon'),(5, 'Kang Ji‐young'); LOG:  AUDIT,2015‐11‐27  11:47:01.647673+09,testdb,snaga,snaga,WRITE,INSERT,TABLE,public.k1,insert into k1  values (1, 'Park Gyu‐ri'),(2, 'Nicole Jung'),(3, 'Goo Ha‐ra'),(4, 'Han Seung‐ yeon'),(5, 'Kang Ji‐young'); INSERT 0 5 testdb=#
  • 43. 実⾏例(2/2) • データの参照と権限の付与 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 43 testdb=# select * from k1; LOG:  AUDIT,2015‐11‐27 11:47:07.221334+09,testdb,snaga,snaga,READ,SELECT,TABLE,pub lic.k1,select * from k1; uid |     uname ‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ 1 | Park Gyu‐ri 2 | Nicole Jung 3 | Goo Ha‐ra 4 | Han Seung‐yeon 5 | Kang Ji‐young (5 rows) testdb=# grant select on k1 to public; LOG:  AUDIT,2015‐11‐27 11:47:11.328344+09,testdb,snaga,snaga,PRIVILEGE,GRANT,,,gra nt select on k1 to public; GRANT testdb=#
  • 44. ログの収集と監査の実施 • 「コンプライアンス上、ログを残します」という要件は多いが… – 本当に「監査」していますか? – 例えば、以下のようなエラーメッセージ • FATAL: role "foo" does not exist • FATAL: password authentication failed for user "postgres" • FATAL: permission denied for database "postgres" • ERROR: permission denied for relation orders • セキュリティインシデントをすぐに検知できますか? – 検知をしないと回復はできない – 「実は半年前からデータを抜かれてました」(←よくある話) • セキュリティコントロールの4機能 – 「抑⽌/予防/検知/回復」 – ⽇本の企業は「検知」と「回復」が弱い傾向(PwC 林⽒) Copyright 2015 Uptime Technologies, LLC. All rights reserved. 44
  • 46. 第5部 その他 Copyright 2015 Uptime Technologies, LLC. All rights reserved. 46
  • 47. バックアップファイル • バックアップファイルは暗号化されない – PostgreSQLとしては機能も提供していない • D2Dのバックアップのリスク – 最新世代はディスクに置きっぱなし – ファイルシステムやファイルなどのレベルで保護を Copyright 2015 Uptime Technologies, LLC. All rights reserved. 47
  • 48. システムカタログ • 関連するシステムカタログ⼀覧 – pg_auth_members – pg_authid – pg_db_role_setting – pg_default_acl – pg_group – pg_roles – pg_seclabel – pg_shadow – pg_user – pg_user_mapping, pg_user_mappings Copyright 2015 Uptime Technologies, LLC. All rights reserved. 48
  • 49. Postgres Advanced Security Pack • セキュリティ関連モジュールをオールインワン・パッケージ化 – 導⼊時に個別にビルドしたり検証したりする必要がなくなる – 独⾃の追加ドキュメントも同梱 – オープンソースライセンス(各モジュールのライセンスに依存) – 現在、テクノロジープレビュー版(バージョン0.8) • Postgres Advanced Security Pack 0.8に含まれるモジュール – tdeforpg (透過的暗号化) – pgaudit (監査ログ) – sql_firewall (SQLファイアーウォール) • リリース案内、導⼊⽅法など – http://pgsqldeepdive.blogspot.jp/2015/10/postgres-advanced- security-pack.html Copyright 2015 Uptime Technologies, LLC. All rights reserved. 49
  • 50. 参考⽂献 • データベースセキュリティガイドライン 第2.0版(データベースセ キュリティコンソーシアム) • DB内部不正対策ガイドライン 第1.0版(同上) • データベース暗号化ガイドライン 第1.0版(同上) • 統合ログ管理サービスガイドライン 第1.0版(同上) • Oracleデータベースセキュリティ セキュアなデータベース構築・ 運⽤の原則(翔泳社) Copyright 2015 Uptime Technologies, LLC. All rights reserved. 50
  • 51. Q&A Copyright 2015 Uptime Technologies, LLC. All rights reserved. 51 コメント、質問など Twitter: @snaga E-Mail: snaga@uptime.jp