無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

17.9. 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 という名前で、それぞれがサーバのデータディレクトリに存在していることが想定されていますが、設定パラメータの ssl_cert_file ssl_key_file によって他の名前、他の場所を指定することもできます。 Unixシステムでは、 server.key の権限は所有者以外からのアクセスを許可してはなりません。 これは chmod 0600 server.key というコマンドで実現できます。 秘密キーがパスフレーズで保護されている場合、サーバはパスフレーズの入力を促し、入力されるまでは起動しません。

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

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

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

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

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

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

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

表17-2 にて、サーバにおけるSSLの設定に関連するファイルをまとめます。 (表示されているファイル名はデフォルトまたは一般的な名前です。異なる名前を個別に設定することもできます。)

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

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

server.key server.crt root.crt root.crl ファイル(またはその他の設定されたファイル名)は、サーバ起動時にのみ検査されます。 ですので、これらのファイルの変更を有効にするためにはサーバを再起動する必要があります。

17.9.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 の使用が推奨されます。


powered by SEO.CUG.NET