PSRemoting para Linux e Windows: Guia Passo a Passo

Uma das grandes vantagens da forma como o PowerShell mudou nos últimos anos é que ele está adotando muitas maneiras de interagir com máquinas não-Windows. Uma dessas mudanças foi dar suporte ao PSRemoting via SSH. O PSRemoting via SSH também significa ter o PSRemoting no Linux!

Embora configurar o PSRemoting para funcionar com SSH e Linux exija um pouco de configuração para funcionar, isso permite que você use o PowerShell para interagir nativamente com máquinas Linux.

Neste tutorial, você aprenderá como configurar um cliente Windows para se conectar a um computador Linux (CentOS) usando PSRemoting via SSH e vice-versa. Você aprenderá como autenticar usando uma senha e usando um certificado.

Relacionado: PowerShell Remoting: O Guia Definitivo

Pré-requisitos

Este tutorial será passo a passo. Se você quiser acompanhar, certifique-se de ter o seguinte com antecedência:

  • A Windows 10 build 1809 or greater machine. The tutorial will use Windows Server 2019 Standard as the remote server.
  • A Linux machine that supports PowerShell 7. The tutorial will use CentOS 8.
  • Direitos de sudo na máquina Linux e direitos de administrador local na máquina Windows. Após a configuração inicial, alguns dos direitos podem ser revogados.

Configurando o Windows (Cliente) para PSRemoting via SSH

Primeiro, você precisa configurar o cliente PSRemoting (PowerShell) em seu cliente Windows. Para fazer isso, você precisará instalar e configurar tanto o PowerShell 7+ quanto o OpenSSH.

Instalando o PowerShell 7+

Primeiro, instale o PowerShell 7+. Este tutorial não abordará como fazer isso. Para aprender como, confira o link abaixo.

Instalando o OpenSSH

Você também precisará instalar o OpenSSH. O OpenSSH é o pacote que o PSRemoting usará para se conectar ao computador Linux remoto. Você pode instalar o OpenSSH via PowerShell usando o cmdlet Get-WindowsCapability conforme mostrado abaixo.

Dependendo se você pretende que seu host Windows seja um cliente e/ou um servidor, depende do recurso do Windows que você deve instalar. Se você estiver conectando do Windows Server para o Linux, você só precisa do cliente OpenSSH. Se estiver conectando do Linux para o Windows Server, você só precisa do servidor OpenSSH.

O comando abaixo encontra todos os recursos do Windows com um nome começando com OpenSSH e os instala, portanto, instalará tanto o cliente quanto o servidor.

Get-WindowsCapability -Online | Where-Object {$_.Name -like 'OpenSSH*'} | Add-WindowsCapability -Online

Se você quiser instalar apenas o cliente, altere o filtro no bloco de script Where-Object para OpenSSH.Client* e para o servidor o filtro deve ser OpenSSH.Server*.

Relacionado: Começando a usar SSH e PowerShell

Iniciando o Servidor SSH

Depois que o OpenSSH for instalado, ele abrirá o firewall do Windows na porta 22, mas não iniciará o serviço do servidor OpenSSH para ouvir na porta. Para iniciar o servidor OpenSSH no Windows Server, execute o seguinte comando PowerShell para iniciar o servidor OpenSSH e configurar o serviço para iniciar na inicialização.

Start-Service sshd
Set-Service sshd -StartupType Automatic

Configurando a Configuração do OpenSSH

O próximo passo é modificar o arquivo de configuração do daemon sshd, sshd_config. Dentro deste arquivo, você deve primeiro confirmar se a autenticação por senha está habilitada e também adicionar o subsistema PowerShell.

Esta parte do tutorial está configurando o método mais fácil usando senhas. Mais adiante no tutorial, você aprenderá como configurar a autenticação SSH usando certificados.

  1. Abra o arquivo de configuração no seu editor de texto favorito em C:\ProgramData\ssh\sshd_config.

2. Confirme se a autenticação por senha está habilitada, onde a linha PasswordAuthentication está comentada com um # no início ou está definida como yes.

Password Authentication

3. Adicione o subsistema PowerShell. Para o PowerShell 7, adicione a linha: Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo.

  • A opção -sshs é usada para permitir que o PowerShell 7 seja executado dentro do SSH como um subsistema.
  • A opção -NoLogo faz com que o PowerShell oculte as informações de direitos autorais ao iniciar, o que garante que não haja saída inesperada ao iniciar a sessão SSH.

4. Salve e feche o arquivo de configuração.

5. Reinicie o serviço sshd do Windows. Você pode fazer isso com o PowerShell executando Restart-Service sshd.

Agora você deve ter tudo configurado para se conectar do (cliente) e para (servidor) a este servidor Windows usando PSRemoting sobre SSH.

Configurando Linux (Servidor) para PSRemoting via SSH

Em seguida, vamos configurar o Linux com uma configuração semelhante; instalando o PowerShell e configurando o OpenSSH.

Observe que, como estamos usando CentOS, alguns dos comandos podem ser diferentes se você estiver usando uma distribuição diferente.

Instalando o PowerShell 7+

Primeiro, instale o PowerShell 7. Este tutorial não cobrirá como fazer isso. Em vez disso, certifique-se de verificar o seguinte link.

Relacionado: Como Baixar e Instalar o PowerShell 7 no Windows, macOS e Linux

Configurando o OpenSSH

Assim como no Windows Server, você precisará do OpenSSH. No entanto, ao contrário do Windows, o OpenSSH provavelmente já está instalado. Para este tutorial executando o CentOS 8, a máquina Linux já tem tanto o cliente quanto o servidor instalados por padrão, mas você pode verificar usando o comando abaixo:

rpm -qa openssh*

Se o cliente e o servidor estiverem instalados, você deverá obter algo semelhante à saída abaixo.

Configuring OpenSSH

Configure o arquivo de configuração do SSH por:

  1. Abrindo o arquivo sshd_config executando sudo vi /etc/ssh/sshd_config.

2. Adicionando o subsistema do PowerShell, assim como no Windows Server, adicionando a linha abaixo ao arquivo de configuração.

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

3. Saindo do vi e salvando o arquivo.

4. Reiniciando o daemon ssh para aplicar as mudanças executando sudo systemctl restart sshd.

Por padrão, a autenticação por senha e chave pública estará habilitada na maioria das instâncias, incluindo o CentOS 8. Não há necessidade de adicioná-las aqui.

Conectando de/para Windows/Linux com Autenticação por Senha

Depois de configurar tudo tanto nas máquinas Linux quanto Windows, é hora de colocar esse trabalho em prática. Vamos agora tentar conectar do Windows para o Linux e vice-versa usando autenticação por senha.

A autenticação baseada em senha parece e se sente familiar ao usar SSH com um nome de usuário e senha.

Comandos de Conexão

Para testar a conexão com PSRemoting via SSH do Windows para o Linux ou do Linux para o Windows, vamos usar tanto uma sessão “ad-hoc” usando o cmdlet Invoke-Command quanto uma sessão persistente usando New-PSSession.

Relacionado: Invoke-Command: A Melhor Maneira de Executar Código Remoto

Teste a conexão PSRemoting usando Invoke-Command por:

  1. Abrir o console do PowerShell 7.

2. Configurar parâmetros para o cmdlet Invoke-Command. Neste caso, os parâmetros abaixo se conectarão a um computador chamado SRV1 usando uma conta de usuário local no SRV1 chamada User.

$SessionParams = @{
     HostName = SRV1
     UserName = user
     SSHTransport = $true
 }

3. Executar Invoke-Command espalhando os parâmetros acima e executando um comando (neste caso, Get-Process) dentro de um bloco de script.

Relacionado: PowerShell Splatting: O que é e como funciona?

Invoke-Command @SessionParams -ScriptBlock {Get-Process}

Em seguida, você deve ver uma lista de todos os processos em execução no computador SRV1.

Você também pode estabelecer uma conexão persistente que permite conectar-se e interativamente executar comandos através de:

  1. Fornecendo os parâmetros acima e passando-os para o cmdlet New-PSSession.

2. Conectando-se a essa sessão de forma interativa usando o cmdlet Enter-PSSession.

Create a persistent session
 $session = New-PSSession @SessionParams
 Connect interactively
 Enter-PSSession -Session $session

3. Após executar o comando Enter-PSSession acima, você será solicitado a senha do usuário. Depois de autenticado, você estará conectado à outra máquina dentro do PowerShell.

Observe que nenhum dos comandos acima exigia o parâmetro comum Credential para fornecer um nome de usuário e senha para conectar. Em vez disso, usamos o parâmetro SSHTransport. O SSH não usa o mesmo processo de autenticação que o Windows usa para ir de um computador Windows para outro, então não pode interpretar objetos PSCredential.

Relacionado: Usando o cmdlet Get-Credential do PowerShell e todas as coisas relacionadas a credenciais.

Usando essa abordagem, você também pode aproveitar sessões desconectadas.

Configurando Autenticação Baseada em Chave Pública

Enquanto a autenticação baseada em senha é fácil de configurar e simples de usar, ela apresenta dois problemas.

  • Não há maneira de autenticar sem que alguém execute manualmente os comandos de forma segura.
  • Você está enviando uma senha pela rede.

Embora a senha, neste caso, esteja criptografada dentro da conexão SSH, o servidor recebe a senha em texto simples. Se o servidor estiver comprometido de alguma forma, isso pode se tornar um problema de segurança.

Gerando Chaves Públicas/Privadas

Ao usar autenticação de chave pública de qualquer tipo, você deve primeiro gerar uma chave pública a partir do cliente. Este requisito se aplica tanto ao Linux quanto ao Windows.

Em qualquer máquina do servidor Linux ou Windows:

  1. Execute ssh-keygen para gerar o par de chaves.

Se estiver executando ssh-keygen no Linux, saiba que ele gerará um par de chaves RSA por padrão. Muitos sistemas operacionais Linux mais recentes não permitirão o uso de pares de chaves RSA para autenticação por padrão. Para corrigir isso, use ssh-keygen -t ed25519.

2. Você será solicitado a fornecer um caminho para armazenar a chave privada e uma senha para criptografar a chave privada. Caso não queira fornecer uma senha durante a autenticação, pode deixar a senha em branco.

3. Apenas para Windows: Execute os comandos abaixo no PowerShell, onde <ProfilePath> é o caminho do seu perfil (provavelmente C:\Users\NomeDoUsuario).

Set-Service ssh-agent -StartupType Automatic
 Start-Service ssh-agent
 ssh-add .ssh\id_ed25519
 Remove-Item ~.ssh\id_ed25519

A implementação do OpenSSH do Windows possui um serviço ssh-agent que permite armazenar chaves privadas no contexto de segurança do Windows do usuário logado. Isso permite importar sua chave privada SSH para o ssh-agent e, em seguida, excluir a chave do sistema de arquivos para aumentar sua segurança.

4. Agora copie a chave pública gerada (<diretório inicial do usuário>\.ssh\id_ed25519.pub) para o servidor com o qual você deseja se conectar. O Windows não possui uma ferramenta para fazer essa cópia, então ela pode ser feita com o SCP. Execute o comando abaixo para copiar a chave pública para a máquina Linux.

scp C:\Users\Username.ssh\id_ed25519.pub username@ServerB:~/.ssh/authorized_keys

Para copiar do Linux para o Windows:

scp ~/.ssh/id_ed25519.pub administrator@ServerA:.ssh/authorized_keys

5. Insira a senha do usuário logado. Após inserir, o PowerShell/Bash copiará a chave e você será desconectado da máquina remota.

Conexão de/para Windows/Linux com autenticação de chave pública

Após configurar as chaves pública e privada, conectar de/para o Windows e o Linux deve ser fácil. É praticamente idêntico à autenticação baseada em senha.

Para conectar com uma chave pública no Windows, use os mesmos comandos mostrados em Comandos de Conexão acima. Você só notará uma diferença: não será solicitada a autenticação.

Abaixo está um exemplo de conexão do Linux para o Windows usando a opção -v para ver o que está acontecendo durante a conexão.

Example of connecting from Linux to Windows using the -v switch

Source:
https://adamtheautomator.com/psremoting-linux/