Lo más deprimente para mí es conectarme a los hosts de Windows. No soy un oponente o un fanático de Microsoft y sus productos. Cada producto tiene su propio propósito. Pero es realmente doloroso para mí conectarme a los servidores de Windows, debido a 2 puntos: es difícil de configurar (Hola WinRM con HTTPS) y es realmente inestable (Hola RDP para máquinas virtuales a través del océano).
Afortunadamente, encontré el proyecto
Win32-OpenSSH . Me di cuenta de que quiero compartir mi experiencia con él. Creo que ayudará a alguien y ahorrará muchos nervios.

Formas de instalación:
- Manualmente
- Vía paquete Chocolatey
- Vía Ansible, digamos el papel jborean93.win_openssh
Explicaré la forma manual porque otras son obvias.
Debo señalar que este proyecto está en etapa beta y no se recomienda usarlo en producción.
Bueno, descarguemos la última versión. Actualmente es
7.9.0.0p1-beta . También tiene versiones de 32 y 64 bits.
Luego descomprímalo en
C: \ Archivos de programa \ OpenSSH .
Importante: Es necesario otorgar acceso de escritura al
SISTEMA y al grupo Administradores solamente.
Además, instale servicios a través de la secuencia de comandos de
instalación install-sshd.ps1 que se encuentra en el directorio OpenSSH
powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
Permitamos conexiones entrantes en el puerto 22:
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
Nota: el applet
New-NetFirewallRule es solo para Windows Server 2012 y superior. Para sistemas operativos más antiguos o de escritorio, puede usar el siguiente comando:
netsh advfirewall firewall add rule name=sshd dir=in action=allow protocol=TCP localport=22
Comience el servicio:
net start sshd
Esto generará automáticamente claves de host en
% programdata% \ ssh si aún no existen.
Puede configurar el inicio automático del servicio mediante el comando:
Set-Service sshd -StartupType Automatic
Además, puede cambiar el shell predeterminado (es
cmd por defecto después de la instalación):
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
Nota: debe definir la ruta absoluta.
Que sigue
Podemos configurar
sshd_config , que se encuentra en
C: \ ProgramData \ ssh .
Por ejemplo:
PasswordAuthentication no PubkeyAuthentication yes
Luego creamos el directorio
.ssh dentro del directorio del usuario (
C: \ Users \ <user_directory> ) y el archivo
autorizado_keys dentro de él. Podemos pegar claves públicas en este archivo.
Importante: el único usuario en qué directorio se encuentra debe tener permisos de escritura para este archivo.
Por cierto, si no puede solucionarlo, puede desactivar la verificación de permisos a través de config:
StrictModes no
Además, el directorio
C: \ Archivos de programa \ OpenSSH contiene 2 scripts (
FixHostFilePermissions.ps1 ,
FixUserFilePermissions.ps1 ), que no deben
obligar a corregir los permisos, incluidos
los permisos de
claves autorizadas , pero no lo hacen.
No olvide reiniciar el servicio
sshd para aplicar los cambios.
ru-mbp-666:infrastructure$ ssh Administrator@192.168.1.10 -i ~/.ssh/id_rsa Windows PowerShell Copyright (C) 2016 Microsoft Corporation. All rights reserved. PS C:\Users\Administrator> Get-Host Name : ConsoleHost Version : 5.1.14393.2791 InstanceId : 653210bd-6f58-445e-80a0-66f66666f6f6 UI : System.Management.Automation.Internal.Host.InternalHostUserInterface CurrentCulture : en-US CurrentUICulture : en-US PrivateData : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy DebuggerEnabled : True IsRunspacePushed : False Runspace : System.Management.Automation.Runspaces.LocalRunspace PS C:\Users\Administrator>
Pros / contras personales.
Pros:
- Manera estándar de conectarse a cualquier servidor (Windows / Linux)
Cuando tiene algunos hosts de Windows, es inconveniente:
Entonces, aquí vamos por ssh, pero aquí por RDP,
y, en general, es la mejor práctica con bastiones, primero ssh-tunnel, luego RDP a través del túnel. Oh, mátame bebé una vez más. - Fácil de configurar
Creo que es obvio. - Velocidad de conexión al host remoto
Sin GUI, ahorramos recursos del host y el tamaño de los datos transmitidos
Contras:
- No puede reemplazar RDP en algunos casos.
No todas las cosas que puedes hacer a través de PowerShell. Me refiero a los casos en que se requiere GUI.
Enlaces:
Proyecto en githubDocumentos Ansible