Configurando o WinRM via SSL para Configurar o PSRemoting [Passo a Passo]

Se você já está executando comandos remotos com PowerShell Remoting (PSRemoting), você sabe o quão conveniente é essa funcionalidade. Você pode se conectar a um ou mais computadores remotos e gerenciá-los como se estivessem locais. PSRemoting depende do Windows Remote Management (WinRM) para funcionar, e se você não estiver usando o WinRM sobre SSL, pode estar se expondo a alguns problemas de segurança.

Neste tutorial prático, você aprenderá como configurar o Windows no cliente e no servidor para usar o WinRM sobre HTTPS (SSL) e como usar certificados para autenticação ao usar o WinRM sobre HTTPS.

Pré-requisitos

Se você deseja seguir este tutorial, certifique-se de ter o seguinte:

  • A Windows 7+ or Server 2008 R2 machine to serve as the client machine. This tutorial will use Windows 10.
  • A Windows 7+ or Server 2008 R2+ machine to serve as the server machine. This tutorial will use Windows Server 2019.
  • Acesso a uma conta administrativa local ou a uma conta com direitos administrativos locais em ambas as máquinas, cliente e servidor.
  • Um Active Directory Certificate Services (ADCS) Public Key Infrastructure (PKI) configurado. Será útil se você implementar o ADCS para implementações de produção, mas é opcional para este tutorial e testes. O tutorial presumirá que o PKI está configurado como uma CA corporativa ou independente.

Por que usar o WinRM sobre SSL?

O PSRemoting, por padrão, usa o WinRM e permite gerenciar máquinas clientes remotamente. Uma vez que o PSRemoting estabelece uma sessão sobre o WinRM, ele criptografa toda a comunicação do cliente para o servidor. Além disso, o procedimento de configuração para implementar o PSRemoting sem HTTPS é bastante simples.

Se o PSRemoting já criptografa a comunicação da sessão, por que passar pelo incômodo de configurar algo como o ADCS e gerenciar certificados quando já está criptografado?

Porque durante o processo de autenticação, as credenciais podem ser enviadas em formatos inseguros, dependendo do tipo de autenticação usado.

Uma das formas mais fáceis de tornar o PSRemoting mais seguro é usar o WinRM sobre HTTPS em vez de HTTP. O HTTPS envolve toda a sua conexão, incluindo a autenticação, dentro da camada de criptografia que o WinRM já usa. O HTTPS também fornece simultaneamente uma maneira de validar o servidor ao qual você está se conectando.

Configurando o WinRM com um Certificado Autoassinado

Agora vamos partir para as demonstrações. Para o primeiro truque, você aprenderá como configurar a comunicação do PSRemoting criptografada com o WinRM sobre SSL usando um certificado autoassinado.

Usar um certificado autoassinado é uma ótima maneira de configurar um ambiente de teste sem se preocupar com uma PKI como ADCS. Quando você usa um certificado autoassinado, gera um certificado que o próprio servidor assina, o que basicamente atesta por si só.

Os certificados existem para realizar duas tarefas geralmente; autenticar uma conexão e criptografá-la. Usar um certificado autoassinado apenas implementa o último. Para validar a identidade de um servidor, você sempre deve usar certificados fornecidos pela PKI. Os certificados fornecidos pela PKI oferecem uma única fonte de confiança em comparação com ter que confiar manualmente em cada certificado autoassinado individualmente.

Configurar o WinRM sobre SSL com um certificado autoassinado requer quatro etapas principais:

  1. Criar o certificado autoassinado na máquina de destino.
  2. Configurar o servidor servidor da web do WinRM (ouvinte) para usar o certificado autoassinado para autenticação.
  3. Abrir as portas apropriadas no firewall do Windows da máquina de destino.
  4. Executar um comando para iniciar uma conexão remota no cliente usando um cmdlet do PowerShell como Enter-PSSession.

Agora, vamos passar por cada etapa.

Criando um Certificado Autoassinado

A primeira etapa é gerar um certificado autoassinado no servidor. Ao se conectar, o PSRemoting usará este certificado para criptografar toda a comunicação.

Ao estar no ServerB com um console do Windows PowerShell aberto como administrador, execute o cmdlet New-SelfSignedCertificate como mostrado abaixo. A execução do comando a seguir gera um certificado para ServerB.domain.com na loja de certificados pessoais da máquina local.

New-SelfSignedCertificate -Subject 'CN=ServerB.domain.com' -TextExtension '2.5.29.37={text}1.3.6.1.5.5.7.3.1'
Creating self-signed certificate.

O parâmetro Subject deve ser o nome de domínio totalmente qualificado do servidor. O WinRM utiliza o subject para validar a identidade do servidor.

Mesmo que o servidor esteja em um grupo de trabalho, sempre forneça um nome de domínio, por exemplo, dominio.com ou lab.local. Ao conectar-se à máquina de destino, o nome DNS ao qual você se conecta deve coincidir exatamente com este nome de Subject, ou a conexão falhará.

O TextExtension permite que você defina o uso da chave do certificado (2.5.29.37), que define para que fins o certificado pode ser utilizado. Defina o uso da chave para Autenticação do Servidor ({text}1.3.6.1.5.5.7.3.1) para garantir que o certificado só possa ser usado para autenticar a identidade de um servidor.

Após a execução de New-SelfSignedCertificates, ele retornará o valor de impressão digital do certificado gerado. Salve isso, pois você precisará para o próximo comando.

Configurando o Ouvinte do WinRM

Depois de criar o certificado autoassinado no servidor, configure o listener WinRM para começar a usar esse certificado para autenticação. Para fazer isso, use o comando winrm create conforme mostrado abaixo.

O Address=* no comando abaixo informa ao ouvinte para escutar em qualquer endereço IP configurado no servidor. Se o servidor tiver vários endereços IP configurados, você pode definir um endereço IP específico aqui.

Certifique-se de substituir o espaço reservado <cert thumbprint here> pelo thumbprint retornado na última etapa.

winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname="ServerB.domain.com"; CertificateThumbprint="<cert thumbprint here>"}'
Creating WinRM listener with self-signed certificate.

Abrindo a Porta do Firewall SSL do WinRM

Em seguida, se você estiver usando o firewall do Windows, será necessário permitir o tráfego HTTPS que entra no servidor pela porta padrão HTTPS 5986.

Abra a porta do firewall para o WinRM sobre HTTPS usando o PowerShell executando o comando abaixo.

$FirewallParam = @{
    DisplayName = 'Windows Remote Management (HTTPS-In)'
    Direction = 'Inbound'
    LocalPort = 5986
    Protocol = 'TCP'
    Action = 'Allow'
    Program = 'System'
}
New-NetFirewallRule @FirewallParam

Conectando-se ao Servidor sobre SSL

Agora você configurou o servidor remoto do Windows para aceitar conexões WinRM sobre SSL. Neste momento, volte para o cliente e inicie quaisquer comandos PSRemoting que você gostaria de testar. Por exemplo, você poderia tentar o Enter-PSSession ou Invoke-Command cmdlet. Somente agora, você se conecta um pouco diferente do que com a conexão HTTP padrão.

Conectar via HTTPS geralmente requer um único parâmetro UseSSL. Este parâmetro indica ao comando para procurar um ouvinte WinRM HTTPS em vez de um ouvinte HTTP, como faria por padrão. O parâmetro UseSSL está disponível em mais comandos PSRemoting.

Para testar, execute Enter-PSSession fornecendo o FQDN do servidor conforme definido pelo assunto do certificado autoassinado, um objeto PSCredential para definir o nome de usuário e a senha, e finalmente, o parâmetro de comutação UseSSL.

Enter-PSSession -ComputerName ServerB.domain.com -Credential (Get-Credential) -UseSSL

Se você executar o comando acima, receberá uma mensagem de erro, pois configurou o ouvinte WinRM no servidor para usar um certificado autoassinado. Sempre que o cliente PSRemoting tenta autenticar no servidor, ele tentará validar o certificado e não conseguirá. Um certificado autoassinado não possui uma cadeia de confiança que o comando pode seguir e falha.

Failing certificate authority trust check with self-signed certificate.

Para conectar ao servidor com um certificado autoassinado, é necessário anular a verificação de confiança do certificado. Você pode fazer isso criando uma opção de PSSession chamada SkipCACheck usando o cmdlet New-PSSessionOption e passando-o para o comando conforme mostrado abaixo.

$PSSessionOption = New-PSSessionOption -SkipCACheck
Enter-PSSession -ComputerName ServerB -Credential (Get-Credential) -SessionOption $PSSessionOption -UseSSL

Você pode definir muitos objetos diferentes de PSSessionOption para adicionar opções à sua conexão remota que não estão incluídas diretamente no cmdlet Enter-PSSession.

Tente conectar novamente e o PowerShell agora deve solicitar suas credenciais. Uma vez fornecidas, você deverá agora se conectar ao servidor com WinRM sobre SSL!

Configurando o WinRM com um Certificado Assinado pela CA

Se você pretende usar o PSRemoting usando WinRM em produção e deseja permanecer o mais seguro possível, precisa focar no WinRM sobre SSL usando um certificado assinado por uma autoridade de certificação (CA).

Os certificados assinados pela CA mantêm uma cadeia de confiança e são mais seguros do que simples certificados autoassinados, pois validam a identidade do emissor do certificado.

Se você está em um ambiente de Active Directory, uma das formas mais comuns de configurar uma CA é com ADCS. Com o ADCS, você pode implantar certificados em dispositivos e configurar o WinRM para usar esses certificados.

Este tutorial vai pressupor que você já tenha o ADCS configurado e funcionando em seu ambiente.

Para uma configuração rápida, você pode seguir a documentação da Microsoft, mas para uma implementação de produção, você deve pesquisar intensamente a configuração, pois uma autoridade de certificação está no centro dos esforços de criptografia de uma organização.

Criando a Solicitação de Certificado

O primeiro passo para usar um certificado emitido por uma AC é criar o certificado. Para criar o certificado, você deve primeiro emitir uma solicitação de certificado usando um pedido de assinatura de certificado (CSR). Uma vez gerado, este CSR pode então ser enviado para a AC para emissão do certificado.

As etapas desta seção funcionarão em implementações do ADCS, seja uma AC corporativa ou uma AC independente. Se você estiver usando uma AC corporativa integrada ao AD, você pode acelerar a inscrição de certificados sem passar pelas etapas desta seção usando inscrição automática de certificados ou modelos de certificados.

Enquanto estiver no servidor (ServerB neste tutorial), crie o CSR:

  1. Execute certlm.msc para abrir o gerenciador de certificados do Windows.

2. Clique com o botão direito na loja Pessoal e selecione Todas as Tarefas —> Operações Avançadas —> Criar Solicitação Personalizada.

3. Para este tutorial, deixe todos os campos como padrão até chegar à página de Informações do Certificado mostrada abaixo. Quando chegar aqui, clique na lista suspensa Detalhes e selecione Propriedades.

Creating a custom certificate request.

4. Clique na guia Assunto e mude o Tipo para Nome Comum.

5. Agora, insira o nome de domínio totalmente qualificado do servidor se estiver associado a um domínio ou apenas o nome do host se não estiver e clique em Adicionar.

Specifying subject for certificate request.

Observe que para uso com um ouvinte SSL do WinRM, você deve usar o nome comum. As outras opções na lista podem ser incluídas, mas não são necessárias para esta implantação.

6. Clique na guia Extensão.

7. Se você não estiver usando autenticação baseada em certificado, que será abordada posteriormente, expanda o cabeçalho uso estendido da chave e adicione Autenticação do Servidor. Esse tipo de uso de chave informa ao Windows que o certificado deve ser usado para autenticar um servidor. Outras opções incluem Autenticação de Cliente, Assinatura de Código e Criptografia de Documentos.

8. Se você deseja configurar a autenticação baseada em certificado, certifique-se de escolher Autenticação de Cliente, como mostrado abaixo.

Requesting a client authentication certificate.

9. Em seguida, clique na guia Chave Privada e observe as Opções da Chave. Altere o tamanho da chave padrão de 1024 para pelo menos 2048 para fortalecer a segurança do par de chaves.

Também existem provedores criptográficos mais robustos disponíveis no Windows, mas você pode enfrentar incompatibilidade com software mais antigo.

10. Feche a janela Propriedades do Certificado e salve suas configurações clicando em OK e clique em Avançar para continuar com as instruções.

11. Agora forneça um caminho para a saída do pedido de certificado, onde você poderá recuperá-lo posteriormente, e clique em Concluir.

Uma vez concluído, você deverá ter um arquivo de solicitação de certificado.

Solicitando um Certificado

Depois de criar a solicitação, agora você precisará enviar essa solicitação ao seu CA, que gerará o certificado. Para fazer isso:

  1. Acesse o servidor ADCS em http://<nome do servidor FQDN>/certsrv/certrqxt.asp.
Certificate request submission web page.

2. Abra o arquivo de solicitação de certificado criado anteriormente com o Bloco de Notas e copie o texto do arquivo de solicitação de certificado para a caixa de solicitação. Nada é necessário para Atributos Adicionais para este certificado.

3. Clique em Enviar. Isso enviará sua solicitação para a CA. Deverá então mostrar o ID da solicitação, que será necessário posteriormente. Salve isso! Você vai precisar mais tarde.

4. Agora conecte-se ao servidor da CA que faz parte do seu ambiente ADCS usando o Gerenciador de Certificados do Windows no seu computador local ou via RDP executando certsrv.msc.

5. Clique em Solicitações Pendentes.

Winrm over SSL : Issuing certificate from pending request.

6. Clique com o botão direito na solicitação pendente, clique em Todas as Tarefas, e clique em Conceder. Isso aprovará a solicitação que você acabou de enviar com base no ID da solicitação da etapa anterior.

Registro do Certificado

Agora que você emitiu um certificado na CA, é hora de registrar o certificado no servidor em que está configurando o WinRM. Para fazer isso:

  1. Do servidor em que está configurando o WinRM sobre SSL, acesse http://<nome do servidor FQDN>/certckpn.asp. Você deverá ver uma única solicitação de certificado pendente.
Viewing status of pending certificate request.

Você pode recuperar o certificado público de uma máquina diferente, se necessário, mas começar a partir do servidor que está configurando para WinRM sobre HTTPS simplifica o processo.

2. Selecione a solicitação que você enviou da lista e faça o download da cadeia de certificados. Você deve baixar toda a cadeia de certificados se o servidor sobre o qual está configurando o WinRM via HTTPS tiver a sua CA como servidor raiz.

Downloading certificate chain.

3. Abra o arquivo da cadeia de certificados. Você deverá ver um certificado para o seu servidor e quaisquer certificados de autoridade de certificação superiores na cadeia. Abaixo win2.lab.int está o certificado solicitado, e WIN2-CA é o certificado da CA que emitiu o certificado para win2.lab.int.

Showing certificates inside of the certificate chain.

4. Dê um duplo clique em um dos certificados e, na caixa que abrir, clique no botão Instalar Certificado. Como este certificado será usado pelo servidor e não por um usuário específico, altere a opção para Máquina Local.

Importing certificate into the local machine certificate store.

5. Continue com o prompt deixando tudo como padrão. As configurações padrão devem colocar o certificado no Armazenamento de Certificados Raiz Confiáveis.

6. Agora repita os passos 3-5 para cada um dos outros certificados na lista. Se você tiver mais de um certificado, certifique-se de que todos os outros certificados sejam colocados no Armazenamento de Autoridades de Certificação Intermediárias.

Criar e Configurar o Ouvinte WinRM HTTPS

Agora que todos os certificados estão instalados, é hora de configurar o WinRM no seu servidor para usar esse certificado para o ouvinte.

Com o PowerShell aberto no servidor WinRM:

  1. Execute o comando abaixo para configurar automaticamente o ouvinte WinRM. O comando winrm faz isso ao procurar no repositório de certificados da máquina local por um certificado que atenda aos requisitos do WinRM.
winrm quickconfig -transport:https

2. O Firewall do Windows bloqueará a porta HTTPS do WinRM, que é 5986, por padrão. Para garantir que o firewall permita a porta de entrada 5986, execute o seguinte comando PowerShell:

$FirewallParam = @{
     DisplayName = 'Windows Remote Management (HTTPS-In)'
     Direction = 'Inbound'
     LocalPort = 5986
     Protocol = 'TCP'
     Action = 'Allow'
     Program = 'System'
 }
 New-NetFirewallRule @FirewallParam

Testando a Conexão SSL do WinRM

Neste ponto, você está pronto para se conectar. Usando seus cmdlets PSRemoting favoritos, como Invoke-Command ou Enter-PSSession, conecte-se ao servidor e use o parâmetro UseSSL.

Enter-PSSession -ComputerName ServerB.domain.com -UseSSL -Credential (Get-Credential)

Sempre certifique-se de que o valor do parâmetro ComputerName corresponda exatamente ao nome comum fornecido durante a criação do certificado. Se você tentar se conectar a um nome de host diferente ou talvez ao endereço IP do host, receberá um erro de incompatibilidade de certificado, causando uma falha na conexão.

Configurando a Autenticação Baseada em Certificado

Neste ponto, você deverá ter um ouvinte WinRM configurado para usar HTTPS. Se for o caso, você também pode usar um certificado de autenticação de usuário para autenticar como um usuário local no servidor remoto. O uso de um certificado de usuário é uma das opções mais seguras, mas leva um tempo para ser configurado. Você perceberá que também é um trabalho repetitivo, já que cada certificado é único para a máquina cliente individual.

A autenticação baseada em certificado só funciona com contas de usuário locais e não com usuários de domínio.

Supondo que você tenha solicitado um certificado para Autenticação de Cliente conforme abordado na seção Criando o Pedido de Certificado, continue lendo:

Habilitando Autenticação por Certificado e Mapeando o Usuário no Servidor

  1. No servidor, execute o comando Set-Item para permitir autenticação baseada em certificado.
Set-Item WSMan:\localhost\Service\Auth\Certificate -Value $true

2. Em seguida, execute Get-ChildItem para verificar a loja de Autoridades de Certificação Raiz Confiáveis e encontrar o thumbprint do CA que emitiu o certificado de autenticação do cliente. Para isso, filtre os certificados pelo assunto que contém o nome do seu CA.

Get-ChildItem Cert:\LocalMachine\Root | Where-Object {$_.Subject -like 'CA-Name'}

3. Execute o comando abaixo onde o SubjectName é o assunto do certificado do usuário que você forneceu ao criar o certificado

O CAThumbprint é o thumbprint do CA coletado com o comando anterior e, em seguida, serão solicitadas credenciais, o nome de usuário e a senha do usuário local que serão usadas para autenticação baseada em certificado.

New-Item WSMan:\localhost\ClientCertificate -Subject SubjectName -URI * -Issuer CAThumbprint -Credential (Get-Credential)

Testando Autenticação Baseada em Certificado

Agora que o mapeamento de certificado para usuário está configurado, use o certificado na máquina do cliente para autenticar sem fornecer credenciais.

No cliente em PowerShell, obtenha o thumbprint do certificado do cliente procurando na loja de certificados Pessoais.

Get-ChildItem Cert:\CurrentUser\My

Agora especifique o thumbprint no parâmetro CertificateThumbprint para um comando PSRemoting como abaixo.

Enter-PSSession -ComputerName ServerName -CertificateThumbprint <Thumbprint>

Observe que, uma vez que a autenticação baseada em certificado só é utilizável com um ouvinte HTTPS, -UseSSL é implicitamente utilizado, ao contrário de outros métodos de autenticação onde é necessário especificar o uso do SSL.

Próximos Passos

Agora que você aprendeu como configurar o WinRM sobre SSL, saiba mais sobre o PSRemoting em nosso post PowerShell Remoting: O Guia Definitivo!

Quer aprender mais sobre o PowerShell em geral, incluindo muitos detalhes sobre o PSRemoting? Confira PowerShell for Sysadmins, o livro!

Source:
https://adamtheautomator.com/winrm-ssl/