AWS Systems Manager Session Managerを使用したポートフォワーディングによるリモートホストへの接続

AWS

2024.12.10

Topics

はじめに

こんにちは!
第一SAチームのshikaです。

この記事はNHN テコラスAdvent Calendar 2024の10日目の記事です。

AWS Systems Manager (SSM) の Session Manager を使えば、セキュリティグループによるポートの開放することなく、安全にリモートリソースへ接続することができます。
本記事では、SSM Session Managerを使ったポートフォワーディングの仕組みとその活用方法について、具体的な手順を交えながら解説します。

ポートフォワーディング機能とは?

AWS SSMのポートフォワーディングは、Session Managerを使って、AWS環境内のリモートリソースにローカルからアクセスできる機能です。この機能により、SSHキーやBastionサーバーを使わずに、EC2インスタンスにアクセスできます。

仕組み

SSMでのポートフォワーディングは、ローカルマシンからAWS CLIを使用してHTTPS通信(ポート443)でAWS API経由のトンネルを構築します。トンネルの片側はローカルマシン上の任意のポート、もう片側はSSMエージェントを通じてEC2インスタンス内の指定ポートに接続されます。
この仕組みにより、EC2のセキュリティグループを開放することなく、セキュアなアクセスが可能です。セッションは一時的で、再接続には新たなセッション開始が必要です。NATゲートウェイやVPCエンドポイントを使用し、SSMへのアウトバウンドのみ許可されていれば、プライベートのEC2にもアクセスできます。

準備

必要な条件

  1. SSMエージェントのインストールと有効化
    ・対象のEC2インスタンスにSSMエージェントがインストールされていること。
    ・SSMエージェントが起動中であること。

  2. 適切なIAMロールの設定
    EC2インスタンスにアタッチされたIAMロールに、以下のポリシーが付与されていること。

    AmazonSSMManagedInstanceCore

  3. AWS CLIのセットアップ
    ローカル環境にAWS CLIがインストールされ、SSMセッションを使用できるよう設定されていること。

  4. ポート443のアウトバウンド許可
    EC2インスタンスがSession ManagerとHTTPS通信を行うために、ポート443のアウトバウンド通信が許可されていること。

手順

1. AWS CLIを使ったセッションの開始

まず、AWS CLIを使用してポートフォワーディングセッションを開始します。以下のコマンドを実行します。
例:ローカルの10022番ポートへの接続をリモート22番に転送。

aws ssm start-session \
    --target "<インスタンスID>" \
    --document-name "AWS-StartPortForwardingSession" \
    --parameters '{"portNumber":["22"],"localPortNumber":["10022"]}'

<コマンドの詳細>
–target: 接続対象のEC2インスタンスID。
–document-name: 使用するSSMドキュメント名(デフォルトでAWS-StartPortForwardingSessionを使用)。
–parameters: ローカルポートとリモートポートを指定。

実行後、セッションが確立されます。

2. ローカルからの接続

セッションが確立したら、ローカル環境からフォワーディングされたポートを使って接続します。

SSH接続の場合
例えば、SSH接続を行う場合は以下のコマンドを実行します

ssh -i <秘密鍵ファイル> ec2-user@localhost -p 8888

アプリケーション接続の場合

アプリケーションが特定のポート(例:80)で動作している場合、リモートの80番ポートをローカルの8888番ポートにフォワーディングをして、ブラウザで以下のURLにアクセスします。
http://127.0.0.1:8888

AWS-StartPortForwardingSessionToRemoteHostドキュメントについて

前述の例では「AWS-StartPortForwardingSession」ドキュメントを「aws ssm start-session」コマンドの「–document-name」オプションに指定しましたが、AWS-StartPortForwardingSessionToRemoteHostを使えば、接続したEC2を踏み台として、さらに別のEC2(SSMエージェントの導入も不要)やRDS等のリソースにもフォワーディングが可能です。

例:ローカルの5555番ポートへの接続を踏み台EC2経由でPostgresのRDS(5432)に転送。

aws ssm start-session \
    --target "<インスタンスID>" \
    --document-name "AWS-StartPortForwardingSessionToRemoteHost" \
    --parameters '{"host":["<RDSホスト名>"],"portNumber":["5432"],"localPortNumber":["5555"]}'

これを使えば、SSMエージェントを導入したEC2を一台用意しておけば、このEC2がアクセス可能な全ホストに対してポートフォワーディングが可能となるのでとても便利に運用ができます。

まとめ

AWS SSMのポートフォワーディング機能を活用することで、SSHキーやBastionサーバーを使わずにプライベートなEC2インスタンスに安全にアクセスできます。これにより、運用の効率化とセキュリティの向上が期待できます。
ぜひこの方法を活用して、AWS環境の運用・管理を便利にしてみてください!

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら