Búsqueda de sitios web

Configuración de la comunicación remota de PowerShell (WinRM) a través de HTTPS


De forma predeterminada, el tráfico en una sesión de comunicación remota de PowerShell se cifra sin importar si se usa el protocolo de transporte HTTP (TCP/5985) o HTTPS (TCP/5986). De todos modos, todo el tráfico se cifra con la clave AES-256. Sin embargo, si se conecta a una computadora remota fuera de su bosque de AD o en un grupo de trabajo (Kerberos no puede establecer una relación de confianza), corre el riesgo de ataques de intermediarios. Microsoft recomienda utilizar siempre el transporte HTTPS para PSRemoting cuando se conecta a equipos de terceros.

En este artículo, le mostraremos cómo configurar la comunicación remota de PowerShell a través de HTTPS mediante un certificado SSL. Las sesiones de PSRemoting a través de HTTPS brindan un mayor nivel de seguridad de sesión cuando se conectan a computadoras fuera de su dominio/bosque de AD.

Los pasos a continuación describen cómo configurar un dispositivo remoto que ejecuta Windows al que desea conectarse mediante PowerShell Remoting a través de HTTPS.

Asegúrese de que su ubicación de red en Windows esté configurada como Privada o Dominio:

Get-NetConnectionProfile

Habilite WinRM y PSRemoting usando el comando:

Enable-PSRemoting -Force

En un dominio, puede configurar WinRM mediante GPO.

Para configurar HTTPS para WinRM, primero debe crear un certificado SSL en una computadora a la que desea conectarse. El certificado se utilizará para cifrar el tráfico de WinRM. Es más fácil crear un certificado autofirmado con PowerShell. En un entorno de dominio, puede emitir certificados WinRM automáticamente mediante la inscripción automática.

Especifique el nombre de la computadora y su dirección IP como el nombre DNS del certificado (es conveniente si su red no tiene un servidor DNS). Puede obtener ambos valores para el nombre alternativo del sujeto del certificado y generar un certificado autofirmado con PowerShell:

$hostName = $env:COMPUTERNAME
$hostIP=(Get-NetAdapter| Get-NetIPAddress).IPv4Address|Out-String
$srvCert = New-SelfSignedCertificate -DnsName $hostName,$hostIP -CertStoreLocation Cert:\LocalMachine\My
$srvCert

El nuevo certificado SSL aparecerá en el almacén de certificados personales de la computadora.

De forma predeterminada, se crean dos agentes de escucha en diferentes puertos para PowerShell Remoting en Windows:

  • HTTP en el puerto 5985

  • HTTPS en el puerto 5986

Puede obtener una lista de oyentes activos de WSMan como se muestra a continuación:

Get-ChildItem wsman:\localhost\Listener

Eliminar los oyentes HTTP y HTTPS predeterminados:

Get-ChildItem wsman:\localhost\Listener\ | Where-Object -Property Keys -like 'Transport=HTTP*' | Remove-Item -Recurse

Cree un nuevo agente de escucha HTTPS y vincúlelo con su certificado:

New-Item -Path WSMan:\localhost\Listener\ -Transport HTTPS -Address * -CertificateThumbPrint $srvCert.Thumbprint -Force

Cree una regla de Firewall de Windows que permita el tráfico HTTPS de WinRM o asegúrese de que esté activa:

New-NetFirewallRule -Displayname 'WinRM - Powershell remoting HTTPS-In' -Name 'WinRM - Powershell remoting HTTPS-In' -Profile Any -LocalPort 5986 -Protocol TCP

Reinicie el servicio WinRM:

Restart-Service WinRM

Puede verificar a qué huella digital de certificado está vinculado un agente de escucha HTTPS de WinRM con este comando:

WinRM e winrm/config/listener

El host remoto está configurado. Ahora debe exportar el certificado SSL a un archivo CER:

Export-Certificate -Cert $srvCert -FilePath c:\PS\SSL_PS_Remoting.cer

Tenga en cuenta que las configuraciones de cliente y servidor WinRM no permiten conexiones sin cifrar (de forma predeterminada):

dir WSMan:\localhost\Service | ? Name -eq AllowUnencrypted
dir WSMan:\localhost\Client | ? Name -eq AllowUnencrypted

Si es necesario, puede deshabilitar las conexiones no cifradas de la siguiente manera:

winrm set winrm/config/service '@{AllowUnencrypted="false"}'
winrm set winrm/config/client '@{AllowUnencrypted="false"}

'

Copie el archivo CER en la computadora de administración e impórtelo usando el siguiente comando (o implemente el certificado en otras computadoras usando GPO):

Import-Certificate -FilePath c:\PS\SSL_PS_Remoting.cer -CertStoreLocation Cert:\LocalMachine\root\

Luego, para conectarse a un host remoto de Windows usando WinRM HTTPS, debe usar el argumento -UseSSL en los cmdlets Enter-PSSession e Invoke-Command. En el siguiente ejemplo, nos conectaremos a un host remoto desde la consola de PowerShell por su dirección IP (tenga en cuenta que no hemos agregado esta dirección IP a TrustedHosts):

$SessionOption = New-PSSessionOption -SkipCNCheck
Enter-PSSession -Computername 192.168.13.4 -UseSSL -Credential maxbak -SessionOption $SessionOption

Al conectarse mediante una dirección IP sin la opción SkipCNCheck, se produce el siguiente error:

The SSL certificate contains a common name (CN) that does not match the hostname

Artículos relacionados