16.7. SSLによる安全なTCP/IP接続

PostgreSQLは標準でSSL接続をサポートし、クライアント/サーバの通信がさらに安全になるよう暗号化します。 そのためにはOpenSSLがクライアントとサーバシステムの両方にインストールされ、構築時にPostgreSQLにおけるそのサポートが有効になっている必要があります(第14章を参照してください)。

SSLサポートを有効にしてコンパイルされた場合、PostgreSQLサーバは、postgresql.confにおいてsslパラメータをonにすることで、SSLサポートを有効にして起動することができます。 SSLモードで起動する時は、サーバはserver.keyファイルとserver.crtファイルをデータディレクトリの中から探します。 これらのファイルはそれぞれサーバのプライベートキーと証明書を含んだものでなければなりません。 SSLが動作可能なサーバを起動するためには、これらのファイルを正しく設定しなければなりません。 もしプライベートキーがパスフレーズで保護されている場合は、サーバはパスフレーズの入力を促し、入力されるまでは起動しません。

サーバは標準接続とSSL接続の両方を同じTCP/IPポート上で監視し、接続してきたクライアントとSSLを使用するかどうかを交渉します。 デフォルトでは、これはクライアントのオプションです。 特定の接続に対し、サーバにSSLを必ず使用させるための設定方法については項20.1を参照してください。

サーバのプライベートキーと証明書を作成する方法の詳細はOpenSSLの文書を参照してください。 テスト用に自己署名の証明書を使うことができますが、実働で使うには認証局(CA)(世界共通のCAもしくは地元認証局)の署名付き証明書を使って、クライアントがサーバの身元を確認できるようにすべきです。 自己署名の証明書を簡単に作るためには下記のOpenSSLコマンドを使ってください。

openssl req -new -text -out server.req

opensslから出される質問に答えてください。 この時、"Common Name"には確実にローカルホスト名を入力してください。 チャレンジパスワードは空白でも構いません。 このプログラムはパスフレーズで保護されたキーを生成しますが、4文字以下のパスフレーズは認められません。 パスフレーズを削除するためには(サーバの自動起動を行いたいのであれば)、下記のコマンドを実行してください。

openssl rsa -in privkey.pem -out server.key
rm privkey.pem

既存のキーのロックを外すために、古いパスフレーズを入力します。 そして、下記を実行してください。

openssl req -x509 -in server.req -text -key server.key -out server.crt
chmod og-rwx server.key

このように、証明書を自己署名の証明書にして、キーと証明書とをサーバが検索する場所にコピーします。

クライアント証明の検証が必要であれば、検査対象のCA(複数可)の証明書をデータディレクトリ内のroot.crtファイルに格納してください。 証明書が存在すれば、接続開始時にクライアントからクライアント証明が要求されます。 また、その証明書はroot.crt内の証明書の1つで署名されている必要があります。 (クライアント認証の設定方法については項29.16の説明を参照してください。) また、root.crlファイルが存在する場合、証明書失効リスト(CRL)の項目も検査されます。

root.crtが存在しない場合、クライアント証明は要求されませんし、検査もされません。 このモードでは、SSLは通信セキュリティを提供しますが、認証は提供しません。

server.keyserver.crtroot.crt、および、root.crlはサーバ起動時にのみ確認されます。 したがって、これらのファイルの変更を有効にするためにはサーバを再起動する必要があります。