สรุป
ความเชื่อถือฟอเรสต์เป็นหนทางสําหรับทรัพยากรในฟอเรสต์ของ Active Directory ที่ไว้ใจข้อมูลประจําตัวจากฟอเรสต์อื่น สามารถกําหนดค่าความเชื่อถือนี้ได้ทั้งสองทิศทาง ฟอเรสต์ที่เชื่อถือได้คือแหล่งที่มาของข้อมูลประจําตัวผู้ใช้ ฟอเรสต์ที่เชื่อถือมีทรัพยากรที่ผู้ใช้รับรองความถูกต้อง ฟอเรสต์ที่เชื่อถือได้สามารถรับรองความถูกต้องให้ผู้ใช้ไปยังฟอเรสต์ที่น่าเชื่อถือโดยไม่อนุญาตให้มีการย้อนกลับเกิดขึ้น
การมอบหมาย Kerberos ที่ไม่มีข้อจํากัดเป็นกลไกที่ผู้ใช้ส่งข้อมูลประจําตัวไปยังบริการเพื่อเปิดใช้งานบริการเพื่อเข้าถึงทรัพยากรในนามของผู้ใช้ เมื่อต้องการเปิดใช้งานการมอบหมาย Kerberos ที่ไม่มีข้อจํากัด บัญชีของบริการใน Active Directory ต้องถูกทําเครื่องหมายเป็นเชื่อถือได้สําหรับการมอบหมาย การทําเช่นนี้จะสร้างปัญหาถ้าผู้ใช้และบริการเป็นของฟอเรสต์ที่แตกต่างกัน ฟอเรสต์บริการมีหน้าที่ในการอนุญาตให้รับมอบสิทธิ์ การมอบหมายมีข้อมูลประจําตัวของผู้ใช้จากฟอเรสต์ของผู้ใช้
การอนุญาตให้ฟอเรสต์หนึ่งทําการตัดสินใจด้านความปลอดภัยที่มีผลต่อบัญชีของฟอเรสต์อีกบัญชีหนึ่งละเมิดขอบเขตความปลอดภัยระหว่างฟอเรสต์ ผู้โจมตีที่เป็นเจ้าของฟอเรสต์ที่เชื่อถือสามารถร้องขอการมอบหมาย TGT สําหรับข้อมูลประจําตัวจากฟอเรสต์ที่เชื่อถือได้ ทําให้สามารถเข้าถึงทรัพยากรในฟอเรสต์ที่เชื่อถือได้ การดําเนินการนี้ไม่สามารถใช้ได้กับการมอบหมายที่มีข้อจํากัดของ Kerberos (KCD)
Windows Server 2012 เริ่มมีการบังคับใช้ขอบเขตฟอเรสต์สําหรับการรับมอบสิทธิ์เต็มรูปแบบของ Kerberos ฟีเจอร์นี้ได้เพิ่มนโยบายไปยังโดเมนที่เชื่อถือได้เพื่อปิดใช้งานการมอบหมายที่ไม่มีข้อจํากัดตามความน่าเชื่อถือ การตั้งค่าเริ่มต้นสําหรับฟีเจอร์นี้อนุญาตให้มีการมอบหมายที่ไม่มีข้อจํากัดและไม่ปลอดภัย
Updates ที่มีการป้องกันความปลอดภัยสําหรับ Windows Server เวอร์ชันต่อไปนี้:
- Windows Server 2019
- Windows Server 2016
- Windows Server 2012 R2
- Windows Server 2012
ฟีเจอร์นี้พร้อมกับการเปลี่ยนแปลงการชุบแข็งด้านความปลอดภัยได้รับการพอร์ตไปยังเวอร์ชันต่อไปนี้:
- Windows Server 2008 R2
- Windows Server 2008
การอัปเดตความปลอดภัยเหล่านี้ทําการเปลี่ยนแปลงต่อไปนี้:
- การมอบหมาย Kerberos ที่ไม่มีข้อจํากัดจะถูกปิดใช้งานตามค่าเริ่มต้นในฟอเรสต์ใหม่และความน่าเชื่อถือภายนอกใหม่หลังจากที่คุณติดตั้งการอัปเดตวันที่ 14 พฤษภาคมและการอัปเดตที่ใหม่กว่า
- การมอบหมาย Kerberos ที่ไม่มีข้อจํากัดถูกปิดใช้งานในฟอเรสต์ (ทั้งความเชื่อถือใหม่และที่มีอยู่) และความน่าเชื่อถือภายนอกหลังจากที่คุณติดตั้งการอัปเดตในวันที่ 9 กรกฎาคม 2019 และการอัปเดตที่ใหม่กว่า
- ผู้ดูแลระบบสามารถเปิดใช้งานการมอบหมาย Kerberos ที่ไม่มีข้อจํากัดได้โดยใช้โมดูล NETDOM และ AD PowerShell เวอร์ชันพฤษภาคมหรือใหม่กว่า
การอัปเดตอาจทําให้เกิดความขัดแย้งของความเข้ากันได้สําหรับแอปพลิเคชันที่ปัจจุบันต้องการการมอบหมายที่ไม่มีข้อจํากัดในฟอเรสต์หรือความน่าเชื่อถือภายนอก โดยเฉพาะอย่างยิ่งความเชื่อถือจากภายนอกที่ค่าสถานะการตรวจสอบสินค้า (หรือที่เรียกว่าการกรอง SID) เปิดใช้งานตามค่าเริ่มต้น โดยเฉพาะอย่างยิ่ง คําขอการรับรองความถูกต้องสําหรับบริการที่ใช้การมอบหมายที่ไม่มีข้อจํากัดในประเภทความน่าเชื่อถือที่ระบุไว้จะล้มเหลวเมื่อคุณร้องขอตั๋วใหม่
สําหรับวันที่วางจําหน่าย ดูที่ Updates ไทม์ไลน์
วิธีแก้ไขปัญหาชั่วคราว
เมื่อต้องการให้ข้อมูลและความปลอดภัยของบัญชีในเวอร์ชัน Windows Server ที่มีขอบเขต การบังคับใช้สําหรับฟอเรสต์ สําหรับ Kerberos Full Delegation คุณสามารถบล็อกการมอบหมาย TGT หลังจากที่คุณติดตั้งการอัปเดตเดือนมีนาคม 2019 ในความเชื่อถือขาเข้าโดยการตั้งค่าสถานะ netdom EnableTGTDelegation เป็น ไม่ใช่ ดังนี้:
netdom.exe trust fabrikam.com /domain:contoso.com /EnableTGTDelegation:No
การมอบหมาย TGT ถูกบล็อกในฟอเรสต์ใหม่และที่มีอยู่และความน่าเชื่อถือภายนอกหลังจากที่คุณติดตั้งการอัปเดตประจําเดือนพฤษภาคมและกรกฎาคม 2019 ตามลําดับ
เมื่อต้องการเปิดใช้งานการมอบหมายความเชื่อถือทั้งหมดอีกครั้ง และกลับไปยังการกําหนดค่าที่ไม่ปลอดภัยเดิมจนกว่าจะสามารถเปิดใช้งานการมอบหมายที่มีข้อจํากัดหรือตามทรัพยากรได้ ให้ตั้งค่าสถานะ EnableTGTDelegation เป็น ใช่
บรรทัดคําสั่ง NETDOM เพื่อเปิดใช้งานการมอบหมาย TGT มีดังนี้:
netdom trust <TrustedDomainName > /domain:<TrustingDomainName > /EnableTgtDelegation:Yes
คุณสามารถนึกถึงไวยากรณ์ NETDOM สําหรับการเปิดใช้งานการมอบหมาย TGT ได้ตามแนวคิดดังนี้:
netdom trust <domain that you are administering> /domain:<domain whose trust NETDOM is modifying> /EnableTgtDelegation:Yes
ไวยากรณ์ NETDOM เพื่อเปิดใช้งานการมอบหมาย TGT ของผู้ใช้ fabrakam.com บนเซิร์ฟเวอร์ contoso.com มีดังนี้:
netdom.exe trust fabrikam.com /domain:contoso.com /EnableTGTDelegation:Yes
หมายเหตุ
- ค่าสถานะ EnableTGTDelegation ควรถูกตั้งค่าในโดเมนที่เชื่อถือได้ (ในกรณีนี้ fabrikam.com) สําหรับแต่ละโดเมนที่เชื่อถือ (เช่น contoso.com) หลังจากตั้งค่าสถานะโดเมนที่เชื่อถือได้จะไม่อนุญาตให้ TGTs ได้รับมอบสิทธิ์ไปยังโดเมนที่เชื่อถืออีกต่อไป
- สถานะที่ปลอดภัยสําหรับ EnableTGTDelegation คือ ไม่ใช่
- แอปพลิเคชันหรือบริการใดๆ ที่อาศัยการมอบหมายที่ไม่มีข้อจํากัดในฟอเรสต์จะล้มเหลวเมื่อ EnableTGTDelegation ถูกตั้งค่าด้วยตนเองหรือตั้งค่าทางโปรแกรมเป็น ใช่ EnableTGTDelegation defaults to NO on new and existing trusts after you install the May 2019 andJuly 2019 updates. สําหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการตรวจหาความล้มเหลวนี้ ให้ดู การค้นหาบริการที่ต้องพึ่งพาการมอบหมายที่ไม่มีข้อจํากัด ดู Updates ไทม์ไลน์สําหรับไทม์ไลน์ของการเปลี่ยนแปลงที่มีผลต่อวิธีการแก้ไขปัญหาชั่วคราวนี้
- สําหรับข้อมูลเพิ่มเติมเกี่ยวกับ NETDOM โปรดดูเอกสารประกอบNetdom.exe
- หากคุณต้องเปิดใช้งานการรับมอบสิทธิ์ TGT บนความน่าเชื่อถือ ขอแนะนําให้คุณลดความเสี่ยงดังกล่าวด้วยการเปิดใช้งาน Windows Defender Credential Guard บนคอมพิวเตอร์ไคลเอ็นต์ ซึ่งจะป้องกันการมอบหมายที่ไม่มีข้อจํากัดทั้งหมดจากคอมพิวเตอร์ที่มีการเปิดใช้งานและเรียกใช้ Windows Defender Credential Guard
- ถ้าคุณมีฟอเรสต์หรือความเชื่อถือจากภายนอก และถูกกําหนดค่าเป็นกักกัน จะไม่สามารถเปิดใช้งานการมอบหมาย TGT ได้เนื่องจากค่าสถานะทั้งสองมีความหมายตรงกันข้าม บิตการตรวจสอบสินค้าช่วยเพิ่มขอบเขตความปลอดภัยระหว่างโดเมนที่เข้าร่วม การเปิดใช้งานการมอบหมาย TGT จะลบขอบเขตความปลอดภัยระหว่างโดเมนโดยการให้สิทธิ์การเข้าถึงโดเมนที่เชื่อถือแก่ข้อมูลประจําตัวของผู้ใช้จากโดเมนที่เชื่อถือได้ คุณไม่สามารถมีได้ทั้งสองวิธี
เพิ่ม การตรวจสอบสินค้า:ไม่มี ค่าสถานะไปยังไวยากรณ์บรรทัดคําสั่ง NETDOM ถ้าสถานะ การตรวจสอบสินค้า เปิดใช้งานอยู่ในปัจจุบัน - ถ้าคุณเปลี่ยน EnableTGTDelegation เป็น ใช่ ให้ลบตั๋ว Kerberos ผู้โทรเริ่มต้นและผู้โทรระดับกลางตามที่จําเป็น ตั๋วที่เกี่ยวข้องที่จะลบคือ TGT การอ้างอิงของลูกค้าทั่วทั้งความน่าเชื่อถือที่เกี่ยวข้อง ซึ่งอาจเกี่ยวข้องกับอุปกรณ์มากกว่าหนึ่งเครื่อง ขึ้นอยู่กับจํานวนฮ็อพการรับมอบสิทธิ์ในสภาพแวดล้อมที่กําหนด
สําหรับข้อมูลเพิ่มเติมเกี่ยวกับขั้นตอนนี้ โปรดดูบทความต่อไปนี้ของ Windows IT Pro Center:
ปกป้องข้อมูลประจําตัวของโดเมนที่ได้รับด้วย Windows Defender Credential Guard
Updates ไทม์ไลน์
12 มีนาคม 2019
การบังคับใช้สําหรับขอบเขตฟอเรสต์สําหรับการรับมอบสิทธิ์แบบเต็มของ Kerberos จะพร้อมใช้งานเป็นการอัปเดตเพื่อเปิดใช้งานฟีเจอร์นี้ใน Windows Server เวอร์ชันที่สนับสนุนทั้งหมดที่แสดงอยู่ในส่วน นําไปใช้กับ ที่ด้านบนของบทความนี้ เราขอแนะนําให้คุณตั้งค่าฟีเจอร์บนความเชื่อถือฟอเรสต์ที่เข้ามา
การอัปเดตจะเพิ่ม การบังคับใช้สําหรับขอบเขตฟอเรสต์สําหรับฟีเจอร์การมอบหมายแบบเต็มของ Kerberos ไปยังระบบต่อไปนี้:
- Windows Server 2008 R2
- Windows Server 2008
14 พฤษภาคม 2019
เผยแพร่การอัปเดตแล้วโดยเพิ่มการกําหนดค่าเริ่มต้นที่ปลอดภัยใหม่ให้กับฟอเรสต์ใหม่และความน่าเชื่อถือภายนอก ถ้าคุณจําเป็นต้องรับมอบสิทธิ์ในความเชื่อถือ ค่าสถานะ EnableTGTDelegation ควรตั้งค่าเป็น ใช่ ก่อนที่จะติดตั้งการอัปเดตของวันที่ 9 กรกฎาคม 2019 ถ้าคุณไม่ต้องการรับมอบสิทธิ์ในความเชื่อถือทั้งหมด คุณไม่ควรตั้งค่าสถานะ EnableTGTDelegation ค่าสถานะ EnableTGTDelegation จะถูกละเว้นจนกว่าจะมีการติดตั้งการอัปเดตของวันที่ 9 กรกฎาคม 2019 เพื่อให้เวลาผู้ดูแลระบบในการเปิดใช้งานการมอบหมาย Kerberos ที่ไม่มีข้อจํากัดอีกครั้งเมื่อจําเป็น
ในฐานะที่เป็นส่วนหนึ่งของการอัปเดตนี้ ค่าสถานะ EnableTGTDelegation จะถูกตั้งค่าเป็น ไม่ใช่ ตามค่าเริ่มต้นสําหรับความน่าเชื่อถือที่สร้างขึ้นใหม่ใดๆ นี่คือสิ่งที่ตรงกันข้ามกับพฤติกรรมก่อนหน้านี้ เราขอแนะนําให้ผู้ดูแลระบบกําหนดค่าบริการที่ได้รับผลกระทบใหม่เพื่อใช้การมอบหมายที่มีข้อจํากัดตามทรัพยากรแทน
สําหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการตรวจหาปัญหาความเข้ากันได้ ให้ดูที่ การค้นหาบริการที่ต้องพึ่งพาการมอบหมายที่ไม่มีข้อจํากัด
9 กรกฎาคม 2019
เผยแพร่การอัปเดตที่บังคับใช้ลักษณะการทํางานเริ่มต้นใหม่ในด้านขาเข้าของฟอเรสต์และความน่าเชื่อถือภายนอก คําขอการรับรองความถูกต้องสําหรับบริการที่ใช้การมอบหมายที่ไม่มีข้อจํากัดในประเภทความน่าเชื่อถือที่แสดงไว้จะเป็นการรับรองความถูกต้องแต่ไม่มีการมอบหมาย บริการจะล้มเหลวเมื่อพยายามเรียกใช้การดําเนินการที่ได้รับมอบสิทธิ์
สําหรับการลดปัญหา ให้ดูส่วน "วิธีแก้ไขปัญหาชั่วคราว"
การค้นหาบริการที่พึ่งพาการมอบหมายที่ไม่มีข้อจํากัด
เมื่อต้องการสแกนหาฟอเรสต์ที่มีความน่าเชื่อถือขาเข้าที่อนุญาตการมอบหมาย TGT และค้นหาหลักเกณฑ์การรักษาความปลอดภัยที่อนุญาตให้มีการมอบหมายที่ไม่มีข้อจํากัด ให้เรียกใช้สคริปต์ PowerShell ต่อไปนี้ในไฟล์สคริปต์ (ตัวอย่างเช่น Get-RiskyServiceAccountsByTrust.ps1 -Collect):
หมายเหตุ
คุณยังสามารถส่งผ่านค่าสถานะ -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 | อันตราย | ผู้ใช้ |
| partner.fabrikam.com | Labsrv$ | คอมพิวเตอร์ |
การตรวจสอบการมอบหมายที่ไม่มีข้อจํากัดผ่านเหตุการณ์ของ Windows
เมื่อออกตั๋ว Kerberos ตัวควบคุมโดเมน Active Directory บันทึกเหตุการณ์ความปลอดภัยต่อไปนี้ เหตุการณ์ประกอบด้วยข้อมูลเกี่ยวกับโดเมนเป้าหมาย คุณสามารถใช้เหตุการณ์เพื่อกําหนดว่ามีการใช้การมอบหมายที่ไม่มีข้อจํากัดในความน่าเชื่อถือขาเข้าหรือไม่
หมายเหตุ
ตรวจสอบเหตุการณ์ที่ประกอบด้วยค่า TargetDomainName ที่ตรงกับชื่อโดเมนที่เชื่อถือได้
| บันทึกเหตุการณ์ | แหล่งของเหตุการณ์ | ID เหตุการณ์ | รายละเอียด |
|---|---|---|---|
| ความปลอดภัย | การตรวจสอบความปลอดภัยของ Microsoft Windows | 4768 | มี Kerberos TGT ออกให้ |
| ความปลอดภัย | การตรวจสอบความปลอดภัยของ Microsoft Windows | 4769 | ออกตั๋วบริการ Kerberos แล้ว |
| ความปลอดภัย | การตรวจสอบความปลอดภัยของ Microsoft Windows | 4770 | บัตรบริการ Kerberos ได้รับการต่ออายุแล้ว |
การแก้ไขปัญหาการรับรองความถูกต้องล้มเหลว
เมื่อการมอบหมายที่ไม่มีข้อจํากัดถูกปิดใช้งาน แอปพลิเคชันอาจมีปัญหาความเข้ากันได้กับการเปลี่ยนแปลงเหล่านี้หากแอปพลิเคชันพึ่งพาการมอบหมายที่ไม่มีข้อจํากัด แอปพลิเคชันเหล่านี้ควรได้รับการกําหนดค่าให้ใช้การมอบหมายที่มีข้อจํากัดหรือการมอบหมายที่มีข้อจํากัดซึ่งใช้ทรัพยากร สําหรับข้อมูลเพิ่มเติม ให้ดูที่ ภาพรวมการมอบหมายที่มีข้อจํากัดของ Kerberos
แอปพลิเคชันที่ใช้การรับรองความถูกต้องสําหรับการเดินทางข้ามความเชื่อถือไม่ได้รับการสนับสนุนโดยใช้การมอบหมายที่มีข้อจํากัด ตัวอย่างเช่น การมอบหมายล้มเหลวถ้าผู้ใช้ในฟอเรสต์ A รับรองความถูกต้องไปยังแอปพลิเคชันในฟอเรสต์ B และแอปพลิเคชันในฟอเรสต์ B กําลังพยายามมอบสิทธิ์ตั๋วกลับไปยังฟอเรสต์ A