Loading
BLOG 開発者ブログ

2021年12月24日

RDPが使えなくてもリモートデスクトップ接続する


リモートデスクトップ接続は離れた端末やサーバをGUIで操作できる便利な機能で、メンテナンスや踏み台サーバに繋ぐ際に利用された方も多いと思います。
しかし、オンプレから一部だけクラウドに移行した場合などオンプレとクラウドを併用する場合に、プロキシでRDP通信が止められてしまいクラウド上のRDPホストに接続できないことがあります。
今回は、このような環境でもリモートデスクトップ接続する方法をご紹介したいと思います。

この記事はアイソルート Advent Calendar 24日目の記事です。
こんにちは。
クラウドソリューショングループのakahane.tです。

昨日はmaruoka.nさんの「Microsoft Defender for Office365を使ってTeamsを脅威から保護する」でした。

アジェンダ

  1. はじめに
  2. 構築
  3. 接続
  4. まとめ
  5. おわりに

はじめに

今回はAWSのEC2で構築したRDPホストにリモートデスクトップ接続する場合を例にご紹介します。
構成は下の図で、直接RDP通信が繋がらない状況を簡単に再現するため、セキュリティグループでRDP通信を制限しています。

今回ご紹介する方法では、RDP通信が制限されているのを迂回してリモートデスクトップ接続するために、SSH接続を利用しますので下記の条件も必要になります。

  • RDPホストにキーペアを割り当て済み
  • RDPホストにグローバルIPを割り当て済み
  • セキュリティグループでSSHを許可している

構築

RDPホストで一般的なWindows ServerはデフォルトではSSHのホストの機能がオフになっているので設定する必要がありますが、リモートデスクトップ接続が利用できないので設定するにも回り道する必要があります。
今回は最近AWSに追加されたWebページからRDPと同じように操作できるFleet Managerを使用して設定します。
接続に必要なIAMロールの割り当てや接続までの手順については「EC2 Windows インスタンスに Web GUI(Fleet Manager) でお手軽接続してみる」で紹介されていますのでこちらをご参考ください。

Fleet Managerを使用してRDPに接続した後は、PowerShellで下記のコマンドを実行してSSHのホストの機能をオンにします。

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Start-Service sshd

接続

RDPホストでSSHのホスト機能がオンにできたら、クライアントからSSH接続します。
この時に通常のSSH接続の設定の他に、ローカルのポートをRDPホストの3389ポートの転送するようにポートフォワードの設定を追加します。
コマンドプロンプトを使用してSSH接続する場合、下記のようなコマンドになります。

ssh -L (ローカルのポート):(転送先IP):(転送先ポート) (接続先ユーザ名)@(接続先IP)

今回はRDPホストのデフォルトのユーザ(Administrator)を使用して、ローカルの13389ポートをRDPホストの3389ポートに転送させます。
この時、RDPホストのグローバルIPが「10.98.76.54」だとすると、コマンドは下記になります。

ssh -L 13389:localhost:3389 Administrator@10.98.76.54

コマンドを実行するとパスワードが要求されますので、AWSのマネジメントコンソールからRDPホストのパスワードを確認して入力します。
パスワードを入力して認証が通れば、RDPホスト側でコマンドを実行する画面になるので、この状態になればSSH接続完了です。

SSH接続をしたまま、RDPクライアントツールの「リモートデスクトップ接続」を立ち上げます。
接続先に「localhost:13389」を設定して接続を開始します。
資格情報にはユーザ名に「Administrator」、パスワードにSSH接続で使用したパスワードを入力します。
認証が通ればRDPホストを操作できるようになるので、リモートデスクトップ接続完了です。

まとめ

今回ご紹介した接続方法は「SSHポートフォワーディング」や「SSHトンネリング」と呼ばれる機能を使用した、「RDP over SSH」という方法で下の図のような接続イメージになります。

SSHの通信の中でRDPの通信が行われていますので、直接リモートデスクトップ接続できない環境でもSSHが利用できればSSHの通信の中を通してリモートデスクトップ接続できます。
また、SSH接続できる環境であればSSHとRDPの両方が利用できるようになるため開放するポートを減らせるだけでなく、SSHポートフォワーディングの転送先をプライベートネットワークにあるサーバに向けることもできるので、SSHホストを踏み台とし切り分けることでセキュリティホールを減らすことできます。

おわりに

「構築の章で登場したFleet ManagerでWebからGUI操作できるならRDP over SSHは不要ではないか?」と感じた方もいらっしゃると思います。
確かにFleet ManagerはRDPホストを操作するには十分な機能が提供されているので私も共感できます。
しかし、インフラの管理者とリモートデスクトップ接続の利用者が分かれていて利用者にAWSのアクセス権限を与えない運用でFleet Managerを使用できない状況や、Fleet Managerが使用できても画面が小さく操作しにくい点やクライアント側とのファイル転送ができない点、接続時間に制限がある点でリモートデスクトップ接続を利用するメリットもあります。
みなさんがそのようなリモートデスクトップ接続にしかできないことが必要になったときに、今回ご紹介した方法がお役に立てれば幸いです。

明日の記事はnamiki.tさんによる「Mock Service Worker を使ってみた」です、お楽しみに!

akahane.tのブログ