Compartir a través de


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 de sesiones remotas de SSH permite realizar la administración básica de PowerShell entre equipos Windows y Linux. La comunicación remota a través SSH crea un proceso de host de PowerShell en el equipo de destino como un subsistema SSH. Finalmente, implementaremos un modelo de hospedaje general, similar a WinRM, para admitir la configuración del punto de conexión y JEA.

Los cmdlets New-PSSession, Enter-PSSession y Invoke-Command ahora tienen un nuevo conjunto de parámetros configurado para admitir esta nueva conexió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 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 general de configuración

PowerShell 6 o posterior, y SSH debe estar instalado en todos los equipos. Instale tanto el cliente SSH (ssh.exe) como el servidor (sshd.exe) para que pueda realizar la conexión remota a y desde los equipos. OpenSSH para Windows ya está disponible en la compilación 1809 de Windows 10 y Windows Server 2019. Para obtener más información, consulte Administrar Windows con OpenSSH. Para Linux, instale SSH, incluido el servidor sshd, que es adecuado para la plataforma. También debe instalar PowerShell desde GitHub para obtener la funcionalidad de comunicación remota SSH. El servidor SSH debe configurarse para crear un subsistema SSH para hospedar un proceso de PowerShell en el equipo remoto. Además, debe habilitar la autenticación basada enclaves o contraseñas.

Instalación del servicio SSH en un equipo Windows

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

    Puede confirmar que PowerShell tiene compatibilidad con la comunicación remota ssh enumerando los New-PSSession conjuntos de parámetros. Observará que hay nombres de conjunto de parámetros que comienzan con 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 de Win32. Para obtener instrucciones de instalación, consulte Introducción a OpenSSH.

    Nota:

    Si desea establecer PowerShell como shell predeterminado para OpenSSH, consulte Configuración de Windows para OpenSSH.

  3. Edite el sshd_config archivo 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
      

      Nota:

      Hay un error en OpenSSH para Windows que impide el uso de una ruta de acceso con espacios para el ejecutable del subsistema. Hay dos formas de evitar este problema:

      • Usar el nombre corto de estilo Windows 8.3 para la ruta de acceso ejecutable de PowerShell
      • Creación de un vínculo simbólico al ejecutable de PowerShell que da como resultado una ruta de acceso sin espacios

      Para obtener más información, consulte el problema 784 en el repositorio de powerShell/Win32-OpenSSH.

      Solo tiene que obtener el nombre de estilo 8.3 para el segmento de la ruta de acceso que contiene el espacio. De forma predeterminada, PowerShell 7 está instalado en C:\Program Files\PowerShell\7\. El nombre de estilo 8.3 para Program Files debe ser progra~1. Puede usar el siguiente comando para comprobar el nombre:

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

      El nombre 8.3 es una característica heredada del sistema de archivos NTFS que se puede deshabilitar. Esta característica debe estar habilitada para el volumen en el que está instalado PowerShell.

      Como alternativa, puede crear un vínculo simbólico al ejecutable de PowerShell que da como resultado una ruta de acceso sin espacios. Este método es preferible porque permite actualizar el vínculo si cambia la ruta de acceso al ejecutable de PowerShell, sin necesidad de actualizar sshd_config el archivo.

      Use el comando siguiente para crear un vínculo simbólico al archivo ejecutable:

      $newItemSplat = @{
           ItemType = 'SymbolicLink'
           Path = 'C:\ProgramData\ssh\'
           Name = 'pwsh.exe'
           Value = (Get-Command pwsh.exe).Source
      }
      New-Item @newItemSplat
      

      Este comando crea el vínculo simbólico en el mismo directorio que usa el servidor OpenSSH para almacenar las claves de host y otra configuración.

    • Opcionalmente, habilite la autenticación de claves:

      PubkeyAuthentication yes
      

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

  4. Reinicie el servicio sshd.

    Restart-Service sshd
    
  5. Agregue la ruta donde está instalado OpenSSH a la variable de entorno PATH. Por ejemplo: C:\Program Files\OpenSSH\. Esta entrada permite que se encuentre el 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 ubuntu OpenSSH Server.

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

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

      PasswordAuthentication yes
      
    • Opcionalmente, habilite la autenticación de claves:

      PubkeyAuthentication yes
      

      Para obtener más información sobre cómo crear claves SSH en Ubuntu, consulte la página de manpage para ssh-keygen.

    • Agregue una entrada del subsistema de PowerShell:

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

      Nota:

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

  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, Instalación de PowerShell en macOS.

    Asegúrese de que la comunicación remota ssh esté habilitada siguiendo estos pasos:

    1. Abierto System Settings.
    2. Haga clic en General.
    3. Haga clic en Sharing.
    4. Verifique Remote Login para establecer Remote Login: On.
    5. Permitir el acceso a los usuarios adecuados.
  2. Edite el sshd_config archivo en la 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 del 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. La ubicación puede variar en función de cómo haya instalado PowerShell.

    • Opcionalmente, habilite la autenticación de claves:

      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 SSH y el servicio SSH y no implementa ningún esquema de autenticación. El resultado es que los esquemas de autenticación configurados, incluida la autenticación multifactor, se controlan mediante SSH e independiente de PowerShell. Por ejemplo, puede configurar el servicio SSH para requerir autenticación de clave pública y una contraseña única para mayor seguridad. La configuración de la autenticación multifactor está fuera del ámbito de esta documentación. Consulte la documentación de SSH sobre cómo configurar correctamente la autenticación multifactor y validar que funciona fuera de PowerShell antes de intentar usarlo con la comunicación remota de PowerShell.

Nota:

Los usuarios conservan los mismos privilegios en sesiones remotas. Es decir, los administradores tienen acceso a un shell con privilegios elevados y los usuarios normales no lo hacen.

Ejemplo de ejecución remota de PowerShell

La manera más fácil de probar la comunicación remota es probarla en un solo equipo. En este ejemplo, se crea una sesión remota de regreso en el mismo equipo Linux. Estamos usando cmdlets de PowerShell de forma interactiva, por lo que vemos mensajes de SSH que solicitan comprobar el equipo host y solicitar una contraseña. Puede hacer lo mismo en un equipo Windows para asegurarse de que la función de acceso remoto está operativa. A continuación, cambie el nombre de host de forma remota entre equipos.

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

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]

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 en un equipo Linux.

  • PSRemoting a través de SSH no admite perfiles y no tiene acceso a $PROFILE. Una vez en una sesión, puede cargar un perfil mediante dot sourcing del perfil con la ruta de acceso completa. Esto no está relacionado con los perfiles ssh. Puede configurar el servidor SSH para que use PowerShell como shell predeterminado y cargar un perfil a través de SSH. Consulte 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 funcionalidad se limitaba a las sesiones que usan WinRM. PowerShell 7.1 permite que Enter-PSSession y Enter-PSHostProcess funcionen desde cualquier sesión remota interactiva.

Consulte también