−25%

no Windows com pagamento anual, até 31/10. Ver planos

EQVPS
Começar

Como instalar o OpenSSH Server no Windows Server 2022 (login por chave, shell PowerShell)

Instale o OpenSSH Server integrado num VPS com Windows Server 2022, deixe o PowerShell como shell padrão, entre por chave como Administrator e desligue o login por senha. Com as duas armadilhas do Windows que fazem o login por chave falhar.

O Windows Server 2022 traz o OpenSSH Server como recurso opcional: sem instalador de terceiros e com atualização pelo Windows Update. Com ele ativo, você roda PowerShell por SSH, copia arquivos com scp e aponta scripts ou CI para o servidor como para qualquer máquina Linux.

Tudo abaixo foi feito na nossa imagem de Windows Server 2022, num PowerShell elevado via RDP (como se conectar).

Primeiro, a rede. Num plano Windows com NAT, o único redirecionamento de entrada vai para o RDP, então o SSH não é acessível pela internet. Para SSH de fora você precisa de um plano com IPv4 próprio, como o Windows Small-IP. Com a porta acessível, os passos levam uns cinco minutos.

1. Instale o OpenSSH Server

Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

O cliente já vem instalado; o servidor aparece como NotPresent até você adicioná-lo. No nosso servidor a instalação levou 28 segundos.

2. Inicie e faça iniciar com o sistema

Start-Service sshd
Set-Service -Name sshd -StartupType Automatic
Get-NetFirewallRule -Name *OpenSSH*

Instalar o recurso cria a regra de firewall OpenSSH-Server-In-TCP (porta 22, entrada, permitida), então você não precisa criar uma.

3. Deixe o PowerShell como shell padrão

Por padrão, uma sessão SSH cai no cmd.exe. Troque para PowerShell:

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force

Novas conexões recebem o PowerShell 5.1 na hora; não é preciso reiniciar.

4. Adicione sua chave para Administrator: o arquivo que pega todo mundo

Esta é a primeira armadilha do Windows. Para contas do grupo Administrators, o sshd não lê C:\Users\<name>\.ssh\authorized_keys. Ele lê um arquivo compartilhado, C:\ProgramData\ssh\administrators_authorized_keys, e só se ninguém além de Administrators e SYSTEM puder gravar nele:

$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"

O -Encoding ascii também importa. No nosso teste, a mesma chave salva com Out-File (UTF-16, o padrão do PowerShell 5.1) foi recusada com Permission denied (publickey). Da sua máquina:

ssh Administrator@YOUR.SERVER.IP

Você deve receber um prompt do PowerShell sem senha. Para usuários que não são administradores, o habitual C:\Users\<name>\.ssh\authorized_keys funciona.

5. Desligue o login por senha: a segunda armadilha

A alteração óbvia, PasswordAuthentication no, não basta nesta versão. O OpenSSH 8.1 continua oferecendo keyboard-interactive, que pede a mesma senha do Windows. No nosso teste, um login sem chave continuava mostrando keyboard-interactive até desligarmos isso também. E a opção precisa vir antes do bloco Match Group administrators no fim do arquivo; senão vale só para administradores. Isto coloca as duas linhas no topo:

$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

Mantenha sua sessão SSH atual aberta e teste de um segundo terminal. Uma tentativa só com senha agora deve receber:

Permission denied (publickey).

Foi o resultado no nosso teste tanto para Administrator quanto para um usuário comum, enquanto o login por chave continuou funcionando.

O que dá para fazer com isso

  • Rodar um comando de qualquer lugar: ssh Administrator@IP 'Get-Service sshd'.
  • Copiar arquivos: scp .\app.zip Administrator@IP:C:/apps/.
  • Restringir a porta ao seu endereço, do mesmo jeito que no RDP: Set-NetFirewallRule -Name OpenSSH-Server-In-TCP -RemoteAddress 203.0.113.10.

Qual plano

SSH de fora precisa de um IPv4 público: o Windows Small-IP (4 vCPU, 4 GB, 50 GB) custa $28/mês e o Windows Medium-IP (6 vCPU, 6 GB) $36/mês. O Windows é Server 2022 com a sua própria licença (BYOL explicado). Os quatro planos estão na página Windows VPS. Para manter um programa rodando depois de desconectar, veja rodar um script 24/7 no Windows Server.

Perguntas frequentes

Para que SSH no Windows se já existe RDP?

Scripts e ferramentas falam SSH. Com o OpenSSH no servidor você roda comandos PowerShell de uma máquina Linux ou de um job de CI, copia arquivos com scp e deixa a automação cuidar do servidor sem sessão de área de trabalho.

Minha chave funciona para um usuário comum, mas não para Administrator. Por quê?

Para membros do grupo Administrators, o OpenSSH do Windows ignora ~/.ssh/authorized_keys e lê C:\ProgramData\ssh\administrators_authorized_keys. Esse arquivo só pode ser gravável por Administrators e SYSTEM; caso contrário, o sshd o ignora sem avisar.

Consigo acessar o SSH num plano Windows com NAT?

De fora, não. Num plano Windows com NAT a porta externa pessoal é redirecionada para o RDP (3389), e esse é o único redirecionamento de entrada. Para SSH pela internet, escolha um plano Windows com IPv4 próprio. Dentro do servidor, o OpenSSH continua funcionando para ferramentas locais.

Que versão do OpenSSH o Windows Server 2022 instala?

OpenSSH 8.1p1 for Windows. Por isso as opções de senha usam ChallengeResponseAuthentication, e não o nome mais novo KbdInteractiveAuthentication.

Comentários

Nenhum comentário ainda. Seja o primeiro.

Deixe um comentário

Os comentários são moderados antes de aparecerem.