こんにちは、インフラ担当のちぇんです。
今回は自宅の仮想 Windows を SSH ポートフォワードを使ってリモートデスクトップで呼び出します。
もともと自宅に L2TP で VPN を張っているのですが、 いずれは外部に「自宅に接続する用拠点」を用意し自宅へは直接アクセスできないようにするための布石として SSH ポートフォワードを試してみました。
準備
今回の環境は以下となります。
リモート端末:
端末 | ThinkPad X250 |
OS | Windows10 Pro 1909 |
ユーザ | root |
サーバ端末:
端末 | ESXi 6.7.0 Update 3 内の仮想マシン |
OS | Windows10 Pro 1909 |
ユーザ | developer |
IPアドレス | 192.168.1.100 |
シェル: PowerShell 7.1.0
作業の流れをおおまかに以下となります。
リモートされる側で SSH サーバを立てる
↓
リモートする側で接続するための設定をする
↓
接続確認
↓
セキュリティ強化
構成イメージ
サーバ側作業
SSH 用ユーザ作成
まず SSH 接続用の専用ユーザを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
PS C:\Users\Developer> New-LocalUser -Name sshuser -Password sshp@ss New-LocalUser: Cannot bind parameter 'Password'. Cannot convert the "sshp@ss" value of type "System.String" to type "System.Security.SecureString". PS C:\Users\Developer> New-LocalUser -Name sshuser -Password (ConvertTo-SecureString "sshp@ss" -AsplainText -Force) Name Enabled Description ---- ------- ----------- sshuser True PS C:\Users\Developer> Add-LocalGroupMember -Group "Administrators" -Menber "sshuser" Add-LocalGroupMember: A parameter cannot be found that matches parameter name 'Menber'. PS C:\Users\Developer> Add-LocalGroupMember -Group "Administrators" -Member "sshuser" PS C:\Users\Developer> Get-LocalGroupMember -Group "Administrators" ObjectClass Name PrincipalSource ----------- ---- --------------- User WIN10-DEVELOPER\Administrator Local User WIN10-DEVELOPER\root Local User WIN10-DEVELOPER\sshuser Local User WIN10-DEVELOPER\tanaka Local PS C:\Users\Developer> |
OpenSSH 状況確認
クライアントはインストールされてますが、サーバはインストールされてませんでした。
1 2 3 4 5 6 7 8 9 10 11 12 |
PS C:\Users\Developer> Get-windowsCapability -Online | ? Name -like 'OpenSSH*' Name : OpenSSH.Client~~~~0.0.1.0 State : Installed Name : OpenSSH.Server~~~~0.0.1.0 State : NotPresent PS C:\Users\Developer> |
OpenSSH.Server インストール
OpenSSH は Windows のオンデマンドを利用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
PS C:\Users\Developer> Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 Path : Online : True RestartNeeded : False PS C:\Users\Developer> Get-WindowsCapability -Online | ? Name -like 'OpenSSH*' Name : OpenSSH.Client~~~~0.0.1.0 State : Installed Name : OpenSSH.Server~~~~0.0.1.0 State : Installed PS C:\Users\Developer> |
SSH サーバ準備
SSH サーバ起動
1 |
PS C:\User\Developer> Start-Service sshd |
Windows 起動時に SSH サーバ自動起動
1 |
PS C:\User\Developer> Set-Service -Name sshd -StartupType 'Automatic' |
ファイアウォールの SSH 許可確認
1 |
PS C:\User\Developer> Get-NetFirewallRule -Name *ssh* |
クライアント側作業
ssh での接続確認
1 2 3 4 5 6 7 8 9 10 11 12 |
PS C:\Users\root> ssh sshuser@192.168.1.100 The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established. ECDSA key fingerprint is SHA256:SIZXxXm4zcsxZjdx4EEwbmBAjPcTXumNLa4u0ZG2/oI. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.1.100' (ECDSA) to the list of known hosts. sshuser@192.168.1.100's password: Microsoft Windows [Version 10.0.18363.1016] (c) 2019 Microsoft Corporation. All rights reserved. sshuser@WIN10-DEVELOPER C:\Users\sshuser>exit Connection to 192.168.1.100 closed. PS C:\Users\root> |
SSH トンネル設定
使用しているターミナルが MobaXterm なので一例として載せます。
接続名 | 設定内容 |
VM-Developer | パスワード認証用のトンネル設定 |
key_VM-Developer | 公開鍵認証用のトンネル設定 |
パスワード認証で接続確認
接続設定をしたら、あっさり接続できました。
セキュリティ強化
RDP 接続をローカルホストからしか許可しない設定にすることで以下の効果を期待します。
・同じローカルエリア内でも、直接 RDP 接続はできなくなる。
・ RDP サーバと同一端末の SSH サーバ を踏み台にすることで SSH サーバ経由時のみ RDP接続が可能となる。
Windows Defender 設定
リモートデスクトップの以下 3 項目に対して 接続許可を制限する設定をします。
接続を許可するリモート IP アドレス | 127.0.0.1 |
ちなみに直接 RDP 接続している場合、この設定が完了したと同時に RDP 接続が切断されてしまいます。
同一端末の SSH サーバ経由で再度接続することになります。
これで直接 RDP 接続は接続不可となります。
接続する際は SSH 接続後、RDP の設定で Forward port を指定すると転送され接続できます。
公開鍵認証設定
すでに SSH で接続しないと RDP での接続が出来ませんが、パスワードで接続できてしまうため、鍵認証に変更します。
クライアント側で公開鍵を作成し scp でサーバに設置します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
PS C:\Users\root> Set-Location -Path .ssh PS C:\Users\root\.ssh> ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (C:\Users\root/.ssh/id_rsa): ssh_key Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in ssh_key. Your public key has been saved in ssh_key.pub. The key fingerprint is: SHA256:NFluPk5BRhuH0AKJVI3gI+bzWP9e6PCB8z6YCxJG+uU root@win10-root The key's randomart image is: +---[RSA 2048]----+ | .o+o=.+*.. | | .. o o*o+ | | + o +.= | | = . . . + . | |. = o S + | | o O . . + . | | + E =oo o | | . .oB.o | | .+B. | +----[SHA256]-----+ PS C:\Users\root\.ssh> Get-ChildItem Directory: C:\Users\root\.ssh Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2020/11/12 17:03 176 known_hosts -a--- 2020/11/13 11:49 1766 ssh_key -a--- 2020/11/13 11:49 398 ssh_key.pub PS C:\Users\root\.ssh> scp ssh_key.pub sshuser@192.168.1.100:C:\Users\sshuser\.ssh\authorized_keys sshuser@192.168.1.100's password: ssh_key.pub 100% 398 0.4KB/s 00:00 PS C:\Users\root\.ssh> |
サーバ側では sshd のコンフィグ C:\ProgramData\ssh\sshd_config を修正します。
1 2 3 4 5 6 7 8 |
# 公開鍵認証を有効にします。 PubkeyAuthentication yes # パスワード認証を無効にします。 PasswordAuthentication no # 公開鍵の場所は ユーザ\.ssh\authorized_keys がデフォルトの為、以下はコメントアウトします。 # AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys |
sshd を再起動することで設定が反映されます。
SSH 接続がパスワードでは接続できず、公開鍵では接続できるようになりました。
まとめ
今回は SSH 鍵認証でかなりてこずりました。
内容は公開鍵を登録するユーザーを間違えていただけなんですが・・・
公開鍵を developer に登録してました・・・
SSH 接続先のユーザ | sshuser |
リモートデスクトップでログインするユーザ | developer |
解決してしまうと「なんだよ!こんな事かよ!!」と思ってしまうことってありますよね。。。精進します。。。
よかった点
・リモートデスクトップのアクセスに対して、セキュリティがかなり強化された気がします。
・ネットワークの論理的な構成について勉強になりました。
・あえて極力 PowerShell のコマンドを調べて取り組んだのでちょっとスキルの幅が拡がった気がします。
微妙な点
・まだ自宅に VPN を張り、その中で SSH を張っているので恩恵をあまり感じてません。
今後の課題
・VPNを張るにしてもクラウドにサーバを建て、L2TP の接続先 IPアドレスをクラウドの IP アドレスにする。
・上記により L2TP 前の IPSEC 接続時に自宅のグローバル IP が抜かれるリスクを回避する。
これからもいろいろ試して記事に使用と思います。よろしくお願いします。
お疲れ様でした。