PostgreSQLのセキュリティを極める
PGConf.ASIA 2018 Day 2
2018年12月12日

SRA OSS, Inc. 日本支社
佐藤 友章
sato@sraoss.co.jp© 2018 SRA OSS, Inc. Japan1

目次• おもなセキュリティの観点• データベース接続時のセキュリティ• データベース内のセキュリティ• そのほかのセキュリティ© 2018 SRA OSS, Inc. Japan2

おもなセキュリティの観点• 考慮すべきセキュリティの観点は多岐に渡る
接続
監視
TCP接続

データベースサーバ

通信
暗号化

クライアント認証

データベース内

設定ファイル
pg_hba.conf

操作

データ
暗号化

テーブル

権限

ローカル接続ユーザ

クライアント

属性

RLS
ポリシー

監査ログ
クライアント© 2018 SRA OSS, Inc. Japan3

データベース接続時のセキュリティ© 2018 SRA OSS, Inc. Japan

4

通信暗号化• SSLでクライアントとデータベースサーバ間の通信を暗号化• SSL接続の強制はクライアント認証で設定• サーバ証明書も検証するには、ルート証明書をクライアントに配置して、接続時にSSLモードを指定

設定例• ssl = on

# SSLによる暗号化を有効に

データベースサーバ• SSLモード
説明

SSLモードサーバ サーバ
秘密鍵 証明書

盗聴
悪意のあるユーザ

SSL接続

SSLで暗号化されているので、通信を盗聴できない

disable

非SSL接続allow

非SSL接続を試みて、できなければSSL接続

prefer

SSL接続を試みて、できなければ非SSL接続（デフォルト）

require

SSL接続

verify-ca

SSL接続/サーバ証明書を検証

verify-all

SSL接続/サーバ証明書とホスト名の一致を検証

クライアント ルート証明書© 2018 SRA OSS, Inc. Japan5

クライアント認証• クライアントに対してデータベースサーバ接続時に行う認証• pg_hba.confの書式

データベースサーバ

local
データベース名 ユーザ名
認証方式
host
データベース名 ユーザ名 IPアドレス範囲 認証方式
hostssl データベース名 ユーザ名 IPアドレス範囲 認証方式
hostnossl データベース名 ユーザ名 IPアドレス範囲 認証方式

pg_hba.confで最初に一致したレコードで認証を行う
接続先
データベース

設定ファイル
pg_hba.conf• おもな認証方式
認証方式

接続ユーザ

接続形式
• ローカル接続（local）• TCP接続（host）• SSL接続（hostssl）• 非SSL接続（hostnossl）

説明

trust/reject

無条件で許可/拒否

scram-sha-256

SCRAM暗号化でパスワード認証（10以降）

md5

MD5暗号化でパスワード認証

password

平文でパスワード認証（非推奨）

ident/peer

OSとデータベースユーザ名との一致で認証

cert

SSLクライアント証明書で認証

クライアント（接続元IPアドレス）© 2018 SRA OSS, Inc. Japan6

listen_addressesパラメータ• クライアントからの接続を監視するサーバのアドレスを指定するパラメータ• クライアントではなく、サーバのアドレスを指定• 未指定のアドレスでは接続要求を受けつけない• デフォルトは「local」でローカルホストのみ、「*」ですべてのアドレスを監視

設定例• listen_addresses = 'localhost,129.168.0.10'

データベース
サーバ

TCP接続
192.168.0.10

TCP接続
192.168.1.10

クライアントネットワークインタ
フェースが複数ある場合

リモートホストからの接続を受けつける場合

クライアント
ローカル接続/var/run/postgresql/.s.PGSQL.5432

不要な接続要求を防止するため、必要なアドレスのみを指定すべきクライアント© 2018 SRA OSS, Inc. Japan7

データベース内のセキュリティ© 2018 SRA OSS, Inc. Japan8

ロールの属性• ロールに対して設定する権限/パスワード/パラメータ• CREATE ROLE/ALTER ROLEで設定• パスワードの設定は、平文での送信を回避するため、psqlの¥passwordで行う
スーパーユーザ権限（SUPERUSER）

データベース作成権限（CREATEDB）

ロール作成権限（CREATEROLE）

ログイン権限（LOGIN）

レプリケーション権限（REPLICATION）

RLS無視権限（9.5以降）（BYPASSRLS）

パスワード（PASSWORD パスワード）パラメータ（SET パラメータ名 TO 値）

RLS

実行例

=# CREATE ROLE alice LOGIN;=# ALTER ROLE alice CREATEDB;=# ¥password alice=# ALTER ROLE alice SET work_mem TO '8MB';-- ログイン権限をもつロールaliceを作成-- ロールaliceにデータベース作成権限を与える-- ロールaliceのパスワードを設定-- ロールaliceが接続時のwork_memパラメータを8MBに設定© 2018 SRA OSS, Inc. Japan9

データベースオブジェクトの権限• データベースオブジェクトに対してロールができる操作の権限
SELECT
所有者のみが基本的にデフォルトですべての権限をもつ所有者以外に操作を許可するには、権限を与える必要がある

INSERTテーブル
accounts
所有者
alice

すべての操作

GRANTで権限を与え
REVOKEで取り消す

一般ユーザ
bob

スーパーユーザは権限に関係なく、すべての操作ができる
スーパーユーザ
postgres

実行例=> GRANT SELECT ON TABLE accounts TO bob; -- テーブルaccountsにロールbobのSELECT権限を与える=> ¥dp accounts
Schema |Name| Type | Access privileges | Column privileges | Policies--------+----------+-------+---------------------+-------------------+---------• aliceはすべての権限（arwdDxt）をもつ
public | accounts | table | alice=arwdDxt/alice+||•bobはSELECT権限（r）をもつ||| bob=r/alice||• 権限はaliceによって与えられた© 2018 SRA OSS, Inc. Japan10

おもなデータベースオブジェクトの権限一覧
データベース
オブジェクト
テーブル/列/ビュー/
外部テーブル（TABLE）

権限

データベースオブジェクト

操作

SELECT（r）

SELECT、COPY TO

INSERT（a）

INSERT、COPY FROMUPDATE（w）

UPDATE、SELECT ...
FOR UPDATE/SHARE

DELETE（d）

DELETE

TRUNCATE（D）

TRUNCATE

REFERENCES（x） 外部キー制約作成
TRIGGER（t）

トリガ作成

USAGE（U）
シーケンス（SEQUENCE） SELECT（r）

currval、nextval関数実行

UPDATE（w）

nextval、setval関数実行

データベース（DATABASE）

権限

操作

CREATE（C）

データベース内にスキーマ作成

CONNECT（c）

データベース接続TEMPORARY（T） データベース内に一時テーブル作成関数/プロシージャ EXECUTE（X）（FUNCTION）

関数、プロシージャ、演
算子実行

スキーマ
（SCHEMA）

CREATE（C）

スキーマ内にオブジェク
ト作成

USAGE（U）

スキーマ内のオブジェク
トアクセス

CREATE（C）

テーブル空間内にテーブ
ル、インデックス、一時ファイル作成

currval関数実行
テーブル空間（TABLESPACE）

データベースのCONNECT、TEMPORARY権限、関数/プロシージャのEXECUTE権限、手続き言語、データ型/ドメインのUSAGE権限はデフォルトですべてのユーザに与えられる© 2018 SRA OSS, Inc. Japan11

デフォルトロール• スーパーユーザのみができる操作の権限を部分的に与えるためのロール（9.6以降）
ロール

操作

pg_read_all_settings

すべてのパラメータを参照できる（10以降）

pg_read_all_stats

すべての統計情報を参照できる（10以降）

pg_stat_scan_tables

ACCESS SHAREロックを長時間取得する統計情報関数を実行できる（10以降）

pg_signal_backend

サーバプロセスにシグナルを送信できる

pg_read_server_files

データベースサーバ上のファイルを読み取りできる（11以降）

pg_write_server_files

データベースサーバ上のファイルに書き込みできる（11以降）

pg_execute_server_program データベースサーバ上のプログラムを実行できる（11以降）
pg_monitor

pg_read_all_settings + pg_read_all_stats + pg_stat_scan_tablesと同じ（10以降）

実行例=# ALTER ROLE pg_monitor TO bob; -- ロールbobにデフォルトロールpg_monitorの権限を与える=# ¥du bob
Role name | Attributes | Member of-----------+------------+-------------bob|| {pg_monitor}© 2018 SRA OSS, Inc. Japan12

publicスキーマ• デフォルトで存在するスキーマ• すべてのユーザがデータベースオブジェクトを作成できる• デフォルトで検索パスに含まれる
publicスキーマ

pg_catalogスキーマ

攻撃を回避するには• publicスキーマに対するすべてのユーザのCREATE権限を取り消す

ユーザ定義関数lower(varchar)
作成

組み込み関数
lower(text)
実行組み込み関数を実行しようとして、意図せずユーザ定義関数が実行されてしまう

悪意のある
ユーザスーパーユーザ
postgres=# REVOKE CREATE-#ON SCHEMA public FROM PUBLIC;• スキーマの検索パスからpublicスキーマを取り除く=# SET search_path TO '$user';• データベースオブジェクトのスキーマ名を明示的に指定する=# SELECT pg_catalog.lower(email)-#FROM accounts;© 2018 SRA OSS, Inc. Japan13

行単位セキュリティ（RLS）• テーブルに対してロールが操作できる行を制限する仕組み（9.5以降）
操作
manager
= bob

操作
一般ユーザ
bob

• テーブルの権限に追加して設定• 操作できない行を参照しようとしても、可視できないだけで、エラーにならない• TRUNCATEなど、テーブル全体への操作は対象外

グループロール
managers

RLS
ポリシー

テーブル
accounts

実行例=# ALTER ROLE managers TO bob;=# ALTER TABLE accounts-#ENABLE ROW LEVEL SECURITY;=# CREATE POLICY account_managers-#ON accounts TO managers-#
USING (manager = current_user);-- グループロールmanagersにロールbobを追加-- テーブルaccountsの行単位セキュリティを有効にする-- テーブルaccountsにグループロールmanagersのメンバが-- 自分がマネージャになっている行のみを操作できるように-- RLSポリシーを作成© 2018 SRA OSS, Inc. Japan

14

そのほかのセキュリティ© 2018 SRA OSS, Inc. Japan15

データ暗号化• データベースに格納するデータを暗号化• おもなデータ暗号化の実現方式
TDE for PG

pgcryptoモジュール
暗号化関数を提供する付属モジュール

pgcryptoをベースにTDE機能を提供するモジュール

T
ユーザ

暗号化関数

暗号化関数
テーブル

ユーザ

PowerGres Plus

テーブル
暗号化キー

テーブル
暗号化キー

eCryptfs/EncFS/dm-crypt + LUKSTDE機能を追加したPostgreSQLベースの商用製品

ユーザ

暗号化データ型

ファイル

様々な暗号化ファイルシステム

ユーザ© 2018 SRA OSS, Inc. Japan

テーブル

ファイル

ディスク16

監査ログ• 不正アクセスの検出のため、データベースの操作を記録したログ
設定例• log_destination = 'csvlog'• log_connections = on
• log_disconenctions = on
• log_statement = all# CSV形式でログを取得# 接続のログを記録# 切断のログを記録# すべてのSQLをログに記録

データベースサーバ

操作
ログ
出力

テーブル

CSV形式で出力したログをテーブルにインポートすれば、SQLで検索できる
監査• OSの機能と組み合わせれば、ログの設定でもある程度実現できる• 監査ログ専用の機能ではないため、要件によってはpgaduditモジュールの導入が必要
pgauditを使用すれば• 取得対象のSQLの詳細な種類や、テーブル/列を指定できる• 操作対象の完全なテーブル名や、SQLのパラメータを取得できる

インポート
ユーザ
ログファイル

スーパーユーザ© 2018 SRA OSS, Inc. Japan

17

オープンソースとともに© 2018 SRA OSS, Inc. Japan

18