Comunicación remota de PowerShell a través de SSH

Información general

La comunicación remota de PowerShell suele usar WinRM para la negociación de la conexión y el transporte de datos. SSH está ahora disponible para plataformas Linux y Windows y permite una verdadera comunicación remota multiplataforma en PowerShell.

WinRM proporciona un modelo de hospedaje sólido para las sesiones remotas de PowerShell. La comunicación remota basada en SSH no admite actualmente la configuración remota de puntos de conexión y de Just Enough Administration (JEA).

La comunicación remota mediante SSH permite una comunicación remota de sesión de PowerShell básica entre los equipos Windows y Linux. La comunicación remota mediante SSH crea un proceso de host de PowerShell en el equipo de destino como un subsistema SSH. Finalmente, implementaremos un modelo general de hospedaje, similar a WinRM, para admitir la configuración de puntos de conexión y JEA.

Los cmdlets New-PSSession, Enter-PSSession y Invoke-Command ahora tienen un nuevo conjunto de parámetros que permite esta nueva conexión de comunicación remota.

[-HostName <string>]  [-UserName <string>]  [-KeyFilePath <string>]

Para crear una sesión remota, especifique el equipo de destino con el parámetro HostName y proporcione el nombre de usuario con UserName. Al ejecutar los cmdlets de forma interactiva, se le pedirá una contraseña. También puede usar la autenticación de la clave SSH mediante un archivo de clave privada con el parámetro KeyFilePath. La creación de claves para la autenticación SSH varía según la plataforma.

Información de configuración general

Deben estar instalados PowerShell 6 o versiones posteriores y SSH en todos los equipos. Instale tanto el cliente (ssh.exe) y el servidor (sshd.exe) SSH para que pueda comunicarse de forma remota hacia y desde los equipos. OpenSSH para Windows ahora está disponible en las compilación 1809 de Windows 10 y en Windows Server 2019. Para obtener más información, vea Administrar Windows con OpenSSH. Para Linux, instale SSH, incluido el servidor sshd, más adecuado para su plataforma. También necesita instalar PowerShell de GitHub para obtener la característica de comunicación remota mediante SSH. El servidor SSH debe estar configurado para crear un subsistema SSH para hospedar un proceso PowerShell en el equipo remoto. Además, debe habilitar la contraseña o la autenticación basada en claves.

Instalación del servicio SSH en un equipo Windows

  1. Instale la versión más reciente de PowerShell. Para más información, consulte Instalación de PowerShell en Windows.

    Para confirmar que PowerShell tiene compatibilidad con la comunicación remota SSH, enumere los conjuntos de parámetros New-PSSession. Observará que hay nombres de conjuntos de parámetros que comienzan por SSH. Esos conjuntos de parámetros incluyen parámetros SSH.

    (Get-Command New-PSSession).ParameterSets.Name
    
    Name
    ----
    SSHHost
    SSHHostHashParam
    
  2. Instale la versión más reciente de OpenSSH para Win32. Para obtener instrucciones de instalación, vea Introducción a OpenSSH.

    Nota:

    Si quiere establecer PowerShell como el shell predeterminado para OpenSSH, vea Configuración de Windows para OpenSSH.

  3. Edite el archivo sshd_config ubicado en $env:ProgramData\ssh.

    Asegúrese de que la autenticación de contraseña esté habilitada:

    PasswordAuthentication yes
    

    Cree el subsistema SSH que hospeda un proceso de PowerShell en el equipo remoto:

    Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -nologo
    

    Nota:

    A partir de PowerShell 7.4, ya no es necesario usar el parámetro -nologo al ejecutar PowerShell en modo de servidor SSH.

    Nota:

    La ubicación predeterminada del ejecutable de PowerShell es c:/progra~1/powershell/7/pwsh.exe. Esta puede variar en función de cómo haya instalado PowerShell.

    Debe usar el nombre corto de 8.3 para las rutas de acceso de archivo que contengan espacios. Hay un error en OpenSSH para Windows que impide que los espacios funcionen en rutas de acceso ejecutables del subsistema. Para más información, consulte este problema de GitHub.

    Normalmente, el nombre corto de 8.3 de la carpeta Program Files en Windows es Progra~1. No obstante, puede usar el comando siguiente para asegurarse:

    Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' |
      Select-Object EightDotThreeFileName
    
    EightDotThreeFileName
    ---------------------
    c:\progra~1
    

    Opcionalmente, habilite la autenticación de clave:

    PubkeyAuthentication yes
    

    Para obtener más información, vea Administración de claves de OpenSSH.

  4. Reinicie el servicio sshd.

    Restart-Service sshd
    
  5. Agregue la ruta de acceso donde está instalado OpenSSH a la variable de entorno Path. Por ejemplo, C:\Program Files\OpenSSH\. Esta entrada permite encontrar el archivo ssh.exe.

Instalación del servicio SSH en un equipo Ubuntu Linux

  1. Instale la versión más reciente de PowerShell, consulte Instalación de PowerShell en Ubuntu.

  2. Instale Servidor OpenSSH en Ubuntu.

    sudo apt install openssh-client
    sudo apt install openssh-server
    
  3. Edite el archivo sshd_config en ubicación /etc/ssh.

    Asegúrese de que la autenticación de contraseña esté habilitada:

    PasswordAuthentication yes
    

    Opcionalmente, habilite la autenticación de clave:

    PubkeyAuthentication yes
    

    Para obtener más información sobre la creación de claves SSH en Ubuntu, vea la página del manual de ssh-keygen.

    Agregue una entrada de subsistema de PowerShell:

    Subsystem powershell /usr/bin/pwsh -sshs -nologo
    

    Nota:

    La ubicación predeterminada del ejecutable de PowerShell es /usr/bin/pwsh. Esta puede variar en función de cómo haya instalado PowerShell.

    Nota:

    A partir de PowerShell 7.4, ya no es necesario usar el parámetro -nologo al ejecutar PowerShell en modo de servidor SSH.

  4. Reinicie el servicio ssh.

    sudo systemctl restart sshd.service
    

Instalación del servicio SSH en un equipo macOS

  1. Instale la versión más reciente de PowerShell. Para obtener más información, vea Instalación de PowerShell en macOS.

    Asegúrese de que la comunicación remota mediante SSH está habilitada. Para ello, siga estos pasos:

    1. Abra System Settings.
    2. Haga clic en General.
    3. Haga clic en Sharing.
    4. Active Remote Login para establecer Remote Login: On.
    5. Permita el acceso a los usuarios adecuados.
  2. Edite el archivo sshd_config en ubicación /private/etc/ssh/sshd_config.

    Use un editor de texto, como nano:

    sudo nano /private/etc/ssh/sshd_config
    

    Asegúrese de que la autenticación de contraseña esté habilitada:

    PasswordAuthentication yes
    

    Agregue una entrada de subsistema de PowerShell:

    Subsystem powershell /usr/local/bin/pwsh -sshs -nologo
    

    Nota:

    La ubicación predeterminada del ejecutable de PowerShell es /usr/local/bin/pwsh. Esta puede variar en función de cómo haya instalado PowerShell.

    Nota:

    A partir de PowerShell 7.4, ya no es necesario usar el parámetro -nologo al ejecutar PowerShell en modo de servidor SSH.

    Opcionalmente, habilite la autenticación de clave:

    PubkeyAuthentication yes
    
  3. Reinicie el servicio sshd.

    sudo launchctl stop com.openssh.sshd
    sudo launchctl start com.openssh.sshd
    

Nota:

Al actualizar el sistema operativo, es posible que se sobrescriba el archivo de configuración SSH. Asegúrese de comprobar el archivo de configuración después de una actualización.

Autenticación

La comunicación remota de PowerShell a través de SSH se basa en el intercambio de autenticación entre el cliente de SSH y el servicio SSH, y no implementa los esquemas de autenticación. El resultado es que los esquemas de autenticación configurados, incluida la autenticación multifactor, se controlan mediante SSH y son independientes de PowerShell. Por ejemplo, puede configurar el servicio SSH para que solicite la autenticación con una clave pública y con una contraseña de un solo uso para una mayor seguridad. La configuración de autenticación multifactor queda fuera del ámbito de este documento. Consulte la documentación para SSH sobre cómo configurar la autenticación multifactor correctamente y validar su funcionamiento fuera de PowerShell antes de intentar usarlo con comunicación remota de PowerShell.

Nota:

Los usuarios conservan los mismos privilegios en las sesiones remotas. Es decir, los administradores tienen acceso a un shell con privilegios elevados, a diferencia de los usuarios normales.

Ejemplo de comunicación remota de PowerShell

La manera más fácil de comprobar si la comunicación remota funciona es probarla en un único equipo. En este ejemplo, vamos a crear una sesión remota en el mismo equipo Linux. Estamos usando cmdlets de PowerShell de manera interactiva para que aparezcan avisos de SSH que solicitan comprobar el equipo host y que piden una contraseña. Puede hacer lo mismo en un equipo Windows para garantizar que la comunicación remota funcione. Después, establézcala entre equipos mediante el cambio del nombre de host.

De Linux a Linux

$session = New-PSSession -HostName UbuntuVM1 -UserName TestUser
The authenticity of host 'UbuntuVM1 (9.129.17.107)' can't be established.
ECDSA key fingerprint is SHA256:2kCbnhT2dUE6WCGgVJ8Hyfu1z2wE4lifaJXLO7QJy0Y.
Are you sure you want to continue connecting (yes/no)?
TestUser@UbuntuVM1s password:
$session
 Id Name   ComputerName    ComputerType    State    ConfigurationName     Availability
 -- ----   ------------    ------------    -----    -----------------     ------------
  1 SSH1   UbuntuVM1       RemoteMachine   Opened   DefaultShell             Available
Enter-PSSession $session
[UbuntuVM1]: PS /home/TestUser> uname -a
Linux TestUser-UbuntuVM1 4.2.0-42-generic 49~16.04.1-Ubuntu SMP Wed Jun 29 20:22:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

[UbuntuVM1]: PS /home/TestUser> Exit-PSSession
Invoke-Command $session -ScriptBlock { Get-Process pwsh }
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName    PSComputerName
-------  ------    -----      -----     ------     --  -- -----------    --------------
      0       0        0         19       3.23  10635 635 pwsh           UbuntuVM1
      0       0        0         21       4.92  11033 017 pwsh           UbuntuVM1
      0       0        0         20       3.07  11076 076 pwsh           UbuntuVM1

De Linux a Windows

Enter-PSSession -HostName WinVM1 -UserName PTestName
PTestName@WinVM1s password:
[WinVM1]: PS C:\Users\PTestName\Documents> cmd /c ver
Microsoft Windows [Version 10.0.10586]

De Windows a Windows

C:\Users\PSUser\Documents>pwsh.exe
PowerShell
Copyright (c) Microsoft Corporation. All rights reserved.
$session = New-PSSession -HostName WinVM2 -UserName PSRemoteUser
The authenticity of host 'WinVM2 (10.13.37.3)' can't be established.
ECDSA key fingerprint is SHA256:kSU6slAROyQVMEynVIXAdxSiZpwDBigpAF/TXjjWjmw.
Are you sure you want to continue connecting (yes/no)?
Warning: Permanently added 'WinVM2,10.13.37.3' (ECDSA) to the list of known hosts.
PSRemoteUser@WinVM2's password:
$session
 Id Name            ComputerName    ComputerType    State         ConfigurationName     Availability
 -- ----            ------------    ------------    -----         -----------------     ------------
  1 SSH1            WinVM2          RemoteMachine   Opened        DefaultShell             Available
Enter-PSSession -Session $session
[WinVM2]: PS C:\Users\PSRemoteUser\Documents> $PSVersionTable

Name                           Value
----                           -----
PSEdition                      Core
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
SerializationVersion           1.1.0.1
BuildVersion                   3.0.0.0
CLRVersion
PSVersion                      6.0.0-alpha
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
GitCommitId                    v6.0.0-alpha.17


[WinVM2]: PS C:\Users\PSRemoteUser\Documents>

Limitaciones

  • El comando sudo no funciona en una sesión remota con un equipo Linux.

  • PSRemoting a través de SSH no admite perfiles y no tiene acceso a $PROFILE. Una vez que esté en una sesión, podrá cargar un perfil prefijando por puntos dicho perfil con la ruta del archivo completa. Esto no está relacionado con los perfiles SSH. Puede configurar el servidor SSH para usar PowerShell como el shell predeterminado y cargar un perfil mediante SSH. Vea la documentación de SSH para obtener más información.

  • Antes de PowerShell 7.1, la comunicación remota a través de SSH no admitía sesiones remotas de segundo salto. Esta capacidad se limitaba a las sesiones que usaban WinRM. PowerShell 7.1 permite que Enter-PSSession y Enter-PSHostProcess funcionen desde cualquier sesión remota interactiva.

Consulte también