Azure上のVMにProxy経由でRDPする
組織に所属する限りProxyを経由しないとインターネットに出れないというのは当たり前ですね。パブリッククラウドがかなり発展してきている中で、少し不自由な時があるのが実情だと思います。セキュリティの関係で仕方ないと言えば仕方ないのですが、どうにかしたいのも事実です。Proxy配下のクライアントからAzure上のVirtual Machineにリモートデスクトップ(RDP)する方法はないものかと気になったので試してみました。
説明するがすごく難しく複雑なのですが、SSH Over HTTPで対象のサーバとSSHを確立して、SSHポート転送でRDPをフォワードするという方法でなんとかつなぐことが出来ました。
いやぁ、なんのこっちゃって感じですよね。とりあえず、絶対に忘れそうなので自分自身への備忘も兼ね方法をまとめておきます。同じことで悩んでる人の少しでも参考になればと思います。
必要なもの
必要なものは下にあげたものです。
クライアント端末はRDPを行う端末なのでWindows端末を用意します。Macは詳しくないのですが、RDP出来るのであればMacでも構いません。クライアント端末には、SSHでサーバと接続しますのでSSHクライアントのインストールが必要です。ポートフォワードが出来るSSHクライアントを使います。私はTera Termを使ってますので、その前提で説明します。
接続先のサーバはAzure上のVirtual Machine(VM)にWindiws Serverを構築しているものとします。RDP先のサーバなのでWindowsですね。開発用やテスト用の環境を素早くプロビジョニングするためにDevTest LabsというAzureの機能を使って構築しています。どんなものかはMicrosoftの公式を読んでくださいね。
クライアント端末とサーバでSSH接続を確立するために、サーバ(Windows Server)にWindows版のOpenSSHを導入する必要があります。OpenSSHは、Windowsに対応したものがあるのですごく簡単にSSH機能を導入できるようになりました。後で導入について記載します。
さて、必要なものがの説明はこれぐらいにしてそれぞれの設定をしていきましょう。
Azure VM の構築
Azure上にすでにVMがある場合はその環境を使用すればよいです。Azure VMを作るところから始める場合は、DevTest Labsを用いてサクッと作成します。それほど設定を項目は多くないのでMicrosoftの公式ページを見て作成してみてください。詳細はここでは割愛します。設定画面からポチポチやっていくと10分ぐらいでVMの立ち上げまで出来ます。クラウドって便利って実感します。マシン調達してインストールしてってやらなきゃいけない時代はもう終わりましたね。
DevTest Labsに、VMを1台構築した状態はこのような感じです。
元となるVMイメージにVisual Studio Enterprise 2017 (version 15.2) on Windows Server 2016 (x64)を使ったのでその前提で下記は説明していきます。Windows ServerにVisual Studioが導入にされた状態で初期構築されます。
Windows ServerにOpenSSHを導入する
SSH接続を確立できるようになるまでは、先ほど作成したAzure VMに直接インターネットから接続する必要があります。初期設定を行うココだけはどうしても避けられなかったです。デザリングでもなんでも良いのでProxy経由しない方法でアクセスできる必要があります。
最初にAzure VMのWindows ServerにRDPしてログインしてください。DevTest Labsで作成した場合はロードバランサが挟まることになるので、“パブリックIP"と"ポート指定”でのRDPになります。
RDP接続できたらSSH接続を確立するために設定を変えていきましょう。検証目的でやっているので、セキュリティ面は多少ゆるくしてます。本来はもう少ししっかり設定した方が良いところもあると思いますが、その辺りは各自考慮して下さいね。セキュアな環境構築はエンジニアとして必須のスキルです。
OpenSSHのモジュールを取得したいのでIEの設定を変更します。Server Managerを開き、Internet Explorer Enhanced Security Configurationから変更します。とりあえずOFFにしました。取得後に元に戻しておくことをお勧めします。
下記からOpenSSHのモジュールをダウンロードして解凍してください。x64の場合は、OpenSSH-Win64.zipです。
展開したいOpenSSHモジュールの置き場所はどこでも良いのですが、わかりやすいように[C:\Program Files\OpenSSH-Win64]が良いと思います。配置したらPathの設定をします。Windwos Server 2016から環境変数の設定画面が改善されてますね。
sshdのインストールを行なっていくのですが、インストールスクリプトがPowerShellファイル(.ps1)なのでPowerShellのポリシーを緩めておきます。
PS C:\> Set-ExecutionPolicy Unrestricted
詳細については下記が参考になると思いますので、設定内容が気になる場合は一読ください。簡単に言うとダウンロードしたPowerShellに対して実行を許可するか確認してから実行するようにする設定になります。
PowerShellを起動して、OpenSSHを配置したフォルダに移動して、インストールスクリプト(install-sshd.ps1)を実行します。
PS C:\Program Files\OpenSSH-Win64> .\install-sshd.ps1
次に、SSH host-keyを生成するために、“.\ssh-keygen.exe -A"コマンドを実行します。
PS C:\Program Files\OpenSSH-Win64> .\ssh-keygen.exe -A
オプションですが、サーバ起動時に自動的にsshdが起動するように、スタートアップの設定を行います。DebTest Labsだと自動シャットダウンが設定されているので、毎回起動時にsshdを起動しなくてはいけなくなるので、出来れば設定しておくべきです。サービス(Services)から"sshd"のプロパティを開き、Startup Typeを“Automatic”に設定します。
最後にファイアウォールの設定を変更します。最低限22番ポートをあける必要があります。私はとりあえず検証なので全部あけました。セキュリティ的によくないので、22だけあけるように設定することをお勧めします。
ここまで設定できれば、サーバ(Windows Server)側の設定はOKです。
Azureの設定変更
DevTest LabsでVMを構築した場合、ロードバランサ(LB)経由のアクセスになるので、SSH通信をフォワードしてあげる必要があります。Azure PortalからDevTest Labsで作成されたロードバランサにアクセスし、“受信NAT受信”に設定を追加します。パブリックIP宛のSSH(22ポート)を、VMのSSH(22ポート)にフォワードする設定を追加すればよいです。こうすることで外部からSSHできるようになるはずです。
ちなみに、22番以外(たとえば22022ポートとか)から、接続先の22ポートにフォワーディングするように設定してやってみたのですがうまくいかなかったので、22ポートをつかうようにしました。Azure Portalで設定追加しないといけない項目はこれだけです。簡単ですね。
SSH Over HTTPで接続
ここからは、Proxy配下のWindowsクライアントで作業します。まず、SSHクライアントをインストールしてください。Tera Termが私が使っているSSHクライアントです。
インストール出来たら早速起動します。起動しても接続を指定する画面はそのまま閉じてください。まだ繋がりません。先にProxy設定が必要なんです。Proxy設定にそれぞれのProxy情報を入力します。
こうすることでSSHをProxy経由で行えるようになるので、Azure VMに接続を行います。接続先にはAzureのパブリックIPを指定します。ポートはLBの受信NATルールで設定したポートです(22ポートですね)。ユーザーとパスフレーズを入力する画面が出るはずなので、正しい情報を入力して接続を確立します。
繋がりましたか?
これでSSH Over HTTPにての接続は成功です。SSH接続は維持しておく必要があるので、接続後は閉じないでそのままにしておいてください。
RDPのSSHポート転送
あともう少しです。
RDP接続をSSH経由で行うためにSSHポート転送の設定を入れます。Tera Termで接続を確立した状態で、[設定] - [SSH転送] を開きます。ポート転送を追加します。ローカルポートは、好きなもの(私は13389)を入力し、リモート側ホストにはサーバ自身(私の場合は10.0.0.4)、ポートは“rdp”を入力します。
この設定のリモート側ホストは、SSH接続を確立したサーバからのIPアドレスとなるので10.0.0.4のようなアドレスになっています。DebTest Labsでのネットワークはデフォルトで、10.0.0.0/20のネットワークになっているようで、10.0.0.4からVMに割り当たっていくみたいです。もちろん変更できます。
SSH over HTTP越しにRDPを行ってみる
これで設定は完了なので、SSH接続をProxy経由で確立した後に、ローカルホストの転送ポート(localhost:13389)にRDP接続します。ローカルホストにRDPって不思議な感じですがこれでローカルポートへの接続が転送されて、リモートホストに接続できるようになります。
繋がりましたか?
少々長い道のりでしたが、この方法を用いれば、SSHを確立したサーバを踏み台に別のサーバにもアクセス出来ます。SSHサーバを構築するところだけはどうしてもProxy経由では出来なかったですが、1度SSH接続できるサーバが構築できてさえしまえば、あとはProxy経由でなんでも出来ます。Proxyサーバの設定次第で接続できない可能性もありますが、皆さんの参考になれば幸いです。