インバウンドアクセスを許可してないWindowsServerにRDP接続してみた

AWS System Managerセッションマネージャーのポートフォワードを使ってインバウンドアクセスを許可してないWindowsServerにRDP接続を試してみました。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは、AWS事業本部のニシヤマです。はいマスキュラー。

遅ればせながらAWS Systems ManagerのBlack Belt Online Seminarを見ていて、AWS System Managerセッションマネージャーのポートフォワードを使ってインバウンドアクセスを許可してないWindowsServerにRDP接続を試してみたのでご紹介します。

構成

今回は以下のような構成の環境を用意しました。

せっかくなので、どのような環境の場合に利用できるかも確認するために上からパブリックサブネット、プロテクテッドサブネット、プライベートサブネットを用意しました。

プロテクテッドサブネットとは

プロテクテッドサブネットについては、NATを介して外部ネットワークとoutbound通信のみが可能なサブネットになります。詳しくは以下のブログを参照してください。

【AWS】VPC環境の作成ノウハウをまとめた社内向け資料を公開してみる

前提

  • ローカルマシン(Mac)にリモートデスクトップクライアントがインストール済み
  • EC2インスタンスはAMI「Windows Server 2019(ami-04b205fe787b460d9)」を利用
  • パブリックサブネットのEC2インスタンスにElastic IPをアタッチ
  • EC2のIAMロールにはIAMポリシー「AmazonSSMManagedInstanceCore」をアタッチ済み
  • ローカルマシン(Mac)にはIAMポリシー「AmazonSSMFullAccess」をアタッチしたIAMユーザのアクセスキー/シークレットアクセスキーが設定済み

やってみる

セキュリティグループの確認

上記のインフラ構成が構築済みの状態から進めます。EC2インスタンスは以下の3台が起動している状態です。

今回、EC2にアタッチするセキュリティグループはインバウンドは何も許可していない状態です。

アウトバウンドはセキュリティグループ作成のままの状態で、すべてのトラフィック0.0.0.0/0宛に許可しています。

セキュリティグループはインバウンドが許可されていないため、この状態ではパブリックサブネットにあるパブリックIPアドレスを持つEC2インスタンスにもRDP接続はできません。

SSMセッションマネージャーを利用して接続してみる

パブリックサブネットのEC2

まずはパブリックサブネットのEC2に対してMacのターミナルを利用して接続を開始します。 ローカルの「13389」番ポートへの通信を、「3389」番ポートへ転送するように設定します。

aws ssm start-session \
  --target i-0ea38c030855ad649 \
  --document-name AWS-StartPortForwardingSession \
  --parameters "portNumber=3389, localPortNumber=13389"

ターミナルに以下のようなメッセージが出たら接続OKです。

Starting session with SessionId: cm-nishiyama.test-0bae452a0d9340895
Port 13389 opened for sessionId cm-nishiyama.test-0bae452a0d9340895.

次にリモートデスクトップクライアントで接続してみます。

接続できました!

インスタンスID、アタッチしたElastic IPアドレス、プライベートIPアドレスが確認できます。

プロテクテッドサブネットのEC2

次はプロテクテッドサブネットのEC2に対して接続を開始します。 ローカルのポート番号が先ほどのEC2と同じにならないよう「13390」番ポートへの通信を、「3389」番ポートへ転送するように設定します。

aws ssm start-session \
  --target i-051e9db4e260e5250 \
  --document-name AWS-StartPortForwardingSession \
  --parameters "portNumber=3389, localPortNumber=13390"

同じく以下のようなメッセージが出たら接続OKです。

Starting session with SessionId: cm-nishiyama.test-0c6c8b55270ec927a
Port 13390 opened for sessionId cm-nishiyama.test-0c6c8b55270ec927a.

次にリモートデスクトップクライアントで接続してみます。

プロテクテッドサブネットのEC2に対してもRDP接続できました!

こちらはパブリックIPアドレスが無いためインスタンスID、プライベートIPアドレスのみが確認できます。

プライベートサブネットのEC2

最後にプライベートサブネットのEC2に対して接続を試してみます。 ローカルのポート番号は「13391」番ポートを設定してみます。

aws ssm start-session \
  --target i-080aa5435288d78f9 \
  --document-name AWS-StartPortForwardingSession \
  --parameters "portNumber=3389, localPortNumber=13391"

こちらは以下のエラーが出て接続ができませんでした。

An error occurred (TargetNotConnected) when calling the StartSession operation: i-080aa5435288d78f9 is not connected.

2020/03/03追記

接続できないとご紹介したプライベートサブネットのEC2ですが、以下の手順を実施することでRDP接続することが可能になります。

(2020/06/24追記)プライベートサブネットのEC2インスタンスのSSM管理については以下のブログも参照して下さい。

プライベートサブネットにあるEC2インスタンスを Systems Manager で管理する

VPCのDNSホスト名を有効化

プライベートサブネットのEC2へRDP接続する場合、SSM用のVPCエンドポイント(インターフェイスエンドポイント)の作成を行うのですが、DNSホスト名を有効化しないと以下のエラーが発生する為、VPCのコンソールから有効化します。

Enabling private DNS requires both enableDnsSupport and enableDnsHostnames VPC attributes set to true for vpc-0f9c1f21a395d95a2

AWS System Manager用のVPCエンドポイントのセキュリティグループを作成

後述するVPCエンドポイント(インターフェイスエンドポイント)にアタッチするセキュリティグループを作成します。インバウンドルールでプライベートサブネットのEC2のセキュリティグループからHTTPS(443番)を許可するように設定してください。

AWS System Manager用のVPCエンドポイントを作成

次にこちらのドキュメントを参照して、以下の3つのサービス名のVPCエンドポイント(インターフェイスエンドポイント)を作成してください。

  • com.amazonaws.ap-northeast-1.ssm
  • com.amazonaws.ap-northeast-1.ec2messages
  • com.amazonaws.ap-northeast-1.ssmmessages

アタッチするセキュリティグループは上記で作成したプライベートサブネットのEC2のセキュリティグループからHTTPS(443番)を許可した物を選択してください。

プライベートサブネットのEC2にRDP接続

プライベートサブネットのEC2に対してMacのターミナルを利用して接続を開始します。

aws ssm start-session \
  --target i-0698aabf08e05220d \
  --document-name AWS-StartPortForwardingSession \
  --parameters "portNumber=3389, localPortNumber=13391"

ターミナルに以下のようなメッセージが出たら接続OKです。

Starting session with SessionId: cm-nishiyama.test-04f6adf7c60f2de63
Port 13391 opened for sessionId cm-nishiyama.test-04f6adf7c60f2de63.

次にリモートデスクトップクライアントで接続してみます。

System Manager用のVPCエンドポイントを作成することでプライベートサブネットのEC2に対してもRDP接続できました!

※EC2は再作成の為、インスタンスIDは異なります。

また、System Manager用のVPCエンドポイントを作成してRDP接続をする場合、Internet Gatewayへのルートだけでは無く、VPCにInternet Gatewayがアタッチされてなくても接続が可能です。(こちらに関しては機会があれば別途ブログ化したいと思います。)

コマンド実行時にエラーが出た場合

SessionManagerPlugin is not found. Please refer to SessionManager Documentation here: http://docs.aws.amazon.com/console/systems-manager/session-manager-plugin-not-found

aws ssm start-sessionコマンド実行時に上記のようなエラーが出た場合は、メッセージ内のURLを参照し、以下のコマンドでSession Manager Plugin をインストールしてください。 また、こちらのプラグインにはPython2.6.5以降またはPython3.3が必要になります。

curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
unzip sessionmanager-bundle.zip
sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin

おわりに

セッションマネージャーのポートフォワード機能は2019年のアップデートで利用可能でしたが、AWS System Managerにいろいろな機能があり触れていませんでした。今回Black Belt Online Seminarで聞いた中でこれは便利と思いすぐに触ってみました。

メンテナンスなどの際にインターネットに対してインバウンドで許可する必要がないのはいいですね。またプライベートサブネットのEC2には接続できませんが、プライベートサブネットのEC2やプロテクテッドサブネットのEC2にも直接接続できるのは楽ですね。この記事がどなたかのお役に立てば幸いです。