はじめに
目的
本ドキュメントは、PostgreSQLで安全な通信を実現するために必要なSSL/TLSの設定方法をわかりやすく解説します。実務で使える手順や注意点、プログラミング例、証明書の作成方法まで幅広く扱います。
対象読者
データベース管理者、アプリ開発者、運用担当者を想定しています。初歩的なPostgreSQLの操作がわかれば読み進められます。
本書で扱う内容の概要
- SSL/TLSの役割と重要性(通信の暗号化となりすまし防止)
- PostgreSQLで選べるSSLモードの説明
- サーバ側・クライアント側の基本設定手順
- Java、Pythonなど言語別の接続例
- 自前で証明書を作る手順と注意点
前提と準備
接続するサーバとクライアント間でネットワークが通じていること、PostgreSQLの基本操作権限(設定ファイルの編集)があることを前提にしています。用語は必要に応じて平易に補足します。
PostgreSQL SSL/TLSセキュアな接続設定ガイド
概要
PostgreSQLのSSL/TLSは通信を暗号化し、盗聴や改ざんを防ぎます。まずサーバー側で証明書を配置し、クライアントで接続設定を行う流れを理解してください。
前提条件
- PostgreSQLがインストール済み
- サーバー証明書(自己署名またはCA発行)と秘密鍵が用意済み
サーバー側の基本設定
- postgresql.confでssl = onに設定します。例: “ssl = on”
- 証明書パスを指定します。例: ssl_cert_file = ‘server.crt’, ssl_key_file = ‘server.key’
- pg_hba.confで暗号化接続を許可するために”hostssl”行を追加します。例: “hostssl all all 0.0.0.0/0 md5”
クライアント側の基本設定
- 接続文字列にsslmodeを追加します。例: “sslmode=require”(暗号化のみ)または”sslmode=verify-full”(サーバー名検証あり)
- クライアントでCA証明書を使う場合はsslrootcertパラメータを指定します。
接続確認方法
- サーバーのログにTLSハンドシェイク成功の記録を確認します。
- psqlで接続後に”\conninfo”を実行するとSSL利用状況が表示されます。
注意点
- 秘密鍵のパーミッションを厳格に管理してください。
- 自己署名証明書は中間者対策に弱いため、本番ではCA証明書を推奨します。
PostgreSQLで利用可能なSSLモード一覧
概要
PostgreSQLは接続時に複数のSSLモードを選べます。各モードは暗号化の有無や証明書検証の厳しさが異なり、セキュリティと運用のバランスを決めます。
各モードの説明と利用例
- disable
- 暗号化を行いません。内部の信頼できるネットワークやパフォーマンス重視の検証環境で使います。
- allow
- まずSSL接続を試み、失敗すると非SSLにフォールバックします。互換性を優先する現場向けです。
- prefer
- SSLを優先しますが、サーバーが対応していなければ非SSLにフォールバックします。段階的な導入時に便利です。
- require
- 暗号化を必須にしますが証明書の有効性は確認しません。盗聴防止はできますが、なりすましには弱いです。
- verify-ca
- サーバー証明書が信頼するCAで署名されているかを確認します。証明書の発行元に基づく検証ができます。
- verify-full
- 最も厳格です。CAの確認に加え、接続先のホスト名が証明書と一致するかも検証します。インターネット上の本番接続に推奨します。
選び方のポイント
- 内部限定ならdisableやrequireで十分な場合があります。
- 外部や重要データを扱う場合はverify-fullを優先してください。証明書管理が難しいならverify-caで段階的に移行するとよいです。
性能について
暗号化によるオーバーヘッドは一般に小さく、最新のサーバーではほとんど影響しません。セキュリティが優先されるなら、性能を犠牲にする必要はほとんどありません。
基本的なSSL/TLS設定方法
概要
PostgreSQL 16以降はOSが信頼する既定の認証局(CA)を利用できます。ここではサーバー側とクライアント側の基本的な設定手順を分かりやすく説明します。
サーバー側(postgresql.conf)
- sslを有効にする
ssl = on
- 証明書と秘密鍵を指定する
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
- ルート証明書を指定するとクライアント証明書検証が可能です
ssl_ca_file = 'root.crt'
ファイルはPostgresの所有者(通常postgres)にし、秘密鍵はパーミッション600にします。設定変更後はPostgreSQLを再起動してください(例: systemctl restart postgresql)。
接続制御(pg_hba.conf)
SSL接続を強制するにはhostsslを使います。例:
hostssl all all 192.168.1.0/24 md5
この行は指定ネットワークからの接続をSSLに限定します。順序が重要なので既存ルールとの兼ね合いに注意してください。
クライアント側
接続パラメータでSSLを指定します。例(psql/libpq):
psql "host=db.example.com port=5432 dbname=mydb user=alice sslmode=verify-full sslrootcert=/etc/ssl/certs/root.crt"
sslmodeにはrequire、verify-ca、verify-fullなどがあり、検証レベルに応じて選びます。PostgreSQL 16ではOSの信頼ストアを使えばsslrootcertを省略できる場合があります。
注意点
- 証明書のパスと権限を正しく設定してください。
- 秘密鍵は厳重に管理し、公開場所に置かないでください。
- 設定反映にはPostgresの再起動が必要です。
プログラミング言語別の実装例
Python(psycopg2)
import psycopg2
conn = psycopg2.connect(
dbname='db', user='u', host='host', password='pw',
sslmode='verify-full', sslrootcert='/path/ca.pem'
)
Django
settings.py
DATABASES = {
'default':{
'ENGINE':'django.db.backends.postgresql',
...,
'OPTIONS':{
'sslmode':'verify-full',
'sslrootcert':'/path/ca.pem'
}
}
}
Node.js(pg)
const {Client} = require('pg')
const fs = require('fs')
const client = new Client({
connectionString:process.env.DATABASE_URL,
ssl:{
ca: fs.readFileSync('/path/ca.pem').toString(),
rejectUnauthorized: true
}
})
Go(pgx)
cfg, _ := pgxpool.ParseConfig(os.Getenv("DATABASE_URL"))
// cfg.ConnConfig.TLSConfig を設定し RootCAs と ServerName を入れる
PHP(pgsql)
$conn = pg_connect("host=host dbname=db user=u password=p sslmode=verify-full sslrootcert=/path/ca.pem");
psql(コマンドライン)
psql “postgresql://user@host/db?sslmode=verify-full&sslrootcert=/path/ca.pem”
各例でsslmode=verify-full(サーバ名検証付き)とCAファイルの指定を推奨します。クライアント証明書が必要な場合は各ドライバでsslcert/sslkeyを追加してください。
SSL証明書の生成と設定
CA証明書の作成
まず自前のCAを作ります。長期有効な自己署名CAを1つ用意するとテストや社内用途で便利です。
例:
openssl genpkey -algorithm RSA -out ca.key -pkeyopt rsa_keygen_bits:4096
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/CN=MyPostgresCA"
サーバー証明書の作成とPostgreSQLへの配置
サーバー用の鍵とCSRを作成し、CAで署名します。
openssl genpkey -algorithm RSA -out server.key -pkeyopt rsa_keygen_bits:2048
openssl req -new -key server.key -out server.csr -subj "/CN=db.example.com"
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 825 -out server.crt
PostgreSQLのdataディレクトリにserver.crtとserver.keyを配置し、権限を厳しくします。
chown postgres:postgres server.key server.crt
chmod 0600 server.key
postgresql.confでssl=on、ssl_cert_file=server.crt、ssl_key_file=server.keyを確認してください。
クライアント証明書(mTLS)用の作成
クライアント鍵とCSRを作りCAで署名します。
openssl genpkey -algorithm RSA -out client.key -pkeyopt rsa_keygen_bits:2048
openssl req -new -key client.key -out client.csr -subj "/CN=db-client"
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 825 -out client.crt
必要ならPKCS#12にまとめます(GUIクライアントや一部ドライバ用)。
openssl pkcs12 -export -inkey client.key -in client.crt -certfile ca.crt -out client.p12
PostgreSQLでのmTLS設定例
postgresql.confにCAファイルを指定します(例: ssl_ca_file = ‘ca.crt’)。pg_hba.confでクライアント証明書を要求します。
hostssl all all 0.0.0.0/0 cert clientcert=1
これで接続時にクライアント証明書が必要になります。最後にPostgreSQLを再起動して設定を反映してください。
注意点
- server.keyは非公開で厳重に管理します。
- CAを信頼できる範囲だけで使ってください。
- 証明書の有効期限や失効管理(CRL)も運用で検討してください。












