はじめに
本番環境や検証環境のAWSインフラを運用する際、プライベートサブネットに配置されたRDS(データベース)にローカルPCから安全に接続したいケースは頻繁に発生します。かつてはパブリックサブネットに踏み台(Bastion)サーバーを構築し、SSHトンネリング(ポートフォワーディング)を行う手法が一般的でした。
しかし、この方法ではSSHキーの管理や、踏み台サーバーのセキュリティグループで22番ポートを開放し続けるセキュリティリスクが伴います。そこで現在、インフラエンジニアの間でデファクトスタンダードとなっているのが、AWS Systems Manager(SSM)Session Managerを活用したポートフォワーディングです。本記事では、踏み台サーバーにSSHポートを開放することなく、安全にRDSへ接続するための具体的な手順を解説します。
前提知識とセキュアな接続が必要な理由
SSM Session Managerの「リモートホストへのポートフォワーディング(AWS-StartPortForwardingSessionToRemoteHost)」機能を使用すると、中継役となるプライベートなEC2インスタンスを経由して、ローカルPCからRDS(MySQL、PostgreSQLなど)へHTTPS(443番ポート)のみで通信をカプセル化して接続できます。
この構成が推奨される理由は以下の3点です。
- 踏み台EC2のインバウンドポート開放が不要: SSMエージェントがアウトバウンド方向(HTTPS)でAWS APIと通信するため、EC2のインバウンドルールで22番や他のポートを開ける必要がありません。
- 踏み台EC2がプライベートサブネットで動作可能: パブリックIPを持つ必要がないため、攻撃表面を最小限に抑えられます。
- IAMによる強固なアクセス制御: 誰がいつ接続したかをIAMポリシーで制御し、AWS CloudTrailで操作ログを監査できます。
具体的な設定手順:RDSへのポートフォワーディング
今回は、プライベートサブネットにあるPostgreSQL(ポート: 5432)に、同じVPC内のSSM用EC2を経由して接続する構成を例に解説します。
1. 中継用EC2インスタンスの作成とIAMロールの付与
プライベートサブネットに、SSMエージェントがプリインストールされている「Amazon Linux 2023」などのEC2インスタンスを1台起動します。このインスタンスに、SSMとの通信を許可するためのIAMロール(インスタンスプロフィール)をアタッチします。
- IAMロールを作成し、AWS管理ポリシーである
AmazonSSMManagedInstanceCoreをアタッチします。 - 作成したIAMロールを、起動したEC2インスタンスに割り当てます。
2. セキュリティグループの設定
通信を通すために、適切なセキュリティグループ(SG)を設定します。ここが最も重要なポイントです。
- 中継用EC2のSG: インバウンドルールは 「すべて空(許可なし)」 で問題ありません。アウトバウンドは、SSMエンドポイントおよびRDSへの通信(5432ポート)を許可します。
- RDSのSG: インバウンドルールで、「中継用EC2のセキュリティグループ」からの「5432(PostgreSQL)ポート」への接続のみを許可します。
3. クライアント環境(ローカルPC)の準備
ローカルPCからSSM経由でポートフォワーディングを実行するには、AWS CLIに加えて、標準外の拡張プラグインである Session Manager Plugin の導入が必要です。
macOS(Homebrewを使用する場合)の導入手順:
# Session Manager Pluginのインストール
brew install --cask aws-session-manager-plugin
# インストール確認
session-manager-plugin --version
Windows(PowerShell)の導入手順:
AWS公式サイトからインストーラー(MSIファイル)をダウンロードして実行するか、以下のコマンドでインストールします。
# インストーラーのダウンロードと実行
Start-BitsTransfer -Source "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows_amd64/awscli-session-manager-plugin.msi" -Destination "C:\awscli-session-manager-plugin.msi"
Start-Process msiexec.exe -ArgumentList "/i C:\awscli-session-manager-plugin.msi /qn" -Wait
# インストール確認
session-manager-plugin
4. セッション開始コマンドの実行と接続確認
環境が整ったら、ローカルPCのターミナルから以下のAWS CLIコマンドを実行します。事前に aws configure 等で適切なIAM権限を持つプロファイルを設定しておいてください。
aws ssm start-session \
--target "i-0123456789abcdef0" \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters '{
"host": ["mypostgres.c123456789.ap-northeast-1.rds.amazonaws.com"],
"portNumber": ["5432"],
"localPortNumber": ["15432"]
}'
※ --target には中継用EC2のインスタンスIDを、host にはRDSのエンドポイントを指定します。localPortNumber はローカルPC側で待ち受ける任意のポート番号(例:15432)です。
コマンド実行後、Port 15432 opened for sessionId ... と表示されればトンネル確立に成功しています。この状態で、DBeaverやpgAdminなどのGUIツールから localhost:15432 宛てに接続を行うと、安全にデータベースを操作することができます。
実務での注意点とセキュリティベストプラクティス
- VPCエンドポイントの整備: もし中継用EC2を配置するプライベートサブネットにNAT Gatewayやインターネットへのルートがない場合、SSMと通信するためにVPCエンドポイント(
ssm,ssmmessages,ec2messages)の構築が必要です。 - セッションの自動切断設定: トンネルを繋ぎっぱなしにするとセキュリティリスクが高まります。Session Managerの「Preferences」から、無操作時にセッションを自動切断する「Idle session timeout」を設定しておくことを推奨します。
- 最小特権の原則: 接続を実行するローカルPC側のIAMユーザーやロールには、指定したEC2インスタンスおよび
AWS-StartPortForwardingSessionToRemoteHostドキュメントのみを実行許可するIAMポリシーを制限して付与してください。
まとめ
AWS Systems Manager Session Managerを利用したポートフォワーディングは、踏み台サーバーの運用負荷を大幅に削減し、インフラのセキュリティ強度を最大化する非常に実用的なアプローチです。鍵管理の煩わしさやポート開放のリスクから解放されるため、現代のAWS設計では必須のスキルと言えます。本手順を参考に、安全でシンプルなデータベース接続環境を構築してみてください。