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)

20160712_1

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.

20160712_2

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

Autor článku: logotype-final

Daniel Hejda
DataScript s.r.o