Creazione del secondo hop nella comunicazione remota di PowerShell
Il "problema relativo al secondo hop" si riferisce a una situazione simile alla seguente:
- Si è connessi al ServerA.
- Dal ServerA, si avvia una sessione remota di PowerShell per connettersi al ServerB.
- Un comando eseguito nel ServerB tramite la sessione di comunicazione remota di PowerShell prova ad accedere a una risorsa nel ServerC.
- L'accesso alla risorsa nel ServerC viene negato perché le credenziali usate per creare la sessione di comunicazione remota di PowerShell non vengono passate da ServerB a ServerC.
Ci sono diversi modi per risolvere questo problema. Nella tabella seguente sono elencati i metodi in ordine di preferenza.
Impostazione | Nota |
---|---|
CredSSP | Bilancia la semplicità d'uso e la sicurezza |
Delega vincolata Kerberos basata sulle risorse | Maggiore sicurezza con una configurazione più semplice |
Delega vincolata Kerberos | Sicurezza elevata, ma richiede un amministratore di dominio |
Delega Kerberos (non vincolata) | Non consigliata |
JEA (Just Enough Administration) | Può fornire la maggiore sicurezza ma richiede una configurazione più dettagliata |
PSSessionConfiguration tramite RunAs | Più semplice da configurare ma richiede la gestione delle credenziali |
Passare le credenziali all'interno di un blocco di script Invoke-Command |
Più semplice da usare ma è necessario fornire le credenziali |
CredSSP
È possibile usare Credential Security Support Provider (CredSSP) per l'autenticazione. CredSSP memorizza le credenziali nel server remoto (ServerB), quindi il suo uso potrebbe facilitare il furto di credenziali. Se il computer remoto viene compromesso, l'utente malintenzionato ha accesso alle credenziali dell'utente. Per impostazione predefinita, CredSSP è disabilitato sia nei computer client che nei computer server. È opportuno abilitare CredSSP solo negli ambienti più attendibili. Ad esempio, quando un amministratore di dominio si connette a un controller di dominio perché il controller di dominio è estremamente attendibile.
Per altre informazioni sui problemi di sicurezza relativi all'uso di CredSSP per la comunicazione remota di PowerShell, vedere Accidental Sabotage: Beware of CredSSP (Sabotaggio accidentale: attenzione a CredSSP).
Per altre informazioni sugli attacchi con furto di credenziali, vedere Mitigating Pass-the-Hash (PtH) Attacks and Other Credential Theft (Mitigazione degli attacchi Pass-the-Hash (PtH) e di altre tecniche per il furto delle credenziali).
Per un esempio di come abilitare e usare CredSSP per la comunicazione remota di PowerShell, vedere Abilitare la funzionalità "secondo hop" di PowerShell con CredSSP.
Vantaggi
- Funziona per tutti i server con Windows Server 2008 o versione successiva.
Svantaggi
- Presenta vulnerabilità di sicurezza.
- Richiede la configurazione dei ruoli client e server.
- non funziona con il gruppo Utenti protetti. Per altre informazioni, vedere Gruppo di sicurezza Utenti protetti.
Delega vincolata Kerberos
È possibile usare la delega vincolata legacy (non basata sulle risorse) per creare il secondo hop. Configurare la delega vincolata Kerberos con l'opzione "Usa un qualsiasi protocollo di autenticazione" per consentire la transizione di protocollo.
Vantaggi
- Non richiede codice speciale
- Le credenziali non vengono archiviate.
Svantaggi
- Non supporta il secondo hop per WinRM.
- Richiede l'accesso di amministratore di dominio per la configurazione.
- Deve essere configurato nell'oggetto di Active Directory del server remoto (ServerB).
- Limitato a un solo dominio. Non è possibile attraversare domini o foreste.
- Richiede diritti per aggiornare gli oggetti e i nomi dell'entità servizio (SPN).
- ServerB può acquisire un ticket Kerberos per ServerC per conto dell'utente senza l'intervento dell'utente.
Nota
Gli account Active Directory con account sensibili e non possono essere delegati . Per altre informazioni, vedere Security Focus: Analisi di "Account sensibile e non può essere delegata" per gli account con privilegi e gli strumenti di autenticazione Kerberos e Impostazioni.
Delega vincolata Kerberos basata sulle risorse
Co l'uso della delega vincolata Kerberos basata sulle risorse (introdotta in Windows Server 2012), si configura la delega delle credenziali nell'oggetto del server dove si trovano le risorse. Nello scenario del secondo hop illustrato in precedenza, si configura il ServerC per specificare da dove vengono accettate le credenziali delegate.
Vantaggi
- Le credenziali non vengono archiviate.
- Configurazione con cmdlet di PowerShell. Non è richiesto codice speciale.
- Non richiede l'accesso a domain Amministrazione istrator per la configurazione.
- Funziona attraverso domini e foreste.
Svantaggi
- Richiede Windows Server 2012 o versione successiva.
- Non supporta il secondo hop per WinRM.
- Richiede diritti per aggiornare gli oggetti e i nomi dell'entità servizio (SPN).
Nota
Gli account Active Directory con account sensibili e non possono essere delegati . Per altre informazioni, vedere Security Focus: Analisi di "Account sensibile e non può essere delegata" per gli account con privilegi e gli strumenti di autenticazione Kerberos e Impostazioni.
Esempio
Di seguito viene illustrato un esempio di PowerShell che configura una delega vincolata basata sulle risorse nel ServerC per consentire le credenziali delegate dal ServerB. In questo esempio si presuppone che tutti i server eseguano versioni supportate di Windows Server e che sia presente almeno un controller di dominio Windows per ogni dominio attendibile.
Prima di poter configurare la delega vincolata, è necessario aggiungere la funzionalità RSAT-AD-PowerShell
per installare il modulo di PowerShell per Active Directory e importare il modulo nella sessione:
Add-WindowsFeature RSAT-AD-PowerShell
Import-Module ActiveDirectory
Get-Command -ParameterName PrincipalsAllowedToDelegateToAccount
Molti cmdlet disponibili hanno ora un parametro 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
Il parametro PrincipalsAllowedToDelegateToAccount imposta l'attributo dell'oggetto di Active Directory msDS-AllowedToActOnBehalfOfOtherIdentity, che contiene un elenco di controllo di accesso (ACL). Questo elenco specifica gli account che hanno l'autorizzazione per delegare le credenziali all'account associato (in questo esempio, sarà l'account computer per il ServerA).
A questo punto vengono impostate le variabili da usare per rappresentare i server:
# Set up variables for reuse
$ServerA = $env:COMPUTERNAME
$ServerB = Get-ADComputer -Identity ServerB
$ServerC = Get-ADComputer -Identity ServerC
WinRM (e di conseguenza la comunicazione remota di PowerShell) viene eseguito come account del computer per impostazione predefinita. È possibile verificarlo esaminando la proprietà StartName del servizio winrm
:
Get-CimInstance Win32_Service -Filter 'Name="winrm"' | Select-Object StartName
StartName
---------
NT AUTHORITY\NetworkService
Per il ServerC per consentire la delega da una sessione di comunicazione remota di PowerShell nel ServerB, è necessario impostare il parametro PrincipalsAllowedToDelegateToAccount nel ServerC sull'oggetto computer del ServerB:
# 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
Le cache del Centro distribuzione chiavi (KDC) Kerberos hanno negato i tentativi di accesso (cache negativa) per 15 minuti. Se ServerB ha tentato in precedenza di accedere a ServerC, è necessario cancellare la cache in ServerB richiamando il comando seguente:
Invoke-Command -ComputerName $ServerB.Name -Credential $cred -ScriptBlock {
klist purge -li 0x3e7
}
È anche possibile riavviare il computer o attendere almeno 15 minuti per cancellare la cache.
Dopo la cancellazione della cache, è possibile eseguire codice dal ServerA attraverso il ServerB al ServerC:
# 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)
}
In questo esempio, la variabile $using
viene usata per rendere visibile la variabile $ServerC
al ServerB.
Per altre informazioni sulla variabile $using
, vedere about_Remote_Variables.
Per consentire a più server di delegare le credenziali al ServerC, impostare il valore del parametro PrincipalsAllowedToDelegateToAccount nel ServerC a una matrice:
# 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
Se si desidera eseguire il secondo hop tra domini, usare il parametro Server per specificare il nome di dominio completo (FQDN) del controller di dominio del dominio a cui appartiene 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
Per rimuovere l'abilità di delegare le credenziali al ServerC, impostare il valore del parametro PrincipalsAllowedToDelegateToAccount nel ServerC to $null
:
Set-ADComputer -Identity $ServerC -PrincipalsAllowedToDelegateToAccount $null
Informazioni sulla delega vincolata Kerberos basata sulle risorse
- Novità nell'autenticazione Kerberos
- How Windows Server 2012 Eases the Pain of Kerberos Constrained Delegation, Part 1 (Come Windows Server 2012 semplifica i problemi della delega vincolata Kerberos, parte 1)
- How Windows Server 2012 Eases the Pain of Kerberos Constrained Delegation, Part 1 (Come Windows Server 2012 semplifica i problemi della delega vincolata Kerberos, parte 2)
- Informazioni sulla delega vincolata Kerberos per le distribuzioni del proxy di applicazione Microsoft Entra con l'autenticazione integrata di Windows
- [Attributi dello schema di Active Directory MS-ADA2 M2.210 Attribute msDS-AllowedToActOnBehalfOfOtherIdentity]MS-ADA2
- [Estensioni del protocollo Kerberos MS-SFU : servizio per il protocollo di delega vincolata e utente 1.3.2 S4U2proxy]MS-SFU
- Remote Administration Without Constrained Delegation Using PrincipalsAllowedToDelegateToAccount (Amministrazione remota senza delega vincolata tramite PrincipalsAllowedToDelegateToAccount)
Delega Kerberos (non vincolata)
È anche possibile usare la delega kerberos senza vincoli per creare il secondo hop. Analogamente a tutti gli scenari Kerberos, le credenziali non vengono archiviate. Questo metodo non supporta il secondo hop per WinRM.
Avviso
Questo metodo non offre alcun controllo su dove vengono usate le credenziali delegate. È meno sicuro di CredSSP. Questo metodo deve essere usato solo per gli scenari di testing.
JEA (Just Enough Administration)
JEA consente di limitare i comandi che un amministratore può eseguire durante una sessione di PowerShell. Può essere usato per risolvere il problema del secondo hop.
Per informazioni su JEA, vedere Just Enough Administration.
Vantaggi
- Non richiede nessuna manutenzione delle password quando si usa un account virtuale.
Svantaggi
- Richiede WMF 5.0 o versione successiva.
- Richiede la configurazione in ogni server intermedio (ServerB).
PSSessionConfiguration tramite RunAs
È possibile creare una configurazione sessione nel ServerB e impostare il parametro RunAsCredential.
Per informazioni sull'uso di PSSessionConfiguration e RunAs per risolvere il problema del secondo hop, vedere Un'altra soluzione per creare più hop nella comunicazione remota di PowerShell.
Vantaggi
- Funziona con qualsiasi server che esegue WMF 3.0 o versione successiva.
Svantaggi
- Richiede la configurazione di PSSessionConfiguration e RunAs in ogni server intermedio (ServerB).
- Richiede la manutenzione delle password quando si usa un account RunAs di dominio
Passare le credenziali all'interno di un blocco di script Invoke-Command
È possibile passare le credenziali all'interno del parametro ScriptBlock di una chiamata al cmdlet Invoke-Command.
Vantaggi
- Non richiede una configurazione speciale del server.
- Funziona in qualsiasi server che esegue WMF 2.0 o versione successiva.
Svantaggi
- Richiede una tecnica di codice complicata.
- Se si esegue WMF 2.0, richiede una sintassi diversa per passare gli argomenti a una sessione remota.
Esempio
L'esempio seguente illustra come passare le credenziali in un blocco di 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}
}
Vedi anche
Considerazioni sulla sicurezza della comunicazione remota di PowerShell