Realizar el segundo salto en la comunicación remota de PowerShell
El "problema del segundo salto" se refiere a una situación similar a la siguiente:
- Ha iniciado sesión en ServidorA.
- En ServidorA, inicia una sesión remota de PowerShell para conectarse a ServidorB.
- Un comando que ejecuta en ServidorB a través de la sesión de comunicación remota de PowerShell intenta obtener acceso a un recurso en ServidorC.
- Se deniega el acceso al recurso en ServerC, ya que las credenciales que ha usado para crear la sesión de comunicación remota de PowerShell no se pasan de ServerB a ServerC.
Hay varias formas de abordar este problema. En la tabla siguiente se enumeran los métodos por orden de preferencia.
Configuración | Nota: |
---|---|
CredSSP | Ofrece un equilibrio entre la facilidad de uso y la seguridad. |
Delegación limitada de Kerberos basada en recursos | Ofrece mayor seguridad con una configuración más sencilla. |
Delegación limitada de Kerberos | Ofrece una seguridad elevada, pero requiere un administrador de dominio. |
Delegación Kerberos (sin restricciones) | No se recomienda |
Just Enough Administration (JEA) | Puede proporcionar la mejor seguridad, pero requiere una configuración más detallada. |
PSSessionConfiguration con RunAs | Es una opción más sencilla de configurar, pero requiere la administración de credenciales. |
Pase de credenciales dentro de un bloque de script de Invoke-Command |
Es la opción más sencilla de usar, pero se deben proporcionar credenciales. |
CredSSP
Puede usar el proveedor de compatibilidad para seguridad de credenciales (CredSSP) para la autenticación. CredSSP copia en caché las credenciales en el servidor remoto (ServidorB), por lo que, al usarlo, le hace vulnerable a los ataques de robos de credenciales. Si el equipo remoto se ve comprometido, el atacante tiene acceso a las credenciales del usuario. CredSSP está deshabilitado de forma predeterminada tanto en el equipo del cliente como del servidor. Debe habilitar CredSSP solo en los entornos de mayor confianza. Por ejemplo, un administrador de dominio que se conecta a un controlador de dominio porque el controlador de dominio es de plena confianza.
Para obtener más información sobre problemas de seguridad cuando se usa CredSSP para la comunicación remota de PowerShell, vea Accidental Sabotage: Beware of CredSSP (Sabotaje accidental: tenga cuidado con CredSSP).
Para obtener más información acerca de los ataques de robo de credenciales, consulte Mitigating Pass-the-Hash (PtH) Attacks and Other Credential Theft (Mitigación de ataques Pass-the-Hash (PtH) y otros robos de credenciales).
Para obtener un ejemplo sobre cómo habilitar y usar CredSSP para la comunicación remota de PowerShell, vea Habilitar la funcionalidad "segundo salto" de PowerShell con CredSSP.
Ventajas
- Funciona en todos los servidores con Windows Server 2008 o versiones posteriores.
Desventajas
- Tiene vulnerabilidades de seguridad.
- Requiere la configuración de roles de cliente y servidor.
- no funciona con el grupo Usuarios protegidos. Para obtener más información, vea Grupo de seguridad de usuarios protegidos.
Delegación limitada de Kerberos
Puede usar la delegación limitada heredada (no basada en recursos) para realizar el segundo salto. Configure la delegación restringida de Kerberos con la opción "Usar cualquier protocolo de autenticación" para permitir la transición del protocolo.
Ventajas
- No requiere código especial
- Las credenciales no se almacenan.
Desventajas
- No admite el segundo salto para WinRM.
- Requiere el acceso de administrador de dominio para la configuración.
- Se debe configurar en el objeto de Active Directory del servidor remoto (ServidorB).
- Limitado a un dominio. No se pueden cruzar dominios ni bosques.
- Requiere derechos para actualizar objetos y nombres de entidad de seguridad de servicio (SPN).
- El ServidorB puede adquirir un vale de Kerberos para el ServidorC en nombre del usuario sin la intervención de este.
Nota:
Las cuentas de Active Directory que tienen la propiedad Cuenta es confidencial y no se puede delegar no se pueden delegar. Para más información, consulte Enfoque de seguridad: análisis de "La cuenta es confidencial y no se puede delegar" para Cuentas con privilegios y Herramientas y configuración de autenticación Kerberos.
Delegación limitada de Kerberos basada en recursos
Con la delegación limitada de Kerberos basada en recursos (introducida en Windows Server 2012), configura la delegación de credenciales en el objeto de servidor en que residen los recursos. En el escenario del segundo salto descrito anteriormente, puede configurar el ServidorC para especificar desde dónde aceptar las credenciales delegadas.
Ventajas
- Las credenciales no se almacenan.
- Se configura con los cmdlets de PowerShell. No requiere código especial.
- No requiere acceso de administrador de dominio para configurar.
- Funciona en dominios y bosques.
Desventajas
- Necesita Windows Server 2012 o versiones posteriores.
- No admite el segundo salto para WinRM.
- Requiere derechos para actualizar objetos y nombres de entidad de seguridad de servicio (SPN).
Nota:
Las cuentas de Active Directory que tienen la propiedad Cuenta es confidencial y no se puede delegar no se pueden delegar. Para más información, consulte Enfoque de seguridad: análisis de "La cuenta es confidencial y no se puede delegar" para Cuentas con privilegios y Herramientas y configuración de autenticación Kerberos.
Ejemplo
Veamos un ejemplo de PowerShell que configura la delegación restringida basada en recursos en el ServidorC para admitir credenciales delegadas de un ServidorB. En este ejemplo se supone que todos los servidores ejecutan versiones compatibles de Windows Server y que hay al menos un controlador de dominio de Windows para cada dominio de confianza.
Antes de que pueda configurar la delegación restringida, debe agregar la característica RSAT-AD-PowerShell
para instalar el módulo de PowerShell de Active Directory y después importar ese módulo en la sesión:
Add-WindowsFeature RSAT-AD-PowerShell
Import-Module ActiveDirectory
Get-Command -ParameterName PrincipalsAllowedToDelegateToAccount
Varios cmdlets disponibles tienen ahora un parámetro PrincipalsAllowedToDelegateToAccount:
CommandType Name ModuleName
----------- ---- ----------
Cmdlet New-ADComputer ActiveDirectory
Cmdlet New-ADServiceAccount ActiveDirectory
Cmdlet New-ADUser ActiveDirectory
Cmdlet Set-ADComputer ActiveDirectory
Cmdlet Set-ADServiceAccount ActiveDirectory
Cmdlet Set-ADUser ActiveDirectory
El parámetro PrincipalsAllowedToDelegateToAccount establece el atributo de objeto de Active Directory msDS-AllowedToActOnBehalfOfOtherIdentity, que contiene una lista de control de acceso (ACL) que especifica qué cuentas tienen permiso para delegar credenciales a la cuenta asociada (en nuestro ejemplo, será la cuenta del equipo de ServidorA).
Ahora vamos a configurar las variables que usaremos para representar los servidores:
# Set up variables for reuse
$ServerA = $env:COMPUTERNAME
$ServerB = Get-ADComputer -Identity ServerB
$ServerC = Get-ADComputer -Identity ServerC
WinRM (y, por tanto, la comunicación remota de PowerShell) se ejecuta como la cuenta de equipo de forma predeterminada. Puede ver esto si atiende a la propiedad StartName del servicio winrm
:
Get-CimInstance Win32_Service -Filter 'Name="winrm"' | Select-Object StartName
StartName
---------
NT AUTHORITY\NetworkService
Para que ServidorC permita la delegación desde una sesión de comunicación remota de PowerShell en ServidorB, debemos establecer el parámetro PrincipalsAllowedToDelegateToAccount en ServidorC al objeto de equipo de ServidorB:
# Grant resource-based Kerberos constrained delegation
Set-ADComputer -Identity $ServerC -PrincipalsAllowedToDelegateToAccount $ServerB
# Check the value of the attribute directly
$x = Get-ADComputer -Identity $ServerC -Properties msDS-AllowedToActOnBehalfOfOtherIdentity
$x.'msDS-AllowedToActOnBehalfOfOtherIdentity'.Access
# Check the value of the attribute indirectly
Get-ADComputer -Identity $ServerC -Properties PrincipalsAllowedToDelegateToAccount
El Centro de distribución de claves (KDC) de Kerberos copia en caché los intentos de acceso denegados (caché negativa) durante 15 minutos. Si ServerB ha intentado acceder previamente a ServerC, debe borrar la memoria caché en ServerB invocando el siguiente comando:
Invoke-Command -ComputerName $ServerB.Name -Credential $cred -ScriptBlock {
klist purge -li 0x3e7
}
También puede reiniciar el equipo o esperar al menos 15 minutos para borrar la caché.
Después de borrar la caché, puede ejecutar correctamente código desde el ServidorA a través del ServidorB hasta el ServidorC:
# Capture a credential
$cred = Get-Credential Contoso\Alice
# Test kerberos double hop
Invoke-Command -ComputerName $ServerB.Name -Credential $cred -ScriptBlock {
Test-Path \\$($using:ServerC.Name)\C$
Get-Process lsass -ComputerName $($using:ServerC.Name)
Get-EventLog -LogName System -Newest 3 -ComputerName $($using:ServerC.Name)
}
En este ejemplo, la variable $using
se usa para hacer visible la variable $ServerC
en el ServidorB.
Para obtener más información sobre la variable $using
, consulte about_Remote_Variables.
Para permitir que varios servidores deleguen credenciales en el ServidorC, establezca el valor del parámetro PrincipalsAllowedToDelegateToAccount en el ServidorC a una matriz:
# Set up variables for each server
$ServerB1 = Get-ADComputer -Identity ServerB1
$ServerB2 = Get-ADComputer -Identity ServerB2
$ServerB3 = Get-ADComputer -Identity ServerB3
$ServerC = Get-ADComputer -Identity ServerC
$servers = @(
$ServerB1,
$ServerB2,
$ServerB3
)
# Grant resource-based Kerberos constrained delegation
Set-ADComputer -Identity $ServerC -PrincipalsAllowedToDelegateToAccount $servers
Si desea realizar el segundo salto entre dominios, use el parámetro Server para especificar el nombre de dominio completo (FQDN) del controlador de dominio del dominio al que pertenece ServerB :
# For ServerC in Contoso domain and ServerB in other domain
$ServerB = Get-ADComputer -Identity ServerB -Server dc1.alpineskihouse.com
$ServerC = Get-ADComputer -Identity ServerC
Set-ADComputer -Identity $ServerC -PrincipalsAllowedToDelegateToAccount $ServerB
Para quitar la capacidad de delegar credenciales en el ServidorC, establezca el valor del parámetro PrincipalsAllowedToDelegateToAccount en el ServidorC en $null
:
Set-ADComputer -Identity $ServerC -PrincipalsAllowedToDelegateToAccount $null
Información sobre la delegación limitada de Kerberos basada en recursos
- Novedades de la autenticación Kerberos
- How Windows Server 2012 Eases the Pain of Kerberos Constrained Delegation, Part 1 (Cómo simplifica Windows Server 2012 el proceso de delegación limitada de Kerberos, parte 1)
- How Windows Server 2012 Eases the Pain of Kerberos Constrained Delegation, Part 2 (Cómo simplifica Windows Server 2012 el proceso de delegación limitada de Kerberos, parte 2)
- Reconocimiento de la delegación restringida de Kerberos para implementaciones de proxy de aplicación de Microsoft Entra con autenticación integrada de Windows
- [MS-ADA2 atributos de esquema de Active Directory M2.210 Atributo msDS-AllowedToActOnBehalfOfOtherIdentity]MS-ADA2
- [MS-SFU Extensiones de protocolo Kerberos: servicio para protocolo de delegación restringida y de usuario 1.3.2 S4U2proxy]MS-SFU
- Remote Administration Without Constrained Delegation Using PrincipalsAllowedToDelegateToAccount (Administración remota sin delegación limitada con PrincipalsAllowedToDelegateToAccount)
Delegación Kerberos (sin restricciones)
También puede usar la delegación sin restricciones de Kerberos para realizar el segundo salto. Al igual que todos los escenarios de Kerberos, las credenciales no se almacenan. Este método no admite el segundo salto para WinRM.
Advertencia
No proporciona control sobre dónde se usan las credenciales delegadas. Es menos seguro que CredSSP. Solo se debe usar para escenarios de prueba.
Just Enough Administration (JEA)
JEA le permite restringir qué comandos puede ejecutar un administrador durante una sesión de PowerShell. Se puede usar para resolver el problema del segundo salto.
Para obtener información sobre JEA, consulte Just Enough Administration.
Ventajas
- No hay mantenimiento de contraseña al usar una cuenta virtual.
Desventajas
- Requiere WMF 5.0 o versiones posteriores.
- Es necesario configurar cada servidor intermedio (ServidorB).
PSSessionConfiguration con RunAs
Puede crear una configuración de sesión en el ServidorB y establecer su parámetro RunAsCredential.
Para obtener información sobre el uso de PSSessionConfiguration y RunAs para resolver el problema del segundo salto, vea Otra solución a la comunicación remota de PowerShell de varios saltos.
Ventajas
- Funciona con cualquier servidor con WMF 3.0 o versiones posteriores.
Desventajas
- Requiere la configuración de PSSessionConfiguration y RunAs en cada servidor intermedio (ServidorB).
- Requiere el mantenimiento de la contraseña cuando se usa una cuenta de ejecución de dominio
Pasar credenciales dentro de un bloque de script de Invoke-Command
Se pueden pasar credenciales dentro del parámetro ScriptBlock de una llamada al cmdlet Invoke-Command.
Ventajas
- No requiere una configuración especial del servidor.
- Funciona en cualquier servidor que ejecute WMF 2.0 o versiones posteriores.
Desventajas
- Se requiere una técnica de código complicada.
- Si ejecuta WMF 2.0, requiere una sintaxis diferente para pasar argumentos a una sesión remota.
Ejemplo
En el ejemplo siguiente se muestra cómo pasar credenciales en un bloque de script:
# This works without delegation, passing fresh creds
# Note $Using:Cred in nested request
$cred = Get-Credential Contoso\Administrator
Invoke-Command -ComputerName ServerB -Credential $cred -ScriptBlock {
hostname
Invoke-Command -ComputerName ServerC -Credential $Using:cred -ScriptBlock {hostname}
}
Consulte también
Consideraciones de seguridad de comunicación remota de PowerShell