SSL/TLSを有効化し、暗号化接続を確認(pg_stat_ssl)
PostgreSQLセキュリティコマンド
# Server certificate (self-signed for testing; use a corporate CA in production)
openssl req -new -x509 -days 365 -nodes -subj "/CN=db.example.com" -keyout server.key -out server.crt
chmod 600 server.key # in the data directory, owned by postgres
-- Enable SSL (a reload is enough)
ALTER SYSTEM SET ssl = on;
ALTER SYSTEM SET ssl_cert_file = 'server.crt';
ALTER SYSTEM SET ssl_key_file = 'server.key';
ALTER SYSTEM SET ssl_min_protocol_version = 'TLSv1.2';
SELECT pg_reload_conf();
-- Which connections are encrypted?
SELECT a.pid, a.usename, a.client_addr, a.application_name,
s.ssl, s.version, s.cipher, s.bits
FROM pg_stat_ssl s
JOIN pg_stat_activity a USING (pid)
WHERE a.backend_type = 'client backend'
ORDER BY s.ssl, a.usename;
# On the client, verify the server identity as well
psql "host=db.example.com dbname=postgres user=postgres sslmode=verify-full sslrootcert=root.crt"概要
再起動なしでサーバー証明書によるTLSを有効にし、最小プロトコルバージョンを設定し、現在の接続が暗号化されているかをTLSバージョンと暗号とともに一覧表示する。
使用する場面
セキュリティ監査/コンプライアンス要件(PCI、GDPR)のため、ネットワーク上を転送されるパスワードとデータを保護するため。
注意
ssl = onだけでは暗号化は強制されない。クライアントはsslmode=prefer/disableで引き続き非暗号化で接続できる。強制するにはpg_hba.confでhostの代わりにhostsslを使用する(さらにhostnossl ... rejectを追加する)。sslmode=requireはサーバーの身元を検証しない(MITMに対して無防備)。証明書の検証にはverify-fullを使用する。鍵ファイルはpostgresユーザー所有でモード0600(またはroot所有で0640)である必要がある。そうでないとSSLが読み込まれないため、リロード後にログとSHOW sslを確認する。証明書の更新もリロードで反映される。