Compartilhar via


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 de SSH permite que você faça a comunicação remota básica da sessão do PowerShell entre computadores Windows e Linux. A comunicação remota do SSH cria um processo de hospedagem do PowerShell no computador de destino como um subsistema SSH. Eventualmente, implementaremos um modelo de hospedagem geral, semelhante ao WinRM, para dar suporte à configuração de ponto de extremidade e jea.

Os New-PSSessioncmdlets e Invoke-Command , Enter-PSSessionagora, 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ê recebe 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 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 fazer o controle remoto de e para os computadores. O OpenSSH para Windows agora está disponível no Windows 10 build 1809 e no Windows Server 2019. Para obter mais informações, consulte Gerenciar o Windows com o OpenSSH. Para Linux, instale o SSH, incluindo o servidor SSHD, que é apropriado para sua plataforma. Você também precisa instalar o PowerShell do GitHub para obter o recurso de comunicação remota do 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çã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 Como instalar o PowerShell no Windows.

    Você pode confirmar que o PowerShell tem suporte à comunicação remota SSH listando os New-PSSession conjuntos de parâmetros. 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 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á 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
      

      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:

      • Usar o nome curto no estilo do 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 nº 784 no repositório do 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 está instalado em C:\Program Files\PowerShell\7\. O nome do estilo 8.3 deve Program Files 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 desabilitado. 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 é preferencial 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
      

      Esse 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 Gerenciar chaves OpenSSH.

  4. Reinicie o serviço sshd.

    Restart-Service sshd
    
  5. Adicione o caminho em que o OpenSSH está instalado à variável de ambiente PATH. Por exemplo, C:\Program Files\OpenSSH\. Essa entrada permite que ela ssh.exe seja encontrada.

Instalar 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 servidor do Ubuntu OpenSSH.

    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á habilitada:

      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 manpage para ssh-keygen.

    • Adicionar 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 em um computador macOS

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

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

    1. Abra o System Settings.
    2. Clique em General
    3. Clique em Sharing.
    4. Verifique Remote Login para definir Remote Login: On.
    5. Permitir 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á habilitada:

      PasswordAuthentication yes
      
    • Adicionar 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. Verifique o arquivo de configuração após uma atualização.

Autenticação

A comunicação remota do PowerShell sobre o 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 autenticação multifator, são tratados pelo SSH e independentes do PowerShell. Por exemplo, você pode configurar o serviço SSH para exigir a autenticação de chave pública e uma senha única para a segurança adicionada. 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 funciona 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 com privilégios elevados 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, portanto, vemos prompts do SSH solicitando 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.

  • O PSRemoting via SSH não dá suporte a Perfis e não tem acesso a $PROFILE. Uma vez em uma sessão, você pode carregar um perfil por meio dot sourcing do 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 via SSH não era compatível com sessões remotas de segundo salto. Essa funcionalidade foi limitada a sessões usando o WinRM. O PowerShell 7.1 permite que Enter-PSSession e Enter-PSHostProcess funcionem de dentro de qualquer sessão remota interativa.

Consulte também