他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 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

19.11. SSHトンネルを使った安全なTCP/IP接続

クライアントとPostgreSQLサーバ間のネットワーク接続を暗号化するためにSSHを使うことができます。 正しく行えば、SSL機能がクライアントになくても、これで十分に安全なネットワーク接続を行うことができます。

まずSSHサーバがPostgreSQLサーバと同じマシン上で正しく起動していて、sshを使ってログインできるユーザが存在することを確かめてください。 リモートサーバへ安全なトンネルを確立することができます。 安全なトンネルは、ローカルポートをリッスンし、すべてのトラフィックをリモートマシン上のポートに転送します。 リモートポートに送信されたトラフィックは、localhostアドレスまたは必要に応じて別のバインドアドレスに到達することができ、ローカルマシンからのトラフィックとは表示されません。 次のコマンドは、クライアントマシンからリモートマシンfoo.comへの安全なトンネルを作成します。

ssh -L 63333:localhost:5432 joe@foo.com

-L引数の1番目の数字(63333)はトンネルのローカル側のポート番号で、未使用のポートを選択することが可能です。(IANAは49152から65535までのポートを私的使用のため予約しています。) この後の名前かIPアドレスは、接続先のリモート側のバインドアドレス(デフォルトはlocalhost)です。 2番目の数字(5432)は、トンネルのリモート側のサーバが使用しているポート番号です。 このトンネルを使ってデータベースサーバに接続するためには、ローカルマシンのポート63333に接続します。

psql -h localhost -p 63333 postgres

データベースサーバにとっては、ユーザがホストfoo.com上のユーザjoeであり、localhostバインドアドレスに接続しているように見え、そのバインドアドレスに対するそのユーザの接続向けに設定された認証手続きが使用されます。 実際、SSHサーバとPostgreSQLサーバとの間は暗号化されていないため、サーバはこの接続がSSLで暗号化されているとみなさないことに注意してください。 それらが、同じマシン上にあるため、セキュリティ上の危険性が増すことはありません。

トンネルの確立が成功するためには、sshを使用して端末セッションを作成したのと同様に、joe@foo.comユーザがsshを通して接続することが許可されていなければいけません。

以下に示すようにポートフォワードを設定することができます。

ssh -L 63333:foo.com:5432 joe@foo.com

しかしそうすると、データベースサーバはそのfoo.comバインドアドレスから接続が来たように判断し、デフォルトの設定であるlisten_addresses = 'localhost'では開かれません。 通常これは好ましいことではありません。

どこかのログインホスト経由でデータベースサーバに跳躍しなければならない場合、以下のようにすることが可能です。

ssh -L 63333:db.foo.com:5432 joe@shell.foo.com

shell.foo.comからdb.foo.comへのこのような接続はSSHトンネルで暗号化されません。 SSHはいろいろな方法でネットワークが制約されているとき、かなりの数の設定可能性を提供しています。 詳細はSSHの文書を参照してください。

ヒント

ここで説明してきたものと似た概念の手続きを使用して、安全なトンネルを提供可能なアプリケーションが他にもいくつか存在します。