AdminSDHolder a problém s mobilním zařízením v Exchange
Dnes se podíváme na službu AdminSDHolder a vazbu při nasazení Exchange Serveru, která není nikterak novou funkcionalitou v rámci Active Directory domény, ale v některých případech ve spojení s Exchange serverem může být poměrně záludnou vlastností.
Co je vlastně AdminSDHolder a koho chrání
Nejprve se podívejme co je „služba“ Admin SDHolder. Tato služba v rámci Active Directory zajišťuje ochranu velmi důležitých skupin, potažmo jejich členů a tzv. Security Descriptor Propagátorů (SDPROP), které bychom měli primárně chránit proti odcizení, jelikož s jejich vlastnictvím je možno provádět privilegované operace v rámci Windows infrastruktury. Tato služba byla implementována již ve Windows Server 2000, ale abych pravdu řekl, tenkrát jsem se s ní až tolik nezabýval a ani nesetkal.
Každá Active Directory doména má ve své topologii umístěný objekt AdminSDHolder, který má definována oprávnění (ACL) v rámci domény. Tato oprávnění jsou na chráněné objekty vynucena každou hodinu z PDC Emulátoru, tudíž dojde k přepsání již nastavených oprávnění. Jak jsem se dočetl v jednom článku, tak přepsání oprávnění je podmíněno změnou velikosti nebo binárních hodnoty daného objektu, jehož výpočet provádí právě master role v PDC Emulátoru tak dojde ke zmiňovanému přepsání oprávnění. Aby bylo možno tato oprávnění přepsat, je nutné nad daným objektem zrušit dědění oprávnění.
Ve výchozím stavu jsou chráněny primárně tyto skupiny a jejich členové:
Windows 2000 < SP4 | Windows 2000 SP4 – Windows Server 2003 RTM | Windows Server 2003 SP1+ | Windows Server 2012, Windows Server 2008 R2, Windows Server 2008 | Windows Server 2016 TP5 |
Administrators | Account Operators | Account Operators | Account Operators | Account Operators |
Administrator | Administrator | Administrator | Administrator | |
Administrators | Administrators | Administrators | Administrators | |
Backup Operators | Backup Operators | Backup Operators | Backup Operators | |
Cert Publishers | ||||
Domain Admins | Domain Admins | Domain Admins | Domain Admins | Domain Admins |
Domain Controllers | Domain Controllers | Domain Controllers | Domain Controllers | |
Enterprise Admins | Enterprise Admins | Enterprise Admins | Enterprise Admins | Enterprise Admins |
Krbtgt | Krbtgt | Krbtgt | Krbtgt | |
Print Operators | Print Operators | Print Operators | Print Operators | |
Read-only Domain Controllers | Read-Only Domain Controlers | |||
Replicator | Replicator | Replicator | Replicator | |
Schema Admins | Schema Admins | Schema Admins | Schema Admins | Schema Admins |
Server Operators | Server Operators | Server Operators | Server Operators |
Jak zjistím co AdminSDHolder chrání
Pokud budeme chtít zjistit, jaké účty máme aktuálně chráněny v rámci Active Directory, tak můžeme použít následující příkazy v powershellu:
Pro výpis všech chráněných skupin: Get-ADGroup -LDAPFilter „(admincount=1)“ | select name
Pro výpis všech chráněných uživatelů: Get-ADUser -LDAPFilter „(admincount=1)“ | select name
Jak upravit výchozí nastavení
Jak jsme si uvedli výše v textu, služba je nějakým způsobem nastavena tak, aby chránila privilegované účty, respektive protected group. Toto nastavení je možno modifikovat a v některých případech to může být i žádoucí a to zejména u Service Desk operátorů, kteří jsou členy skupiny Account Operators, aby mohli vytvářet uživatele v doméně pro nově příchozí zaměstnance, a mají pod stejný účet přiřazený mailbox (o mailboxu si řekneme více později).
V rámci dané služby je možno modifikovat v první řadě čas za jak dlouho proběhne na PDC Emulátoru kontrola protected group. Nastavení se primárně mění na PDC Emulátoru v registrech operačního systému a to v: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters, kde by měla existovat hodnota DWORD s názvem AdminSDProtectedFrequency a nastavenou hodnotou v sekundách. Pokud tato hodnota neexistuje, používá se výchozí nastavení 60 minut. Tuto hodnotu můžeme nastavit na nižší hodnotu a to v rozmezí 60 – 7200 sekund. V případě špatného nastavení je možné, že dojde k velkému zatížení na procesu Local Security Authority Subsystem Service (LSASS) a proto je nutno po změně tuto hodnotu sledovat a testovat v neprodukčním prostředí.
Další možností pro modifikaci je seznam a definice protected group, která se provádí pomocí ADSI Edit v Default Naming Content. V rámci nastavení je však možno provádět úpravy na jen těchto built in skupinách:
- Account Operators
- Server Operators
- Print Operators
- Backuo Operators
A to pomocí změny hodnoty atributu dsHeuristics na objektu CN=Directory Service v Configuration partition Active Directory a to zadáním správné hodnoty. Pozor tímto atributem lze měnit i další nastavení v Active Directory a tak doporučuji důkladně nastudovat dokumentaci a otestovat v LABu. (https://msdn.microsoft.com/cs-cz/enus/library/ms675656(VS.85).aspx)
Každá ze skupin má vlastní binární číslo a při modifikaci dsHeuritics je nutno tyto binární čísla sčítat:
Bit | Group to Exclude | Binary Value | Hexadecimal Value |
0 | Account Operators | 1 | 1 |
1 | Server Operators | 10 | 2 |
2 | Print Operators | 100 | 4 |
3 | Backup Operators | 1000 | 8 |
Tato tabulka, jež je zdrojem z stránek Microsoftu, udává všechny kombinace a součty, jež je možno použít v rámci modifikace nastavení pro AdminSDHolder:
Group(s) to Exclude | Binary Value | Hexadecimal Value |
None (Default) | 0 | 0 |
Account Operators | 1 | 1 |
Server Operators | 10 | 2 |
Account Operators | 0001 + 0010 = 0011 | 3 |
Server Operators | ||
Print Operators | 100 | 4 |
Account Operators | 0001 + 0100 = 0101 | 5 |
Print Operators | ||
Server Operators | 0010 + 0100 = 0110 | 6 |
Print Operators | ||
Account Operators | 0001 + 0010 + 0100 = 0111 | 7 |
Server Operators | ||
Print Operators | ||
Backup Operators | 1000 | 8 |
Account Operators | 0001 + 1000 = 1001 | 9 |
Backup Operators | ||
Server Operators | 0010 + 1000 = 1010 | A |
Backup Operators | ||
Account Operators Server Operators | 0001 + 0010 + 1000 = 1011 | B |
Backup Operators | ||
Print Operators | 0100 + 1000 = 1100 | C |
Backup Operators | ||
Account Operators | 0001 + 0100 + 1000 = 1101 | D |
Print Operators | ||
Backup Operators | ||
Server Operators | 0010 + 0100 + 1000 = 1110 | E |
Print Operators | ||
Backup Operators | ||
Account Operators | 0001 + 0010 + 0100 + 1000 = 1111 | F |
Server Operators | ||
Print Operators Backup Operators |
Propojení a závislosti u služeb Exchange
V rámci instalace služeb Exchange, Lync, BlackBarry Server a dalších dochází v infrastruktuře k úpravě konfigurační a schéma partition. Dále pak také k vytvoření nových objektů skupin a ACL nad objekty v Active Directory. V kombinaci s funkcí AdminSDHolder to však může způsobit problémy.
Jedním ze scénářů může být právě výše uvedená situace, kdy máte správce service desku, kteří mají kompetenci na vytváření účtů v Active Directory a tudíž jsou členy skupiny Account Operators (Protected Group). Danému uživateli vytvoříte mailbox na novém Exchange serveru a jelikož daný administrátor drží pohotovosti, musí si připojit email i do služebního a chráněného telefonu (třeba pomocí EMS nebo Intune).
Při přidání mailboxu se na tento účet v Active Directory nastaví nová oprávnění, jež jsou zděděna z nadřazeného OU nebo CN a také při registraci telefonu dojde k jeho zaznamenání do Active Directory partition, kde se uchovává informace o registraci zařízení do Exchange a tato registrace se používá pro Wipe telefonu, zjištění IMEI, výrobce, verze OS a také ActiveSync.
Co se stane ve chvíli, kdy zjistí AdminSDHolder, že došlo ke změně? Provede přepsání těchto ACL nad daným objektem a uživateli přestane primárně fungovat ActiveSync zařízení (přístup pomocí MS Outlook funguje, OWA funguje) a vy budete velmi těžko hledat, co se stalo s daným účtem.
Řešením může být znovu zapnutí dědění nad daným objektem, čímž dojde na definovanou dobu k funkčnosti služeb ActiveSync v rámci mobilního zařízení (můžete to také vyřešit připojením schránky přes IMAP nebo POP3, ale to mi přijde trošku nešťastné řešení). Abyste problém vyřešili globálně a trvale, rozhodnete se, že daného uživatele odeberete ze skupiny Account Operators (pokud tedy nevytvoříte exclude dané skupiny modifikací dcHeuristic), ale ani to váš problém nevyřeší.
Zde právě nastává ta chyba a to, že v některých verzích Active Directory nedojde k automatickému smazání objektu z chránění pomocí AdminSDHolder a je potřeba toto vyčistění provést ručním způsobem a to třeba pomocí skriptu uvolněného společností Microsoft v roce 2003 (i když jsem daný skript použil již několikrát, doporučuji testovat v neprodukčním prostředí) – viz na konci příspěvku. Také bych doporučil pomocí ADSI Edit vymazat dané zařízení z configuration partition Active Directory a provést znovu jeho registraci, čímž zajistíte, že nedošlo k rozpadu oprávnění ještě nad tímto OU.
Pokud smažete celé OU umístěné pod daným objektem, nedojde k narušení (wipe nebo cokoliv jiného) daných zařízení, ale bude nutno nastavení telefonu nebo tabletu nastavit znovu.
VBS Script z Microsoftu
184-2
'********************************************************************
'*
'* File: ResetAccountsadminSDHolder.vbs
'* Created: November 2003
'* Version: 1.0
'*
'* Main Function: Resets all accounts that have adminCount = 1 back
'* to 0 and enables the inheritance flag
'*
'* ResetAccountsadminSDHolder.vbs
'*
'* Copyright (C) 2003 Microsoft Corporation
'*
'********************************************************************
Const SE_DACL_PROTECTED = 4096
On Error Resume Next
Dim sDomain
Dim sADsPath
Dim sPDC
Dim oCon
Dim oCmd
Dim oRst
Set oRst = CreateObject("ADODB.Recordset")
Set oCmd = CreateObject("ADODB.Command")
Set oCon = CreateObject("ADODB.Connection")
Dim oRoot
Dim oDomain
Dim oADInfo
Dim oInfo
Set oADInfo = CreateObject("ADSystemInfo")
Set oInfo = CreateObject("WinNTSystemInfo")
sPDC = oInfo.PDC & "." & oADInfo.DomainDNSName
oCon.Provider = "ADSDSOObject"
oCon.Open "Active Directory Provider"
oCmd.ActiveConnection = oCon
Set oRoot = GetObject("LDAP://rootDSE")
sDomain = oRoot.Get("defaultNamingContext")
Set oDomain = GetObject("LDAP://" & sDomain)
sADsPath = ""
oCmd.CommandText = "SELECT ADsPath FROM 'LDAP://" & sPDC & "/" & sDomain & "' WHERE objectCategory='person' and objectClass = 'user' AND adminCount = 1"
Set oRst = oCmd.Execute
WScript.Echo "searching for objects with 'admin count = 1' in " & sDomain
If oRst.RecordCount = 0 Then
WScript.Echo "no accounts found"
WScript.Quit
End If
Do While Not oRst.EOF
WScript.Echo "found object " & oRst.Fields("ADsPath")
If SetInheritanceFlag(oRst.Fields("ADsPath")) = 0 Then WScript.Echo "Inheritance flag set"
If SetAdminCount(oRst.Fields("ADsPath"), 0) = 0 Then WScript.Echo "adminCount set to 0"
WScript.Echo "=========================================="
oRst.MoveNext
Loop
Private Function SetInheritanceFlag(DSObjectPath)
Dim oSD
Dim oDACL
Dim lFlag
Dim oIADs
Set oIADs = GetObject(DSObjectPath)
Set oSD = oIADs.Get("nTSecurityDescriptor")
If oSD.Control And SE_DACL_PROTECTED Then
oSD.Control = oSD.Control - SE_DACL_PROTECTED
End If
oIADs.Put "nTSecurityDescriptor", oSD
oIADs.SetInfo
If Err.Number 0 Then
SetInheritanceFlag = Err.Number
Else
SetInheritanceFlag = 0
End If
End Function
Private Function SetAdminCount(DSObjectPath, AdminCount)
Dim oIADs
Dim iAdminCount
Set oIADs = GetObject(DSObjectPath)
iAdminCount = oIADs.Get("adminCount")
If iAdminCount = 1 Then iAdminCount = 0
oIADs.Put "adminCount", iAdminCount
oIADs.SetInfo
If Err.Number 0 Then
SetAdminCount = Err.Number
Else
SetAdminCount = 0
End If
End Function
Daniel Hejda
DataScript s.r.o