MENU

SSH ポートフォワーディングで RDS 接続する

SSHポートフォワーディングでRDS接続する

お世話になります、株式会社エイトハンドレッド・テクノロジー本部の細江と申します。本記事では、Linux 踏み台ホスト経由で RDS 接続する環境を AWS CloudFormation で構築する で構築した環境へ SSH ポートフォワーディングで RDS に接続する方法を3種類(PowerShell, Tera Term, pgAdmin 4)ご紹介します。

SSHポートフォワーディング

SSH (Secure Shell) の機能を用いて外部の機器との間で暗号化された通信経路を用意すること。本来なら外部からアクセスできないプライベートサブネットの RDS との間に安全な通信経路を確保できます。

【参考】
ポートフォワーディング(ポート転送)とは - IT用語辞典 e-Words
ポートフォワードとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

接続する環境

東京リージョンのアベイラビリティーゾーン 1a もしくは 1c のパブリックサブネットに踏み台ホストとなる EC2 インスタンスが、プライベートサブネットに RDS がそれぞれ稼働しています。

今回は、NLB 経由でパブリックサブネットの踏み台ホストへログイン後、RDS へ接続します。

構成図

PowerShell

PowerShell で接続する場合は以下のコマンドを実行します。

ssh [USER_NAME]@[BASTION_HOST] -i [PRIVATE_KEY] -L [BASTION_PORT]:[RDS_ENDPOINT]:[RDS_PORT]

USER_NAME 踏み台ホストへログインするユーザ名
BASTION_HOST 踏み台ホスト名 / IP アドレス(今回の場合は NLB の DNS 名)
PRIVATE_KEY 踏み台ホストへの接続に必要な秘密鍵
BASTION_PORT 待ち受けポート番号
RDS_ENDPOINT 踏み台ホスト経由で接続する RDS エンドポイント
RDS_PORT 踏み台ホスト経由で接続する RDS ポート番号

コマンド例

ssh ec2-user@hatena-handson-nlb-XXX.elb.ap-northeast-1.amazonaws.com -i private.pem -L 22:hatena-handson-rds.XXX.ap-northeast-1.rds.amazonaws.com:5432

PowerShell のログイン状態を維持したまま、任意のクライアントソフトで localhost:0000 は設定した待ち受けポート番号)に接続。

以下のようなエラーが出た場合は秘密鍵のパーミッションを変更する必要があります。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'private.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "private.pem": bad permissions
ec2-user@hatena-handson-nlb-XXX.elb.ap-northeast-1.amazonaws.com: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

【参考】
SSHでUNPROTECTED PRIVATE KEY FILEと言われたら
【Windows PowerShell】SSH接続する際にパーミッションエラーが発生した場合の権限変更

Tera Term (Ver 5 以上)

Amazon Linux 2023 では ssh-rsa 署名がデフォルトで無効化されるようになったため、Tera Term は rsa-sha2 に対応している Ver 5 以上が必要です。

【参考】
Amazon Linux 2023にTeratermで接続できない?
Amazon Linux 2023 に Teraterm から SSH 接続してみた

[新しい接続] から以下の情報を入力し [OK] をクリック。

ホスト(T) 踏み台ホスト名 / IP アドレス(今回の場合は NLB の DNS 名)
TCPポート#(P) 待ち受けポート番号

TeraTerm > 新しい接続

セキュリティ警告が表示された場合は [続行] をクリック。

[SSH認証] で以下の情報を入力し [OK] をクリック。

ユーザ名(N) 踏み台ホストへログインするユーザ名
秘密鍵(K) 踏み台ホストへの接続に必要な秘密鍵

TeraTerm > SSH認証

踏み台ホストへのログインを確認後、[ 設定 > SSH転送 ] をクリック。

TeraTerm > 設定 > SSH転送

[追加] をクリック。

TeraTerm > 設定 > SSH転送 > 追加

以下の情報を入力し [OK] をクリック。

ローカルのポート(L) 待ち受けポート番号
リモート側ホスト(M) 踏み台ホスト経由で接続する RDS エンドポイント
ポート(P) 踏み台ホスト経由で接続する RDS ポート番号

TeraTerm > 設定 > SSH転送 > 追加 > SSHポート転送

SSHポート転送設定を保存しておく場合は、[ 設定 > 設定の保存 ] から設定ファイル(.ini)を任意の場所に保存。

TeraTerm > 設定 > 設定の保存

Tera Term のログイン状態を維持したまま、任意のクライアントソフトで localhost:0000 は設定した待ち受けポート番号)に接続。

pgAdmin 4

[Servers] を右クリックし、[ 登録 > サーバ... ] を選択。

pgAdmin 4 > 登録 > サーバ...

[登録 - サーバ] 画面の [General] で任意のサーバ名称を入力後、[接続] で以下の情報(と必要に応じて RDS のユーザ名とパスワード)を入力。

ホスト名/アドレス 踏み台ホスト経由で接続する RDS エンドポイント
ポート番号 踏み台ホスト経由で接続する RDS ポート番号

pgAdmin 4 > サーバ登録 > 接続

[SSHトンネル] で「SSH トンネリングを使用」を ON に設定し、以下の情報を入力。

トンネルホスト 踏み台ホスト名 / IP アドレス(今回の場合は NLB の DNS 名)
トンネルポート番号 待ち受けポート番号
ユーザ名 踏み台ホストへログインするユーザ名
認証 [識別情報ファイル] を選択
識別情報ファイル 踏み台ホストへの接続に必要な秘密鍵

pgAdmin 4 > サーバ登録 > SSH トンネル

[保存] をクリック。

最後に

Tera Term や pgAdmin 4 はバージョンアップによって UI/UX が変わってしまう可能性もありますが、基本的には以下のふたつさえ設定できれば、SSH ポートフォワーディングによる RDS 接続は実現できると思います。

  • 踏み台ホスト名 / IP アドレス、および待ち受けポート番号
  • 踏み台ホスト経由で接続する RDS エンドポイント、およびポート番号

Linux 踏み台ホスト経由で RDS 接続する環境を AWS CloudFormation で構築する と合わせて楽しんでいただけますと幸いです。