Partilhar via


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

Visã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 a realização de sessões remotas básicas do PowerShell entre computadores Windows e Linux. A comunicação remota SSH cria um processo anfitrião 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-PSSession, Enter-PSSession, e Invoke-Command cmdlets agora têm um novo conjunto de parâmetros para suportar esta 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. Para obter o recurso de remoting por SSH, você também precisa instalar o PowerShell a partir do GitHub. 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çãobaseada 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.

    Observação

    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
      

      Observação

      Há um bug no OpenSSH para Windows que impede que você use um caminho com espaços para o executável do subsistema. Há duas maneiras de contornar esse problema:

      • Use o nome curto no estilo Windows 8.3 para o caminho executável do PowerShell
      • Criar um link simbólico para o executável do PowerShell que resulta em um caminho sem espaços

      Para obter mais informações, consulte o problema #784 no repositório PowerShell/Win32-OpenSSH.

      Você só precisa obter o nome de estilo 8.3 para o segmento do caminho que contém o espaço. Por padrão, o PowerShell 7 é instalado no C:\Program Files\PowerShell\7\. O nome de estilo 8.3 para Program Files deve ser progra~1. Você pode usar o seguinte comando para verificar o nome:

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

      O nome 8.3 é um recurso herdado do sistema de arquivos NTFS que pode ser desativado. Esse recurso deve ser habilitado para o volume no qual o PowerShell está instalado.

      Como alternativa, você pode criar um link simbólico para o executável do PowerShell que resulta em um caminho sem espaços. Esse método é preferido porque permite que você atualize o link se o caminho para o executável do PowerShell for alterado, sem também precisar atualizar seu sshd_config arquivo.

      Use o seguinte comando para criar um link simbólico para o executável:

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

      Este comando cria o link simbólico no mesmo diretório usado pelo servidor OpenSSH para armazenar as chaves de host e outras configurações.

    • 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 à sua variável de ambiente PATH. Por exemplo, C:\Program Files\OpenSSH\. Esta entrada permite que o ssh.exe seja 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 arquivo sshd_config na localização /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
      

      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 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. Abra 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 arquivo sshd_config na localização /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
      

      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.

    • 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
    

Observação

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.

Observação

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 a usar interativamente cmdlets do PowerShell, então vemos mensagens de aviso do SSH a pedir para verificar o computador hospedeiro e a solicitar uma senha. Você pode fazer a mesma coisa em um computador Windows para garantir que a comunicação remota esteja funcionando. Em seguida, estabeleça uma ligação remota entre os 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 através de SSH não suporta Perfis e não tem acesso ao $PROFILE. Uma vez durante uma sessão, pode carregar um perfil ao executar o comando de origem do perfil com o caminho completo do arquivo. 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 que Enter-PSSession e Enter-PSHostProcess trabalhem a partir de qualquer sessão remota interativa.

Ver também