他のバージョンの文書11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

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

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

SSLサポートを有効にしてコンパイルされた場合、PostgreSQLサーバは、postgresql.confにおいてsslパラメータをonにすることで、SSLサポートを有効にして起動することができます。 サーバは同じTCPポートで通常の接続とSSL接続の両方を待ち受け、クライアントとの接続にSSLを使用するかどうかを調停します。 デフォルトでは、これはクライアントの選択肢です。 一部またはすべての接続でSSLの使用を必要とさせるためのサーバ側の設定方法に関しては項19.1を参照してください。

PostgreSQLは、システム全体用のOpenSSL設定ファイルを読み取ります。 デフォルトでは、このファイルの名前はopenssl.cnfであり、openssl version -dで報告されるディレクトリに存在します。 このデフォルトは環境変数OPENSSL_CONFを希望する設定ファイルの名前に設定することにより変更可能です。

OpenSSLは、強度が異なる、多くの暗号化および認証用のアルゴリズムをサポートします。 暗号の一覧はOpenSSL設定ファイル内で指定することができますが、postgresql.conf内のssl_ciphersを変更することで、データベースサーバで使用される暗号を指定することができます。

注意: NULL-SHAまたはNULL-MD5暗号を使用して暗号化のオーバーヘッドなしで認証を行うことが可能です。 しかし、中間者はクライアントサーバ間の通信を読み取り中継することができます。 また、暗号化のオーバーヘッドは認証のオーバーヘッドと比べると最小です。 こうした理由によりNULL暗号は推奨しません。

SSLモードを始めるには、server.crtおよびserver.keyファイルがサーバのデータディレクトリに存在しなければなりません。 これらのファイルには、サーバ証明書と秘密キーがそれぞれ含まれます。 Unixシステムでは、server.keyの権限は所有者以外からのアクセスを許可してはなりません。 これはchmod 0600 server.keyというコマンドで実現できます。 秘密キーがパスフレーズで保護されている場合、サーバはパスフレーズの入力を促し、入力されるまでは起動しません。

サーバ証明書がクライアントで直接信頼している認証局ではなく"中間"認証局により署名されている場合があります。 こうした証明書を使用するために、server.crtファイルに署名した局の証明書と、クライアントで直接信頼している"ルート"認証局までその親となる認証局の証明書を追加してください。 server.crtに複数の証明書が含まれる場合はすべて、ルート証明書を含めなければなりません。

17.8.1. クライアント証明書の使用

クライアントに信頼できる証明書を要求するためには、信頼する認証局(CA)の証明書をデータディレクトリ内のroot.crtファイルに記述し、pg_hba.conf内の適切なhostssl行(複数もあり)にclientcertパラメータを1に設定します。 その後、SSL接続起動時にクライアントからの証明書が要求されます。 (クライアントにある証明書の設定方法については項31.17を参照してください。) サーバは、クライアントの証明書が信頼する認証局のいずれかにより署名されていることを検証します。 root.crlファイルが存在する場合、証明失効リスト(CRL)項目も検査されます。 (SSL証明書の使用方法の示す図についてはhttp://h71000.www7.hp.com/DOC/83final/BA554_90007/ch04s02.htmlを参照してください。)

pg_hba.confの中のclientcertオプションは全ての認証方式に対して有効ですが、hostsslとして指定された行のみに対してです。 clientcertが指定されていない、または、0と設定されている場合でも、root.crtファイルが存在すれば、サーバはroot.crtに対して存在するクライアント証明書の検証を行います。 しかしクライアント証明書の存在を要求しません。

root.crtはクライアント証明書の署名に対して信頼できるとみなしている最上位のCAを列挙していることに注意してください。 原理的には、サーバの証明書を署名したCAを列挙する必要はありませんが、ほとんどの場合、そのCAはクライアント証明書でも信頼されています。

クライアント証明書を設定している場合、接続の安全性を提供するとともに証明書でユーザ認証を制御できるようにcert認証方式を使用したいと考えるかもしれません。 詳細については項19.3.9を参照してください。

17.8.2. サーバにおけるSSL関連ファイルの利用

server.keyserver.crtroot.crtroot.crlファイルは、サーバ起動時にのみ検査されます。 ですので、これらのファイルの変更を有効にするためにはサーバを再起動する必要があります。

表 17-3. SSLサーバファイルの使用方法

ファイル内容影響
server.crtサーバ証明書サーバの身元を示すためにクライアントに送信します
server.keyサーバの秘密キーサーバ証明書が所有者によって送られたことを証明します。証明書所有者が信頼できることを意味しません。
root.crt信頼できる認証局信頼する認証局により署名されたクライアント証明書か検査します。
root.crl認証局により失効された証明書クライアント証明書はこの一覧にあってはいけません。

17.8.3. 自己署名証明書の作成

サーバ用の自己署名証明書を簡単に作るためには下記の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

サーバの秘密キーおよび証明書を作成するための詳しい方法についてはOpenSSLの文書を参照してください。

自己署名証明書を試験のために使用することはできますが、クライアントがサーバの身元を検証できるように、運用時は(グローバルなCAの1つまたはローカルな認証局のいずれかの)認証局(CA)により署名された証明書を使用すべきです。 もし全てのクライアントが組織においてローカルであれば、ローカルCAの使用が推奨されます。