Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Securely Connect to a Remote PostgreSQL Database with SSH Tunneling

2025年10月02日に「Dev.to」が公開したITニュース「Securely Connect to a Remote PostgreSQL Database with SSH Tunneling」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

リモートのPostgreSQLデータベースへ安全に接続する手順を説明する。SSHトンネリング(安全な通信経路)を利用することで、データベースポートをインターネットに直接公開することなく、ローカルPCからセキュアにアクセスできる。不正アクセスを防ぎ、データ通信を暗号化する。

ITニュース解説

システムエンジニアを目指す初心者が、リモートにあるPostgreSQLデータベースに安全に接続する方法について解説する。インターネットに接続されたサーバー上のデータベースに直接アクセスポートを開放することは、セキュリティ上非常に危険である。これは、家のドアに鍵をかけずに「ようこそ」と書かれた看板を立てるようなもので、悪意のある攻撃者にとって格好の標的となる。そこで、この危険を回避し、安全にデータベースへアクセスするための強力な手段がSSHトンネリングである。SSHトンネリングは、あなたのパソコンとリモートサーバーの間に、まるで「秘密のパイプ」を作るようなもので、このパイプを通してのみデータベースと通信できるようになる。サーバー側ではPostgreSQLデータベースは外部に公開されず、あなたのパソコンから安全に接続できる仕組みだ。

まず、この安全な通信を実現するために、SSHキーペアを作成する必要がある。SSHキーペアとは、公開鍵と秘密鍵という二つの鍵のセットで、まるでドアの鍵(秘密鍵)と、その鍵穴の情報(公開鍵)のような関係である。あなたのパソコン上でssh-keygen -t ed25519 -C "your_email@example.com"というコマンドを実行することで、このキーペアが生成される。~/.ssh/id_ed25519というファイルが秘密鍵、~/.ssh/id_ed25519.pubというファイルが公開鍵として保存される。秘密鍵は絶対に他人に共有してはならない、厳重に保管すべき鍵である。一方、公開鍵はリモートサーバーに登録する情報であり、これを使ってサーバーがあなたの身元を確認する。

次に、作成した公開鍵をリモートサーバーにコピーする。これは、あなたがこのサーバーへのアクセスを許可された正規のユーザーであることをサーバーに知らせるための作業である。ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote-server.comというコマンドを使用すると、自動的にあなたの公開鍵をサーバーの適切な場所(通常は~/.ssh/authorized_keysファイル)に追加してくれる。もしssh-copy-idコマンドが利用できない場合は、公開鍵ファイル(.pubファイル)の中身を直接コピーし、サーバーの~/.ssh/authorized_keysファイルに手動でペーストすることでも同じ設定が可能である。この作業により、パスワード入力なしでSSH接続ができるようになり、セキュリティも向上する。

さらに、SSH接続をより便利にするために、SSH設定ファイル~/.ssh/configにエントリーを追加することをおすすめする。この設定ファイルに、接続先のサーバーに関する情報をまとめて記述しておくことで、毎回長いコマンドを入力する手間を省くことができる。例えば、Host my-serverという名前で、HostName remote-server.com(実際のサーバーアドレス)、User user(サーバーのユーザー名)、IdentityFile ~/.ssh/id_ed25519(使用する秘密鍵のパス)、IdentitiesOnly yes(指定した秘密鍵のみを使用する)といった情報を設定する。一度設定すれば、今後は単にssh my-serverと入力するだけで、設定した内容に基づいたSSH接続が確立できるようになる。

いよいよSSHトンネルを開設する段階に入る。SSHトンネルは、あなたのパソコンからリモートサーバー上のデータベースへと安全な通信路を確立する、この解説の中心となる機能である。PostgreSQLデータベースがサーバー上のlocalhost:5432で動作していると仮定する。このデータベースへのアクセスを、あなたのパソコンの特定のポート(例えば5555)に転送するように設定する。そのためのコマンドがssh -L 5555:localhost:5432 my-serverである。このコマンドの-Lオプションは「ローカルポートフォワーディング」を意味し、5555はあなたのパソコン上で待ち受けるポート番号、localhost:5432はリモートサーバー上のPostgreSQLが稼働しているアドレスとポート番号、my-serverは前述のSSH設定で定義した接続先のエイリアスである。このコマンドを実行すると、ターミナルがSSHトンネルの確立状態を維持するため、このターミナルを開きっぱなしにしておく必要がある。もしバックグラウンドでトンネルを動かしたい場合は、-fNオプションを追加してssh -fN -L 5555:localhost:5432 my-serverと実行する。-fはSSHプロセスをバックグラウンドに移動させる(フォークする)ことを意味し、-Nはリモートサーバーでコマンドを実行せずにトンネルだけを確立することを意味する。これにより、ターミナルが解放され、他の作業を続行できる。

SSHトンネルが確立されたら、PostgreSQLデータベースクライアント(例えばpgAdmin、DBeaver、またはコマンドラインツールであるpsqlなど)から接続が可能になる。クライアントの接続設定では、通常リモートサーバーのIPアドレスやホスト名を指定する代わりに、Host: localhostPort: 5555(SSHトンネルで指定したローカルポート)と設定する。その他、User: your database user(データベースのユーザー名)、Password: your database password(データベースのパスワード)、Database name: the actual DB name(接続するデータベース名)を適切に設定する。この設定で接続すると、クライアントはあなたのパソコンのlocalhost:5555に通信を試みるが、その通信はSSHトンネルによって安全に暗号化され、リモートサーバーのPostgreSQLデータベース(localhost:5432)へと転送される。これにより、まるでデータベースがあなたのパソコン上で直接動いているかのように、安全に操作できるのだ。

役目を終えたSSHトンネルは適切に閉じる必要がある。フォアグラウンドで実行しているトンネル(ssh -L ...)の場合は、ターミナルでCtrl+Cを押すことで簡単に終了できる。バックグラウンドで実行しているトンネル(ssh -fN -L ...)の場合は、まずps aux | grep 'ssh -L'コマンドを使って、実行中のSSHトンネルプロセスを探し出す必要がある。このコマンドは、現在実行中のすべてのプロセスの中から、ssh -Lという文字列を含むものを表示する。表示された結果の中から、目的のSSHトンネルプロセスを見つけ、そのプロセスID(PID)を確認する。その後、kill <PID>コマンド(<PID>は確認したプロセスIDに置き換える)を実行することで、バックグラウンドのSSHトンネルを終了させることができる。

このSSHトンネリングを利用した接続方法は、複数の重要なメリットをもたらす。一つ目は、あなたのデータベースポートがインターネットの外部世界から完全に隠され、直接的な攻撃の対象とならないこと。二つ目は、あなたのパソコンとリモートサーバー間のすべての通信がSSHによって強力に暗号化されるため、データが盗聴されるリスクが極めて低いこと。三つ目は、pgAdminのようなGUIツールやpsqlのようなコマンドラインツールなど、普段使い慣れた任意のクライアントツールを使って安全にデータベースに接続できることである。このSSHトンネリングの技術はPostgreSQLに限らず、MySQL、Redis、あるいは直接インターネットに公開したくないあらゆる種類のサービスに対して応用可能であり、システム開発におけるセキュリティの基礎として非常に有用な知識となる。

関連コンテンツ

関連IT用語

関連ITニュース