Aprenda a configurar y usar la comunicación remota SSH de PowerShell

Cuando Microsoft dijo que PowerShell se convertiría en un proyecto de código abierto que se ejecutaría en Windows, Linux y macOS en agosto de 2016, hubo una arruga interesante relacionada con la comunicación remota de PowerShell.

Microsoft dijo que este núcleo de PowerShell soportaría la comunicación remota a través de Secure Shell (SSH), así como la Administración de Servicios Web (WS-MAN). Siempre puede usar los binarios SSH de PowerShell, pero el anuncio indica que la compatibilidad con SSH sería una parte integral de PowerShell. Esto abrió la posibilidad de realizar la administración remota de sistemas Windows y Linux fácilmente utilizando las mismas tecnologías.

Breve historial de la comunicación remota de PowerShell

Microsoft introdujo la comunicación remota en la versión 2.0 de PowerShell en Windows 7 y Windows Server 2008 R2, lo que cambió drásticamente el panorama de los administradores de Windows. Podían crear sesiones de escritorio remoto en servidores, pero la comunicación remota de PowerShell permitía administrar un gran número de servidores simultáneamente.

La comunicación remota en Windows PowerShell se basa en WS-MAN, un estándar abierto del Grupo de Tareas de Administración distribuida. Pero debido a que la comunicación remota basada en WS-MAN está orientada a Windows, necesitaba usar otra tecnología, generalmente SSH, para administrar sistemas Linux.

Presentamos SSH en PowerShell Core

Nos hemos acostumbrado a instalar software en Windows utilizando los asistentes, pero la instalación de OpenSSH requiere más información de fondo y más trabajo del administrador.

SSH es un protocolo para administrar sistemas a través de una red posiblemente no segura. SSH funciona en modo cliente-servidor y es el estándar de facto para la administración remota en entornos Linux.

PowerShell Core utiliza OpenSSH, una bifurcación de SSH 1.2.12 que se publicó bajo una licencia de código abierto. OpenSSH es probablemente la implementación SSH más popular.

El código necesario para usar la comunicación remota WS-MAN se instala como parte del sistema operativo Windows. Necesita instalar OpenSSH manualmente.

Instalación de OpenSSH

Nos hemos acostumbrado a instalar software en Windows utilizando los asistentes, pero la instalación de OpenSSH requiere más información de fondo y más trabajo del administrador. Sin alguna intervención manual, pueden surgir muchos problemas.

El proceso de instalación de OpenSSH en Windows ha mejorado con el tiempo, pero aún no es tan fácil como debería ser. Trabajar con el archivo de configuración deja mucho que desear.

Hay dos opciones al instalar PowerShell SSH:

  1. En Windows 10 1809, Windows Server 1809, Windows Server 2019 y versiones posteriores, OpenSSH está disponible como característica opcional.
  2. En versiones anteriores de Windows, puedes descargar e instalar OpenSSH desde GitHub.

Asegúrese de que su sistema tenga los parches más recientes antes de instalar OpenSSH.

Instalación de la función opcional de OpenSSH

Puede instalar la función opcional de OpenSSH con PowerShell. Primero, compruebe su sistema con el siguiente comando:

Get-WindowsCapability -Online | where Name -like '*SSH*'
OpenSSH componentes
Figura 1. Encuentre los componentes OpenSSH en su sistema.

La figura 1 muestra que el software cliente OpenSSH está preinstalado.

Necesitará usar Windows PowerShell para la instalación a menos que descargue el módulo WindowsCompatibility para PowerShell Core. A continuación, puede importar el módulo de Administración y mantenimiento de imágenes de implementación desde Windows PowerShell y ejecutar los comandos en PowerShell Core.

Instale la función de servidor:

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Path :
Online : True
RestartNeeded : False

Los archivos SSH se instalan en el C:\Windows\System32\OpenSSH carpeta.

Descargar OpenSSH de GitHub

Comience descargando la última versión de GitHub. La última versión de las instrucciones de instalación se encuentra en este enlace.

Una vez finalizada la descarga, extraiga el archivo zip en el C:\Program Carpeta Files\OpenSSH. Cambiar ubicación a C:\Program Archivos\OpenSSH para instalar los servicios SSH:

.\install-sshd.ps1
SetServiceObjectSecurity SUCCESS
ChangeServiceConfig2 SUCCESS
ChangeServiceConfig2 SUCCESS

Configurar OpenSSH

Después de instalar OpenSSH, realice algunos pasos de configuración adicionales.

Asegúrese de que la carpeta OpenSSH esté incluida en la variable de entorno de ruta del sistema:

  • C:\Windows\System32\OpenSSH\ si está instalado como la función opcional de Windows
  • C:\Program Files \ OpenSSH \ si se instala a través de la descarga de OpenSSH

Configure los dos servicios para que se inicien automáticamente:

Set-Service sshd -StartupType Automatic
Set-Service ssh-agent -StartupType Automatic

Si instaló OpenSSH con la función opcional, Windows crea una nueva regla de firewall para permitir el acceso entrante de SSH a través del puerto 22. Si instaló OpenSSH desde la descarga, cree la regla de firewall con este comando:

New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' `
-Enabled True -Direction Inbound -Protocol TCP `
-Action Allow -LocalPort 22

Inicie el servicio sshd para generar las claves SSH:

Start-Service sshd

Las claves SSH y el archivo de configuración residen en C:\ProgramData\ssh, que es una carpeta oculta. El shell predeterminado utilizado por SSH es el shell de comandos de Windows. Esto debe cambiar a PowerShell:

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell `
-Value "C:\Program Files\PowerShell\6\pwsh.exe" -PropertyType String -Force

Ahora, cuando se conecte al sistema a través de SSH, PowerShell Core se iniciará y será el shell predeterminado. También puede crear el shell predeterminado de Windows PowerShell si lo desea.

Hay un error en OpenSSH en Windows. No funciona con rutas con un espacio, como la ruta al ejecutable PowerShell Core. La solución es crear un enlace simbólico que cree una ruta de acceso que OpenSSH pueda usar:

New-Item -ItemType SymbolicLink -Path C:\pwsh -Target 'C:\Program Files\PowerShell\6'

En el archivo sshd_config, anule los comentarios de las siguientes líneas:

PubkeyAuthentication yes
PasswordAuthentication yes

Agregue esta línea antes de otras líneas del subsistema:

Subsystem powershell C:\pwsh\pwsh.exe -sshs -NoLogo -NoProfile

Esto indica a OpenSSH que ejecute PowerShell Core.

Comment out the line:

AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

Después de guardar los cambios en el archivo sshd_config, reinicie los servicios:

Restart-Service sshd
Start-Service ssh-agent

Debe reiniciar el servicio sshd después de cualquier cambio en el archivo de configuración.

Usar la comunicación remota SSH de PowerShell

Usar la comunicación remota sobre SSH es muy similar a la comunicación remota sobre WS-MAN. Puede acceder al sistema remoto directamente con Invoke-Command:

Invoke-Command -HostName W19DC01 -ScriptBlock {Get-Process}
richard@MANTICORE@w19dc01's password:

Obtendrá una solicitud de contraseña, que no se mostrará mientras la escribe.

Si es la primera vez que se conecta al sistema remoto a través de SSH, verá un mensaje similar a este:

The authenticity of host 'servername (10.00.00.001)' can't be established.
ECDSA key fingerprint is SHA256:(<a large string>).
Are you sure you want to continue connecting (yes/no)?

Escriba sí y presione Entrar.

Puede crear una sesión remota:

$sshs = New-PSSession -HostName W19FS01
richard@MANTICORE@w19fs01's password:

Y luego usarla:

Invoke-Command -Session $sshs -ScriptBlock {$env:COMPUTERNAME}
W19FS01

Puede ingresar una sesión remota de OpenSSH utilizando Enter-PSSession de la misma manera que una sesión WS-MAN. Puede introducir una sesión existente o usar el parámetro Nombre de host en Enter-PSSession para crear la sesión interactiva.

No se puede desconectar una sesión basada en SSH; esa es una técnica de WS-MAN.

Puede usar las sesiones WS-MAN y SSH para administrar varios equipos, como se muestra en la Figura 2.

La información de la sesión muestra los diferentes mecanismos de transporte W WS-MAN y SSH, respectivamente.y el punto final utilizado por cada sesión.

las sesiones de administración Remota
Figura 2. Utilice sesiones WS-MAN y SSH juntas para administrar máquinas remotas.

Si observa detenidamente la Figura 2, notará que no se solicitó la contraseña en la sesión SSH porque el sistema se configuró con autenticación basada en claves SSH.

Mediante autenticación basada en claves SSH

Abra una sesión de PowerShell elevada. Cambie la ubicación a la .carpeta ssh en su área de usuario:

Set-Location -Path ~\.ssh

Genere el par de claves:

ssh-keygen -t ed25519

Agregue el archivo de claves al agente SSH en la máquina local:

ssh-add id_ed25519

Una vez que haya agregado la clave privada a SSH-agent, realice una copia de seguridad de la clave privada en una ubicación segura y elimine la clave de la máquina local.

Copie el id_ed25519.archivo de pub en el .carpeta ssh para la cuenta de usuario correspondiente en el servidor remoto. Puede crear una cuenta de este tipo si es necesario:

$pwd = Read-Host -Prompt 'Password' -AsSecureString
Password: ********
New-LocalUser -Name Richard -Password $pwd -PasswordNeverExpires
Add-LocalGroupMember -Group Administrators -Member Richard

En el equipo remoto, copie el contenido del archivo de clave en el archivo authorized_keys:

scp id_ed25519.pub authorized_keys

El archivo authorized_keys necesita cambiar sus permisos:

  • Abra el explorador de archivos, haga clic con el botón derecho en authorized_keys y vaya a Propiedades – Seguridad – Avanzadas
  • Haga clic en Deshabilitar herencia.
  • Seleccione Convertir permisos heredados en permisos explícitos en este objeto.
  • Elimine todos los permisos excepto el SISTEMA y su cuenta de usuario. Ambos deberían tener el control total.
Introducción a SSH con PowerShell Core.

Verá referencias al uso del módulo OpenSSHUtils para establecer los permisos, pero hay un error en la versión de la Galería de PowerShell que hace que el archivo authorized_keys no se pueda usar.

Reinicie el servicio sshd en el equipo remoto.

Ahora puede conectarse a la máquina remota sin usar una contraseña, como se muestra en la Figura 2.

Si se conecta a una máquina que no es de dominio desde una máquina del dominio, debe usar el parámetro Nombre de usuario después de habilitar la autenticación de pares de claves:

$ss = New-PSSession -HostName W19ND01 -UserName Richard

Necesita el nombre de usuario en la máquina remota para que coincida con el nombre de usuario de su dominio. No se le solicitará una contraseña.

WS-MAN o SSH remota?

¿Debería usar la comunicación remota basada en WS-MAN o SSH? La comunicación remota de WS-MAN está disponible en todos los sistemas Windows y está habilitada de forma predeterminada en Windows Server 2012 y versiones de servidor posteriores. La comunicación remota WS-MAN tiene algunos problemas, en particular el problema del doble salto. WS-MAN también necesita trabajo adicional para remotear a sistemas que no son de dominio.

La comunicación remota SSH solo está disponible en PowerShell Core; Windows PowerShell está restringido a la comunicación remota WS-MAN. Se necesita una cantidad significativa de trabajo para instalar y configurar la comunicación remota SSH. La documentación no es tan buena como debe ser. Las ventajas de la comunicación remota SSH son que puede acceder fácilmente a máquinas que no son de dominio y sistemas que no son Windows donde SSH es el estándar para el acceso remoto.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.