インバウンドアクセスを許可してないWindowsServerにRDP接続してみた
はじめに
こんにちは、AWS事業本部のニシヤマです。はいマスキュラー。
遅ればせながらAWS Systems ManagerのBlack Belt Online Seminarを見ていて、AWS System Managerセッションマネージャーのポートフォワードを使ってインバウンドアクセスを許可してないWindowsServerにRDP接続を試してみたのでご紹介します。
構成
今回は以下のような構成の環境を用意しました。
せっかくなので、どのような環境の場合に利用できるかも確認するために上からパブリックサブネット、プロテクテッドサブネット、プライベートサブネットを用意しました。
プロテクテッドサブネットとは
プロテクテッドサブネットについては、NATを介して外部ネットワークとoutbound通信のみが可能なサブネット
になります。詳しくは以下のブログを参照してください。
前提
- ローカルマシン(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管理については以下のブログも参照して下さい。
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にも直接接続できるのは楽ですね。この記事がどなたかのお役に立てば幸いです。