Windows Server 들어오는 트러스트에서 TGT 위임으로 업데이트

적용 대상
Windows Server 2008 Windows Server 2008 R2 Windows Server 2012 Windows Server 2012 R2 Windows Server 2016 Windows Server 2019, all editions

요약​​

포리스트 트러스트는 Active Directory 포리스트 리소스가 다른 포리스트의 ID를 신뢰하는 방법을 제공합니다. 이 트러스트는 양방향으로 구성할 수 있습니다. 신뢰할 수 있는 포리스트는 사용자 ID의 원본입니다. 신뢰할 수 있는 포리스트에는 사용자가 인증하는 리소스가 포함됩니다. 신뢰할 수 있는 포리스트는 반대의 경우를 허용하지 않고 사용자를 신뢰할 수 있는 포리스트에 인증할 수 있습니다.

제한되지 않은 Kerberos 위임은 사용자가 서비스를 대신하여 리소스에 액세스할 수 있도록 자격 증명을 서비스에 보내는 메커니즘입니다. 제한되지 않은 Kerberos 위임을 사용하도록 설정하려면 Active Directory의 서비스 계정을 위임에 대해 신뢰할 수 있는 것으로 표시해야 합니다. 이렇게 하면 사용자와 서비스가 서로 다른 포리스트에 속하는 경우 문제가 발생합니다. 서비스 포리스트는 위임을 허용해야 합니다. 위임에는 사용자의 포리스트에서 사용자의 자격 증명이 포함됩니다.

한 포리스트가 다른 포리스트의 계정에 영향을 주는 보안 결정을 내릴 수 있도록 허용하면 포리스트 간의 보안 경계가 위반됩니다. 신뢰할 수 있는 포리스트를 소유하는 공격자는 신뢰할 수 있는 포리스트의 ID에 대한 TGT 위임을 요청하여 신뢰할 수 있는 포리스트의 리소스에 대한 액세스 권한을 부여할 수 있습니다. 이는 KCD(Kerberos 제한 위임)에 적용되지 않습니다.

Windows Server 2012 Kerberos 전체 위임에 대한 포리스트 경계 적용을 도입했습니다. 이 기능은 신뢰할 수 있는 도메인에 제한되지 않은 위임을 신뢰 단위로 사용하지 않도록 설정하는 정책을 추가했습니다. 이 기능에 대한 기본 설정은 제한되지 않은 위임을 허용하며 안전하지 않습니다.

다음 버전의 Windows Server 보안 강화를 제공하는 업데이트 있습니다.

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

보안 강화의 변경 내용과 함께 이 기능은 다음 버전으로 백포트되었습니다.

  • Windows Server 2008 R2
  • Windows Server 2008

이러한 보안 업데이트는 다음과 같이 변경됩니다.

  • 5월 14일 업데이트 이상 업데이트를 설치한 후 새 포리스트 및 새 외부 트러스트에서는 기본적으로 제한되지 않은 Kerberos 위임을 사용할 수 없습니다.
  • 2019년 7월 9일 업데이트 및 이후 업데이트를 설치한 후 포리스트(신규 및 기존) 및 외부 트러스트에서 제한되지 않은 Kerberos 위임을 사용할 수 없습니다.
  • 관리자는 5월 이상 버전의 NETDOM 및 AD PowerShell 모듈을 사용하여 제한되지 않은 Kerberos 위임을 사용하도록 설정할 수 있습니다.

업데이트로 인해 포리스트 또는 외부 트러스트 간에 현재 제한되지 않은 위임이 필요한 애플리케이션에 대한 호환성 충돌이 발생할 수 있습니다. 이는 격리 플래그(SID 필터링이라고도 함)가 기본적으로 사용하도록 설정된 외부 신뢰의 경우 특히 그렇습니다. 특히 나열된 트러스트 유형에 대해 제한되지 않은 위임을 사용하는 서비스에 대한 인증 요청은 새 티켓을 요청할 때 실패합니다.

릴리스 날짜는 업데이트 타임라인 참조하세요.

해결 방법

Kerberos 전체 위임에 대한 포리스트 경계 적용 기능이 있는 Windows Server 버전에서 데이터 및 계정 보안을 제공하려면 다음과 같이 netdom 플래그 EnableTGTDelegation아니요로 설정하여 들어오는 트러스트에 2019년 3월 업데이트를 설치한 후 TGT 위임을 차단할 수 있습니다.


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

TGT 위임은 각각 2019년 5월 및 7월 업데이트를 설치한 후 신규 및 기존 포리스트 및 외부 트러스트에서 차단됩니다.

트러스트 간에 위임을 다시 사용하도록 설정하고 제한되거나 리소스 기반 위임을 사용할 수 있을 때까지 원래 안전하지 않은 구성으로 돌아가려면 EnableTGTDelegation 플래그를 예로 설정합니다.

TGT 위임을 사용하도록 설정하는 NETDOM 명령줄은 다음과 같습니다.


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

다음과 같이 TGT 위임을 사용하도록 설정하는 NETDOM 구문을 개념적으로 생각할 수 있습니다.


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

contoso.com 서버에서 fabrakam.com 사용자의 TGT 위임을 사용하도록 설정하는 NETDOM 구문은 다음과 같습니다.


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

         참고

  • EnableTGTDelegation 플래그는 신뢰할 수 있는 각 도메인(예: contoso.com)에 대해 신뢰할 수 있는 도메인(이 경우 fabrikam.com)에 설정해야 합니다. 플래그가 설정되면 신뢰할 수 있는 도메인은 더 이상 TGT를 신뢰할 수 있는 도메인에 위임할 수 없습니다.
  • EnableTGTDelegation의 보안 상태는 아니요입니다.
  • EnableTGTDelegation을 수동으로 또는 프로그래밍 방식으로 예로 설정하면 포리스트 간에 제한되지 않은 위임을 사용하는 모든 애플리케이션 또는 서비스가 실패합니다 . EnableTGTDelegation은 2019년 5월 및 2019년 7월 업데이트를 설치한 후 신규 및 기존 트러스트에서 기본적으로 NO 로 설정됩니다. 이 오류를 감지하는 방법에 대한 자세한 내용은 제한되지 않은 위임을 사용하는 서비스 찾기를 참조하세요. 이 해결 방법을 적용하는 방법에 영향을 주는 변경 내용의 타임라인 업데이트 타임라인 참조하세요.
  • NETDOM에 대한 자세한 내용은 Netdom.exe 설명서를 참조하세요.
  • 트러스트에서 TGT 위임을 사용하도록 설정해야 하는 경우 클라이언트 컴퓨터에서 Windows Defender Credential Guard를 사용하도록 설정하여 해당 위험을 완화하는 것이 좋습니다. 이렇게 하면 Windows Defender Credential Guard를 사용하도록 설정하고 실행 중인 컴퓨터에서 제한되지 않은 모든 위임이 방지됩니다.
  • 포리스트 또는 외부 트러스트가 있고 격리된 것으로 구성된 경우 두 플래그에 반대 의미 체계가 있기 때문에 TGT 위임을 사용하도록 설정할 수 없습니다. 격리 비트는 참여하는 도메인 간의 보안 경계를 강화합니다. TGT 위임을 사용하도록 설정하면 신뢰할 수 있는 도메인의 사용자 자격 증명에 대한 신뢰할 수 있는 도메인 액세스 권한을 부여하여 도메인 간의 보안 경계가 지워집니다. 두 가지 방법을 모두 사용할 수는 없습니다.
    격리 플래그가 현재 사용하도록 설정된 경우 NETDOM 명령줄 구문에 quarantine:no 플래그 를 추가합니다.
  • EnableTGTDelegation예로 변경한 경우 필요에 따라 원래 및 중간 호출자의 Kerberos 티켓을 삭제합니다. 삭제할 관련 티켓은 관련 트러스트에서 클라이언트의 추천 TGT입니다. 여기에는 지정된 환경의 위임 홉 수에 따라 둘 이상의 디바이스가 포함될 수 있습니다.

이 절차에 대한 자세한 내용은 다음 Windows IT Pro Center 문서를 참조하세요.

Windows Defender Credential Guard를 사용하여 파생 도메인 자격 증명 보호

업데이트 타임라인

2019년 3월 12일

Kerberos 전체 위임에 대한 포리스트 경계 적용은 이 문서의 맨 위에 있는 적용 대상 섹션에 나열된 지원되는 모든 Windows Server 버전에서 이 기능을 사용하도록 설정하는 업데이트로 사용할 수 있습니다. 들어오는 포리스트 트러스트에 기능을 설정하는 것이 좋습니다.

이 업데이트는 Kerberos 전체 위임에 대한 포리스트 경계 적용 기능을 다음 시스템에 추가합니다.

  • Windows Server 2008 R2
  • Windows Server 2008

2019년 5월 14일

새 포리스트 및 외부 트러스트에 새 안전한 기본 구성을 추가하는 업데이트가 릴리스되었습니다. 트러스트 간에 위임이 필요한 경우 2019년 7월 9일 업데이트가 설치되기 전에 EnableTGTDelegation 플래그를 예로 설정해야 합니다. 트러스트 간에 위임이 필요하지 않은 경우 EnableTGTDelegation 플래그를 설정하면 안 됩니다. EnableTGTDelegation 플래그는 2019년 7월 9일 업데이트가 설치될 때까지 무시되어 관리자가 필요할 때 제한되지 않은 Kerberos 위임을 다시 사용하도록 설정할 시간을 제공합니다.

이 업데이트의 일부로 새로 만든 트러스트 에 대해 EnableTGTDelegation 플래그가 기본적으로 아니요 로 설정됩니다. 이는 이전 동작과 반대입니다. 대신 관리자가 리소스 기반 제한된 위임을 사용하도록 영향을 받는 서비스를 다시 구성하는 것이 좋습니다.

호환성 문제를 검색하는 방법에 대한 자세한 내용은 제한되지 않은 위임을 사용하는 서비스 찾기를 참조하세요.

2019년 7월 9일

포리스트 및 외부 트러스트의 인바운드 쪽에서 새 기본 동작을 적용하는 업데이트가 릴리스되었습니다. 나열된 신뢰 유형에 대해 제한되지 않은 위임을 사용하는 서비스에 대한 인증 요청은 위임 없이 인증됩니다. 위임된 작업을 실행하려고 하면 서비스가 실패합니다.

완화 방법은 "해결 방법" 섹션을 참조하세요.

제한되지 않은 위임을 사용하는 서비스 찾기

TGT 위임을 허용하는 들어오는 트러스트가 있는 포리스트를 검색하고 제한되지 않은 위임을 허용하는 보안 주체를 찾으려면 스크립트 파일(예: Get-RiskyServiceAccountsByTrust.ps1 -Collect)에서 다음 PowerShell 스크립트를 실행합니다.

참고

-ScanAll 플래그를 전달하여 TGT 위임을 허용하지 않는 트러스트를 검색할 수도 있습니다.

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 
}

PowerShell 스크립트의 출력에는 제한되지 않은 위임이 구성된 실행 중인 도메인에서 들어오는 트러스트에 대해 구성된 도메인의 Active Directory 보안 주체가 나열됩니다. 출력은 다음 예제와 유사합니다.

도메인 sAMAccountName objectClass
partner.fabrikam.com 위험한 user
partner.fabrikam.com labsrv$ 복제

Windows 이벤트를 통해 제한되지 않은 위임 검색

Kerberos 티켓이 발급되면 Active Directory 도메인 컨트롤러는 다음 보안 이벤트를 기록합니다. 이벤트에는 대상 도메인에 대한 정보가 포함됩니다. 이벤트를 사용하여 들어오는 트러스트에서 제한되지 않은 위임이 사용되고 있는지 여부를 확인할 수 있습니다.

참고

신뢰할 수 있는 도메인 이름과 일치하는 TargetDomainName 값이 포함된 이벤트를 확인합니다.

이벤트 로그 이벤트 원본 이벤트 ID 세부 정보
보안 Microsoft-Windows-Security-Auditing 4768 Kerberos TGT가 발급되었습니다.
보안 Microsoft-Windows-Security-Auditing 4769 Kerberos 서비스 티켓이 발급되었습니다.
보안 Microsoft-Windows-Security-Auditing 4770 Kerberos 서비스 티켓이 갱신되었습니다.

인증 실패 문제 해결

제한되지 않은 위임을 사용하지 않도록 설정하면 애플리케이션이 제한되지 않은 위임을 사용하는 경우 애플리케이션에서 이러한 변경 내용과 호환성 문제가 발생할 수 있습니다. 이러한 애플리케이션은 리소스 기반의 제한된 위임 또는 제한된 위임을 사용하도록 구성해야 합니다. 자세한 내용은 Kerberos 제한 위임 개요를 참조하세요.

트러스트 간에 왕복 인증을 사용하는 애플리케이션은 제한된 위임을 사용하여 지원되지 않습니다. 예를 들어 포리스트 A의 사용자가 포리스트 B의 애플리케이션에 인증하고 포리스트 B의 애플리케이션이 포리스트 A에 티켓을 다시 위임하려고 하면 위임이 실패합니다.