Comunicação remota do PowerShell por SSH

Visão geral

Normalmente, a comunicação remota do PowerShell usa WinRM para negociação de conexão e transporte de dados. Agora, o SSH está disponível para plataformas Linux e Windows, e permite a verdadeira comunicação remota multiplataforma do PowerShell.

O WinRM fornece um modelo de hospedagem robusto para sessões remotas do PowerShell. No momento, a comunicação remota baseada em SSH não é compatível com a configuração de ponto de extremidade remoto e JEA (Just Enough Administration).

A comunicação remota do SSH permite fazer a comunicação remota de sessão básica do PowerShell entre máquinas Windows e Linux. A comunicação remota do SSH cria um processo de hospedagem do PowerShell no computador de destino como um subsistema de SSH. Eventualmente, implementaremos um modelo de hospedagem geral, semelhante ao WinRM, para dar suporte à configuração de ponto de extremidade e JEA.

Agora, os cmdlets New-PSSession, Enter-PSSession e Invoke-Command têm um novo parâmetro definido para dar suporte a essa nova conexão de comunicação remota.

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

Para criar uma sessão remota, especifique o computador de destino com o parâmetro HostName e forneça o nome de usuário com UserName. Ao executar os cmdlets interativamente, você receberá uma solicitação de senha. Você também pode usar a autenticação de chave SSH usando um arquivo de chave privada com o parâmetro KeyFilePath. A criação de chaves para a autenticação SSH varia de acordo com a plataforma.

Informações gerais de configuração

PowerShell 6 ou superior, e o SSH deve ser instalado em todos os computadores. Instale o cliente SSH (ssh.exe) e o servidor (sshd.exe) para fazer a comunicação remota entre os computadores. Agora o OpenSSH para Windows está disponível no build 1809 do Windows 10 e no Windows Server 2019. Para saber mais, confira Gerenciar o Windows com OpenSSH. No Linux, instale o SSH (incluindo sshd server) apropriado para a sua plataforma. Também é preciso instalar o PowerShell no GitHub para obter o recurso de comunicação remota do SSH. O servidor SSH deve ser configurado para criar um subsistema de SSH para hospedar um processo do PowerShell no computador remoto. É necessário habilitar a autenticação por senha ou baseada em chave.

Configurar em um computador com Windows

  1. Instalar a versão mais recente do PowerShell. Para obter mais informações, confira Como instalar o PowerShell Core no Windows.

    É possível confirmar se o PowerShell é compatível com a comunicação remota do SSH listando os conjuntos do parâmetro New-PSSession. Você observará que há nomes de conjunto de parâmetros que começam com SSH. Esses conjuntos de parâmetros incluem parâmetros SSH.

    (Get-Command New-PSSession).ParameterSets.Name
    
    Name
    ----
    SSHHost
    SSHHostHashParam
    
  2. Instale o OpenSSH Win32 mais recente. Para ver as instruções de instalação, confira Introdução ao OpenSSH.

    Observação

    Se você quiser definir o PowerShell como o shell padrão para o OpenSSH, confira Configurar o Windows para o OpenSSH.

  3. Edite o arquivo sshd_config localizado em $env:ProgramData\ssh.

    Verifique se a autenticação de senha está habilitada:

    PasswordAuthentication yes
    

    Crie o subsistema SSH que hospeda um processo do PowerShell no computador remoto:

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

    Observação

    O local padrão do executável do PowerShell é c:/progra~1/powershell/7/pwsh.exe. O local pode variar dependendo de como você instalou o PowerShell.

    Você deve usar o nome curto 8.3 para qualquer caminho de arquivo que contenha espaços. Há um bug no OpenSSH para Windows que impede que os espaços trabalhem em caminhos executáveis do subsistema. Para saber mais, confira este problema do GitHub.

    O nome curto 8.3 para a pasta Program Files no Windows geralmente é Progra~1. No entanto, você pode usar o seguinte comando para garantir:

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

    Como alternativa, habilite a autenticação de chave:

    PubkeyAuthentication yes
    

    Para saber mais, confira Gerenciar chaves do OpenSSH.

  4. Reinicie o serviço sshd.

    Restart-Service sshd
    
  5. Adicione o caminho no qual o OpenSSH está instalado à sua variável de ambiente Path. Por exemplo, C:\Program Files\OpenSSH\. Essa entrada permite que ssh.exe seja localizado.

Configurar em um computador Linux Ubuntu 16.04

  1. Instale a versão mais recente do PowerShell, confira Instalar o PowerShell Core no Linux.

  2. Instale o Ubuntu OpenSSH Server.

    sudo apt install openssh-client
    sudo apt install openssh-server
    
  3. Edite o arquivo sshd_config no local /etc/ssh.

    Verifique se a autenticação de senha está habilitada:

    PasswordAuthentication yes
    

    Como alternativa, habilite a autenticação de chave:

    PubkeyAuthentication yes
    

    Para obter mais informações sobre como criar chaves SSH no Ubuntu, confira a página de manual para ssh-keygen.

    Adicione uma entrada do subsistema PowerShell:

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

    Observação

    O local padrão do executável do PowerShell é /usr/bin/pwsh. O local pode variar dependendo de como você instalou o PowerShell.

  4. Reinicie o serviço ssh.

    sudo service ssh restart
    

Configurar em um computador macOS

  1. Instalar a versão mais recente do PowerShell. Para obter mais informações, confira Como instalar o PowerShell Core no macOS.

    Verifique se a comunicação remota do SSH está habilitada, seguindo estas etapas:

    1. Abra o System Preferences.
    2. Clique em Sharing.
    3. Verifique Remote Login para definir Remote Login: On.
    4. Permita o acesso a usuários apropriados.
  2. Edite o arquivo sshd_config no local /private/etc/ssh/sshd_config.

    Abra um editor de texto, como o nano:

    sudo nano /private/etc/ssh/sshd_config
    

    Verifique se a autenticação de senha está habilitada:

    PasswordAuthentication yes
    

    Adicione uma entrada do subsistema PowerShell:

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

    Observação

    O local padrão do executável do PowerShell é /usr/local/bin/pwsh. O local pode variar dependendo de como você instalou o PowerShell.

    Como alternativa, habilite a autenticação de chave:

    PubkeyAuthentication yes
    
  3. Reinicie o serviço sshd.

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

Autenticação

A comunicação remota do PowerShell por SSH depende da troca de autenticação entre o cliente do SSH e o serviço de SSH; ela própria não implementa nenhum esquema de autenticação. Isso significa que os esquemas de autenticação configurada, incluindo a autenticação multifator, são manipulados por SSH e são independentes do PowerShell. Por exemplo, é possível configurar o serviço SSH para exigir autenticação de chave pública, bem como uma senha única para aumentar a segurança. A configuração da autenticação multifator está fora do escopo desta documentação. Consulte a documentação para o SSH sobre como configurar a autenticação multifator corretamente e validar seu trabalho fora do PowerShell antes de tentar usá-la com a comunicação remota do PowerShell.

Observação

Os usuários mantêm os mesmos privilégios em sessões remotas. Isso quer dizer que os administradores têm acesso a um shell elevado, e os usuários normais não terão.

Exemplo de comunicação remota do PowerShell

A maneira mais fácil de testar a comunicação remota é experimentá-la em um único computador. Neste exemplo, criamos uma sessão remota para o mesmo computador com Linux. Estamos usando cmdlets do PowerShell de forma interativa para que possamos ver avisos do SSH para verificar o computador host, bem como solicitar uma senha. É possível fazer a mesma coisa em um computador com Windows para garantir o funcionamento da comunicação remota. Em seguida, realize a comunicação remota entre os computadores alterando o nome do host.

# Linux to Linux
#
$session = New-PSSession -HostName UbuntuVM1 -UserName TestUser
The authenticity of host 'UbuntuVM1 (9.129.17.107)' cannot 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 powershell }
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName                    PSComputerName
-------  ------    -----      -----     ------     --  -- -----------                    --------------
      0       0        0         19       3.23  10635 635 powershell                     UbuntuVM1
      0       0        0         21       4.92  11033 017 powershell                     UbuntuVM1
      0       0        0         20       3.07  11076 076 powershell                     UbuntuVM1
#
# Linux to 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 to 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>

Limitações

  • O comando sudo não funciona em uma sessão remota para computador com Linux.

  • O PSRemoting no SSH não dá suporte a perfis e não tem acesso a $PROFILE. Estando em uma sessão, você pode carregar um perfil executando dot source dele com o caminho de arquivo completo. Isso não está relacionado aos perfis SSH. Você pode configurar o servidor SSH para usar o PowerShell como o shell padrão e carregar um perfil por meio do SSH. Confira a documentação do SSH para obter mais informações.

  • Antes do PowerShell 7.1, a comunicação remota por SSH não dava suporte a sessões remotas de segundo salto. Essa funcionalidade estava limitada a sessões que usavam o WinRM. O PowerShell 7.1 permite que Enter-PSSession e Enter-PSHostProcess funcionem em qualquer sessão remota interativa.

Confira também

Instalar o PowerShell Core no Linux

Instalar o PowerShell Core no macOS

Instalar o PowerShell Core no Windows

Gerenciar o Windows com o OpenSSH

Gerenciar chaves do OpenSSH

Ubuntu SSH