テレワークでリモートデスクトップ!Windowsのリモートデスクトップは非常に危険??SSHのトンネリング技術を使ってセキュリティを高めてみた

先般、投資用自動運用プログラムを走り続けさせるために仮想サーバーでWindowsサーバーを契約した。
自前でネットワークなどを構成しているわけではないので、VPNがどうのこうのとか、何かの認証方式がどうのこうのとかができないことがわかってきた。
もちろん高価なクラウドサービスなどであればそういうことも可能だが、運用しているマシンの契約はVPSと言われる安価なサービスで細かいことはできないのだ。

そのうえで、この状態で何とかしたい…ということでいろいろ考えてみた。

今回利用しているサーバーはさくらのVPS for Windowsです。

ヘッドライン



安価にもかかわらずSSD採用で、サクサク動きます。(さすが、さくらという名前の企業です。さくさくです♪)
※2017年5月現在、Microsoftとのライセンス契約の上限に達したということでWindowsの新規受け付けは停止中です
↑2018年7月現在、販売を再開しておりますね!

安いサービスですから、提供企業にいろいろワガママな要求はできませんので、こちらでできるセキュリティ強化を試みます。

リモートデスクトップ接続に潜む危険

リモートデスクトップサービスというのは、簡単に言えば、遠隔地から接続先へ容易に接続ができ、そのWindowsの機能をリモート先から好きに使うことができるサービスです。
利用するには、接続先Windowsのユーザ名とパスワードを知る必要がありますが、逆に言えば知ってしまえばだれでも簡単にWindowsマシンに接続できてしまうサービスなのです。
なので、パスワード総当たりアタックを受けた日にはひとたまりもありません。

セキュリティ強化自体をリモートデスクトップでは簡単に設定できない。。。

SSL通信に載せることができるそうですが、それは、リモートデスクトップで接続した後の操作、要は通信内容を暗号化(どんな作業をしているのかなど)することであり、接続自体のセキュリティ強化につながることではありません。今回行いたいこととは趣旨がずれています。
どれだけ調べても、根本的にはパスワード認証なので、パスワードを1時間に1回変更するなどくらいの施策しか思いつかないのが現状です。

簡単にできるリモートデスクトップセキュリティ

とはいえ、まったくないわけではなく、Microsoft社も、以下のような前提がある場合に推奨しているようで、それらも相まって、デフォルトはリモート接続は無効になっています。
有効にする前に、セキュリティ確保してね?という意図が垣間見れます。
そのうえで、簡単にできるセキュリティ設定を紹介します。

IP接続制限

リモートデスクトップ接続してくる相手のIPアドレスを登録し、許可したIPアドレスからのみリモート接続を許可する方法。
最もポピュラーで、確実な設定の一つです。
ただし、そのような指定の方法ですから、もちろんIPアドレスは固定IPで持っている必要があります、コストをかけるという要求が高く、それは、結局高額支払いにつながります。
また、スマホでテザリングしたものでリモート接続。。。となってくるとなかなか厳しくなります。

もちろんIPブロック単位での許可というのは可能ですが。。。

IPブロック単位(192.168.1.1~192.168.1.255というような連続したIPをまとめて許可するようなやり方)での許可はもちろんできますが、それだけ穴が開くこと、また、会社、自宅、2つ目の営業所、スマホのテザリングなどを含めると結局何個も許可設定しなければいけなくなり、なかなかカンタンとはいいがたいものになってしまいそうです。

費用をかけることができる状態であるなら、固定IPを取得して、そこからしか繋げない!というポリシーで運用するのなら、シンプルでベストな選択でしょう。

VPN接続からのリモート接続

リモート接続(用のファイアウォール設定)には、ローカルIPからのみ受付、外部IPからの受付は拒否という設定を持っています。
なので、ローカルIPからの接続だけ許可をすれば、社内LAN内からのみ受付できるように設定できます。
(Windowsファイアウォールを使って設定します。)
そうなると、外部から接続した際も、そのLAN内のローカルIPが割り振られればいいわけですので、VPNを使うことで外部からでもローカルIPを振ってしまうことが可能です。
企業内LAN上にあるサーバーなどは、YAMAHAルータなどを導入しDDNS(YAMAHAの場合ネットボランチと言っています。)を使って、グローバルIPが変動するプロバイダでも、DDNSを利用して一意のホストを割り振って、接続アドレスを固定化して、そのホスト名をベースにVPN接続できるように設定することが多々あります。
それを利用して、VPN接続をしてからローカルIPでリモート接続というのは次善の策として、また最もよく使われるセキュリティ設定となります。

メジャーな2つのやり方が使えない場合は。。。

今回の私の要求は、

固定IPを取るとなると、会社、自宅に固定IPが2つは必要になり、かつ、出張時などはスマホのテザリングで通信を行うので、IP制限によるセキュリティ強化は自分が強化策に引っかかり接続できない面があるのでなかなか導入しにくいと感じました。
では、VPNは。。。というと、まずVPSサービスなので、手前にYAMAHAルータを導入するというわけにはいかない。。。さくらのクラウドならオプションでVPNオプションというのがあるらしく、簡単にVPNを導入できるそうだけど、VPSにはそのオプションはないそうです。。。
Windowsサーバーを借りているので、その中の機能としてVPNサーバーを構築するということも不可能ではないのですが、あまり詳しくない。。。複雑な設定はほかの追従者には難しくてできないだろう。。。という判断でVPNも採用しにくい。。。と思っていました。

再度整理!リモート接続の危険性とは?

ここで再度整理します。
リモートデスクトップ接続という機能の危険性は何かを端的に表すと、リモート接続の認証はユーザ名とパスワードによるログイン認証のみなので、パスワードが知られたら終わりであることです。

これがクリアされればいいわけですが、リモートデスクトップ接続自体にセキュリティ強化の機能を実装するのは素人では難しいということです。
そこで、一般的に行われるセキュリティ対策は、IP指定による接続者の制限、もしくはVPN接続による接続者の制限がよく使われるということでした。

ポイントは、接続者をパスワード認証以外のものによって制限がかけることができればどんなものを利用してもOK!ということでもあります。

Linuxの世界での認証によるセキュリティ事情は?

私が10年以上食っていくために商材としてきたLinuxの世界は、リモート接続が命綱です。
ホスティングサービスのサーバーは、少しでも回線環境のいいところに置くものなので、大手ハウジング(サーバーと回線を預かってくれる)会社に設置しおいておきます。
入局一つも膨大な書類を提出し入局するような場所ですから、ちょっと設定をいじるたびに入局。。。ということはなく、回線さえつながっていればリモート接続して作業するのがごくごく当たり前の世界です。
そんなLinuxで、セキュリティ強化は、重要です。
私がこの世界に入ったころは主流のリモート接続ツールの一つはtelnetでした。telnetは、リモートデスクトップ同様、パスワード認証が普通の接続ツールでした。
今私が直面しているリモートデスクトップ接続における危険と同じで、パスワード認証のみの認証方法なので、パスワードが破られれば、正当な接続としてアクセスし放題であるということです。
Linuxの世界ではそれらがスグに問題となり、telnetを使わなくなっていきました。その代わり出てきたのはSSHというリモート接続プロトコルです。
SSHというのはtelnet同様、遠隔地にあるLinuxサーバーにリモートログインを行い、遠隔地からLinuxを操作する(原則プロンプトベースですが)ツールです。telnetとの大きな違いは標準機能としてパスワード認証に関して様々な設定ができることで、そのうえで認証方法として鍵ペアの照合による認証方式というものがあります。

鍵認証とは?

鍵認証とは世の中にある鍵と錠前の関係と同じで、錠前と鍵を持ち、普段扉(ログイン前)に錠前を施錠しておき、簡単に扉を開かなくしておきます。(パスワードだけではダメな状態を作っておく。開けゴマ!では扉は開かない。)
そのうえで、この錠前に照合する鍵を持っている人だけが錠前を開錠することができ、結果扉を開けることができるのです。
SSHにおける鍵認証も同じで。Privatekeyを持つクライアントだけが設定してある公開鍵を開けることができる仕様を利用して認証することができます。
この鍵は復号するには現在のPCでは何カ月もかかる鍵長(鍵ファイルのデータが大きいので、偽造しようと思ってもコンピュータの能力的には膨大な時間がかかるファイルサイズで作られている)で作られるので、要は正規に作り出した鍵を持つ者だけがアクセスを許されるように設計できます。
さらに、この鍵には開錠前に開錠のためのパスワードも設定でき、要は、

  1. 錠前を開錠するための正規の鍵を持っている必要があり
  2. 尚且つ開錠する前に設定したパスワードも当てる必要がある

そしてさらに、rootで作業をしたい場合はrootのパスワードも必要になってくる

という、2段、3段階の認証を使うことができます。
もし自分が悪意のあるハッカーだった場合、ここまで設定しているマシンをアタックするより、面倒くさい。。。と、telnetやSSHでも鍵認証を設定しておらずパスワードのみのサーバーを探し出してアタックしたほうが早いと感じるでしょう。
そうやってセキュリティを高めることができるのがSSHというサービスです。

リモートデスクトップにも鍵認証があれば問題ないんですが。。。

そうなんです。鍵認証方式を採用してくれれば、自分だけが開錠用の鍵を持つことで、ある一定以上のセキュリティを高めることができる、SSHと同じレベルで安心はできるのですが残念なことに2017年5月現在はリモートデスクトップ接続のサービスに鍵認証設定は存在していません(少なくとも、一般的な設定では採用できないと考えています。いろいろ改造すれば使えるかもしれませんが。。。)

今起きている問題に似たものがあった!

今私が悩んでいるリモートデスクトップ接続がパスワード認証しかないというこの問題。。。
実はほとんど同じことが問題になり、最近どんどん使われなくなっていったものがあります。
それは、FTPです。

FTP接続のセキュリティ

FTP接続もリモートデスクトップやtelnet同様パスワード認証が一般的な通信プロトコルです。
だから、パスワードがばれれば、アップしてあるコンテンツダウンロードし放題。ウィルスファイルをアップロードし放題です。
FTPでアップロードする先の大半はホームページ用のスペースですから、最近はやりのフィッシング詐欺サイトに改ざんしたり、プログラムファイルを読み解いて個人情報を抜いたりすることが本当に容易にできてしまうわけす。
その危険性から、FTPサーバーをどうするか。。。は最近のサーバー管理者の悩みの一つではあります。

FTPサーバーのセキュリティ対策は

もちろんそうなってくるとセキュリティ対策というものを施す必要が出てきます。

IPアドレスによる接続制限という、先ほどからリモートデスクトップから来た制限やVPNによる制限、サイト管理者が使わない時はFTPサーバー自体をダウンさせておくなどの方法です。
あと、FTPサーバーなら.ftpaccessというファイルを作っておくことで接続制限をかけることもできます。
しかしながら、残念なことに、FTPもパスワード認証機能しか持っていないので根本的なセキュリティを高める方法は基本的にありません。

SFTPを使う

SFTPというのはSSHの接続を使ってFTPのようなことを行う機能です。
接続はSSH、接続後はそのSSH接続を使ってローカルPCと、サーバーでファイルの転送を行う技術です。
SSH自体はもともとファイルのやり取りをするコマンドを持っているのですが、SSHソフト自体でファイルのやり取りを行うツールがなかったのですが、最近のFTPソフトはSFTPに対応しているものも増えてきましたし、さらには鍵認証も設定できるソフトも出てきました。

結局鍵認証が現在のところ最も堅いセキュリティ設定の一つで、そこに合わせこむことでセキュリティレベルを高めているのです。

リモートデスクトップのセキュリティを極限まで高める1つの方法がある!

ここからが本題です。
前向までで説明してきたことをまず軽くまとめますと、

リモートデスクトップセキュリティは2つの方法で高めることができます。
一つは接続側・クライアント側のIPを固定化し、サーバー側(リモート接続したい方のマシン)のファイアウォールで、固定IP のみを接続許可するように設定する方法と、VPNを張りローカルIPのみリモート接続を許可する方法の2つが最もよく使われる方法としてありました。
しかし、サーバー側をレンタルサーバーなどで借りている場合、VPNを張るというのはいささか面倒くさいこと、固定IPの取得はコスト増につながることから一般利用の際に非常に選択しにくいセキュリティ設定です。

上記の2つの方法は確実に存在しますが、なかなか選択しにくい方法でした。

しかし、リモート接続を使えないと、レンタルサーバーのWindows サーバーなど、ほとんど怖くて使えない。。。そして、一度設定したら容易にセキュリティの高いサーバーを様々な場所からすきにつなげたい。
それらをすべて持ち合った方法がたった一つだけ思いつきました!
それは
SSH鍵認証接続を利用してセキュリティを高めたうえで、SSHクライアントの機能であるトンネル設定を利用してサーバーにSSH接続したものだけがリモート接続が可能になるという方法です!
難しい説明になってしまいましたが、要は、SSHでは鍵認証をつかえるので、SSHの設定を鍵認証のみで接続できる設定にして立ち上げておきます。
クライアント側からはSSHでまず鍵認証でwindows サーバーにログインします。その際に、SSHクライアント(接続側のソフト)で、トンネル設定というものを使って、SSH接続ログインした際に、クライアント側から、指定したポートに接続すると、サーバー側に指定したポートへトンネルを張るという設定ができます。
もう少しわかりやすく説明すると、

まず、windows サーバー側のリモート接続に関する設定はグローバルIPからの接続は原則受け付けないようにすることで、普通にリモート接続しようとしてもすべて拒否されるように設定しておきます。この時点でリモート接続は外部からアクションは不可になります。現状ではセキュリティ最強の設定です。
そのうえで、WindowsサーバーにSSHサーバーを建て、そのSSHは鍵認証のみ受け付けるよう設定を行い、接続ユーザを作り、そのユーザ用の鍵ペアを作ります。
PrivateKeyを自分が接続の際に利用するPCに落としてきて、SSH接続の際にその鍵を使って接続するようにしておきます。(接続テストで接続ができることを確認しておきます)
そのうえで、次に、クライアントPC側のSSHクライアントの設定でトンネル設定を行います(利用するSSHクライアントはトンネリング設定ができるものを準備してください。Puttyがおすすめです。LinuxのSSHでも利用できますし、鍵ペアを作ることもできるのでおススメです。)
トンネル設定で、ローカル側のポート(は、何でもいいので、3390とかにしておきます。)の設定とリモート先のポート(こちらはリモートデスクトップ接続の接続先ポートデフォルトなら3386)と設定します。そうしますと、SSH接続が認証されたばあい、ローカルPCの3390ポートにアクセスすると、SSH接続先の3386にトンネリングされる仕組みです。リモート接続のホスト名はlocalhost:3390で、その接続先に対してリモート接続を行うと、ローカル接続として転送されリモート先の3386ポートにデータが送られます。
SSHにてトンネルを掘った状態=少なくとも堀ったトンネルポート同士はローカル接続としてみなされる状態なので、ファイアウォールはスルーしてリモート接続できるのです。

もっと簡単に言えば、SSHの仕組みを利用して簡単でかつセキュリティ認証レベルを高めたVPNを張ったようなものです。

どのくらいセキュリティが高くなるか

これが重要なわけですが、SSHトンネルのみリモートで接続できるように設定をした場合、まず、

SSH接続をせずにリモート接続をしようとしてもまったく接続できません

これは、ファイアウォール的にはリモートデスクトップ接続に関する設定を全閉めできるから、ローカルIPでもSSH接続せずにリモート接続は不可という設定もできます。
レンタルしている場合、サーバー業者がリモートで覗きに来るかもしれないという不安もありますが、少なくともこの設定により、リモートデスクトップ機能で接続はできなくなるでしょう。(サーバー業者に関しては別の方法で接続する何かを持っている可能性はありますので、のぞかれる可能性は完全に排除できません)
そして、SSH接続するには設定をしっかり編集すれば鍵を持っていないとSSHで接続ができないように設定ができますので鍵を持っている人のみが接続できるようになります。
さらに、この鍵に、パスワード設定を行うことができますので、鍵+パスワード、ようは鍵を持っていてかつパスワードも符合させないといけないというレベルの高いセキュリティを要求できます。
このSSHで接続出来て、やっとリモート接続することができるトンネル設定が行えます。
さらにさらに、それプラスWindowsユーザのパスワードを知らなければトンネルを張っても認証が通らないという状態になります。
簡単に言えば認証は三重認証です。鍵・SSH鍵パスワード・リモートユーザパスワード、この3つすべての認証をクリアして初めて接続できるセキュアな設定ができます。

それもこれも、WindowsにSSHサーバーを容易に導入できるようになったから!

実はつい先般まで簡単にSSHサーバーをWindowsに導入できなかった(できるにはできましたが、ほかに不必要なモジュールやパッケージをたくさん入れなければいけなかったらしい)のですが、OpenSSHがWindows用のインストーラーパッケージを数年前に準備してくれました。
接続後はコマンドプロンプトで使えるコマンドでいろいろ操作はできますが、そこは自分は必要なく、SSHの鍵認証と、SSHクライアントのトンネル設定がLinux同様に使えることが大きいわけで。。。これによって最強レベルのセキュリティを費用を掛けずにできることがわかりました。
これで安心してFX用のWindowsマシンを借りて運用できるようになりました!

AndroidのアプリにSSHポートフォワーディング機能のみを提供するアプリがあります!

※2019年10月30日追記

これはすごいです。まさにこのポートフォワーディングのみを行ってくれるSSHクライアントアプリがAndroidにあります。
なにがすごいのか?というと、鍵をAndroidに入れておいて、接続設定を保存しておくと、接続を行うと、SSH鍵認証とポートフォワーディングだけを行ってくれるアプリなので、先述のlocalhost:3390ポートにリモートデスクトップ用のホールを作ってくれるアプリなのです。
と、いうことは、AndroidのWindowsリモートデスクトップ用のアプリを一緒に利用すればAndroidタブレットからWindowsへリモートデスクトップ接続をSSHを利用してセキュリティを高めたうえで利用可能になるということです!
私はこれを利用して、自前のPCもクラウド化してしまいました。
目の前で印刷というわけにはいかないですが、それ以外はすべてAndroidの安物タブレットを使ってリモートでWindowsマシンを使うという流れになりました。

コメント

SNSでもご購読できます。