Amazon Web Services ブログ

AWS System Manager Sessions Manager を使用した新しい機能 – Port Forwarding

昨今不変のインフラストラクチャアーキテクチャパターンを採用しているお客様が増えており、更新ごとにインフラストラクチャ全体を再構築およびリデプロイしています。SSH や RDP を介してサーバーに接続して、設定を更新したり、ソフトウェアの更新をデプロイしたりすることはほとんどありません。ただし、既存のアプリケーションをクラウドに移行する場合、Amazon Elastic Compute Cloud (EC2) インスタンスに接続して、さまざまな管理タスクまたは運用タスクを実行するのが一般的です。攻撃にさらされる面を減らすために、AWS では、ジャンプホストとも呼ばれる Bastion ホストを使用することをお勧めします。この特別な目的の EC2 インスタンスは、インターネットからのプライマリアクセスポイントになるように設計されており、他の EC2 インスタンスへのプロキシとして機能します。 EC2 インスタンスに接続するには、まず Bastion ホストに SSH/RDP 接続し、そこから宛先の EC2 インスタンスに接続します。

攻撃にさらされる面、Bastion ホストを管理するための運用上の負荷、および発生する追加コストをさらに削減するために、AWS Systems Manager Session Manager は、独自の Bastion ホストを実行および操作する必要も、 EC2 インスタンスで SSH を実行する必要もなく、 EC2 インスタンスに安全に接続できます。インスタンスに Systems Manager のエージェントがインストールされており、Systems Manager API を呼び出す IAM アクセス許可がある場合、AWS マネジメントコンソールまたは AWS コマンドラインインターフェイス (CLI) を使用して、Linux または Windows EC2 インスタンスに安全に接続できます。

EC2 インスタンスの対話型シェルは、SSH の唯一のユースケースではありません。多くのお客様は、SSH トンネルを使用して、公共インターネットに公開されていないサービスにリモートアクセスしています。SSH トンネルは強力ですが、あまり知られていない SSH の機能で、ローカルホストとリモートサービスの間に安全なトンネルを作成できます。EC2 インスタンスとノートパソコンとの間で簡単にプライベートファイルを転送するためにウェブサーバーを運用していると想像してみましょう。ファイルはプライベートなので、他の人にそのウェブサーバーにアクセスさせたくありません。そのため、127.0.0.1 でのみバインドするようにウェブサーバーを設定し、インスタンスのセキュリティグループにポート 80 を追加しません。ローカルプロセスのみがウェブサーバーにアクセスできます。ノートパソコンからウェブサーバーにアクセスするには、以下に示すように、ノートパソコンとウェブサーバーの間に SSH トンネルを作成します。

このコマンドは、ユーザー ec2-user としてインスタンスに接続し、ローカルノートパソコンでポート 9999 を開き、そこからすべてをインスタンスの localhost:80 に転送するように SSH に指示します。トンネルが確立されたら、ブラウザーを http://localhost:9999 に向けて、ポート 80 でプライベートウェブサーバーに接続できます。

本日、AWS Systems Manager Session Manager の Port Forwarding を発表します。Port Forwarding を使用すると、プライベートサブネットにデプロイされたインスタンス間にトンネルを安全に作成できます。その際、サーバーで SSH サービスを開始したり、セキュリティグループで SSH ポートを開いたり、Bastion ホストを使用したりする必要はありません。

SSH トンネルと同様に、Port Forwarding を使用すると、ノートパソコン間でトラフィックを転送してインスタンスのポートを開くことができます。Port Forwarding を設定したら、ローカルポートに接続して、インスタンス内で実行されているサーバーアプリケーションにアクセスできます。Systems Manager Session Manager の Port Forwarding の使用は、API アクセスの IAM ポリシーおよび Port Forwarding SSM Document によって制御されます。これらは、組織内の誰にトンネルの作成を許可するかを制御できる 2 つの異なる場所です。

今日 Port Forwarding を試すには、この CDK スクリプトを使用して、プライベートサブネットとパブリックサブネット、およびプライベートサブネットでウェブサーバーを実行する単一のインスタンスで VPC をデプロイできます。以下の図は、このブログ記事に使用しているインフラストラクチャを示しています。

インスタンスはプライベートであり、パブリック IP アドレスも DNS 名もありません。VPC デフォルトセキュリティグループは、SSH 経由の接続を許可しません。EC2 インスタンスで実行されている Systems Manager のエージェントは、Systems Manager の サービスエンドポイントと通信できる必要があります。そのため、プライベートサブネットには NAT ゲートウェイへのルーティングテーブルが必要です。それがない場合は AWS Private Link を設定する必要があります。

Systems Manager Session Manager Port Forwarding を使用して、この専用インスタンスで実行されているウェブサーバーにアクセスしましょう。

その前に、 EC2 インスタンスで以下の前提条件が満たされていることを確認する必要があります。

  • System Manager Agent をインストールして実行する必要があります (バージョン 2.3.672.0 以降、Linux または Windows の手順を参照)。エージェントは、Amazon が提供する Amazon Linux 1&2、Windows と Ubuntu AMI にデフォルトでインストールされ起動していること (正確なバージョンについてはこのページをご覧ください)。これらを使用する場合、アクションは不要です。
  • EC2 インスタンスには、 Systems Manager API を呼び出す権限を持つ IAM ロールが必要です。この例では、AmazonSSMManagedInstanceCore を使用しています。

ノートパソコンでは、次のことを行う必要があります。

前提条件が満たされたら、次のように、AWS Command Line Interface (CLI) を使用してトンネルを作成します (インスタンスを作成するのに、the CDK script を使用してインスタンスを開始したと仮定します)

# find the instance ID based on Tag Name
INSTANCE_ID=$(aws ec2 describe-instances \
               --filter "Name=tag:Name,Values=CodeStack/NewsBlogInstance" \
               --query "Reservations[].Instances[?State.Name == 'running'].InstanceId[]" \
               --output text)
# create the port forwarding tunnel
aws ssm start-session --target $INSTANCE_ID \
                       --document-name AWS-StartPortForwardingSession \
                       --parameters '{"portNumber":["80"],"localPortNumber":["9999"]}'

Starting session with SessionId: sst-00xxx63
Port 9999 opened for sessionId sst-00xxx63
Connection accepted for session sst-00xxx63.

ブラウザでポート 9999 を指定して、プライベートウェブサーバーにアクセスできるようになりました。Port Forwarding セッションを終了するには、ctrl-c と入力します。

以下に示すように、Session Manager Port Forwarding は、SSH トンネルに似たトンネルを作成します。

Port Forwarding は、Windows および Linux インスタンスで機能します。現在、すべてのパブリック AWS リージョンで追加料金なしで利用でき、EC2 インスタンスへ接続時に、NAT ゲートウェイまたは VPC Private Link からの発信帯域幅に対して課金されます。

— seb