Updates to TGT delegation across incoming trusts in Windows Server

Berlaku Untuk
Windows Server 2008 Windows Server 2008 R2 Windows Server 2012 Windows Server 2012 R2 Windows Server 2016 Windows Server 2019, all editions

Ringkasan

Kepercayaan hutan menyediakan cara bagi sumber daya di forest Direktori Aktif untuk memercayai identitas dari forest lain. Kepercayaan ini dapat dikonfigurasi di kedua arah. Hutan tepercaya adalah sumber identitas pengguna. Trusting forest berisi sumber daya yang diautentikasi pengguna. Hutan tepercaya dapat mengautentikasi pengguna ke hutan tepercaya tanpa membiarkan kebalikan terjadi.

Delegasi Kerberos tidak dibatasi adalah mekanisme di mana pengguna mengirimkan kredensialnya ke layanan untuk memungkinkan layanan mengakses sumber daya atas nama pengguna. Untuk mengaktifkan delegasi Kerberos tanpa batasan, akun layanan di Direktori Aktif harus ditandai sebagai tepercaya untuk delegasi. Hal ini menimbulkan masalah jika pengguna dan layanan termasuk dalam forest yang berbeda. Hutan layanan bertanggung jawab untuk mengizinkan delegasi. Delegasi menyertakan kredensial pengguna dari forest pengguna.

Mengizinkan satu hutan untuk membuat keputusan keamanan yang memengaruhi akun hutan lain melanggar batas keamanan antar hutan. Penyerang yang memiliki hutan tepercaya dapat meminta delegasi TGT untuk identitas dari forest tepercaya, memberikan akses ke sumber daya di forest tepercaya. Hal ini tidak berlaku untuk Delegasi Terbatas Kerberos (KCD).

Windows Server 2012 memperkenalkan Penerapan Batas Hutan untuk Delegasi Penuh Kerberos. Fitur ini menambahkan kebijakan ke domain tepercaya untuk menonaktifkan delegasi tanpa batasan berdasarkan per-trust. Pengaturan default untuk fitur ini memungkinkan delegasi tanpa batasan dan tidak aman.

Updates yang menyediakan pengerasan keamanan tersedia untuk versi Windows Server berikut:

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

Fitur ini, bersamaan dengan perubahan dalam pengerasan keamanan, di-backport ke versi berikut:

  • Windows Server 2008 R2
  • Windows Server 2008

Pembaruan keamanan ini membuat perubahan berikut:

  • Delegasi Kerberos tidak dibatasi dinonaktifkan secara default pada forest baru dan kepercayaan eksternal baru setelah Anda menginstal pembaruan 14 Mei dan pembaruan yang lebih baru.
  • Delegasi Kerberos tidak dibatasi dinonaktifkan pada forests (baik yang baru maupun yang sudah ada) dan kepercayaan eksternal setelah Anda menginstal pembaruan 9 Juli 2019 dan yang lebih baru.
  • Administrator dapat mengaktifkan delegasi Kerberos tanpa batasan menggunakan modul NETDOM dan AD PowerShell versi Mei atau yang lebih baru.

Pembaruan dapat menyebabkan konflik kompatibilitas untuk aplikasi yang saat ini memerlukan delegasi tanpa batasan di seluruh forest atau kepercayaan eksternal. Hal ini khususnya berlaku untuk kepercayaan eksternal di mana bendera karantina (juga dikenal sebagai pemfilteran SID) diaktifkan secara default. Secara khusus, permintaan autentikasi untuk layanan yang menggunakan delegasi tanpa batasan pada tipe kepercayaan yang tercantum akan gagal saat Anda meminta tiket baru.

Untuk tanggal rilis, lihat lini masa Updates.

Solusi

Untuk menyediakan keamanan data dan akun pada versi Windows Server yang memiliki fitur Penerapan Batas Hutan untuk Delegasi Penuh Kerberos, Anda dapat memblokir delegasi TGT setelah menginstal pembaruan Maret 2019 di seluruh kepercayaan masuk dengan mengatur bendera netdom EnableTGTDelegation ke Tidak, sebagai berikut:


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

Delegasi TGT diblokir pada kepercayaan forestier dan eksternal yang baru dan yang sudah ada setelah Anda menginstal pembaruan Mei dan Juli 2019 masing-masing.

Untuk mengaktifkan kembali delegasi di seluruh kepercayaan dan kembali ke konfigurasi tidak aman asli hingga delegasi terbatas atau berbasis sumber daya dapat diaktifkan, atur bendera EnableTGTDelegation ke Ya.

Baris perintah NETDOM untuk mengaktifkan delegasi TGT adalah sebagai berikut:


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

Anda dapat secara konseptual memikirkan sintaks NETDOM untuk mengaktifkan delegasi TGT sebagai berikut:


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

Sintaks NETDOM untuk mengaktifkan delegasi TGT pengguna fabrakam.com di server contoso.com adalah sebagai berikut:


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

         Catatan

  • Bendera EnableTGTDelegation harus diatur di domain tepercaya (fabrikam.com dalam hal ini) untuk setiap domain tepercaya (seperti contoso.com). Setelah bendera ditetapkan, domain tepercaya tidak akan lagi mengizinkan TGT didelegasikan ke domain tepercaya.
  • Status aman untuk EnableTGTDelegation adalah No.
  • Aplikasi atau layanan apa pun yang bergantung pada delegasi tanpa batasan di seluruh hutan akan gagal saat EnableTGTDelegation diatur secara manual atau terprogram ke Ya. EnableTGTDelegation secara default ke TIDAK pada kepercayaan baru dan yang sudah ada setelah Anda menginstal pembaruan Mei 2019 dan Juli 2019. Untuk informasi selengkapnya tentang cara mendeteksi kegagalan ini, lihat Menemukan layanan yang mengandalkan delegasi tanpa batasan. Lihat lini masa Updates untuk garis waktu perubahan yang memengaruhi cara solusi ini dapat diterapkan.
  • Untuk informasi selengkapnya tentang NETDOM, lihat dokumentasiNetdom.exe.
  • Jika Anda harus mengaktifkan delegasi TGT pada kepercayaan, sebaiknya mitigasi risiko tersebut dengan mengaktifkan Windows Defender Credential Guard di komputer klien. Ini mencegah semua delegasi tanpa batasan dari komputer yang mengaktifkan dan menjalankan Windows Defender Credential Guard.
  • Jika Anda memiliki kepercayaan forest atau eksternal, dan keduanya dikonfigurasi sebagai dikarantina, delegasi TGT tidak dapat diaktifkan karena kedua bendera memiliki semantik yang berlawanan. Bit karantina memperkuat batas keamanan antara domain yang berpartisipasi. Mengaktifkan delegasi TGT akan menghapus batas keamanan antar domain dengan memberikan akses kepada domain tepercaya ke kredensial pengguna dari domain tepercaya. Anda tidak dapat memiliki keduanya.
    Tambahkan bendera karantina:tidak ada ke sintaks baris perintah NETDOM jika bendera karantina saat ini diaktifkan.
  • Jika Anda mengubah EnableTGTDelegation menjadi Ya, hapus tiket Kerberos pada penelepon asal dan menengah sesuai kebutuhan. Tiket yang relevan untuk dihapus adalah TGT rujukan klien di seluruh kepercayaan yang relevan. Hal ini dapat melibatkan lebih dari satu perangkat, tergantung pada jumlah lompatan delegasi di lingkungan tertentu.

Untuk informasi selengkapnya tentang prosedur ini, lihat artikel Pusat Profesional TI Windows berikut ini:

Lindungi kredensial domain turunan dengan Windows Defender Credential Guard

Updates timeline

12 Maret 2019

Penerapan batas hutan untuk delegasi penuh Kerberos akan tersedia sebagai pembaruan untuk mengaktifkan fitur ini di semua versi Windows Server yang didukung yang tercantum di bagian Berlaku untuk di bagian atas artikel ini. Kami menyarankan Anda mengatur fitur pada kepercayaan hutan yang masuk.

Pembaruan ini akan menambahkan fitur Penerapan Batas Hutan untuk Delegasi Penuh Kerberos ke sistem berikut:

  • Windows Server 2008 R2
  • Windows Server 2008

14 Mei 2019

Pembaruan telah dirilis, menambahkan konfigurasi default aman baru ke forest baru dan kepercayaan eksternal. Jika Anda memerlukan delegasi di seluruh kepercayaan, bendera EnableTGTDelegation harus diatur ke Ya sebelum pembaruan 9 Juli 2019 diinstal. Jika Anda tidak memerlukan delegasi di seluruh kepercayaan, Anda tidak boleh mengatur bendera EnableTGTDelegation . Bendera EnableTGTDelegation akan diabaikan hingga pembaruan 9 Juli 2019 diinstal untuk memberi waktu kepada administrator guna mengaktifkan kembali delegasi Kerberos yang tidak dibatasi saat diperlukan.

Sebagai bagian dari pembaruan ini, bendera EnableTGTDelegation akan diatur ke Tidak secara default untuk setiap kepercayaan yang baru dibuat. Ini adalah kebalikan dari perilaku sebelumnya. Sebagai gantinya, kami menyarankan agar administrator mengonfigurasi ulang layanan yang terpengaruh untuk menggunakan delegasi terbatas berbasis sumber daya.

Untuk informasi selengkapnya tentang cara mendeteksi masalah kompatibilitas, lihat Menemukan layanan yang mengandalkan delegasi tanpa batasan.

9 Juli 2019

Pembaruan dirilis yang memberlakukan perilaku default baru di sisi masuk forest dan kepercayaan eksternal. Permintaan autentikasi untuk layanan yang menggunakan delegasi tanpa batasan pada tipe kepercayaan yang tercantum akan diautentikasi, tetapi tanpa delegasi. Layanan akan gagal saat mencoba menjalankan operasi yang didelegasikan.

Untuk mitigasi, lihat bagian "Solusi sementara".

Menemukan layanan yang mengandalkan delegasi tanpa batasan

Untuk memindai forest yang memiliki kepercayaan masuk yang memungkinkan delegasi TGT, dan untuk menemukan prinsipal keamanan yang mengizinkan delegasi tanpa batasan, jalankan skrip PowerShell berikut dalam file skrip (misalnya, Get-RiskyServiceAccountsByTrust.ps1 -Collect):

Catatan

Anda juga dapat meneruskan bendera -ScanAll untuk mencari di seluruh kepercayaan yang tidak mengizinkan delegasi TGT.

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

Output skrip PowerShell mencantumkan perwakilan keamanan Direktori Aktif dalam domain yang dikonfigurasi untuk kepercayaan masuk dari domain yang menjalankan yang telah mengonfigurasi delegasi tanpa batas. Outputnya akan menyerupai contoh berikut.

domain sAMAccountName objectClass
partner.fabrikam.com berbahaya pengguna
partner.fabrikam.com labsrv$ komputer

Mendeteksi delegasi tanpa batasan melalui peristiwa Windows

Saat tiket Kerberos dikeluarkan, pengontrol domain Direktori Aktif mencatat peristiwa keamanan berikut. Kejadian berisi informasi tentang domain target. Anda dapat menggunakan peristiwa untuk menentukan apakah delegasi tanpa batasan digunakan di seluruh kepercayaan masuk.

Catatan

Periksa peristiwa yang berisi nilai TargetDomainName yang cocok dengan nama domain tepercaya.

Log peristiwa Sumber acara ID Peristiwa Detail
Keamanan Microsoft-Windows-Security-Auditing 4768 TGT Kerberos dikeluarkan.
Keamanan Microsoft-Windows-Security-Auditing 4769 Tiket Layanan Kerberos dikeluarkan.
Keamanan Microsoft-Windows-Security-Auditing 4770 Tiket Layanan Kerberos diperpanjang.

Memecahkan masalah kegagalan autentikasi

Saat delegasi tanpa batasan dinonaktifkan, aplikasi mungkin memiliki masalah kompatibilitas dengan perubahan ini jika aplikasi mengandalkan delegasi tanpa batasan. Aplikasi ini harus dikonfigurasi untuk menggunakan delegasi terbatas atau delegasi terbatas yang berbasis sumber daya. Untuk informasi selengkapnya, lihat Gambaran Umum Delegasi Terbatas Kerberos.

Aplikasi yang mengandalkan autentikasi bolak-balik di seluruh kepercayaan tidak didukung dengan menggunakan delegasi terbatas. Misalnya, delegasi gagal jika pengguna di Forest A mengautentikasi ke aplikasi di Forest B dan aplikasi di Forest B mencoba mendelegasikan tiket kembali ke Forest A.