Creazione del secondo hop nella comunicazione remota di PowerShellMaking the second hop in PowerShell Remoting

Il "problema relativo al secondo hop" si riferisce a una situazione simile alla seguente:The "second hop problem" refers to a situation like the following:

  1. Si è connessi al ServerA .You are logged in to ServerA .
  2. Dal ServerA , si avvia una sessione remota di PowerShell per connettersi al ServerB .From ServerA , you start a remote PowerShell session to connect to ServerB .
  3. Un comando eseguito nel ServerB tramite la sessione di comunicazione remota di PowerShell prova ad accedere a una risorsa nel ServerC .A command you run on ServerB via your PowerShell Remoting session attempts to access a resource on ServerC .
  4. L'accesso alla risorsa nel ServerC viene negata, perché le credenziali usate per creare la sessione di comunicazione remota di PowerShell non vengono passate dal ServerB al ServerC .Access to the resource on ServerC is denied, because the credentials you used to create the PowerShell Remoting session are not passed from ServerB to ServerC .

Ci sono diversi modi per risolvere questo problema.There are several ways to address this problem. Nella tabella seguente sono elencati i metodi in ordine di preferenza.The following table lists the methods in order of preference.

ConfigurazioneConfiguration NoteNote
CredSSPCredSSP Bilancia la semplicità d'uso e la sicurezzaBalances ease of use and security
Delega vincolata Kerberos basata sulle risorseResource-based Kerberos constrained delegation Maggiore sicurezza con una configurazione più sempliceHigher security with simpler configuration
Delega vincolata KerberosKerberos constrained delegation Sicurezza elevata, ma richiede un amministratore di dominioHigh security but requires Domain Administrator
Delega Kerberos (non vincolata)Kerberos delegation (unconstrained) Non consigliataNot recommended
JEA (Just Enough Administration)Just Enough Administration (JEA) Può fornire la maggiore sicurezza ma richiede una configurazione più dettagliataCan provide the best security but requires more detailed configuration
PSSessionConfiguration tramite RunAsPSSessionConfiguration using RunAs Più semplice da configurare ma richiede la gestione delle credenzialiSimpler to configure but requires credential management
Passare le credenziali all'interno di un blocco di script Invoke-CommandPass credentials inside an Invoke-Command script block Più semplice da usare ma è necessario fornire le credenzialiSimplest to use but you must provide credentials

CredSSPCredSSP

È possibile usare Credential Security Support Provider (CredSSP) per l'autenticazione.You can use the Credential Security Support Provider (CredSSP) for authentication. CredSSP memorizza le credenziali nel server remoto ( ServerB ), quindi il suo uso potrebbe facilitare il furto di credenziali.CredSSP caches credentials on the remote server ( ServerB ), so using it opens you up to credential theft attacks. Se il computer remoto viene compromesso, l'utente malintenzionato ha accesso alle credenziali dell'utente.If the remote computer is compromised, the attacker has access to the user's credentials. Per impostazione predefinita, CredSSP è disabilitato sia nei computer client che nei computer server.CredSSP is disabled by default on both client and server computers. È opportuno abilitare CredSSP solo negli ambienti più attendibili.You should enable CredSSP only in the most trusted environments. Ad esempio, quando un amministratore di dominio si connette a un controller di dominio perché il controller di dominio è estremamente attendibile.For example, a domain administrator connecting to a domain controller because the domain controller is highly trusted.

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).For more information about security concerns when using CredSSP for PowerShell Remoting, see Accidental Sabotage: Beware of 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).For more information about credential theft attacks, see Mitigating Pass-the-Hash (PtH) Attacks and Other Credential Theft.

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.For an example of how to enable and use CredSSP for PowerShell remoting, see Enable PowerShell "Second-Hop" Functionality with CredSSP.

VantaggiPros

  • Funziona per tutti i server con Windows Server 2008 o versione successiva.It works for all servers with Windows Server 2008 or later.

SvantaggiCons

  • Presenta vulnerabilità di sicurezza.Has security vulnerabilities.
  • Richiede la configurazione dei ruoli client e server.Requires configuration of both client and server roles.
  • Non funziona con il gruppo Utenti protetti.Does not work with the Protected Users group. Per altre informazioni, vedere Gruppo di sicurezza Utenti protetti.For more information, see Protected Users Security Group.

Delega vincolata KerberosKerberos constrained delegation

È possibile usare la delega vincolata legacy (non basata sulle risorse) per creare il secondo hop.You can use legacy constrained delegation (not resource-based) to make the second hop. Configurare la delega vincolata Kerberos con l'opzione "Usa un qualsiasi protocollo di autenticazione" per consentire la transizione di protocollo.Configure Kerberos constrained delegation with the option "Use any authentication protocol" to allow protocol transition.

VantaggiPros

  • Non richiede codice specialeRequires no special coding
  • Le credenziali non vengono archiviate.Credentials are not stored.

SvantaggiCons

  • Non supporta il secondo hop per WinRM.Does not support the second hop for WinRM.
  • Richiede l'accesso di amministratore di dominio per la configurazione.Requires Domain Administrator access to configure.
  • Deve essere configurato nell'oggetto di Active Directory del server remoto ( ServerB ).Must be configured on the Active Directory object of the remote server ( ServerB ).
  • Limitato a un solo dominio.Limited to one domain. Non funziona attraverso domini o foreste.Cannot cross domains or forests.
  • Richiede diritti per aggiornare gli oggetti e i nomi dell'entità servizio (SPN).Requires rights to update objects and Service Principal Names (SPNs).
  • ServerB può acquisire un ticket Kerberos per ServerC per conto dell'utente senza l'intervento dell'utente.ServerB can acquire a Kerberos ticket to ServerC on behalf of the user without user intervention.

Nota

gli account di Active Directory che hanno il set di proprietà L'account è sensibile e non può essere delegato non possono essere delegati.Active Directory accounts that have the Account is sensitive and cannot be delegated property set cannot be delegated. Per altre informazioni, vedere Security Focus: Analisi del set di proprietà 'L'account è sensibile e non può essere delegato' per gli account privilegiati e Strumenti e impostazioni dell'autenticazione Kerberos.For more information, see Security Focus: Analysing 'Account is sensitive and cannot be delegated' for Privileged Accounts and Kerberos Authentication Tools and Settings.

Delega vincolata Kerberos basata sulle risorseResource-based Kerberos constrained delegation

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.Using resource-based Kerberos constrained delegation (introduced in Windows Server 2012), you configure credential delegation on the server object where resources reside. Nello scenario del secondo hop illustrato in precedenza, si configura il ServerC per specificare da dove vengono accettate le credenziali delegate.In the second hop scenario described above, you configure ServerC to specify from where it accepts delegated credentials.

VantaggiPros

  • Le credenziali non vengono archiviate.Credentials are not stored.
  • Configurazione con cmdlet di PowerShell.Configured using PowerShell cmdlets. Non è richiesto codice speciale.No special coding required.
  • Non è richiesto l'accesso di amministratore di dominio per la configurazione.Does not require Domain Administrator access to configure.
  • Funziona attraverso domini e foreste.Works across domains and forests.

SvantaggiCons

  • Richiede Windows Server 2012 o versione successiva.Requires Windows Server 2012 or later.
  • Non supporta il secondo hop per WinRM.Does not support the second hop for WinRM.
  • Richiede diritti per aggiornare gli oggetti e i nomi dell'entità servizio (SPN).Requires rights to update objects and Service Principal Names (SPNs).

Nota

gli account di Active Directory che hanno il set di proprietà L'account è sensibile e non può essere delegato non possono essere delegati.Active Directory accounts that have the Account is sensitive and cannot be delegated property set cannot be delegated. Per altre informazioni, vedere Security Focus: Analisi del set di proprietà 'L'account è sensibile e non può essere delegato' per gli account privilegiati e Strumenti e impostazioni dell'autenticazione Kerberos.For more information, see Security Focus: Analysing 'Account is sensitive and cannot be delegated' for Privileged Accounts and Kerberos Authentication Tools and Settings.

EsempioExample

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 .Let's look at a PowerShell example that configures resource-based constrained delegation on ServerC to allow delegated credentials from a ServerB . In questo esempio si presuppone che tutti i server eseguano Windows Server 2012 o versione successiva, e che ci sia almeno un controller di dominio di Windows Server 2012 a cui appartenga uno dei server.This example assumes that all servers are running Windows Server 2012 or later, and that there is at least one Windows Server 2012 domain controller each domain to which any of the servers belong.

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:Before you can configure constrained delegation, you must add the RSAT-AD-PowerShell feature to install the Active Directory PowerShell module, and then import that module into your session:

Add-WindowsFeature RSAT-AD-PowerShell
Import-Module ActiveDirectory
Get-Command -ParameterName PrincipalsAllowedToDelegateToAccount

Molti cmdlet disponibili hanno ora un parametro PrincipalsAllowedToDelegateToAccount :Several available cmdlets now have a PrincipalsAllowedToDelegateToAccount parameter:

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 ).The PrincipalsAllowedToDelegateToAccount parameter sets the Active Directory object attribute msDS-AllowedToActOnBehalfOfOtherIdentity , which contains an access control list (ACL) that specifies which accounts have permission to delegate credentials to the associated account (in our example, it will be the machine account for ServerA ).

A questo punto vengono impostate le variabili da usare per rappresentare i server:Now let's set up the variables we'll use to represent the servers:

# 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.WinRM (and therefore PowerShell remoting) runs as the computer account by default. È possibile verificarlo esaminando la proprietà StartName del servizio winrm:You can see this by looking at the StartName property of the winrm service:

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 :For ServerC to allow delegation from a PowerShell remoting session on ServerB , we must set the PrincipalsAllowedToDelegateToAccount parameter on ServerC to the computer object of 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.The Kerberos Key Distribution Center (KDC) caches denied-access attempts (negative cache) for 15 minutes. Se il ServerB ha tentato in precedenza di accedere al ServerC , sarà necessario cancellare la cache nel ServerB chiamando il comando seguente:If ServerB has previously attempted to access ServerC , you will need to clear the cache on ServerB by invoking the following command:

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.You could also restart the computer, or wait at least 15 minutes to clear the cache.

Dopo la cancellazione della cache, è possibile eseguire codice dal ServerA attraverso il ServerB al ServerC :After clearing the cache, you can successfully run code from ServerA through ServerB to 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 .In this example, the $using variable is used to make the $ServerC variable visible to ServerB . Per altre informazioni sulla variabile $using, vedere about_Remote_Variables.For more information about the $using variable, see 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:To allow multiple servers to delegate credentials to ServerC , set the value of the PrincipalsAllowedToDelegateToAccount parameter on ServerC to an array:

# 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

# Grant resource-based Kerberos constrained delegation
Set-ADComputer -Identity $ServerC `
    -PrincipalsAllowedToDelegateToAccount @($ServerB1,$ServerB2,$ServerB3)

Se si vuole creare il secondo hop tra domini, aggiungere un nome di dominio completo (FQDN) del controller di dominio del dominio a cui appartiene il ServerB :If you want to make the second hop across domains, add fully-qualified domain name (FQDN) of the domain controller of the domain to which ServerB belongs:

# 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:To remove the ability to delegate credentials to ServerC, set the value of the PrincipalsAllowedToDelegateToAccount parameter on ServerC to $null:

Set-ADComputer -Identity $ServerC -PrincipalsAllowedToDelegateToAccount $null

Informazioni sulla delega vincolata Kerberos basata sulle risorseInformation on resource-based Kerberos constrained delegation

Delega Kerberos (non vincolata)Kerberos delegation (unconstrained)

È anche possibile usare la delega non vincolata Kerberos per creare il secondo hop.You can also used Kerberos unconstrained delegation to make the second hop. Come tutti gli scenari Kerberos, le credenziali non vengono archiviate.Like all Kerberos scenarios, credentials are not stored. Questo metodo non supporta il secondo hop per WinRM.This method does not support the second hop for WinRM.

Avviso

Questo metodo non offre alcun controllo su dove vengono usate le credenziali delegate.This method provides no control of where delegated credentials are used. È meno sicuro rispetto a CredSSP.It is less secure than CredSSP. Questo metodo deve essere usato solo per gli scenari di testing.This method should only be used for testing scenarios.

JEA (Just Enough Administration)Just Enough Administration (JEA)

JEA consente di limitare i comandi che un amministratore può eseguire durante una sessione di PowerShell.JEA allows you to restrict what commands an administrator can run during a PowerShell session. Può essere usato per risolvere il problema del secondo hop.It can be used to solve the second hop problem.

Per informazioni su JEA, vedere Just Enough Administration.For information about JEA, see Just Enough Administration.

VantaggiPros

  • Non richiede nessuna manutenzione delle password quando si usa un account virtuale.No password maintenance when using a virtual account.

SvantaggiCons

  • Richiede WMF 5.0 o versione successiva.Requires WMF 5.0 or later.
  • Richiede la configurazione in ogni server intermedio ( ServerB ).Requires configuration on every intermediate server ( ServerB ).

PSSessionConfiguration tramite RunAsPSSessionConfiguration using RunAs

È possibile creare una configurazione sessione nel ServerB e impostare il parametro RunAsCredential .You can create a session configuration on ServerB and set its RunAsCredential parameter.

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.For information about using PSSessionConfiguration and RunAs to solve the second hop problem, see Another solution to multi-hop PowerShell remoting.

VantaggiPros

  • Funziona con qualsiasi server che esegue WMF 3.0 o versione successiva.Works with any server with WMF 3.0 or later.

SvantaggiCons

  • Richiede la configurazione di PSSessionConfiguration e RunAs in ogni server intermedio ( ServerB ).Requires configuration of PSSessionConfiguration and RunAs on every intermediate server ( ServerB ).
  • Richiede la manutenzione delle password quando si usa un account RunAs di dominioRequires password maintenance when using a domain RunAs account

Passare le credenziali all'interno di un blocco di script Invoke-CommandPass credentials inside an Invoke-Command script block

È possibile passare le credenziali all'interno del parametro ScriptBlock di una chiamata al cmdlet Invoke-Command.You can pass credentials inside the ScriptBlock parameter of a call to the Invoke-Command cmdlet.

VantaggiPros

  • Non richiede una configurazione di server speciale.Does not require special server configuration.
  • Funziona in qualsiasi server che esegue WMF 2.0 o versione successiva.Works on any server running WMF 2.0 or later.

SvantaggiCons

  • Richiede una tecnica di codice complicata.Requires an awkward code technique.
  • Se si esegue WMF 2.0, richiede una sintassi diversa per passare gli argomenti a una sessione remota.If running WMF 2.0, requires different syntax for passing arguments to a remote session.

EsempioExample

L'esempio seguente illustra come passare le credenziali in un blocco di script Invoke-Command :The following example shows how to pass credentials in an Invoke-Command script block:

# 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}
}

Vedere ancheSee also

Considerazioni sulla sicurezza della comunicazione remota di PowerShellPowerShell Remoting Security Considerations