Actualizări la delegarea TGT între autorizările primite din Windows Server

Se aplică la
Windows Server 2008 Windows Server 2008 R2 Windows Server 2012 Windows Server 2012 R2 Windows Server 2016 Windows Server 2019, all editions

Rezumat

Autorizările pădure oferă o modalitate pentru resursele dintr-o pădure Active Directory de a acorda încredere identităților din altă pădure. Această încredere poate fi configurată în ambele direcții. Pădurea de încredere este sursa identității utilizatorului. Pădurea de încredere conține resursa cu care se autentifică utilizatorii. Pădurea de încredere poate autentifica utilizatorii în pădurea de încredere fără a permite apariția inversei.

Delegarea Kerberos nerestricționată este un mecanism prin care un utilizator trimite acreditările sale unui serviciu pentru a-i permite să acceseze resurse în numele utilizatorului. Pentru a activa delegarea Kerberos fără restricții, contul serviciului din Active Directory trebuie marcat ca fiind de încredere pentru delegare. Acest lucru creează o problemă dacă utilizatorul și serviciul aparțin unor păduri diferite. Pădurea de servicii este responsabilă pentru permiterea delegării. Delegarea include acreditările utilizatorilor din pădurea utilizatorilor.

Dacă permiteți unei păduri să ia decizii de securitate care afectează conturile altei păduri încalcă limita de securitate dintre păduri. Un atacator care deține pădurea de încredere poate solicita delegarea unui TGT pentru o identitate din pădurea de încredere, oferindu-i acces la resursele din pădurea de încredere. Acest lucru nu este valabil pentru delegarea restricționată Kerberos (KCD).

Windows Server 2012 a introdus impunerea limitei pădurii pentru delegarea completă Kerberos. Această caracteristică a adăugat o politică la domeniul de încredere pentru a dezactiva delegarea fără restricții pe bază de încredere. Setarea implicită pentru această caracteristică permite delegarea fără restricții și este nesigură.

Actualizări care furnizează întărirea securității există pentru următoarele versiuni de Windows Server:

  • Windows Server 2019
  • Windows Server 2016
  • Windows Server 2012 R2
  • Windows Server 2012

Această caracteristică, împreună cu modificările aduse întăririi securității, au fost instalate pentru următoarele versiuni:

  • Windows Server 2008 R2
  • Windows Server 2008

Aceste actualizări de securitate fac următoarele modificări:

  • Delegarea Kerberos nerestricționată este dezactivată în mod implicit pentru autorizările externe noi și pentru pădurea nouă după ce instalați actualizarea din 14 mai și actualizările ulterioare.
  • Delegarea Kerberos nerestricționată este dezactivată pentru pădurile (atât noi, cât și existente) și autorizările externe după ce instalați actualizarea din 9 iulie 2019 și actualizările ulterioare.
  • Administratorii pot activa delegarea Kerberos fără restricții utilizând versiunile din mai sau mai recente ale modulului NETDOM și AD PowerShell.

Actualizările pot provoca conflicte de compatibilitate pentru aplicațiile care necesită în prezent delegare fără restricții în pădure sau autorizări externe. Acest lucru este valabil mai ales în cazul încrederii externe, pentru care semnalizarea de carantină (numită și filtrare SID) este activată în mod implicit. Mai exact, solicitările de autentificare pentru serviciile care utilizează delegări nerestricționate în locul tipurilor de autorizări listate nu vor reuși atunci când solicitați tichete noi.

Pentru datele de lansare, consultați cronologia Actualizărilor.

Soluție

Pentru a furniza securitate de date și de cont pe o versiune de Windows Server care are caracteristica Impunere pentru limitele pădurii pentru delegare completă Kerberos, puteți bloca delegarea TGT după ce instalați actualizările din martie 2019 într-o autorizare de intrare, setând semnalizatorul netdom EnableTGTDelegation la No, după cum urmează:


netdom.exe trust fabrikam.com /domain:contoso.com /EnableTGTDelegation:No

Delegarea TGT este blocată pentru acreditările noi și existente din pădure și externe după ce instalați actualizările din mai și, respectiv, iulie 2019.

Pentru a reactiva delegarea între autorizări și a reveni la configurația inițială nesigură până când se poate activa delegarea restricționată sau bazată pe resurse, setați semnalizarea EnableTGTDelegation la Yes.

Linia de comandă NETDOM pentru a activa delegarea TGT este următoarea:


netdom trust <TrustedDomainName > /domain:<TrustingDomainName > /EnableTgtDelegation:Yes

Vă puteți gândi conceptual la sintaxa NETDOM pentru a activa delegarea TGT după cum urmează:


netdom trust <domain that you are administering> /domain:<domain whose trust NETDOM is modifying> /EnableTgtDelegation:Yes

Sintaxa NETDOM pentru a permite delegarea TGT a utilizatorilor fabrakam.com pe serverele contoso.com este după cum urmează:


netdom.exe trust fabrikam.com /domain:contoso.com /EnableTGTDelegation:Yes

         Note

  • Semnalizarea EnableTGTDelegation ar trebui setată în domeniul de încredere (fabrikam.com în acest caz) pentru fiecare domeniu de încredere (cum ar fi contoso.com). După setarea semnalizării, domeniul de încredere nu va mai permite delegarea TGT-urilor la domeniul de încredere.
  • Starea de siguranță pentru EnableTGTDelegation este Nu.
  • Orice aplicație sau serviciu care se bazează pe o delegare nerestricționată între păduri nu va reuși dacă EnableTGTDelegation este setat manual sau programatic la Yes. EnableTGTDelegation are setarea implicită la NU pentru autorizările noi și existente după ce instalați actualizările din mai 2019 și iulie 2019. Pentru mai multe informații despre cum se detectează această eroare, consultați Găsirea serviciilor care se bazează pe delegarea fără restricții. Consultați cronologia Actualizări pentru o cronologie a modificărilor care afectează modul în care poate fi aplicată această soluție.
  • Pentru mai multe informații despre NETDOM, consultați documentațiaNetdom.exe.
  • Dacă trebuie să activați delegarea TGT pe o autorizare, se recomandă să reduceți riscul activând Windows Defender Credential Guard pe computerele client. Acest lucru împiedică orice delegare nerestricționată de pe un computer care are activat și rulează Windows Defender Credential Guard.
  • Dacă aveți o pădure sau o autorizare externă și oricare dintre acestea este configurată ca în carantină, delegarea TGT nu poate fi activată, deoarece cele două semnalizări au semantică opusă. Bitul de carantină întărește limita de securitate între domeniile participante. Activarea delegării TGT șterge limitele de securitate dintre domenii, oferind domeniului de încredere acces la acreditările utilizatorilor din domeniul de încredere. Nu le poți avea pe ambele.
    Adăugați semnalizarea quarantine:no la sintaxa liniei de comandă NETDOM dacă semnalizarea de carantină este activată în prezent.
  • Dacă ați modificat EnableTGTDelegation la Yes, ștergeți tichetele Kerberos pentru apelanții de origine și intermediari, după cum este necesar. Tichetul relevant de șters este TGT-ul de recomandare al clientului în trustul relevant. Acest lucru ar putea implica mai multe dispozitive, în funcție de numărul de salturi de delegare dintr-un mediu dat.

Pentru mai multe informații despre această procedură, consultați următorul articol Windows IT Pro Center Center:

Protejarea acreditărilor de domeniu derivate cu Windows Defender Credential Guard

Actualizări cronologie

12 martie 2019

Impunerea limitei pădurii pentru delegarea completă Kerberos va fi disponibilă ca actualizare pentru a activa această caracteristică în toate versiunile de Windows Server acceptate care sunt listate în secțiunea Se aplică la din partea de sus a acestui articol. Vă recomandăm să setați caracteristica pentru acreditările pădure de intrare.

Actualizarea va adăuga impunerea limitelor de pădure pentru caracteristica Delegare completă Kerberos la următoarele sisteme:

  • Windows Server 2008 R2
  • Windows Server 2008

14 mai 2019

A fost lansată o actualizare prin adăugarea unei noi configurații implicite sigure pentru noile autorizări externe și pentru pădurea nouă. Dacă aveți nevoie de delegarea între autorizări, semnalizarea EnableTGTDelegation trebuie setată la Da înainte de instalarea actualizării din 9 iulie 2019. Dacă nu solicitați delegarea între autorizări, nu trebuie să setați semnalizarea EnableTGTDelegation . Semnalizatorul EnableTGTDelegation va fi ignorat până la instalarea actualizării din 9 iulie 2019, pentru a le oferi administratorilor timp să reactiveze delegarea Kerberos nerestricționată atunci când este nevoie.

Ca parte a acestei actualizări, semnalizarea EnableTGTDelegation va fi setată în mod implicit la Nu pentru toate autorizările nou create. Acesta este opus comportamentului anterior. Recomandăm administratorilor, în schimb, să reconfigureze serviciile afectate pentru a utiliza delegarea restricționată bazată pe resurse.

Pentru mai multe informații despre detectarea problemelor de compatibilitate, consultați Găsirea serviciilor care se bazează pe delegarea fără restricții.

9 iulie 2019

A fost lansată o actualizare care impune noul comportament implicit pe partea de intrare a pădurii și a autorizărilor externe. Solicitările de autentificare pentru serviciile care utilizează delegări nerestricționate în locul tipurilor de autorizări listate vor fi autentificate, dar fără delegare. Serviciul nu va reuși atunci când încearcă să ruleze operațiuni delegate.

Pentru atenuare, consultați secțiunea "Soluție".

Găsirea serviciilor care se bazează pe o delegare fără restricții

Pentru a scana pădurile care au autorizări de intrare care permit delegarea TGT și pentru a găsi entitățile principale de securitate care permit delegarea fără restricții, rulați următoarele scripturi PowerShell într-un fișier script (de exemplu, Get-RiskyServiceAccountsByTrust.ps1 -Collect):

Notă

De asemenea, puteți transmite semnalizarea -ScanAll pentru a căuta în autorizările care nu permit delegarea TGT.

Scripturi PowerShell

[CmdletBinding()]  
Param  
(  
    [switch]$Collect, 
    [switch]$ScanAll 
) 
 
if ($Debug) {  
    $DebugPreference = 'Continue'  
} 
else { 
    $DebugPreference = 'SilentlyContinue'  
} 

function Get-AdTrustsAtRisk 
{ 
    [CmdletBinding()]  
    Param  
    (  
        [string]$Direction = "Inbound", 
        [switch]$ScanAll 
    ) 
 
    if ($ScanAll) { 
        return get-adtrust -filter {Direction -eq $Direction} 
    } 
    else { 
        return get-adtrust -filter {Direction -eq $Direction -and TGTDelegation -eq $false} 
    } 
} 
 
function Get-ServiceAccountsAtRisk 
{ 
    [CmdletBinding()]  
    Param  
    (  
        [string]$DN = (Get-ADDomain).DistinguishedName, 
        [string]$Server = (Get-ADDomain).Name 
    ) 
 
    Write-Debug "Searching $DN via $Server" 
 
    $SERVER_TRUST_ACCOUNT = 0x2000  
    $TRUSTED_FOR_DELEGATION = 0x80000  
    $TRUSTED_TO_AUTH_FOR_DELEGATION= 0x1000000  
    $PARTIAL_SECRETS_ACCOUNT = 0x4000000    
 
    $bitmask = $TRUSTED_FOR_DELEGATION -bor $TRUSTED_TO_AUTH_FOR_DELEGATION -bor $PARTIAL_SECRETS_ACCOUNT  
  
$filter = @"  
(& 
  (servicePrincipalname=*) 
  (| 
    (msDS-AllowedToActOnBehalfOfOtherIdentity=*) 
    (msDS-AllowedToDelegateTo=*) 
    (UserAccountControl:1.2.840.113556.1.4.804:=$bitmask) 
  ) 
  (| 
    (objectcategory=computer) 
    (objectcategory=person) 
    (objectcategory=msDS-GroupManagedServiceAccount) 
    (objectcategory=msDS-ManagedServiceAccount) 
  ) 
) 
"@ -replace "[\s\n]", ''  
  
    $propertylist = @(  
        "servicePrincipalname",   
        "useraccountcontrol",   
        "samaccountname",   
        "msDS-AllowedToDelegateTo",   
        "msDS-AllowedToActOnBehalfOfOtherIdentity"  
    )  
 
    $riskyAccounts = @() 
 
    try { 
        $accounts = Get-ADObject -LDAPFilter $filter -SearchBase $DN -SearchScope Subtree -Properties $propertylist -Server $Server 
    } 
    catch { 
        Write-Warning "Failed to query $Server. Consider investigating seperately. $($_.Exception.Message)" 
    } 
              
    foreach ($account in $accounts) {  
        $isDC = ($account.useraccountcontrol -band $SERVER_TRUST_ACCOUNT) -ne 0  
        $fullDelegation = ($account.useraccountcontrol -band $TRUSTED_FOR_DELEGATION) -ne 0  
        $constrainedDelegation = ($account.'msDS-AllowedToDelegateTo').count -gt 0  
        $isRODC = ($account.useraccountcontrol -band $PARTIAL_SECRETS_ACCOUNT) -ne 0  
        $resourceDelegation = $account.'msDS-AllowedToActOnBehalfOfOtherIdentity' -ne $null  
      
        $acct = [PSCustomobject] @{  
            domain = $Server 
            sAMAccountName = $account.samaccountname  
            objectClass = $account.objectclass          
            isDC = $isDC  
            isRODC = $isRODC  
            fullDelegation = $fullDelegation  
            constrainedDelegation = $constrainedDelegation  
            resourceDelegation = $resourceDelegation  
        }  
 
        if ($fullDelegation) {  
            $riskyAccounts += $acct    
        } 
    }  
 
    return $riskyAccounts 
} 
 
function Get-RiskyServiceAccountsByTrust  
{ 
    [CmdletBinding()]  
    Param  
    ( 
        [switch]$ScanAll 
    ) 
     
    $riskyAccounts = @() 
 
    $trustTypes = $("Inbound", "Bidirectional") 
 
    foreach ($type in $trustTypes) { 
 
        $riskyTrusts = Get-AdTrustsAtRisk -Direction $type -ScanAll:$ScanAll 
 
        foreach ($trust in $riskyTrusts) { 
            $domain = $null 
     
            try { 
                $domain = Get-AdDomain $trust.Name -ErrorVariable eatError -ErrorAction Ignore 
            } catch { 
                write-debug $_.Exception.Message 
            } 
 
            if($eatError -ne $null) { 
                Write-Warning "Couldn't find domain: $($trust.Name)" 
            } 
 
            if ($domain -ne $null) { 
                $accts = Get-ServiceAccountsAtRisk -DN $domain.DistinguishedName -Server $domain.DNSRoot 
 
                foreach ($acct in $accts) { 
                    Write-Debug "Risky: $($acct.sAMAccountName) in $($acct.domain)" 
                }             
 
                $risky = [PSCustomobject] @{  
                    Domain = $trust.Name 
                    Accounts = $accts 
                } 
 
                $riskyAccounts += $risky 
            } 
        } 
    } 
 
    return $riskyAccounts 
} 
 
if ($Collect) { 
   Get-RiskyServiceAccountsByTrust -ScanAll:$ScanAll | Select-Object -expandProperty Accounts | format-table 
}

Rezultatul scripturilor PowerShell listează entitățile principale de securitate Active Directory din domeniile configurate pentru o autorizare de intrare de la domeniul de executare care are configurată delegarea fără restricții. Rezultatul va semăna cu următorul exemplu.

domeniu sAMAccountName clasă obiect
partner.fabrikam.com periculos utilizator
partner.fabrikam.com labsrv$ computer

Detectarea delegării nerestricționate prin evenimente Windows

Atunci când este emis un tichet Kerberos, un controler de domeniu Active Directory înregistrează următoarele evenimente de securitate. Evenimentele conțin informații despre domeniul țintă. Puteți utiliza evenimentele pentru a determina dacă se utilizează delegarea fără restricții între autorizările de intrare.

Notă

Căutați evenimente care conțin o valoare TargetDomainName care se potrivește cu numele de domeniu de încredere.

Jurnal de evenimente Sursa evenimentului ID eveniment Detalii
Securitate Microsoft-Windows-Security-Auditing 4768 A fost emis un TGT Kerberos.
Securitate Microsoft-Windows-Security-Auditing 4769 A fost emis un tichet de serviciu Kerberos.
Securitate Microsoft-Windows-Security-Auditing 4770 A fost reînnoit un tichet de serviciu Kerberos.

Depanarea erorilor de autentificare

Atunci când delegarea fără restricții este dezactivată, aplicațiile pot avea probleme de compatibilitate cu aceste modificări dacă se bazează pe o delegare fără restricții. Aceste aplicații ar trebui configurate să utilizeze delegarea restricționată sau delegarea restricționată care se bazează pe resurse. Pentru mai multe informații, consultați Prezentarea generală a delegării restricționate Kerberos.

Aplicațiile care se bazează pe autentificarea dus-întors între autorizări nu sunt acceptate prin utilizarea delegării restricționate. De exemplu, o delegare nu reușește dacă un utilizator din pădurea A se autentifică la o aplicație din pădurea B și aplicația din pădurea B încearcă să delege un tichet înapoi la pădurea A.