Sécuriser l'implémentation de votre modèle de délégation Active Directory (fr-FR)
Cet article présente un modèle de sécurisation d’un modèle de délégation Active Directory et son implémentation en Powershell.
Introduction
Il arrive souvent de voir des environnements où de la délégation d'administration a été mise en place mais n'a pas été sécurisée.
Les cas les plus fréquents étant les comptes d'administration présents dans la même OU que les utilisateurs standards et même chose pour les groupes du modèle de délégation.
Le risque est relativement simple à comprendre. Si vous avez par exemple délégué ne serai-ce que la réinitialisation de mot de passe à une population type Service Desk sur l'OU des utilisateurs. Rien ne les empêche de réinitialiser le mot de passe d'un compte d'administration qui est présent dans la même OU puis d'utiliser ce compte.
Pareil pour les groupes, si vous déléguez la gestion du membership sur une OU contenant des groupes et que vos groupes de délégation sont dans cette OU, un utilisateur ayant cette délégation peut s'ajouter dans un groupe de délégation pour faire une élévation de privilège.
On peut aller plus loin. Le simple fait de pouvoir savoir quels sont les comptes d'administration et quels sont les groupes et leurs membres présente un risque puisque avec ces informations une attaque sera plus ciblée.
Le constat est simple, les comptes, groupes et postes à privilèges doivent être isolés.
Modele de securisation
Le modèle suivant est proposé dans le guide de sécurité inclus avec Security Compliance Manager :
http://4.bp.blogspot.com/-pxTO4kuWp1E/U9y2A15B6GI/AAAAAAAABSM/hfgy-pz94Zw/s1600/SADMOU001.PNG
Nous allons voir comment automatiser la création de cette structure d'OU en suivant ce modèle (qui peut-être discutable et pas adapté à votre infrastructure).
Remarque : Si vous n’avez jamais effectuer de délégation d’administration Active Directory avec Powershell, je vous conseille de consulter au préalable l’article du wiki suivant : Powershell et la délégation d’administration Active Directory : les bases (fr-FR)
Implementation du modele
On commence d'abord par récupérer les informations sur le domaine Active Directory qui nous seront utiles pour la suite du script :
http://3.bp.blogspot.com/-PusG_ee8GvM/U93VrZNwXlI/AAAAAAAABSc/iVbvj8gtxCQ/s1600/SADMOU002.PNG
Creation de la structure d’Unite Organisationnelle
On créé ensuite notre structure d'OU :
http://4.bp.blogspot.com/-TBpBr0EebiA/U93XFNDLpAI/AAAAAAAABS0/w7kJMMTDwlQ/s1600/SADMOU003.PNG
On peut vérifier la création :
http://4.bp.blogspot.com/-MqOpefMaQn0/U93YQPCCl9I/AAAAAAAABS8/WlH_YnDAXL8/s1600/SADMOU004.PNG
Creation des groupes du modele de delegation
Ensuite on créé nos groupes du modèle de délégation (dans le cas où ils n'existent pas).
Je créé ici uniquement un groupe qui me permettra d'administrer cette arborescence d'OU et les objets qu'elle contient. Normalement je devrais créer tous les groupes de mon modèle de délégation.
http://3.bp.blogspot.com/-knZa8tQHloI/U93YUo3h5yI/AAAAAAAABTE/_nmuN6kPc8Q/s1600/SADMOU005.PNG
Suppression des ACE existantes et desactivation de l’heritage
Maintenant je vais supprimer les ACE existantes sur mes OU et je vais désactiver l'héritage :
http://3.bp.blogspot.com/-8Bab9mbEOi4/U93Y3LztxLI/AAAAAAAABTM/CHbzPGF40MM/s1600/SADMOU006.PNG
On peut vérifier dans la console ADUC :
http://4.bp.blogspot.com/-EkdXR9X7X9g/U93ZqH6sgUI/AAAAAAAABTU/QnbH7xo_dxw/s1600/SADMOU007.PNG
L'OU Service Admins n'est plus "visible" .
Si on vérifie les droits sur l'OU, on voit bien qu'il n'y a plus d'ACE et que l'héritage est désactivé.
http://2.bp.blogspot.com/-4XlmnHBNI2k/U93aJftgiJI/AAAAAAAABTc/S5MdTE_OrBA/s1600/SADMOU008.PNG
Etant le propriétaire de l'objet, je peux toujours modifier les permissions.
Creation des nouvelles ACE
Je crée ensuite les ACE correspondantes au modèle :
http://3.bp.blogspot.com/-y6kKOCqfUrc/U93bW8nPdUI/AAAAAAAABTk/yHSOBgxAYcg/s1600/SADMOU009.PNG
J'utilise les SID et non les noms des groupes dans mes ACE. Avec le SID on est sûr de positionner le bon groupe et non un groupe qui aurait pu être renommé.
Application des nouvelles ACE
On peut maintenant appliquer les ACE que l'on vient de créer :
http://2.bp.blogspot.com/-zd8wPzjhtXo/U93cyqpsL7I/AAAAAAAABTw/mGqMXglHi5w/s1600/SADMOU010.PNG
Protection contre la suppression accidentelle
Ce n'est pas prévu dans le modèle de Microsoft mais on peut reconfigurer la protection contre la suppression accidentelle sur les OU:
http://2.bp.blogspot.com/-2lsrrVadIR0/U93eCPR93ZI/AAAAAAAABT4/-VjdoOPS_-E/s1600/SADMOU011.PNG
Deplacement des comptes et groupes a privileges
Et on peut finir par déplacer dans la structure les groupes à privilèges :
http://1.bp.blogspot.com/-q7_waxs4Qns/U93elW6-k0I/AAAAAAAABUA/_zubfsmA3CU/s1600/SADMOU012.PNG
Je ne l'ai pas fait ici mais on pourrait aussi configurer les SACL sur cette structure d'OU.
Il ne reste plus qu'à déplacer les comptes d'administration et les postes d'administration dans les OU.
Code Powershell d’implementation
Voici le code que j'ai utilisé pour faire cette implémentation, il faudra bien évidemment l'adapter au contexte et aux besoins :
Import-Module ActiveDirectory
### Getting Domain Informations
$Domain = Get-ADDomain
$DomainBaseDN = ($Domain).DistinguishedName
$DomainSID = $Domain.DomainSID.Value
$RootDSE = Get-ADRootDSE
### Getting Class And Attribute GUID
$GuidMap = @{}
Get-ADObject -SearchBase ($RootDSE.SchemaNamingContext) -LDAPFilter "(schemaidguid=*)" -Properties lDAPDisplayName,schemaIDGUID |% {
$GuidMap[$_.lDAPDisplayName]=[System.GUID]$_.schemaIDGUID
}
### Getting Extended Rights GUID
$ExtendedRightsMap = @{}
Get-ADObject -SearchBase ($RootDSE.ConfigurationNamingContext) -LDAPFilter "(&(objectclass=controlAccessRight)(rightsguid=*))" -Properties displayName,rightsGuid | % {
$ExtendedRightsMap[$_.displayName]=[System.GUID]$_.rightsGuid
}
### Create OU Structure
$ServiceAdminsOU = New-ADOrganizationalUnit -Name "Service Admins" -Path $DomainBaseDN -PassThru
$UsersAndGroupsOU = New-ADOrganizationalUnit -Name "Users And Groups" -Path $ServiceAdminsOU.DistinguishedName -PassThru
$AdminWorkstationsOU = New-ADOrganizationalUnit -Name "Admin Workstations" -Path $ServiceAdminsOU.DistinguishedName -PassThru
### Create Delegation Groups
$GroupADServiceAdmins = New-ADGroup -GroupCategory Security -GroupScope DomainLocal -Name ("AD Service Admins") -Path $UsersAndGroupsOU.DistinguishedName -PassThru
### Removing Access Rule on Service Admins OU
Get-ADOrganizationalUnit -Filter * -SearchBase $ServiceAdminsOU.DistinguishedName|%{
$ACLOU = Get-Acl ("AD:\ + $_)
$ACLOU.Access|%{$ACLOU.RemoveAccessRule($_)|out-null}
$ACLOU|Set-Acl -Path ("AD:\ + $_)
}
### Removing inheritance on Service Admins OU
$ACLAdmOU = Get-Acl ("AD:\ + $ServiceAdminsOU.DistinguishedName)
$ACLAdmOU.SetAccessRuleProtection($true,$false)
$ACLAdmOU | Set-Acl -Path ("AD:\ + $ServiceAdminsOU.DistinguishedName)
### Creating Access Rule for Administrators
[System.Security.Principal.SecurityIdentifier] $SID = "S-1-5-32-544"
[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "GenericAll"
[System.Security.AccessControl.AccessControlType] $AccCtrlType = "Allow"
[System.DirectoryServices.ActiveDirectorySecurityInheritance] $SecInherit = "All"
$ACE01 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $SID,$ADRights,$AccCtrlType,$SecInherit
### Creating Access Rule for Domain Admins
[System.Security.Principal.SecurityIdentifier] $SID = ($DomainSID + "-512")
[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "GenericAll"
[System.Security.AccessControl.AccessControlType] $AccCtrlType = "Allow"
[System.DirectoryServices.ActiveDirectorySecurityInheritance] $SecInherit = "All"
$ACE02 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $SID,$ADRights,$AccCtrlType,$SecInherit
### Creating Access Rule for Enterprise Admins
[System.Security.Principal.SecurityIdentifier] $SID = ($DomainSID + "-519")
[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "GenericAll"
[System.Security.AccessControl.AccessControlType] $AccCtrlType = "Allow"
[System.DirectoryServices.ActiveDirectorySecurityInheritance] $SecInherit = "All"
$ACE03 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $SID,$ADRights,$AccCtrlType,$SecInherit
### Creating Access Rule for Pre-Windows 2000 Compatible Access
[System.Security.Principal.SecurityIdentifier] $SID = ("S-1-5-32-554")
[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "GenericRead,ListObject"
[System.Security.AccessControl.AccessControlType] $AccCtrlType = "Allow"
[System.DirectoryServices.ActiveDirectorySecurityInheritance] $SecInherit = "Descendents"
[system.guid]$GUID = $GuidMap["User"]
$ACE04 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $SID,$ADRights,$AccCtrlType,$SecInherit,$GUID
### Creating Access Rule for AD Service Admins
[System.Security.Principal.SecurityIdentifier] $SID = $GroupADServiceAdmins.SID
[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "GenericAll"
[System.Security.AccessControl.AccessControlType] $AccCtrlType = "Allow"
[System.DirectoryServices.ActiveDirectorySecurityInheritance] $SecInherit = "All"
$ACE05 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAccessRule -ArgumentList $SID,$ADRights,$AccCtrlType,$SecInherit
### Setting Access Rules
$ObjectDN = $ServiceAdminsOU.DistinguishedName
### Applying new Access Rules
$ACL = Get-Acl ("AD:\ + $ObjectDN)
$ACL.AddAccessRule($ACE01)
$ACL.AddAccessRule($ACE02)
$ACL.AddAccessRule($ACE03)
$ACL.AddAccessRule($ACE04)
$ACL.AddAccessRule($ACE05)
$ACL|Set-ACL -Path ("AD:\ + $ObjectDN)
### Protect OU from Accidental Deletion
Set-ADOrganizationalUnit $ServiceAdminsOU.DistinguishedName -ProtectedFromAccidentalDeletion $true
Set-ADOrganizationalUnit $UsersAndGroupsOU.DistinguishedName -ProtectedFromAccidentalDeletion $true
Set-ADOrganizationalUnit $AdminWorkstationsOU.DistinguishedName -ProtectedFromAccidentalDeletion $true
### Move Highly Privileged Groups
### Move Enterprise Admins
Move-ADObject -Identity ((Get-ADGroup -Identity ($DomainSID + "-519")).DistinguishedName) -TargetPath $UsersAndGroupsOU.DistinguishedName
### Move Domain Admins
Move-ADObject -Identity ((Get-ADGroup -Identity ($DomainSID + "-512")).DistinguishedName) -TargetPath $UsersAndGroupsOU.DistinguishedName
### Move Schema Admins
Move-ADObject -Identity ((Get-ADGroup -Identity ($DomainSID + "-518")).DistinguishedName) -TargetPath $UsersAndGroupsOU.DistinguishedName
### Move Administrator Account (RID 500)
Move-ADObject -Identity ((Get-ADUser -Identity ($DomainSID + "-500")).DistinguishedName) -TargetPath $UsersAndGroupsOU.DistinguishedName