Búsqueda de sitios web

Tocando WinRM sobre SSL para configurar PSRemoting [Paso a paso]


Si ya está ejecutando comandos remotos con PowerShell Remoting (PSRemoting), sabrá lo conveniente que es esta función. Puede conectarse a una o más computadoras remotas y administrarlas como si fueran locales. PSRemoting depende de la Administración remota de Windows (WinRm) para que esto suceda, y si no está utilizando WinRM a través de SSL, es posible que se esté exponiendo a algunos problemas de seguridad.

En este tutorial práctico, aprenderá cómo configurar Windows en el cliente y el servidor para usar WinRM sobre HTTPS (SSL) y cómo usar certificados para autenticarse cuando usa WinRM sobre HTTPS.

Requisitos previos

Si desea seguir este tutorial, asegúrese de tener lo siguiente:

  • Una máquina con Windows 7+ o Server 2008 R2 que sirva como máquina cliente. Este tutorial utilizará Windows 10.
  • Una máquina con Windows 7+ o Server 2008 R2+ que sirva como máquina servidor. Este tutorial utilizará Windows Server 2019.
  • Acceso a una cuenta administrativa local o una cuenta con derechos administrativos locales en las máquinas cliente y servidor.
  • Una infraestructura de clave pública (PKI) de servicios de certificados de Active Directory (ADCS) configurada. Sería útil implementar ADCS para implementaciones de producción, pero es opcional para este tutorial y pruebas. El tutorial asumirá que la PKI está configurada como una CA empresarial o independiente.

¿Por qué utilizar WinRM sobre SSL?

PSRemoting, listo para usar, utiliza WinRM y le permite administrar máquinas cliente de forma remota. Una vez que PSRemoting establece una sesión a través de WinRM, cifra todas las comunicaciones del cliente al servidor. Además, el procedimiento de configuración para implementar PSRemoting sin HTTPS es bastante sencillo.

Si PSRemoting ya cifra la comunicación de la sesión, ¿por qué tomarse la molestia de configurar algo como ADCS y administrar certificados cuando ya está cifrado?

Porque durante el proceso de autenticación, las credenciales se pueden enviar en formatos inseguros dependiendo del tipo de autenticación utilizado.

Una de las formas más sencillas de hacer que PSRemoting sea más seguro es utilizar WinRM a través de HTTPS en lugar de HTTP. HTTPS encierra todo el flujo de conexión, incluida la autenticación dentro de la capa de cifrado que WinRM ya usa. HTTPS también proporciona simultáneamente una forma de validar que el servidor al que se está conectando es lo que cree que es.

Configuración de WinRM con un certificado autofirmado

Pasemos ahora a las manifestaciones. Para el primer truco, aprenderá cómo configurar la comunicación cifrada de PSRemoting con WinRm a través de SSL a través de un certificado autofirmado.

Usar un certificado autofirmado es una excelente manera de configurar un entorno de prueba sin preocuparse por una PKI como ADCS. Cuando utiliza un certificado autofirmado, genera un certificado que el propio servidor firma y que básicamente responde por sí mismo.

Existen certificados para realizar dos tareas normalmente; autenticar una conexión y cifrarla. El uso de un certificado autofirmado solo implementa lo último. Para validar la identidad de un servidor, siempre debe utilizar certificados proporcionados por PKI. Los certificados proporcionados por PKI proporcionan una única fuente de confianza en lugar de tener que confiar en cada certificado autofirmado de forma individual y manual.

La configuración de WinRM sobre SSL con un certificado autofirmado requiere cuatro pasos de alto nivel:

  1. Creando el certificado autofirmado en la máquina de destino.
  2. Configurar el servidor web WinRM (escucha) del servidor para utilizar el certificado autofirmado para la autenticación.
  3. Abrir los puertos apropiados en el firewall de Windows de la máquina de destino.
  4. Ejecutar un comando para iniciar una conexión remota en el cliente mediante un cmdlet de PowerShell como Enter-PSSession.

Repasemos ahora cada uno de los pasos.

Crear un certificado autofirmado

El primer paso es generar un certificado autofirmado en el servidor. Al conectarse, PSRemoting utilizará este certificado para cifrar todas las comunicaciones.

Mientras está en ServerB con una consola de Windows PowerShell abierta como administrador, ejecute el cmdlet New-SelfSignedCertificate como se muestra a continuación. La ejecución del siguiente comando genera un certificado para ServidorB.dominio.com en el almacén de certificados personales de la 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'

El parámetro Asunto debe ser el nombre de dominio completo del servidor. WinRm utiliza el asunto para validar la identidad del servidor.

Incluso si el servidor está en un grupo de trabajo, proporcione siempre un nombre de dominio, por ejemplo, dominio.com o lab.local. Al conectarse a la máquina de destino, el nombre DNS al que se conecta debe coincidir exactamente con el nombre del sujeto; la conexión fallará.

TextExtension le permite definir el uso de clave del certificado (2.5.29.37), que define para qué se permite utilizar el certificado. Defina el uso de claves para Autenticación del servidor ({text}1.3.6.1.5.5.7.3.1) para garantizar que el certificado solo se pueda utilizar para autenticar la identidad de un servidor.

Después de ejecutar New-SelfSignedCertificates, devolverá la huella digital del certificado que generó. Guárdelo ya que lo necesitará para el siguiente comando.

Configurar el oyente WinRM

Una vez que haya creado el certificado autofirmado en el servidor, configure el oyente WinRm para comenzar a usar ese certificado para la autenticación. Para hacer eso, use el comando winrm create como se muestra a continuación.

La Address=* en el siguiente comando informa al oyente que escuche en cualquier dirección IP configurada en el servidor. Si el servidor tiene varias direcciones IP configuradas, puede definir una dirección IP específica aquí.

Asegúrese de reemplazar el marcador de posición con la huella digital devuelta en el último paso.

winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname="ServerB.domain.com"; CertificateThumbprint="<cert thumbprint here>"}'

Abrir el puerto del firewall SSL de WinRM

A continuación, si utiliza el firewall de Windows, deberá permitir que el tráfico HTTPS ingrese al servidor a través del puerto HTTPS predeterminado 5986.

Abra el puerto del firewall para WinRM a través de HTTPS usando PowerShell ejecutando el siguiente comando.

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

Conexión al servidor a través de SSL

Ahora ha configurado el servidor Windows remoto para aceptar conexiones WinRM a través de SSL. En este momento, regrese al cliente e inicie cualquier comando de PSRemoting que desee probar. Por ejemplo, podría probar el cmdlet Enter-PSSession o Invoke-Command . Solo que ahora te conectas de forma un poco diferente que con la conexión HTTP predeterminada.

La conexión a través de HTTPS normalmente requiere un único parámetro UseSSL. Este parámetro le indica al comando que busque un escucha HTTPS WinRM frente a un escucha HTTP como lo haría de forma predeterminada. El parámetro UseSSL está disponible en más comandos de PSRemoting.

Para realizar pruebas, ejecute Enter-PSSession proporcionando el FQDN del servidor definido por el sujeto del certificado autofirmado, un objeto PSCredential para definir el nombre de usuario y la contraseña y, finalmente, el UseSSL cambiar parámetro.

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

Si ejecuta el comando anterior, recibirá un mensaje de error ya que configuró el oyente WinRM en el servidor para usar un certificado autofirmado. Siempre que el cliente PSRemoting intente autenticarse en el servidor, intentará validar el certificado y no podrá. Un certificado autofirmado no tiene una cadena de confianza que el comando pueda seguir y falla.

Para conectarse al servidor con un certificado autofirmado, debe anular la verificación de confianza del certificado. Puede hacerlo creando una PSSessionOption llamada SkipCACheck usando el cmdlet New-PSSessionOption y pasándola al comando como se muestra a continuación.

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

Puede definir muchos objetos PSSessionOption diferentes para agregar opciones para su conexión remota que no están incluidas directamente en el cmdlet Enter-PSSession.

Intente conectarse nuevamente y PowerShell ahora debería solicitarle las credenciales. Una vez proporcionado, ahora debería conectarse al servidor con WinRM a través de SSL.

Configuración de WinRM con un certificado firmado por CA

Si tiene la intención de utilizar PSRemoting usando WinRM en producción y desea permanecer lo más seguro posible, debe centrarse en WinRM sobre SSL usando un certificado firmado por una autoridad certificadora (CA).

Los certificados firmados por una CA mantienen una cadena de confianza y son más seguros que los simples certificados autofirmados porque validan la identidad del emisor del certificado.

Si está en un entorno de Active Directory, una de las formas más comunes de configurar una CA es con ADCS. Con ADCS, puede implementar certificados en dispositivos y configurar WinRM para usar esos certificados.

Este tutorial asumirá que ya tiene ADCS configurado y funcionando en su entorno.

Para una configuración rápida, puede seguir la documentación de Microsoft, pero para una implementación de producción, debe investigar detenidamente la configuración, ya que una autoridad de certificación es el centro de los esfuerzos de cifrado de una organización.

Crear la solicitud de certificado

El primer paso para utilizar un certificado emitido por una CA es crear el certificado. Para crear el certificado, primero debe emitir una solicitud de certificado mediante una solicitud de firma de certificado (CSR). Una vez generada, esta CSR se puede enviar a la CA para emitir el certificado.

Los pasos de esta sección funcionarán en implementaciones de ADCS cuando se trata de una CA empresarial o una CA independiente. Si está utilizando una CA empresarial integrada en AD, puede acelerar la inscripción de certificados sin seguir los pasos de esta sección mediante la inscripción automática de certificados o plantillas de certificados.

Mientras esté en el servidor (ServidorB en este tutorial), cree la CSR:

  1. Ejecute certlm.msc para abrir el administrador de certificados de Windows.

2. Haga clic derecho en la tienda Personal y seleccione Todas las tareas —> Operaciones avanzadas —> Crear solicitud personalizada. .

3. Para este tutorial, deje todos los campos como predeterminados hasta llegar a la página Información del certificado que se muestra a continuación. Cuando llegue aquí, haga clic en el menú desplegable Detalles y seleccione Propiedades.

4. Haga clic en la pestaña Asunto y cambie el Tipo a Nombre común.

5. Ahora ingrese el nombre de dominio completo del servidor si está unido a un dominio o solo el nombre de host si no lo está y haga clic en Agregar.

Tenga en cuenta que para usarlo con un escucha SSL de WinRM, debe usar el nombre común. Las otras opciones de la lista se pueden incluir, pero no son necesarias para esta implementación.

6. Haga clic en la pestaña Extensión.

7. Si no está utilizando la autenticación basada en certificados, que se tratará más adelante, expanda el encabezado uso extendido de clave y agregue Autenticación del servidor. Este tipo de uso de clave le dice a Windows que el certificado debe usarse para autenticar un servidor. Otras opciones incluyen autenticación de cliente, firma de código y cifrado de documentos.

8. Si desea configurar la autenticación basada en certificados, asegúrese de elegir Autenticación de cliente, como se muestra a continuación.

9. A continuación, haga clic en la pestaña Clave privada y observe las opciones de clave. Cambie el tamaño de clave predeterminado de 1024 a al menos 2048 para fortalecer la seguridad del par de claves.

También hay proveedores criptográficos más potentes disponibles en Windows, pero es posible que surjan incompatibilidades con software más antiguo.

10. Cierre la ventana Propiedades del certificado y guarde su configuración haciendo clic en Aceptar y haga clic en Siguiente para continuar con las indicaciones.

11. Ahora proporcione una ruta para generar la solicitud de certificado donde podrá recuperarla más tarde y haga clic en Finalizar.

Una vez completado, debería tener un archivo de solicitud de certificado.

Solicitar un certificado

Una vez que haya creado la solicitud, deberá enviarla a su CA, que generará el certificado. Para hacer eso:

  1. Navegue hasta su servidor ADCS en http:///certsrv/certrqxt.asp.

2. Abra el archivo de solicitud de certificado creado anteriormente con el bloc de notas y copie el texto del archivo de solicitud de certificado en el cuadro de solicitud. No se requiere nada para los atributos adicionales para este certificado.

3. Haga clic en Enviar. Esto enviará su solicitud a la CA. Luego debería mostrarle el ID de la solicitud, que se le solicitará más adelante. ¡Guarda esto! Lo necesitarás más tarde.

4. Ahora conéctese al servidor CA que forma parte de su entorno ADCS utilizando el Administrador de certificados de Windows en su computadora local o mediante RDP ejecutando certsrv.msc.

5. Haga clic en Solicitudes pendientes.

6. Haga clic derecho en la solicitud pendiente, haga clic en Todas las tareas y haga clic en Problema. Esto aprobará la solicitud que acaba de enviar según el ID de solicitud del paso anterior.

Inscribir el certificado

Ahora que ha emitido un certificado en la CA, es hora de inscribir el certificado en el servidor en el que está configurando WinRM. Para hacer eso:

  1. Desde el servidor en el que está configurando WinRM a través de SSL, navegue hasta http:///certckpn.asp. Debería ver una única solicitud de certificado pendiente.

Puede recuperar el certificado público desde una máquina diferente si es necesario, pero comenzar desde el servidor que está configurando para WinRM a través de HTTPS simplifica el proceso.

2. Seleccione la solicitud que envió de la lista y descargue la cadena de certificados. Debe descargar la cadena de certificados completa si el servidor que está configurando WinRM a través de HTTPS tiene su CA como servidor raíz.

3. Abra el archivo de la cadena de certificados. Debería ver un certificado para su servidor y cualquier certificado de autoridad certificadora que se encuentre más arriba en la cadena. Debajo de win2.lab.int está el certificado solicitado y WIN2-CA es el certificado de la CA que emitió el certificado para win2.lab.int..

4. Haga doble clic en uno de los certificados y, en el cuadro que se abre, haga clic en el botón Instalar certificado. Dado que este certificado será utilizado por el servidor y no por un usuario específico, cambie la opción a Máquina local.

5. Continúe con el mensaje dejando todo como predeterminado. Los valores predeterminados deben colocar el certificado en el almacén de certificaciones raíz de confianza.

6. Ahora repita los pasos 3 a 5 para cada uno de los demás certificados de la lista. Si tiene más de un certificado, asegúrese de que todos los demás certificados se coloquen en el almacén de autoridades de certificación intermedias.

Crear y configurar el oyente HTTPS de WinRM

Ahora que todos los certificados están instalados, es hora de configurar WinRM en su servidor para usar ese certificado para el oyente.

Con PowerShell abierto en el servidor WinRm:

  1. Ejecute el siguiente comando para configurar el oyente WinRm automáticamente. El comando winrm hace esto buscando en el almacén de certificados de la máquina local un certificado que coincida con los requisitos de WinRM.
winrm quickconfig -transport:https

2. El Firewall de Windows bloqueará el puerto HTTPS de WinRM 5986 de forma predeterminada. Para asegurarse de que el firewall permita el puerto de entrada 5986, ejecute el siguiente comando de PowerShell:

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

Probando la conexión SSL de WinRM

En este punto, estás listo para conectarte. Usando sus cmdlets PSRemoting favoritos como Invoke-Command o Enter-PSSession, conéctese al servidor y use el parámetro UseSSL.

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

Asegúrese siempre de que el valor del parámetro ComputerName coincida exactamente con el nombre común proporcionado durante la creación del certificado. Si intenta conectarse a un nombre de host diferente o quizás a la dirección IP del host, recibirá un error de discrepancia de certificado que provocará una falla en la conexión.

Configurar la autenticación basada en certificados

A estas alturas, ya debería tener un oyente WinRM configurado para usar HTTPS. Si es así, también puede utilizar un certificado de autenticación de usuario para autenticarse como usuario local en el servidor remoto. Usar un certificado de usuario es uno de los más seguros, pero lleva un tiempo configurarlo. Descubrirá que también supone mucho trabajo repetido, ya que cada certificado es exclusivo de la máquina cliente individual.

La autenticación basada en certificados solo funciona con cuentas de usuarios locales y no con usuarios de dominio.

Suponiendo que solicitó un certificado para la autenticación del cliente como se describe en la sección Creación de la solicitud de certificado, siga leyendo:

Habilitación de la autenticación de certificados y asignación del usuario en el servidor

  1. En el servidor, ejecute el comando Set-Item para permitir la autenticación basada en certificados.
Set-Item WSMan:\localhost\Service\Auth\Certificate -Value $true

2. A continuación, ejecute Get-ChildItem para buscar en el almacén de autoridades de certificación raíz de confianza la huella digital de la CA que emitió el certificado de autenticación del cliente. Para ello, filtre los certificados por el asunto que contiene el nombre de su CA.

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

3. Ejecute el siguiente comando donde SubjectName es el asunto del certificado de usuario que proporcionó al crear el certificado.

CAThumbprint es la huella digital de la CA recopilada con el comando anterior y luego se le solicitan las credenciales, el nombre de usuario y la contraseña del usuario local que se utilizará para la autenticación basada en certificados.

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

Prueba de autenticación basada en certificados

Ahora que la asignación de certificado a usuario está configurada, utilice el certificado en la máquina cliente para autenticarse sin proporcionar credenciales.

En el cliente en PowerShell, obtenga la huella digital del certificado del cliente buscando en el almacén de certificados personales.

Get-ChildItem Cert:\CurrentUser\My

Ahora especifique la huella digital en el parámetro CertificateThumbprint para un comando PSRemoting como se muestra a continuación.

Enter-PSSession -ComputerName ServerName -CertificateThumbprint <Thumbprint>

Tenga en cuenta que, dado que la autenticación basada en certificados solo se puede utilizar con un escucha HTTPS, -UseSSL está implícito, a diferencia de otros métodos de autenticación en los que debe especificar el uso de SSL.

Próximos pasos

Ahora que ha aprendido cómo configurar WinRM a través de SSL, obtenga más información sobre PSRemoting en nuestra publicación PowerShell Remoting: la guía definitiva.

¿Quiere obtener más información sobre PowerShell en general, incluido mucho sobre PSRemoting? ¡Consulte PowerShell para administradores de sistemas, el libro!

Artículos relacionados