Partager via


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