Windows Server 2022 には、OpenSSH Server がオプション機能として含まれています。サードパーティのインストーラーは不要で、更新は Windows Update 経由です。有効にすれば、SSH で PowerShell を実行し、scp でファイルをコピーし、スクリプトや CI を他の Linux マシンと同じようにサーバーへ向けられます。
以下はすべて、当社の Windows Server 2022 イメージで、RDP 経由の管理者権限 PowerShell から実行しました(接続方法)。
まずネットワークについて。 NAT の Windows プランでは唯一の受信転送が RDP 向けなので、インターネットから SSH には届きません。外部から SSH を使うには、Windows Small-IP のような専用 IPv4 付きのプランが必要です。ポートに届く状態なら、以下の手順は 5 分ほどで終わります。
1. OpenSSH Server をインストールする
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
クライアントはすでに入っています。サーバーは追加するまで NotPresent と表示されます。当社のサーバーではインストールに 28 秒かかりました。
2. 起動し、ブート時に自動で起動させる
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic
Get-NetFirewallRule -Name *OpenSSH*
この機能をインストールすると、ファイアウォールルール OpenSSH-Server-In-TCP(ポート 22、受信、許可)が作られるので、自分で追加する必要はありません。
3. PowerShell を既定のシェルにする
既定では SSH セッションは cmd.exe で開きます。PowerShell に切り替えます。
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
新しい接続ではすぐに PowerShell 5.1 になります。再起動は不要です。
4. Administrator の鍵:誰もがつまずくファイル
これが Windows 特有の 1 つ目の落とし穴です。Administrators グループのアカウントについて、sshd は C:\Users\<name>\.ssh\authorized_keys を読みません。共有ファイル C:\ProgramData\ssh\administrators_authorized_keys を読み、しかも Administrators と SYSTEM 以外が書き込めない場合に限ります。
$pub = 'ssh-ed25519 AAAA...your-public-key... you@laptop'
Set-Content -Path C:\ProgramData\ssh\administrators_authorized_keys -Value $pub -Encoding ascii
icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
-Encoding ascii も重要です。私たちのテストでは、同じ鍵を Out-File(UTF-16、PowerShell 5.1 の既定)で保存すると Permission denied (publickey) で拒否されました。手元のマシンから:
ssh Administrator@YOUR.SERVER.IP
パスワードなしで PowerShell のプロンプトが出れば成功です。管理者でないユーザーには、通常の C:\Users\<name>\.ssh\authorized_keys が使えます。
5. パスワードログインを無効にする:2 つ目の落とし穴
分かりやすい変更の PasswordAuthentication no だけでは、このバージョンでは不十分です。OpenSSH 8.1 は引き続き keyboard-interactive を提示し、同じ Windows パスワードを尋ねます。私たちのテストでも、それも無効にするまでは、鍵なしのログインで keyboard-interactive が表示され続けました。さらに、この設定はファイル末尾の Match Group administrators ブロックより前に置く必要があります。そうしないと管理者にしか適用されません。次のコマンドで両方の行を先頭に置きます。
$cfg = 'C:\ProgramData\ssh\sshd_config'
$lines = Get-Content $cfg | Where-Object { $_ -notmatch '^#?\s*(PasswordAuthentication|KbdInteractiveAuthentication|ChallengeResponseAuthentication)\s' }
Set-Content $cfg -Value (@('PasswordAuthentication no', 'ChallengeResponseAuthentication no') + $lines) -Encoding ascii
Restart-Service sshd
現在の SSH セッションは開いたまま、2 つ目のターミナルから試してください。パスワードだけで試すと、次のようになるはずです。
Permission denied (publickey).
私たちのテストでは Administrator でも通常ユーザーでもこの結果になり、鍵でのログインは引き続き使えました。
これでできること
- どこからでもコマンドを実行:
ssh Administrator@IP 'Get-Service sshd'。 - ファイルをコピー:
scp .\app.zip Administrator@IP:C:/apps/。 - RDP と同じ方法でポートを自分のアドレスに限定:
Set-NetFirewallRule -Name OpenSSH-Server-In-TCP -RemoteAddress 203.0.113.10。
どのプランを選ぶか
外部からの SSH にはグローバル IPv4 が必要です。Windows Small-IP(4 vCPU、4 GB、50 GB)は月 $28、Windows Medium-IP(6 vCPU、6 GB)は月 $36 です。Windows はあなた自身のライセンスで使う Server 2022 です(BYOL の解説)。4 つのプランはすべて Windows VPS のページにあります。切断後もプログラムを動かし続けるには、Windows Server でスクリプトを 24 時間動かす方法をご覧ください。
コメント
まだコメントはありません。最初になりましょう。