−25%

Windows 年払い、10月31日まで。 プランを見る

EQVPS
始める

Windows Server 2022 に OpenSSH Server を入れる方法(鍵ログイン、PowerShell をシェルに)

Windows Server 2022 VPS に組み込みの OpenSSH Server をインストールし、PowerShell を既定のシェルにして、Administrator として鍵でログインし、パスワードログインを無効にします。鍵ログインが失敗する Windows 特有の 2 つの落とし穴も解説。

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 時間動かす方法をご覧ください。

よくある質問

RDP があるのに、なぜ Windows で SSH を使うのですか?

スクリプトやツールは SSH で話します。サーバーに OpenSSH があれば、Linux マシンや CI ジョブから PowerShell のコマンドを実行し、scp でファイルをコピーし、デスクトップセッションなしで自動化にサーバーを管理させられます。

鍵が通常ユーザーでは使えるのに Administrator では使えません。なぜですか?

Administrators グループのメンバーについては、Windows の OpenSSH は ~/.ssh/authorized_keys を無視し、C:\ProgramData\ssh\administrators_authorized_keys を読みます。このファイルに書き込めるのが Administrators と SYSTEM だけでないと、sshd は黙って読み飛ばします。

NAT の Windows プランで SSH に接続できますか?

外部からはできません。NAT の Windows プランでは専用の外部ポートが RDP(3389)に転送されており、それが唯一の受信転送です。インターネットから SSH を使うなら、専用 IPv4 付きの Windows プランを選んでください。サーバー内部では、ローカルツール用に OpenSSH はそのまま使えます。

Windows Server 2022 が入れる OpenSSH のバージョンは?

OpenSSH 8.1p1 for Windows です。そのため、パスワード関連の設定には新しい名前の KbdInteractiveAuthentication ではなく ChallengeResponseAuthentication を使います。

コメント

まだコメントはありません。最初になりましょう。

コメントを残す

コメントは表示される前にモデレートされます。