SSH を使用して安全に Windows にリモートデスクトップ接続を使用する
動作確認環境
- リモート接続先 Windows
-
- Windows 11
- リモート接続元 Windows
-
- Windows 10
- OpenSSH
-
- OpenSSH_for_Windows_8.1p1, LibreSSL 3.0.2
動作必須環境
- リモート接続先 Windows
-
- Windows 10 以降 (Pro などのエディションが必要)。ただし別途 OpenSSH を用意できる場合この限りではない。
- Windows Server 2019 以降。ただし別途 OpenSSH を用意できる場合この限りではない。
- リモート接続元 Windows
-
- Windows (大抵のバージョンは可能)
- Windows Server (大抵のバージョンは可能)
はじめに
クラウドや VPS などでインターネット上に Windows 環境を構築した後、リモート先の Windows を操作する際にリモートデスクトップ接続を使用することが多いと思います。
リモートデスクトップ接続では通信内容は暗号化されており、ユーザー名やパスワードが漏れていなければ勝手に他人にログインされることはないのですが、 どこからでもログインを試みられるという懸念は常に存在します。
大手のクラウドなどでは仮想マシンとは別にファイアウォールなどを設けているところがあり接続元を制限したりする機能があるのですが、 そういった機能はあらゆるサービスで使用できるとは限りません。 特に低予算で構築している環境などはそういった機能がないことが多いです。
そこで今回は SSH の機能を追加することによって接続元を極力制限するようにしてみたいと思います。 秘密鍵と公開鍵を使用しますので、秘密鍵が漏れさえしなければ他の環境からリモートでログインさせる可能性を極力小さくすることが出来ます。
今回 SSH の環境の構築には OpenSSH を使用します。
リモート先の Windows 環境を構築
インターネット上を経由してリモート接続できる Windows 環境を構築します。 インターネット上を経由するのであればどこに構築しても構いませんが、今回の検証では Microsoft Azure 上に仮想マシンとして構築します。 Azure 上での構築手順は今回の Tips には関係ないので省略します。 今回 22 番ポートを使用するので Azure を使用する場合は Azure 上の仮想マシンの設定で 22 番ポートの通信が通るようにしてください。
Azure 以外の環境で構築する場合は自身の環境に合わせて Windows にリモートデスクトップ接続できるところまで構築しておいてください。
また、Windows のバージョンについては OpenSSH 環境を簡単に構築できる Windows 10 以降、または Windows Server 2019 以降をターゲットとしています。 それ以前の環境でも実装可能なのですが、別途 OpenSSH をダウンロードしてきてセットアップする必要があるため多少手間は増えます。
その場合の手順については SFTP の時と同じなので以下の Tips を参考にしてください。
OpenSSH のセットアップ
ここからはリモート先の Windows 環境の作業になります。 まずはリモート先にリモートデスクトップ接続で接続してください。クラウドや VPS でコンソールが提供されている場合はそちらを使っても構いません。 今回 Windows 11 環境で操作するので他のバージョンでは少し手順が異なる場合があります。
スタートメニューを開き「設定」を選択します。
アプリを選択します。
「オプション機能」を選択します。
「機能を表示」を選択します。
一覧の少し下の方に「OpenSSH サーバー」があるのでチェックをつけて「次へ」をクリックします。
インストールをクリックします。
インストールが完了し下の一覧に「OpenSSH サーバー」が追加されたら完了です。
OpenSSH のサービス設定
スタートメニューを右クリックして「コンピューターの管理」を選択します。
左の一覧から「サービス」を選択します。
中央の一覧から「OpenSSH SSH Server」を探し、右クリックして「プロパティ」を選択します。
リモートで接続する際には OpenSSH サーバーは起動しておいてほしいので「スタートアップの種類」を「自動」にします。
現時点では起動していないので設定することも含めてここで起動しておきます。
起動したら OK ボタンをクリックして閉じてください。一覧では実行中になっているはずです。
OpenSSH の設定
初期状態では秘密鍵による認証は無効になっているので設定します。 エクスプローラーで以下のフォルダを開いてください。
- C:\ProgramData\ssh
ただし上記のフォルダは隠しフォルダになっている場合がありますのでエクスプローラーのオプションの設定などで見えるようにして下さい。
フォルダの中に sshd_config
というファイルがあるのでメモ帳などのテキストエディタで開いてください。
今回変更を加えるので、変更前のバックアップとして sshd_config_old
というようにコピーして複製しておいてください。
PubkeyAuthentication yes
を検索します。
この項目は秘密鍵認証を有効にするかどうかの設定となります。
デフォルトでは無効になっており yes
と書かれていますがコメントアウトになっているのでコメントを解除します。
変更前
#PubkeyAuthentication yes
変更後
PubkeyAuthentication yes
PasswordAuthentication yes
を検索します。
この項目はパスワード認証を有効にするかどうかの設定となります。
デフォルトでは有効になっており秘密鍵認証を有効にしてもこちらも有効なままだとセキュリティ的に意味がないのでコメントを解除して no
を設定します。
変更前
#PasswordAuthentication yes
変更後
PasswordAuthentication no
最後の方にある以下の行をコメントアウトします。 これは administrators グループの鍵設定であり、今回ユーザーごとのログインに対応させるので無効にしておきます。
変更前
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
変更後
#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
変更後ファイルを保存したら OpenSSH SSH Server
のサービスを再起動することにより設定が反映されます。
ポートを変更したい場合
SSH のポートを変更したい場合は以下の箇所を変更します。
変更前
#Port 22
変更後
#Port <任意の番号>
ポート番号を変更することにより、デフォルトのポートをアタックされなくなるのでよりセキュリティの強化につながりますが、 反面運用の複雑さが上がりますので注意が必要です。
ポート番号を変更した場合は接続時に 22 番以外のポートを指定する必要があります。
秘密鍵と公開鍵の作成
こちらはクライアント側の作業となります。ただ、実際にはどこの環境で作業をしても構いません。 ただし作成した秘密鍵が漏洩しないように注意してください。
Windows 10 以降, Windows Server 2019 以降なら標準で OpenSSH クライアントがインストールされているのでコマンドで簡単に作成することができます。 それ以外の環境では別途 OpenSSH クライアントをインストールするか別途ツールを使用する必要があります。
以下の Tips は SFTP 用ですが OpenSSH クライアントのセットアップについて書いてますので参考にしてください。
クライアント環境でコマンドプロンプト、PowerShell、ターミナル、なんでも良いのでコマンドを実行できるツールを起動してください。
ファイルを作成することになるので cd
コマンドなどで任意のディレクトリに移動します。
以下のコマンドを実行します。
ssh-keygen -t rsa -f id_rsa
鍵にはパスフレーズ(パスワード)を設定できるので必要であれば入れてください。 パスフレーズを設定した場合セキュリティは強化されますが後の工程でパスフレーズ入力の手間が増えます。
公開鍵 (id_rsa.pub) と秘密鍵 (id_rsa) が作成されました。
公開鍵 (id_rsa.pub) は後でリモート先に配置します。 秘密鍵についてはリモート元のクライアントのどこに配置しても構いませんが、セキュリティ上使用するアカウントのみがアクセスできるフォルダに配置する必要があります。 基本的にはクライアント側の以下のフォルダに配置しておけば問題ないと思います。 OpenSSH クライアントを使用する場合はデフォルトでこのフォルダを参照してくれます。
C:\Users\<ユーザー名>\.ssh
エクスプローラーで上記フォルダが作れない場合は以下のコマンドで作ることが出来ます。
cd C:\Users\<ユーザー名>
mkdir .ssh
公開鍵の配置
ここはリモート先の操作になります。
作成した公開鍵 (id_rsa.pub) をリモート先に配置します。
このファイルを以下のフォルダに移動してください。<ユーザー名>
の部分は実際にリモートで接続したときにログインするユーザーアカウント名になります。
C:\Users\<ユーザー名>\.ssh
フォルダがなくエクスプローラーでフォルダを作れない場合は以下のコマンドでフォルダを作成出来ます。
cd C:\Users\<ユーザー名>
mkdir .ssh
配置した公開鍵ファイルを authorized_keys
に変更してください。これで終わりです。
環境によってはすでに authorized_keys
ファイルがある場合があります。これは他の用途で SSH 接続の設定を行っている場合にそうなっていることがあります。
その場合は authorized_keys
ファイルと id_rsa.pub
ファイルをメモ帳などで開き、id_rsa.pub の内容を authorized_keys の次の行に記載することによって登録したことになります。
authorized_keys には複数の公開鍵を登録できるというわけです。
SSH で接続
OpenSSH コマンドで接続する場合
SSH で接続する方法はいろいろありますが、まずはコマンドベースで接続してみます。 実際一番手順が少ないのはコマンドによる接続になります。 前提として OpenSSH クライアントがインストールされている必要があります。
任意のコマンドツール (コマンドプロンプト、PowerShell、ターミナル) を起動してください。
以下のコマンドを入力します。
コマンド形式
ssh -i <秘密鍵ファイルパス> -L <ローカルの空いているポート>:127.0.0.1:3389 <接続先のユーザーアカウント名>@<接続先サーバーIPアドレス、またはホスト名>
以下、パラメータの説明になります。環境に合わせて設定してください。
パラメータ名 | 可変 | 説明 |
---|---|---|
ssh | OpenSSH で SSH を使用する宣言です。 | |
-i | 秘密鍵ファイルを使用する宣言です。 | |
<秘密鍵ファイルパス> | ● | 作成した秘密鍵ファイルの場所を記述します。C:\Users\<ユーザー名>\.ssh に配置している場合はパスは省略可能です。それ以外の場合は絶対パス、相対パスが必要です。 |
-L | リモート先に接続する際にローカルとリモートで使用するポートを指定する宣言です。 | |
<ローカルの空いているポート> | ● | 通常リモートデスクトップ接続は 3389 ポートを使用しますが、任意のポートを使用して接続できます。空いていれば何番でもいいです。 |
127.0.0.1 | リモート先がどこから接続されているかを認識するホストIPアドレスです。基本的には 127.0.0.1 でよいです。 | |
3389 | リモート先で使用するポート番号です。リモート先はリモートデスクトップ接続で普通に 3389 ポートで接続されるのでこのままでよいです。 | |
<接続先のユーザーアカウント名> | ● | リモート先でどのアカウントで接続するかを指定します。 |
<接続先サーバーIPアドレス、またはホスト名> | ● | リモート先のサーバーを指定します。 |
入力例
ssh -i id_rsa -L 13389:127.0.0.1:3389 TestUser@52.140.221.194
初回は鍵の確認が表示されるので yes
と入力して Enter キーを押します。
秘密鍵にパスフレーズを設定している場合は入力する必要があります。
以下は接続した状態になります。クライアントではなくサーバー側のユーザーが表示されていることが分かります。 このウィンドウを表示している間は接続中となっていますので閉じないようにしてください。閉じると接続は切れます。
PuTTY で接続する場合
ここでは PuTTY というツールで SSH 接続してみます。
秘密鍵の変換
まず PuTTY を使用する場合、秘密鍵の変換が必要になります。 付属ツールに「puttygen.exe」があると思いますので起動してください。
メニューから「Conversions -> Import key」を選択します。
作成した秘密鍵、ここでは「id_rsa」を選択します。
パスフレーズを設定している場合は入力します。
メニューから「File -> Save private key」を選択します。
「.ppk」ファイルとして保存します。
作成したら完了です。
PuTTY の設定
putty.exe を起動します。
接続先環境の IP アドレスを入力します。ドメインがあるならドメイン名でも接続可能です。
左のメニューから「Connection -> Data」を選択します。 「Auto-login username」に接続先環境のアカウント名を入力します。
左のメニューから「Connection -> SSH -> Tunnels」を選択します。 下の入力欄にそれぞれ入力して「Add」ボタンをクリックします。
パラメータ名 | 値 | 備考 |
---|---|---|
Source port | 13389 | 空いているポートならなんでも構いません。あとで使います |
Destination | 127.0.0.1:3389 |
追加すると以下のようになります。
次に左のメニューから「Connection -> SSH -> Auth -> Cledentioals」を選択し、「Private key file for authentication」の Browse ボタンをクリックします。
保存している秘密鍵を選択します。
左のメニューで「Session」を選択し、Save Sessions の名前を任意に入力して Save ボタンをクリックします。 次回以降はこの設定を読み込めばOKです。
保存を確認したら「Open」ボタンをクリックします。
初回の接続では以下のような画面が表示されます。Accept ボタンをクリックしてください。
コマンドプロンプトのような画面が表示されます。秘密鍵にパスフレーズを設定している場合は入力します。
以下のように表示内容が変われば接続した状態になります。クライアントではなくサーバー側のユーザーが表示されていることが分かります。 このウィンドウを表示している間は接続中となっていますので閉じないようにしてください。閉じると接続は切れます。
SSH でリモートデスクトップ接続を行う
では SSH で接続中の状態でリモートデスクトップ接続を行ってみましょう。
接続する際コンピューターの部分は実際にリモート先のアドレスではなく「localhost:<SSH 接続で指定したポート名>」になります。 例では 13389 を指定していたのでここでは「localhost:13389」に対して接続します。
認証画面が表示されれば接続できていると判断できます。ユーザー名とパスワードを入力して接続してください。
このように接続できれば成功です。
ファイアウォールの設定で通常のリモートデスクトップ接続を無効にする
前項目の時点で SSH を使用してリモートデスクトップで接続できるようになりました。 ですがこの状態では「通常のリモートデスクトップ接続」に「SSH によるリモートデスクトップ接続」を追加しただけですので、 セキュリティ的にはなんのプラスにもなっていません。 なので次に行うことは「通常のリモートデスクトップ接続」ができないようにすることです。
この設定を行うと「SSH によるリモートデスクトップ接続」以外では接続できなくなるので、設定などでヘタをするとリモートで接続する手段がなくなってしまう場合もあります。 なので必ず「SSH によるリモートデスクトップ接続」が可能なことを事前に確認しておき、万が一接続しようとしているクライアントがなくなっても別手段でリモート環境を操作できるようにしておいてください。
ここでは「SSH によるリモートデスクトップ接続」でファイアウォールの設定を行います。 「通常のリモートデスクトップ接続」で操作を行うとファイアウォールを設定した瞬間に切断されてしまうためです。
「セキュリティが強化された Windows Defender ファイアウォール」を表示します。Windows のバージョンによってどこから表示できるかはまちまちなのでそのバージョンに合わせて表示してください。
左のメニューから「受信の規則」を選択します。
中央の一覧から「リモート デスクトップ - ユーザーモード (TCP 受信)」を探しプロパティを開きます。
「スコープ」タブを選択し、ローカル IP アドレスを「これらの IP アドレス」に変更して「追加」ボタンをクリックします。
「127.0.0.1」と入力して OK ボタンをクリックします。これにより 127.0.0.1 以外からはリモートデスクトップで接続できなくなります。 127.0.0.1 というのは自分自身のマシンを指す IP アドレスです。間違った値を入れるとどこからも接続できなくなる可能性があるので注意してください。
OK ボタンをクリックして確定します。
一応これだけでも対策にはなっているのですが「リモート デスクトップ - ユーザー モード (UDP 受信)」も設定しましょう。
SSH 以外でリモート接続できないことを確認する
では SSH を使用していない別の PC からリモートデスクトップ接続を行ってみてください。
接続できる状態なら認証画面が表示されます。 以下のように接続できないことを確認できれば OK です。
まとめ
最新の Windows では手軽に SSH サーバーを導入できるようになったため、 設定を追加することによりリモートデスクトップ接続のセキュリティも手軽に高められるようになりました。 ただあくまでも Windows 本体でセキュリティ対策を担っていることになりますので、 より安全にしたい場合は Windows に接続する経路の前に別途 SSH サーバーやファイアウォールなどを設定するのが好ましいかと思います。
また SSH を使ってガチガチにセキュリティを設定出来ますが、固めすぎた際に運用のミスによってだれも接続できなくなってしまった、 なんてことにはならないように注意してください。