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.
Comentários
Nenhum comentário ainda. Seja o primeiro.