2016年6月6日月曜日

sshトンネルを使ったリモートデスクトップその2

前回は、軽くポートフォワーディングについて記載した。
んで、自宅内のWindowsマシンに、外出先からリモートデスクトップ(RDP)接続出来るようにしたい。

ただ、「外部からsshでログインその1」でルータに設定を施したように、Windowsマシンへも転送するようにすれば、別にsshを通す必要は無い。

これなら、RDPのポート番号さえ分かっていれば、簡単に実現できる。

ただこの場合、幾つか問題点がある。

  1. WindowsPCが増えるたびに、ルータのポート転送を追加する必要がある
  2. 当然、WindowsPCが減ったら、ルータのポート転送を削除する必要がある
  3. ポートスキャンをかけると、RDPサービスだということがバレる
  4. アクセス制御が、RDPの仕組み(ユーザ認証)しか無い
  5. 生RDP通信であり、暗号強度が不安(どのような暗号アルゴリズムなのか不明)
  6. ルータにたくさんの穴開けをしないといけなくなる(台数分)
1,2,6は、「そもそもそんなにWindowsマシン作らないよ」ということになると思うが、今後Ubuntu Linuxマシンや、Windowsマシン上に仮想マシンを作って、WindowsOSをどんどん作っていったら…?なんてことを考えると、意外と管理に手間がかかる。
(ま、WindowsOSのライセンスが高いので、そんなに作ることは無いと思うが)

3,4,5は、RDPセキュリティに関連するそのことだが、正直RDPの暗号強度が高いとは思えない。
また、「外部からsshログインその1」「その2」で書いたように、外部からのアクセスはユーザID/パスワードの組み合わせ以外の仕組みも使いたい。

そういった点を考慮しつつ、それでもRDPで接続出来るようにならないか?
というところで出てくるのが、先に紹介した「sshポートフォワーディング(ローカルポートフォワーディング)」だ。
ローカルポートフォワーディングを使って、以下のような接続状況を作ればいい。


と言っても、これだけではイマイチ良く分からない。
なので、実際に動かしながらやってみよう。

条件としては、外(The Internet側)から、家の中のUbuntu Linuxへsshログイン出来ること。
Ubuntu Linuxと同じネットワーク内(家のネットワーク)に、RDP接続を許可したWindowsマシンがいること。(そもそも、WindowsのHome EditionではRDP接続出来ないため、Professionalとかそういうエディションを使うこと)
作業用PC(クライアント)は、Windows+teratermでサンプルを書く。
  1. teratermでsshログインする前の設定
    ログインする前に、teratermの設定でSSHポート転送を有効にしておこう

    設定内容は以下の通りだ。
    • ローカルのポート
      13389
    • リッスン
      127.0.0.1
    • リモート側ホスト
      接続先Windows機のIPアドレス
    • ポート
      3389
  2. sshログイン
    上記の設定を施したら、「OK」ボタンで設定を確定し、今まで通りにUbuntu Linux機へsshログインしよう。
  3. RDPクライアントでログイン
    端末側でRDP接続を起動して、以下のようにログイン情報を入力する。

    • コンピュータ
      127.0.0.1:13389 (sshポートフォワードの設定で入れた「リッスン」と「ローカルのポート」を「:」で繋いだもの)
    • ユーザ
      接続先Windows機のユーザアカウント名
    これで接続すると、通常のRDP接続と同様、パスワードを聞いてくるダイアログが出てくる。(証明書関連の警告も出てくると思うが、そちらは普段通りにOKしてくれればいい)
    また、ここで入力するパスワードは、操作用PC(クライアント)のパスワードではなく、接続先の(自宅内の)Windowsマシンのパスワードだ。

    この時のダイアログをよく見てみて欲しい。
    「これらの資格情報は、127.0.0.1(RDP接続先のIPとして指定したIP)への接続に使用されます。」となっているはずだ。
    このアドレスは、自分自身を示すアドレスのため、「遠隔のWindows機ではなく、自分自身へ接続しようとしている」ことになる。
    これが、ローカルポートフォワーディングの基本的な考え方だ。
    つまり「ローカル(自分自身)への接続を、他のマシンへ転送する」ということだ。
  4. リモートデスクトップ接続に成功する
    成功すれば、リモートデスクトップの画面が出てくるはずだ。

    これで普通に操作が可能だ。
    ウィンドウタイトル部分をよく見てみると、接続先が「127.0.0.1:13389」になっていると思う。これは、RDPクライアントとしては「127.0.0.1:13389」へ接続していると思い込んでいる、ということだ。実際には、sshがパケット転送をしてくれて、自宅内のWindows機へ接続している形になっている。
さてこれでRDP接続が出来るのが確認できた。
そこで、一体どのようなフローで接続できたのかを確認しておきたい。

簡単な図に書いてみたが、先にポートフォワードを有効にしてsshログインを行うことで、作業用PCとUbuntu Linuxの間でポート転送の設定が行われる。
その上で、RDP通信を行うと、上記図のようにRDP通信がsshのコネクション内を通って行く形になる。
そして、そのRDP通信を受けたsshd(sshサーバ)が、指定されたIP:ポートへパケットを転送する、という形だ。
TCP通信のため、当然戻りパケットも発生するが、これは同じ経路を通って流れていく。
ちょうど、sshで作成したコネクションをトンネルにして、他の通信(この場合RDP通信)が流れていくため、「sshトンネル」等と呼ばれている。

この図で記載したが、赤い線で示した区間は、sshによる暗号化通信が行われている。そのため、単純にパケットを読み取られても、それがRDP通信であることは分からない。(ssh暗号を解読して、初めてRDPであることが判明する。)
そのため、非常に強固で安全性の高いRDP通信を行うことが出来る。(当然、sshの暗号アルゴリズムは強固なものを使う前提だ)

更に、ブロードバンドルータ側には、RDPのための設定は一切行っていない。ポート転送はsshのみだ。

最初にsshによる認証が必要になり、こちらは既に公開鍵認証方式のみ利用できる設定にしているため、外部からのパスワード推測系の攻撃を受けても、突破されることは無い。

とまぁこのように、セキュリティレベルをある程度維持したまま、宅内のWindows機へRDP接続が出来るようになった。
以後は必要に応じて、このパターンでRDP接続しよう。

となると、普段電源を落としている or スリープモードにしている or ハイバネーション(休止状態にしている)Windowsマシンを、遠隔で電源入れられるようにしたい。Wake On LANだ。
次はWake On LANに挑戦したい。

今回は以上。

0 件のコメント:

コメントを投稿