クライアントとPostgreSQLサーバ間のネットワーク接続を暗号化するためにSSHを使うことができます。 正しく行えば、SSL機能がクライアントになくても、これで十分に安全なネットワーク接続を行うことができます。
まずSSHサーバがPostgreSQLサーバと同じマシン上で正しく起動していて、ssh
を使ってログインできるユーザが存在することを確かめてください。
そうすると、次に示すコマンドでクライアントマシンから安全なトンネルを確立することができます。
ssh -L 63333:localhost:5432 joe@foo.com
-L
引数の1番目の数字(63333)はトンネルのローカル側のポート番号で、未使用のポートを選択することが可能です。(IANAは49152から65535までのポートを私的使用のため予約しています。)
2番目の数字(5432)は、トンネルのリモート側のサーバが使用しているポート番号です。
2つのポート番号間の名前もしくはアドレスは、ログインしているホスト(この例では、foo.com
)から見られる、あなたが接続しようとするデータベースサーバホストです。
このトンネルを使ってデータベースサーバに接続するためには、ローカルマシンのポート63333に接続します。
psql -h localhost -p 63333 postgres
データベースサーバにとっては、ユーザが実際にホストfoo.com
上のユーザjoe
であるかのように見え、このユーザとホストによるlocalhost
接続向けに設定された認証手続きが使用されます。
サーバはこの接続がSSLで暗号化されているとみなさないことに注意してください。
実際、SSHサーバとPostgreSQLサーバとの間は暗号化されません。
この2つのサーバが同一マシンにある限り、セキュリティ上の危険性が増すことはありません。
トンネルの確立が成功するためには、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の文書を参照してください。
ここで説明してきたものと似た概念の手続きを使用して、安全なトンネルを提供可能なアプリケーションが他にもいくつか存在します。