Comunicação remota do PowerShell através de SSH

Descrição geral

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

O WinRM fornece um modelo de hospedagem robusto para sessões remotas do PowerShell. Atualmente, a comunicação remota baseada em SSH não oferece suporte à configuração de ponto final remoto e à administração apenas suficiente (JEA).

A comunicação remota SSH permite que você faça a comunicação remota de sessão básica do PowerShell entre computadores Windows e Linux. A comunicação remota SSH cria um processo de host do PowerShell no computador de destino como um subsistema SSH. Eventualmente, implementaremos um modelo geral de hospedagem, semelhante ao WinRM, para suportar a configuração de endpoint e JEA.

Os New-PSSessioncmdlets , Enter-PSSessione Invoke-Command agora têm um novo conjunto de parâmetros para dar suporte a essa nova conexã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, será solicitada uma 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 autenticação SSH varia de acordo com a plataforma.

Informações gerais de configuração

O PowerShell 6 ou superior e o SSH devem ser instalados em todos os computadores. Instale o cliente SSH (ssh.exe) e o servidor (sshd.exe) para que você possa ir e vir remotamente dos computadores. O OpenSSH para Windows já está disponível no Windows 10 build 1809 e no Windows Server 2019. Para obter mais informações, consulte Gerenciar o Windows com OpenSSH. Para Linux, instale SSH, incluindo servidor sshd, que é apropriado para sua plataforma. Você também precisa instalar o PowerShell do GitHub para obter o recurso de comunicação remota SSH. O servidor SSH deve ser configurado para criar um subsistema SSH para hospedar um processo do PowerShell no computador remoto. Além disso, você deve habilitar a autenticação baseada em senha ou chave.

Instalar o serviço SSH em um computador Windows

  1. Instale a versão mais recente do PowerShell. Para obter mais informações, consulte Instalando o PowerShell no Windows.

    Você pode confirmar se o PowerShell tem suporte à comunicação remota SSH listando os conjuntos de New-PSSession parâmetros. Você notará que há nomes de conjuntos 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 Win32 OpenSSH mais recente. Para obter instruções de instalação, consulte Introdução ao OpenSSH.

    Nota

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

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

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

    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
    

    Nota

    A partir do PowerShell 7.4, você não precisa mais usar o parâmetro ao executar o -nologo PowerShell no modo de servidor SSH.

    Nota

    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 abreviado 8.3 para todos os caminhos de arquivo que contenham espaços. Há um bug no OpenSSH para Windows que impede que os espaços funcionem em caminhos executáveis do subsistema. Para obter mais informações, consulte este problema do GitHub.

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

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

    Opcionalmente, habilite a autenticação de chave:

    PubkeyAuthentication yes
    

    Para obter mais informações, consulte Gerenciando chaves OpenSSH.

  4. Reinicie o serviço sshd.

    Restart-Service sshd
    
  5. Adicione o caminho onde o OpenSSH está instalado à variável de ambiente Path. Por exemplo, C:\Program Files\OpenSSH\. Esta entrada permite que o ssh.exe para ser encontrado.

Instale o serviço SSH em um computador Ubuntu Linux

  1. Instale a versão mais recente do PowerShell, consulte Instalando o PowerShell no Ubuntu.

  2. Instale o Ubuntu OpenSSH Server.

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

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

    PasswordAuthentication yes
    

    Opcionalmente, habilite a autenticação de chave:

    PubkeyAuthentication yes
    

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

    Adicione uma entrada de subsistema do PowerShell:

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

    Nota

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

    Nota

    A partir do PowerShell 7.4, você não precisa mais usar o parâmetro ao executar o -nologo PowerShell no modo de servidor SSH.

  4. Reinicie o serviço ssh .

    sudo systemctl restart sshd.service
    

Instalar o serviço SSH num computador macOS

  1. Instale a versão mais recente do PowerShell. Para obter mais informações, Instalando o PowerShell no macOS.

    Certifique-se de que a comunicação remota SSH está ativada seguindo estes passos:

    1. Abrir System Settings.
    2. Clique em General
    3. Clique em Sharing.
    4. Verifique Remote Login para definir Remote Login: On.
    5. Permitir o acesso aos usuários apropriados.
  2. Edite o sshd_config arquivo no local /private/etc/ssh/sshd_config.

    Use um editor de texto como nano:

    sudo nano /private/etc/ssh/sshd_config
    

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

    PasswordAuthentication yes
    

    Adicione uma entrada de subsistema do PowerShell:

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

    Nota

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

    Nota

    A partir do PowerShell 7.4, você não precisa mais usar o parâmetro ao executar o -nologo PowerShell no modo de servidor SSH.

    Opcionalmente, 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
    

Nota

Quando você atualiza seu sistema operacional, o arquivo de configuração SSH pode ser substituído. Certifique-se de verificar o arquivo de configuração após uma atualização.

Autenticação

A comunicação remota do PowerShell sobre SSH depende da troca de autenticação entre o cliente SSH e o serviço SSH e não implementa nenhum esquema de autenticação em si. O resultado é que todos os esquemas de autenticação configurados, incluindo a autenticação multifator, são manipulados por SSH e independentes do PowerShell. Por exemplo, você pode configurar o serviço SSH para exigir autenticação de chave pública e uma senha de uso único para maior segurança. A configuração da autenticação multifator está fora do escopo desta documentação. Consulte a documentação do SSH sobre como configurar corretamente a autenticação multifator e validá-la fora do PowerShell antes de tentar usá-la com a comunicação remota do PowerShell.

Nota

Os usuários mantêm os mesmos privilégios em sessões remotas. Ou seja, os administradores têm acesso a um shell elevado, e os usuários normais nã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 de volta para o mesmo computador Linux. Estamos usando cmdlets do PowerShell interativamente, então vemos prompts do SSH pedindo para verificar o computador host e solicitando uma senha. Você pode fazer a mesma coisa em um computador Windows para garantir que a comunicação remota esteja funcionando. Em seguida, remoto entre computadores alterando o nome do host.

Linux para 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 para 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 para 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 um computador Linux.

  • PSRemoting sobre SSH não suporta perfis e não tem acesso ao $PROFILE. Uma vez em uma sessão, você pode carregar um perfil por ponto sourcing o perfil 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. Consulte a documentação do SSH para obter mais informações.

  • Antes do PowerShell 7.1, a comunicação remota sobre SSH não oferecia suporte a sessões remotas de segundo salto. Esse recurso foi limitado a sessões usando o WinRM. O PowerShell 7.1 permite Enter-PSSession e Enter-PSHostProcess funciona a partir de qualquer sessão remota interativa.

Consulte também