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

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

クライアントと 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 であるかのように見え、このユーザとホストによる接続向けに設定された認証手続きが使用されます。 サーバはこの接続が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の文書を参照してください。

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


powered by SEO.CUG.NET