−25%

Windows 按年付费,截至 10 月 31 日。 查看套餐

EQVPS
开始使用

如何在 Windows Server 2022 上安装 OpenSSH Server(密钥登录,PowerShell 作为 Shell)

在 Windows Server 2022 VPS 上安装内置的 OpenSSH Server,把 PowerShell 设为默认 Shell,以 Administrator 身份用密钥登录,并关闭密码登录。附带两个会导致密钥登录失败的 Windows 特有陷阱。

Windows Server 2022 把 OpenSSH Server 作为可选功能提供:不需要第三方安装程序,通过 Windows Update 更新。启用后,你可以通过 SSH 运行 PowerShell、用 scp 复制文件,并像对待任何 Linux 机器一样把脚本或 CI 指向这台服务器。

以下所有操作都是在我们的 Windows Server 2022 镜像上,通过 RDP 打开的管理员 PowerShell 中完成的(如何连接)。

先说网络。 在 NAT 的 Windows 套餐上,唯一的入站转发指向 RDP,所以无法从互联网访问 SSH。要从外部使用 SSH,需要带独立 IPv4 的套餐,例如 Windows Small-IP。端口可达时,下面的步骤大约需要五分钟。

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 设为默认 Shell

默认情况下,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 的第一个陷阱。对于 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. 关闭密码登录:第二个陷阱

最直观的修改 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 会话不关闭,从第二个终端测试。仅用密码尝试,现在应该得到:

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 说明)。四个套餐都在 Windows VPS 页面。想让程序在断开连接后继续运行,请看 在 Windows Server 上 24/7 运行脚本。

常见问题

已经有 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。因此密码相关设置使用 ChallengeResponseAuthentication,而不是较新的名称 KbdInteractiveAuthentication。

评论

暂无评论。来做第一个吧。

发表评论

评论在显示前会经过审核。