a2 Tech blog

試したこと・調べたこと・感じたことを発信するITエンジニアの日記です。仕事とは直接関係ないけど興味あることを模索していきます。

Azure上のVMにProxy経由でRDPする

組織に所属する限りProxyを経由しないとインターネットに出れないというのは当たり前ですね。パブリッククラウドがかなり発展してきている中で、少し不自由な時があるのが実情だと思います。セキュリティの関係で仕方ないと言えば仕方ないのですが、どうにかしたいのも事実です。Proxy配下のクライアントからAzure上のVirtual Machineにリモートデスクトップ(RDP)する方法はないものかと気になったので試してみました。

説明するがすごく難しく複雑なのですが、SSH Over HTTPで対象のサーバとSSHを確立して、SSHポート転送でRDPをフォワードするという方法でなんとかつなぐことが出来ました。

いやぁ、なんのこっちゃって感じですよね。とりあえず、絶対に忘れそうなので自分自身への備忘も兼ね方法をまとめておきます。同じことで悩んでる人の少しでも参考になればと思います。

必要なもの

必要なものは下にあげたものです。

  • クライアント端末
  • SSHクライアント
  • Azure VM
  • OpenSSH

クライアント端末はRDPを行う端末なのでWindows端末を用意します。Macは詳しくないのですが、RDP出来るのであればMacでも構いません。クライアント端末には、SSHでサーバと接続しますのでSSHクライアントのインストールが必要です。ポートフォワードが出来るSSHクライアントを使います。私はTera Termを使ってますので、その前提で説明します。

接続先のサーバはAzure上のVirtual Machine(VM)にWindiws Serverを構築しているものとします。RDP先のサーバなのでWindowsですね。開発用やテスト用の環境を素早くプロビジョニングするためにDevTest LabsというAzureの機能を使って構築しています。どんなものかはMicrosoftの公式を読んでくださいね。

azure.microsoft.com

クライアント端末とサーバでSSH接続を確立するために、サーバ(Windows Server)にWindows版のOpenSSHを導入する必要があります。OpenSSHは、Windowsに対応したものがあるのですごく簡単にSSH機能を導入できるようになりました。後で導入について記載します。

さて、必要なものがの説明はこれぐらいにしてそれぞれの設定をしていきましょう。

Azure VM の構築

Azure上にすでにVMがある場合はその環境を使用すればよいです。Azure VMを作るところから始める場合は、DevTest Labsを用いてサクッと作成します。それほど設定を項目は多くないのでMicrosoftの公式ページを見て作成してみてください。詳細はここでは割愛します。設定画面からポチポチやっていくと10分ぐらいでVMの立ち上げまで出来ます。クラウドって便利って実感します。マシン調達してインストールしてってやらなきゃいけない時代はもう終わりましたね。

docs.microsoft.com

docs.microsoft.com

DevTest Labsに、VMを1台構築した状態はこのような感じです。

f:id:ninna2:20170519200239p:plain

元となる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 VMWindows ServerにRDPしてログインしてください。DevTest Labsで作成した場合はロードバランサが挟まることになるので、“パブリックIP"と"ポート指定”でのRDPになります。

RDP接続できたらSSH接続を確立するために設定を変えていきましょう。検証目的でやっているので、セキュリティ面は多少ゆるくしてます。本来はもう少ししっかり設定した方が良いところもあると思いますが、その辺りは各自考慮して下さいね。セキュアな環境構築はエンジニアとして必須のスキルです。

OpenSSHのモジュールを取得したいのでIEの設定を変更します。Server Managerを開き、Internet Explorer Enhanced Security Configurationから変更します。とりあえずOFFにしました。取得後に元に戻しておくことをお勧めします。

f:id:ninna2:20170519210336p:plain:w360

f:id:ninna2:20170519192409p:plain:w360

下記からOpenSSHのモジュールをダウンロードして解凍してください。x64の場合は、OpenSSH-Win64.zipです。

github.com

展開したいOpenSSHモジュールの置き場所はどこでも良いのですが、わかりやすいように[C:\Program Files\OpenSSH-Win64]が良いと思います。配置したらPathの設定をします。Windwos Server 2016から環境変数の設定画面が改善されてますね。

f:id:ninna2:20170519200130p:plain:w360

sshdのインストールを行なっていくのですが、インストースクリプトPowerShellファイル(.ps1)なのでPowerShellのポリシーを緩めておきます。

PS C:\> Set-ExecutionPolicy Unrestricted

詳細については下記が参考になると思いますので、設定内容が気になる場合は一読ください。簡単に言うとダウンロードしたPowerShellに対して実行を許可するか確認してから実行するようにする設定になります。

www.atmarkit.co.jp

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ポート)を、VMSSH(22ポート)にフォワードする設定を追加すればよいです。こうすることで外部からSSHできるようになるはずです。

f:id:ninna2:20170519203350p:plain:w360

ちなみに、22番以外(たとえば22022ポートとか)から、接続先の22ポートにフォワーディングするように設定してやってみたのですがうまくいかなかったので、22ポートをつかうようにしました。Azure Portalで設定追加しないといけない項目はこれだけです。簡単ですね。

SSH Over HTTPで接続

ここからは、Proxy配下のWindowsクライアントで作業します。まず、SSHクライアントをインストールしてください。Tera Termが私が使っているSSHクライアントです。

ja.osdn.net

インストール出来たら早速起動します。起動しても接続を指定する画面はそのまま閉じてください。まだ繋がりません。先にProxy設定が必要なんです。Proxy設定にそれぞれのProxy情報を入力します。

f:id:ninna2:20170519204922p:plain:w360

こうすることで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”を入力します。

f:id:ninna2:20170519204942p:plain:w360

この設定のリモート側ホストは、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って不思議な感じですがこれでローカルポートへの接続が転送されて、リモートホストに接続できるようになります。

f:id:ninna2:20170519205415p:plain:w360

繋がりましたか?

少々長い道のりでしたが、この方法を用いれば、SSHを確立したサーバを踏み台に別のサーバにもアクセス出来ます。SSHサーバを構築するところだけはどうしてもProxy経由では出来なかったですが、1度SSH接続できるサーバが構築できてさえしまえば、あとはProxy経由でなんでも出来ます。Proxyサーバの設定次第で接続できない可能性もありますが、皆さんの参考になれば幸いです。