PowerShell remoto: la forma segura de administrar PCs (sin TeamViewer)

¿Te fue útil?

En algún momento toda organización de TI choca con la misma petición: “¿Puedes entrar por TeamViewer al portátil de Susan y arreglarlo?” Parece rápido, familiar y provoca el tic de un oficial de cumplimiento. El control remoto interactivo es la cinta adhesiva de las operaciones de endpoints: útil en una emergencia, pero no es con lo que construirías una casa.

PowerShell remoto te ofrece otra postura: no interactivo, registrado, con mínimos privilegios, automatizable y escalable. No es magia. Todavía hay que conectar identidad, transporte y políticas. Pero una vez hecho, dejas de “ayudar a un usuario” y empiezas a operar una flota.

Por qué el control remoto al estilo TeamViewer no debe ser el predeterminado

Las herramientas de control remoto resuelven un problema específico: “Necesito ver lo que ve el usuario”. Eso es legítimo para unos cuantos problemas orientados al usuario: bugs de interfaz, configuraciones por usuario raras, situaciones de “mi ratón está poseído”. Pero como canal de gestión por defecto para un parque Windows, es un desastre:

  • Es difícil auditarlo de forma significativa. Una grabación de vídeo no es un registro de seguridad. Quieres registros estructurados: quién ejecutó qué, cuándo, en qué equipo y con qué parámetros.
  • No escala. Tu tiempo se convierte en el cuello de botella. Las operaciones de flota requieren paralelismo.
  • Fomenta la administración por instinto. Hacer clic hasta que funcione. Luego nadie puede reproducirlo.
  • A menudo tiene privilegios excesivos. La toma de control de la sesión más admin local es una explosión de privilegios, especialmente cuando aparecen cuentas compartidas.
  • Amplía la superficie de ataque. Cualquier herramienta remota de terceros es otro agente, otro actualizador, otro conjunto de CVE y otra vía de confianza del proveedor.

PowerShell remoto no es “el nuevo TeamViewer”. Es un plano de gestión. Si lo tratas como tal, obtendrás reproducibilidad, responsabilidad y menos heroísmos a las 2 a. m.

Qué es realmente PowerShell remoto (y qué no es)

PowerShell remoting es una forma de ejecutar comandos PowerShell en otra máquina Windows usando el protocolo WS-Management (WinRM). En la práctica, hay tres patrones comunes:

  • Uno a uno ad hoc: Enter-PSSession para entrar en un host único para solución interactiva.
  • Uno a muchos fan-out: Invoke-Command -ComputerName ... para ejecutar lo mismo en muchos endpoints.
  • Sesiones persistentes: New-PSSession para reutilizar conexiones (útil cuando haces varios pasos).

Lo que no es: un reemplazo de escritorio remoto basado en píxeles. No arreglarás la cinta de opciones rota de Excel con él. Sí podrás averiguar si Excel se bloquea por un complemento, si la máquina está parcheada, si el disco está lleno o si el proceso está colgado—y lo harás sin pedir al usuario que “haga clic en Inicio y escriba…”.

Cuando la gente dice “PowerShell remoting es inseguro”, lo que suelen querer decir es: “Lo habilité deprisa, en HTTP, con autenticación débil y sin auditoría.” Eso no es un problema del protocolo. Es un problema de supervisión adulta.

Hechos e historia que importan en producción

Estos no son datos para un trivial. Explican por qué existen ciertos valores predeterminados y por qué algunas “buenas prácticas” dependen del contexto.

  1. PowerShell 2.0 (2009) introdujo el remoting usando WS-Management, alineándose con un estándar de la industria en lugar de inventar un esquema RPC propio.
  2. WinRM es anterior al uso moderno de PowerShell; formaba parte de la historia de gestión más amplia de Microsoft (WS-Man) para administración remota.
  3. Kerberos es la vía ideal en entornos de dominio. Muchos “problemas de seguridad” del remoting son en realidad “caímos a NTLM e ignoramos las restricciones de doble salto”.
  4. El problema del “doble salto” se hizo famoso porque los administradores intentaron acceder a recursos de red desde una sesión remota y toparon con límites de delegación de autenticación.
  5. El transporte HTTPS se hizo más común fuera de dominios porque evita algunos juegos de confianza necesarios cuando Kerberos no está disponible.
  6. JEA (Just Enough Administration) llegó en la era WMF 5.0 para traer mínimos privilegios y puntos finales basados en roles a PowerShell, no como una ocurrencia tardía.
  7. La transcripción de PowerShell y el registro de bloques de script evolucionaron mayormente como respuesta al abuso en el mundo real: los defensores necesitaban visibilidad de lo que se ejecutó, no solo nombres de procesos.
  8. Windows Remote Management usa SOAP internamente. No es “moderno”, pero es duradero—y la durabilidad importa en operaciones más que la moda.
  9. PowerShell 7+ usa una pila de remoting diferente (SSH es común), pero el remoting de Windows PowerShell vía WinRM sigue siendo la herramienta principal en muchos entornos.

Modelo de seguridad: identidad, transporte, autorización y auditoría

Identidad: ¿quién eres?

En un dominio, apunta a Kerberos. Te da autenticación mutua y reduce el riesgo de reproducción de credenciales. Fuera de un dominio, normalmente usarás cuentas locales (no es ideal), autenticación basada en certificados (mejor), o remoting por SSH si estandarizas en PowerShell 7+ y puedes operacionalizar claves SSH.

Regla práctica: si puedes usar Kerberos, úsalo. Si no puedes, usa HTTPS con certificados y restringe quién puede conectar.

Transporte: ¿cómo se protege el tráfico?

WinRM puede funcionar sobre HTTP (puerto 5985) o HTTPS (puerto 5986). En un escenario de dominio con Kerberos, HTTP no es automáticamente “texto plano y condenado”. La capa de autenticación (Kerberos) proporciona cifrado a nivel de mensaje. Aun así, HTTPS ofrece modelos mentales más simples, mejor compatibilidad a través de fronteras de confianza y menos debates con auditores sobre “¿esto está realmente cifrado?”.

No actives HTTPS como una casilla y ya está. Si despliegas certificados mal, solo has movido el problema a la gestión del ciclo de vida de certificados—donde los servicios olvidados van a morir.

Autorización: ¿qué estás autorizado a hacer?

Hay tres niveles de “permitido” que deberías importar:

  • ¿Puedes conectar en absoluto? Controlado por la configuración del listener de WinRM, reglas de firewall y membresía de grupos (por ejemplo, “Remote Management Users” local).
  • ¿Qué puedes ejecutar una vez conectado? Controlado por la configuración del endpoint, configuraciones de sesión y capacidades de rol de JEA.
  • ¿Qué pueden tocar los comandos? Mínimos privilegios en el SO: ACLs de archivos, permisos de servicio, derechos del registro, etc.

La mayoría de organizaciones se detiene en “puede conectar”. Eso es como instalar una cerradura en la puerta y dejar la bóveda abierta.

Auditoría: ¿puedes demostrar qué ocurrió?

La auditoría no es solo para cumplimiento. Es para respuesta a incidentes y para postmortems cuando algo se rompe y todos juran que no lo tocaron. Habilita:

  • Transcripción de PowerShell (captura flujos de entrada/salida en archivos).
  • Registro de bloques de script (registra contenido de scripts desofuscado en los registros de eventos).
  • Registro de módulos para módulos clave en entornos sensibles.
  • Recolección central (SIEM / recolección de logs). Los registros locales son donde la evidencia va a ser “borrada accidentalmente”.

Una idea parafraseada de un ingeniero orientado a la fiabilidad: idea parafraseada “Si no puedes medirlo, no puedes gestionarlo” — a menudo atribuida a Peter Drucker (idea parafraseada). En términos de operaciones: si no puedes registrarlo, no puedes defenderlo.

Configuración base: WinRM, firewall y valores sensatos

Hay dos preguntas separadas: “¿Puedo conectar técnicamente?” y “¿Debo permitir que esto sea un plano de gestión soportado?” La base que sigue asume que estás construyendo lo segundo.

Recomendaciones base (opinión)

  • Usa GPO para el inicio del servicio WinRM, configuración de listeners y reglas de firewall. Endpoints únicos son cómo te hacen sonar una alarma.
  • Restringe WinRM entrante a subredes de gestión / jump hosts. “Cualquier origen en la LAN” no es un modelo de amenaza.
  • Usa cuentas administrativas dedicadas (separadas de la identidad de uso diario). Si administras desde tu cuenta de email, un phishing te deja en problemas.
  • Empieza con Kerberos en dominio. Añade HTTPS donde ayude (endpoints en workgroup, cross-forest, auditores o redes no confiables).
  • Planifica JEA temprano si el helpdesk va a usar remoting. Es más fácil diseñar mínimos privilegios que adaptarlos después.

Chiste #1: Activar WinRM para todos y llamarlo “gestión remota” es como dejar las llaves puestas en el encendido para mejorar la “descubribilidad de llaves”.

WinRM sobre HTTPS: cuándo hacerlo y cómo

HTTPS vale la pena cuando se cumple cualquiera de lo siguiente:

  • Gestionas máquinas fuera del dominio (workgroup, DMZ, filiales adquiridas, laboratorios).
  • Debes atravesar redes donde no confías en el intermediario (Wi‑Fi de invitados, redes de socios, VPNs con segmentos desordenados).
  • Necesitas satisfacer a revisores de seguridad que creen que “HTTP” significa “sin cifrado”. A veces ganas ese argumento. Otras veces pones HTTPS y sigues adelante.

Dos advertencias prácticas:

  • La identidad del certificado debe coincidir con el host. Si enlazas un certificado con el nombre equivocado, los clientes fallarán con errores que parecen “flakiness” aleatorio de WinRM.
  • El ciclo de vida del certificado importa. Los certificados expirados no causan una advertencia suave; hacen fallar tu automatización a escala.

JEA: dar poder al helpdesk sin entregar el reino

Just Enough Administration (JEA) es cómo detienes la espiral de “todos son administradores locales” sin atar las manos al soporte. Con JEA publicas un endpoint restringido (una configuración de sesión PowerShell) que:

  • Sólo permite comandos específicos (o funciones que definas).
  • Se ejecuta bajo una cuenta virtual o administrada con derechos limitados.
  • Registra lo que se ejecutó.

Operativamente, JEA se trata menos de RBAC perfecto y más de reducir el radio de impacto. Si se compromete la credencial de un técnico de helpdesk, el atacante obtiene un martillo de juguete en lugar de la llave maestra.

Chiste #2: JEA es como darle a alguien una navaja suiza sin la hoja—sorprendentemente eficaz, y nadie termina “accidentalmente” siendo Domain Admin.

Tareas prácticas (con comandos, salidas y decisiones)

Estas son tareas reales que puedes ejecutar desde una máquina de gestión. Los comandos se muestran como si se ejecutaran en un host admin Linux usando PowerShell 7 (pwsh). Eso es deliberado: en 2026, muchos SREs ejecutan su plano de control en Linux, incluso cuando los endpoints son Windows. El objetivo de remoting sigue siendo WinRM.

Supuestos para los ejemplos:

  • El host de gestión tiene instalado pwsh.
  • Los objetivos son pc-014, pc-022, etc.
  • Entorno de dominio salvo que se indique lo contrario.

Tarea 1: Verificar la conectividad de red básica (no lo omitas)

cr0x@server:~$ pwsh -NoProfile -Command "Test-Connection -ComputerName pc-014 -Count 2 | Format-Table Address,ResponseTime,StatusCode"
Address       ResponseTime StatusCode
-------       ------------ ----------
10.40.12.14            3          0
10.40.12.14            2          0

Qué significa la salida: El host responde a ICMP y la latencia es baja. StatusCode 0 indica éxito.

Decisión: Si el ping falla, no discutas todavía con WinRM. Revisa enrutamiento/VPN, si el endpoint está en suspensión o el firewall del host bloquea ICMP. Si tu organización bloquea ICMP, pasa a pruebas de puertos.

Tarea 2: Comprobar que los puertos de WinRM son accesibles (5985/5986)

cr0x@server:~$ pwsh -NoProfile -Command "Test-NetConnection -ComputerName pc-014 -Port 5985 | Select-Object ComputerName,RemotePort,TcpTestSucceeded"
ComputerName RemotePort TcpTestSucceeded
------------ ---------- ---------------
pc-014             5985            True

Qué significa: La conectividad TCP funciona hacia el puerto 5985.

Decisión: Si es falso, tienes un problema de ruta de firewall (firewall del endpoint o ACL de red). Arregla eso antes de tocar credenciales o configuración de WinRM.

Tarea 3: Confirmar el estado del servicio WinRM de forma remota (cuando aún no puedes remotar)

Si WinRM no está activo, no puedes usar WinRM para comprobar WinRM. Usa lo que tengas fuera de banda: cumplimiento por GPO, gestión de endpoints, o como mínimo pide una comprobación local. En una flota gestionada, deberías consultarlo via tu herramienta de endpoint. Pero si puedes conectar a otro servicio (como SMB) puedes usar WMI/DCOM en algunos entornos—aunque eso es otra conversación de seguridad.

La conclusión operativa: construye informes de cumplimiento para que esto no sea un misterio a las 2 a. m.

Tarea 4: Crear una sesión remota y ejecutar un comando simple

cr0x@server:~$ pwsh -NoProfile -Command "$s = New-PSSession -ComputerName pc-014; Invoke-Command -Session $s -ScriptBlock { hostname; whoami }; Remove-PSSession $s"
PC-014
CORP\svc-ops-admin

Qué significa: El remoting funciona y estás ejecutando con la identidad esperada.

Decisión: Si la identidad es incorrecta (p. ej., esperabas una cuenta privilegiada), detente y corrige el uso de credenciales. No “pruebes otra vez” con cuentas al azar hasta que funcione.

Tarea 5: Verificar el mecanismo de autenticación (Kerberos vs NTLM)

cr0x@server:~$ pwsh -NoProfile -Command "Test-WSMan -ComputerName pc-014 | Select-Object ProductVendor,ProductVersion"
ProductVendor ProductVersion
------------- --------------
Microsoft Corporation OS: 10.0.19045 SP: 0.0 Stack: 3.0

Qué significa: WSMan responde. Esto no muestra explícitamente Kerberos/NTLM, pero es una comprobación de salud para la pila WSMan.

Decisión: Si Test-WSMan falla con errores de autenticación, revisa SPNs, desfase horario y confianza de dominio. Si falla con errores de transporte, comprueba listeners y firewall.

Tarea 6: Comprobar la configuración de listeners en el objetivo

cr0x@server:~$ pwsh -NoProfile -Command "Invoke-Command -ComputerName pc-014 -ScriptBlock { winrm enumerate winrm/config/Listener }"
Listener
    Address = *
    Transport = HTTP
    Port = 5985
    Hostname
    Enabled = true
    URLPrefix = wsman
    CertificateThumbprint
    ListeningOn = 10.40.12.14, 127.0.0.1

Qué significa: El endpoint escucha solo en HTTP.

Decisión: En dominio con ruta de red restringida, HTTP puede estar bien. Si esta máquina vive en un segmento menos confiable, planifica HTTPS y restricciones por IP de origen.

Tarea 7: Habilitar PowerShell remoting (para laboratorio o bootstrap inicial)

cr0x@server:~$ pwsh -NoProfile -Command "Invoke-Command -ComputerName pc-014 -ScriptBlock { Enable-PSRemoting -Force; Get-Service WinRM | Select-Object Status,StartType,Name }"
Status  StartType Name
------  --------- ----
Running Automatic WinRM

Qué significa: WinRM está habilitado y en ejecución.

Decisión: En producción, prefiere GPO/MDM para evitar desviaciones. La habilitación ad hoc es como acabas con reglas de firewall diferentes en cada máquina.

Tarea 8: Restringir quién puede conectar (Remote Management Users)

cr0x@server:~$ pwsh -NoProfile -Command "Invoke-Command -ComputerName pc-014 -ScriptBlock { net localgroup 'Remote Management Users' }"
Alias name     Remote Management Users
Comment        Members of this group can access WMI resources over management protocols (such as WS-Management via the Windows Remote Management service). This applies only to WMI namespaces that grant access to the user.

Members

-------------------------------------------------------------------------------
CORP\GG-Helpdesk-RemoteMgmt
The command completed successfully.

Qué significa: Solo el grupo especificado tiene derechos de gestión remota (asumiendo que no hayas concedido aparte derechos de administrador).

Decisión: Mantén este grupo cerrado. Si ves “Domain Users” aquí, tienes una falla de política, no técnica.

Tarea 9: Comprobar reglas de firewall efectivas para WinRM

cr0x@server:~$ pwsh -NoProfile -Command "Invoke-Command -ComputerName pc-014 -ScriptBlock { Get-NetFirewallRule -DisplayGroup 'Windows Remote Management' | Select-Object DisplayName,Enabled,Profile,Direction,Action | Format-Table -Auto }"
DisplayName                                  Enabled Profile  Direction Action
-----------                                  ------- -------  --------- ------
Windows Remote Management (HTTP-In)           True    Domain   Inbound   Allow
Windows Remote Management (HTTP-In)           False   Private  Inbound   Allow
Windows Remote Management (HTTP-In)           False   Public   Inbound   Allow

Qué significa: WinRM está permitido entrante en el perfil Domain únicamente. Esa es una buena base para portátiles corporativos.

Decisión: Si lo ves habilitado en Public, arréglalo. Exponer el perfil Público es cómo una Wi‑Fi de cafetería se convierte en un incidente.

Tarea 10: Comprobar nivel de parches y último reinicio (triaje 101)

cr0x@server:~$ pwsh -NoProfile -Command "Invoke-Command -ComputerName pc-014 -ScriptBlock { Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 3 HotFixID,InstalledOn; (Get-CimInstance Win32_OperatingSystem).LastBootUpTime }"
HotFixID  InstalledOn
-------   -----------
KB5034765 1/18/2026 12:00:00 AM
KB5034122 12/12/2025 12:00:00 AM
KB5033375 11/14/2025 12:00:00 AM

Friday, January 31, 2026 8:14:22 AM

Qué significa: La máquina tiene parches recientes y la hora del último arranque está visible.

Decisión: Si faltan parches, programa la remediación. Si el último arranque es antiguo, espera actualizaciones pendientes, pérdidas de memoria y comportamiento extraño de drivers. Las ventanas de reinicio son política, no preferencia personal.

Tarea 11: Comprobar presión de disco y decidir si estás en problemas de paginación

cr0x@server:~$ pwsh -NoProfile -Command "Invoke-Command -ComputerName pc-014 -ScriptBlock { Get-PSDrive -PSProvider FileSystem | Select-Object Name,Used,Free | Format-Table -Auto }"
Name Used         Free
---- ----         ----
C    210.34 GB    8.12 GB

Qué significa: C: tiene ~8 GB libres. En Windows moderno, eso coquetea con problemas (actualizaciones, archivos temporales, crecimiento del pagefile).

Decisión: Si el espacio libre es <10–15 GB en builds corporativos típicos, debes tratarlo como precursor de incidente. Limpia cachés, elimina bloat o amplía la unidad donde sea factible.

Tarea 12: Identificar qué consume disco (rápido, no perfecto)

cr0x@server:~$ pwsh -NoProfile -Command "Invoke-Command -ComputerName pc-014 -ScriptBlock { Get-ChildItem C:\Users -Directory | ForEach-Object { $size = (Get-ChildItem $_.FullName -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object Length -Sum).Sum; [pscustomobject]@{User=$_.Name;GB=[math]::Round($size/1GB,2)} } | Sort-Object GB -Descending | Select-Object -First 5 }"
User     GB
----     --
susan    48.12
public    2.05
default   0.76

Qué significa: Tamaños de perfiles de usuario. Susan está acumulando—probablemente en Descargas, caché de OneDrive o archivos PST locales.

Decisión: Si un perfil es enorme, decide entre una política de limpieza (Known Folder Move, Storage Sense) o una limpieza dirigida con aprobación del usuario. Ten cuidado al borrar; sé más cuidadoso con los PST.

Tarea 13: Comprobar salud de un servicio (ejemplo: servicio Windows Update)

cr0x@server:~$ pwsh -NoProfile -Command "Invoke-Command -ComputerName pc-014 -ScriptBlock { Get-Service wuauserv | Select-Object Name,Status,StartType }"
Name     Status  StartType
----     ------  ---------
wuauserv Running Manual

Qué significa: El servicio Windows Update se está ejecutando y está en Manual (configuración común).

Decisión: Si está Disabled, frecuentemente es un “alguien lo optimizó” problemático. Vuelve a habilitar vía política e investiga quién decidió que parchear era opcional.

Tarea 14: Capturar errores recientes del registro de eventos para una app que falla

cr0x@server:~$ pwsh -NoProfile -Command "Invoke-Command -ComputerName pc-014 -ScriptBlock { Get-WinEvent -FilterHashtable @{LogName='Application'; Level=2; StartTime=(Get-Date).AddHours(-6)} -MaxEvents 5 | Select-Object TimeCreated,ProviderName,Id,Message | Format-List }"
TimeCreated  : 2/5/2026 9:12:33 AM
ProviderName : Application Error
Id           : 1000
Message      : Faulting application name: OUTLOOK.EXE, version: 16.0.17328.20174, time stamp: 0x00000000 ...

Qué significa: Tienes una firma de fallo real (event ID 1000) y un marco temporal.

Decisión: Si los fallos se correlacionan con una actualización, aisla el build, revisa complementos y valida la ruta de remediación. No “reinstales Office” como primera respuesta; eso es ruido costoso.

Tarea 15: Comprobar presión de CPU/memoria y principales consumidores

cr0x@server:~$ pwsh -NoProfile -Command "Invoke-Command -ComputerName pc-014 -ScriptBlock { Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 Name,Id,CPU,WS | Format-Table -Auto }"
Name       Id    CPU        WS
----       --    ---        --
Teams    8420  1520.34  812345344
chrome   5124   980.12  623214592
MsMpEng  2140   301.88  315654144

Qué significa: Tiempo de CPU y conjunto de trabajo destacan procesos pesados.

Decisión: Si un proceso se desboca, decide si detenerlo, actualizarlo o escalar a ingeniería de endpoints. Para apps orientadas al usuario, coordina antes de matar procesos.

Tarea 16: Comprobar las opciones de endurecimiento de configuración de WinRM

cr0x@server:~$ pwsh -NoProfile -Command "Invoke-Command -ComputerName pc-014 -ScriptBlock { winrm get winrm/config/service }"
Service
    RootSDDL = O:NSG:BAD:P(A;;GA;;;BA)(A;;GA;;;SY)...
    MaxConcurrentOperations = 4294967295
    MaxConcurrentOperationsPerUser = 1500
    EnumerateTimeoutms = 240000
    AllowUnencrypted = false
    Auth
        Basic = false
        Kerberos = true
        Negotiate = true
        Certificate = false
        CredSSP = false

Qué significa: AllowUnencrypted está en false, Basic en false, Kerberos/Negotiate activados. CredSSP desactivado (bueno salvo que lo necesites intencionalmente).

Decisión: Si AllowUnencrypted=true o Basic=true en producción, trátalo como una violación de política. Arréglalo vía GPO e investiga cómo llegó a ese estado.

Tarea 17: Activar transcripción de PowerShell y registro de bloques de script (snippet de ejemplo)

cr0x@server:~$ pwsh -NoProfile -Command "Invoke-Command -ComputerName pc-014 -ScriptBlock { New-Item -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription' -Force | Out-Null; Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription' -Name EnableTranscripting -Type DWord -Value 1; Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription' -Name OutputDirectory -Type String -Value 'C:\ProgramData\PSTranscripts'; New-Item -Path 'C:\ProgramData\PSTranscripts' -ItemType Directory -Force | Out-Null; New-Item -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging' -Force | Out-Null; Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging' -Name EnableScriptBlockLogging -Type DWord -Value 1; 'OK' }"
OK

Qué significa: Las políticas se establecen localmente para habilitar transcripción y registro de bloques de script. En entornos reales, haz esto via GPO/MDM.

Decisión: Si habilitas transcripción, también debes pensar en almacenamiento (retención, permisos, reenvío). Los registros que cualquiera puede editar no son registros de auditoría; son un diario.

Tarea 18: Crear un endpoint restringido (verificación conceptual)

cr0x@server:~$ pwsh -NoProfile -Command "Invoke-Command -ComputerName pc-014 -ScriptBlock { Get-PSSessionConfiguration | Select-Object Name,Permission | Format-Table -Auto }"
Name          Permission
----          ----------
Microsoft.PowerShell NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed

Qué significa: Sólo está presente el endpoint por defecto (típico). Los endpoints JEA mostrarían configuraciones con nombres adicionales.

Decisión: Si el helpdesk usa remoting, crea un endpoint JEA y niega el endpoint completo. “Confianza” no es un control.

Guía rápida de diagnóstico

Cuando el remoting falla, puedes pasarte una hora discutiendo errores, o puedes triagear como si importara. Aquí está el orden que encuentra el cuello de botella más rápido.

Primero: ruta de red y puertos

  • ¿Puedes alcanzar el host? Ping o comprobación de ruta. Si el endpoint está en VPN, confirma que realmente esté conectado.
  • ¿Es alcanzable el puerto 5985/5986? Usa Test-NetConnection. Si TCP falla, es firewall/NACL, no PowerShell.
  • ¿Está el host en el perfil de red correcto? Si el portátil piensa que está en “Public”, tu regla de firewall solo Domain no aplicará.

Segundo: servicio WinRM y listener

  • ¿WinRM está en ejecución? En entornos gestionados, verifica via cumplimiento. Si puedes remotar, consulta Get-Service WinRM.
  • ¿Hay un listener? Comprueba winrm enumerate winrm/config/Listener. Sin listener, no hay fiesta.
  • ¿Se espera HTTPS? Si tu cliente apunta al 5986 y el host solo escucha en 5985, recibirás ruido de “está caído”.

Tercero: autenticación y autorización

  • Problemas Kerberos: revisa desfase horario, rarezas de SPN y confianza de dominio. También confirma que hayas usado el FQDN cuando sea necesario.
  • Cuentas locales/restricciones UAC remotas: el administrador local puede no comportarse como crees por la red sin cambios de política. Prefiere cuentas de dominio.
  • Membresía de grupos: confirma “Remote Management Users” (o admin) y permisos de cualquier endpoint JEA.

Cuarto: políticas y palancas de endurecimiento

  • Configuraciones de auth: Basic/unencrypted debería estar desactivado. Si están activados, puede haber políticas conflictivas.
  • Problemas TLS/certificados (HTTPS): mismatch de nombre de certificado o certificado expirado causa fallos opacos.
  • Interferencia de protección del endpoint: algunos conjuntos de reglas EDR pueden bloquear WinRM en “modo contención”. Confirma con operaciones de seguridad.

Errores comunes: síntomas → causa raíz → solución

1) “El cliente no puede conectarse al destino especificado en la solicitud”

Síntoma: Enter-PSSession falla inmediatamente; Test-WSMan agota el tiempo.

Causa raíz: Puerto bloqueado (firewall del endpoint, ACL de red), o WinRM no está escuchando.

Solución: Valida con Test-NetConnection -Port 5985/5986. Asegura que exista el listener de WinRM y que las reglas de firewall estén habilitadas en el perfil correcto.

2) “Acceso denegado” con credenciales válidas

Síntoma: La autenticación responde lo suficiente para denegar la creación de sesión.

Causa raíz: La cuenta no está en administradores locales o en “Remote Management Users”, o faltan permisos en un endpoint JEA.

Solución: Añade membresía de grupo via GPO/política local. Si usas JEA, concede explícitamente permisos al endpoint y prueba con el rol exacto.

3) Funciona en LAN, falla por VPN

Síntoma: La misma máquina es accesible en la oficina, inalcanzable remoto.

Causa raíz: Split tunneling, problemas DNS sobre VPN, o perfil de firewall diferente activado (Public vs Domain).

Solución: Confirma resolución de nombres sobre VPN, asegura el perfil de red correcto y permite WinRM solo desde redes de gestión/jump routing por VPN.

4) HTTPS falla con errores de certificado

Síntoma: 5986 es alcanzable pero las conexiones fallan mencionando SSL/TLS o confianza.

Causa raíz: CN/SAN incorrecto, certificado expirado o CA intermedia faltante en el cliente.

Solución: Reemite certificado con los SAN correctos, asegura que el cliente confíe en la cadena CA, automatiza la renovación y mantén la vinculación por thumbprint actualizada.

5) “Doble salto” rompe el acceso a compartidos desde una sesión remota

Síntoma: Remotas a la PC A y tratas de acceder a un recurso en Server B; la autenticación falla.

Causa raíz: La delegación no está permitida con el método de auth usado; no está configurada la delegación Kerberos/CredSSP.

Solución: Evita flujos de administración por saltos. Ejecuta el comando directamente contra el recurso (Server B) o usa delegación restringida donde corresponda. Usa CredSSP solo si entiendes y aceptas el riesgo.

6) Las sesiones son lentas y poco fiables bajo carga

Síntoma: El remoting funciona pero tarda 30–60 segundos, a veces falla, especialmente en operaciones masivas.

Causa raíz: Límites de concurrencia, presión de CPU en el endpoint, latencia DNS o jump host sobrecargado.

Solución: Añade throttling (-ThrottleLimit), mejora DNS y dimensiona hosts de gestión. No hagas fan-out a 2000 portátiles desde una VM pequeña y te sorprendas.

Listas de verificación / plan paso a paso

Fase 1: Establecer un plano de gestión seguro (semana 1)

  1. Define fuentes de gestión: elige jump hosts o una subred de gestión. Hazlo explícito.
  2. Habilita WinRM via GPO/MDM: inicia el servicio WinRM automáticamente; crea listeners; configura reglas de firewall.
  3. Establece política de autenticación: Kerberos/Negotiate activados; Basic desactivado; AllowUnencrypted desactivado.
  4. Restringe el alcance entrante: firewall permite solo desde fuentes de gestión. Si no puedes restringir origen, no has terminado.
  5. Define grupos: separa grupos para “puede remotear” y “puede administrar”. Pon humanos en grupos, no máquinas en excepciones.

Fase 2: Hacerlo auditable (semana 2)

  1. Habilita el registro de PowerShell: transcripción + registro de bloques de script.
  2. Reenvía logs: Windows Event Forwarding o tu agente SIEM. Asegura retención y controles de acceso.
  3. Etiqueta y alerta: alertas para patrones sospechosos (comandos codificados, eliminación masiva de procesos, desactivación de Defender).

Fase 3: Aplicar mínimos privilegios (semanas 3–4)

  1. Diseña roles JEA: por ejemplo, “Reiniciar servicios aprobados”, “Recolectar diagnósticos”, “Instalar paquete de drivers de impresora”.
  2. Crea endpoints JEA: publica configuraciones de sesión con capacidades de rol restringidas.
  3. Despliega gradualmente: piloto con helpdesk, itera comandos y luego expande.
  4. Elimina admin local donde sea posible: usa LAPS/Windows LAPS para break‑glass, no para operaciones diarias.

Fase 4: Operacionalizar a escala (continuo)

  1. Crea runbooks estándar: verificación de parches, limpieza de disco, recuperación de servicios, comprobaciones de renovación de certificados.
  2. Construye scripts idempotentes: seguros para ejecutarse dos veces; seguros para ejecutarse a las 2 a. m.; seguros para que los ejecute alguien nuevo.
  3. Prueba en un ring canario: el primer 1–5% de dispositivos recibe cambios temprano; observas; aprendes.

Tres micro-historias corporativas desde el terreno

Incidente provocado por una suposición errónea: “HTTP significa texto plano” (y el pánico que siguió)

Una empresa mediana desplegó WinRM para automatizar el helpdesk. Alguien vio el puerto 5985 en una petición de cambio de firewall y escaló: “Estamos enviando comandos admin sin cifrar por HTTP.” La dirección de seguridad imaginó contraseñas volando por la red como postales.

La reacción inmediata fue… energética. Se pausó el remoting, se abandonaron scripts a medias y la organización volvió a sesiones de control remoto interactivas “por seguridad”. Ironicamente eso era menos auditable y más privilegiado. Pero eh, tenía un icono de candado en la GUI.

Cuando pasó el polvo, repasamos el transporte real. En dominio, WinRM sobre HTTP con Kerberos proporciona cifrado a nivel de mensaje. Las credenciales no se envían como Basic y el tráfico no es legible en una captura casual de paquetes. El riesgo real no era “HTTP”; era “alcance entrante amplio.” La regla de firewall permitía WinRM desde cualquier lugar de la LAN corporativa, no solo desde hosts de gestión.

La solución no fue una cruzada por HTTPS en todas partes. Fue segmentación: restringir WinRM a jump boxes y estaciones admin, exigir Kerberos y activar auditoría. Añadimos HTTPS solo para segmentos especiales (máquinas de laboratorio fuera de dominio), pero fue una decisión dirigida, no una superstición.

La lección: no luches contra etiquetas. Lucha contra modelos de amenaza. Si alguien dice “HTTP es malo”, pregunta “desde dónde, autenticado cómo, registrado dónde y con qué radio de impacto?”

Una optimización que salió mal: scripts fan-out que derritieron el jump host del helpdesk

Otra organización decidió “modernizarse” y reemplazar el soporte manual de portátiles con PowerShell remoto paralelo. Buena idea. El primer script era una maravilla: comprobar disco, recopilar logs de eventos, reiniciar un servicio y verificar parches en toda la flota.

Lo ejecutaron un lunes por la mañana contra varios miles de endpoints con un throttle generoso por defecto. La CPU del jump host llegó al máximo. DNS fue machacado. Las sesiones WinRM se acumularon. Endpoints que ya estaban lentos se volvieron más lentos, lo que hizo que el script reintentara, lo que calentó más al jump host. Un pequeño DoS autoinfligido, vestido de “automatización”.

El postmortem fue dolorosamente aburrido: ningún bug exótico, ningún problema de proveedor. Solo concurrencia sin límites y falta de retropresión. El script asumía que si una sesión remota está bien, 3000 sesiones remotas son mejor.

Lo arreglamos tratando el remoting como cualquier sistema distribuido: límites de throttle, jitter, batching por OU/sitio y un guardrail explícito “detener cuando la tasa de fallos supera X%”. También separamos diagnósticos de solo lectura de acciones de escritura. Recopila primero y repara solo las máquinas que lo necesitan.

La lección: la operación es teoría de colas aplicada. Si no construyes límites, el entorno los impondrá por ti, normalmente en horas de trabajo.

La práctica aburrida pero correcta que salvó el día: logs, roles y registro

Una firma de servicios financieros tenía una política estricta: nadie usa remoting administrativo completo para soporte rutinario. El helpdesk usa un endpoint JEA. Todas las transcripciones de PowerShell van a un directorio protegido y se reenvían centralmente. Se consideraba “mucho proceso”.

Entonces llegó un incidente: un conjunto de desktops empezó a perder configuraciones de red. Los usuarios no podían acceder a apps internas. Comenzó el carrusel de culpas—equipo de red, equipo de endpoints, “quizá una actualización de Windows”, “quizá el cliente VPN”. Mientras, el negocio quería un culpable y una solución.

Los logs contaron la historia rápidamente. Un contratista recientemente incorporado había usado el endpoint JEA para ejecutar una función permitida de “reset de red” repetidamente, sin entender qué hacía. La función estaba permitida (por diseño) pero necesitaba protecciones: confirmaciones, límites de alcance y nombres más claros. Porque JEA restringía el conjunto de acciones, pudimos demostrar que no hizo nada más. Porque existía la transcripción, teníamos los parámetros exactos y los tiempos.

La solución no fue punitiva. Mejoramos la función, añadimos un modo “simulación”, y actualizamos el runbook. También añadimos una alerta para resets repetidos desde una misma cuenta de operador. El negocio obtuvo responsabilidad sin drama y operaciones obtuvo una herramienta más segura.

La lección: los controles aburridos son baratos comparados con incidentes emocionantes.

Preguntas frecuentes

1) ¿Necesito WinRM sobre HTTPS en un dominio?

No siempre. Con Kerberos, WinRM sobre HTTP aún proporciona comunicación cifrada. Usa HTTPS cuando necesites confianza más simple entre límites, gestión de workgroups o claridad para auditores.

2) ¿Puedo reemplazar TeamViewer por completo?

No. Algunos problemas requieren ver la interfaz. Pero puedes reemplazar el 80–95% de los casos de “entrar y clicar cosas” con diagnósticos scriptados y acciones dirigidas, y reservar el control remoto para el resto.

3) ¿Cuál es la línea base mínima segura?

Restringe WinRM entrante a fuentes de gestión, desactiva Basic y tráfico sin cifrar, usa Kerberos cuando sea posible y habilita el registro de PowerShell con recolección central.

4) ¿Por qué funciona el remoting como admin pero falla para usuarios de helpdesk?

Porque “puede conectar” y “puede hacer cosas útiles” son distintas. Da al helpdesk un endpoint JEA y permisos explícitos; no les des admin local y esperes lo mejor.

5) ¿Qué es el problema de “doble salto” en términos sencillos?

Entras remotamente a una máquina y luego intentas acceder a otro recurso de red desde esa sesión remota. La autenticación a menudo no se delega por defecto, así que el segundo salto falla. Diseña flujos para evitar encadenar saltos.

6) ¿Es CredSSP la solución correcta para doble salto?

A veces, pero trátalo como una sustancia controlada. Puede exponer credenciales al host remoto. Prefiere rediseño (ejecutar comandos directamente en el servidor objetivo) o delegación restringida donde corresponda.

7) ¿Cómo gestiono portátiles fuera de dominio de forma segura?

Usa WinRM sobre HTTPS con autenticación basada en certificados o considera PowerShell sobre SSH (PowerShell 7+). En cualquiera de los casos, restringe IPs de origen y exige controles de identidad fuertes.

8) ¿Cómo evito que esto se convierta en otra “configuración snowflake”?

Usa GPO/MDM para la configuración, mantiene un pequeño número de endpoints de sesión estandarizados y mide el cumplimiento continuamente. La configuración manual por máquina no escala.

9) ¿Qué debo registrar para respuesta a incidentes?

Transcripción de PowerShell, registro de bloques de script y registros de eventos relevantes de Windows (WinRM/Operational, Security). Reenvía centralmente con retención y controles de acceso a prueba de manipulación.

10) ¿PowerShell 7 cambia todo esto?

Te da mejores opciones multiplataforma (notablemente remoting por SSH), pero WinRM sigue profundamente integrado con la administración Windows. Muchas flotas ejecutarán ambos: WinRM para operaciones nativas de Windows, SSH cuando corresponda.

Conclusión: siguientes pasos prácticos

Si aún por defecto usas herramientas de control remoto para operaciones rutinarias de endpoints, estás pagando un impuesto en tiempo, auditabilidad y riesgo. PowerShell remoto es la alternativa adulta: es automatizable, registrable y compatible con el principio de mínimos privilegios—si lo construyes así.

Haz esto a continuación, en orden:

  1. Elige tus fuentes de gestión (jump hosts/estaciones admin) y restringe WinRM entrante a ellas.
  2. Estandariza WinRM vía política (servicio, listeners, firewall, auth). Elimina la deriva.
  3. Activa el registro y centralízalo antes de necesitarlo en una investigación.
  4. Despliega JEA para helpdesk y flujos comunes. Reduce el radio de impacto.
  5. Escribe runbooks que produzcan decisiones, no solo salidas. “Disco bajo” es una observación. “Libre < 10 GB dispara limpieza + ticket” es un sistema operacional.

El acceso remoto debería sentirse aburrido. Aburrido significa predecible. Predecible significa que puedes dormir.

← Anterior
Elige una distribución WSL que no te fastidie (Ubuntu vs Debian y otras)
Siguiente →
Instalar Node, Python y Go en WSL: entornos de desarrollo limpios sin ensuciar Windows

Deja un comentario