Partager via


Configurer les SACL Active Directory en Powershell (fr-FR)

 

 

Cet article présente la méthodologie d’implémentation de SACL Active Directory en Powershell.

La méthodologie est très similaire à celle permettant d’ajouter des ACE dans une DACL, il est donc recommandé de lire au préalable l’article suivant du wiki : Powershell et la délégation d’administration Active Directory (fr-FR)

 

Classe d’objet ActiveDirectorySecurity

Comme pour l’implémentation des ACE dans une DACL nous allons utiliser un objet de la classe System.DirectoryServices.ActiveDirectorySecurity que nous récupérons via un Lecteur Powershell Active DIrectory

 

 

Pour rappel, la liste des méthodes la classe est disponible dans le lien suivant : Méthodes ActiveDirectorySecurity

La méthode qui nous intéresse cette fois est la méthode AddAuditRule qui permet d'ajouter une règle d'audit à la liste de contrôle d'accès système (SACL) d'un objet.

Le paramètre de cette méthode est un objet de classe ActiveDirectoryAuditRule qui représente une entrée de contrôle d'accès (ACE) dans la liste de contrôle d'accès système (SACL).

 

Classe d’objet ActiveDirectoryAuditRule

Nous allons voir maintenant comment construire des objets de classe System.DirectoryServices.ActiveDirectoryAuditRule.

Il existe différents constructeurs pour initialiser une nouvel objet de classe ActiveDirectoryAuditRule : Constructeurs ActiveDirectoryAuditRule.

On utilisera ces différents constructeurs en fonction du besoin.

En fonction du constructeur utilisé, nous avons besoin au plus des paramètres suivants pour construire notre ACE :

  • la référence d'identité : Objet IdentityReference qui identifie le tiers de confiance de la règle d'accès
  • les droits des services de domaine Active Directory : Combinaison d'une ou plusieurs valeurs de l'énumération ActiveDirectoryRights qui spécifient les droits de la règle d'accès
  • le type de règle d'audit : Une des valeurs de l'énumération AuditFlags qui spécifie le type de règle d'audit
  • le type d'objet : GUID de schéma de l'objet auquel la règle d'accès s'applique.
  • le type d'héritage : Une des valeurs de l'énumération ActiveDirectorySecurityInheritance qui spécifie le type d'héritage de la règle d'accès
  • le type d'objet hérité spécifiés :  GUID de schéma du type d'objet enfant qui peut hériter de cette règle d'accès

 

Comme vous pouvez le voir, seul le paramètre de type de règle d’audit diffère des paramètres nécessaires pour les objets ActiveDirectoryAccessRule utilisés pour l’implémentation des ACL.

Vous pouvez donc réutiliser les 2 morceaux de code de Joe Corey déjà utilisé dans l’article Powershell et la délégation d’administration Active Directory (fr-FR) qui nous permettent de récupérer rapidement et facilement les GUID.

Remarque : Comme pour les objets ActiveDirectoryAccessRule, pensez à bien typer vos variables pour ne pas avoir d’erreur avec le constructeur.

 

Ajout des nouvelles ACE

Le processus d’implémentation est toujours le même :

  1. Création des ACE
  2. Récupération de l’ACL de l’objet
  3. Ajout des ACE dans la SACL de l’objet
  4. Application de la nouvelle ACL

Rien de compliqué dans cette partie, on créé les nouvelles ACE, on utilise la Cmdlet Get-ACL pour récupérer l’ACL de l’objet, on ajoute les ACE dans la SACL de l’objet avec la méthode AddAuditRule et on termine par réappliquer l’ACL sur l’objet avec la Cmdlet Set-ACL

 

Un exemple concret

Nous allons voir maintenant un exemple concret d’utilisation de Powershell pour implémenter l’audit des objets de type Password Settings Objects.

Je commence donc par importer le module ActiveDirectory, je récupère l'objet RootDSE, le SID du groupe “Everyone”  et je construis les 2 hashtables avec le code de Joe.

 

On va maintenant créer les ACE pour configurer l’audit.

Nous avons besoins de 2 ACE, un pour la création/suppression d’objets enfant du conteneur “Password Settings Container” et un pour la modification d’objet de classe msDS-PasswordSettings.

Pour la 1ère ACE nous avons besoin des paramètres suivants :

  • la référence d'identité : SID du groupe “Everyone”
  • les droits des services de domaine Active Directory : CreateChild, DeleteChild
  • le type de règle d'audit : les succès
  • le type d'héritage : tous les objets

On créé les différents paramètres de notre constructeur puis on créé notre ACE:

On oublie pas de bien typer les variables correspondantes aux paramètres et on utilise la hashtable des droits étendus pour récupérer le GUID du droit étendu.

 

Pour la 2ème ACE nous avons besoin des paramètres suivants :

  • la référence d'identité : SID du groupe “Everyone”
  • les droits des services de domaine Active Directory : GenericWrite, Delete, WriteDacl, WriteOwner
  • le type de règle d'audit : les succès
  • le type d'héritage : les objets descendants
  • le type d'objet hérité spécifiés : GUID des objets de classe msDS-PasswordSettings

On créé les différents paramètres de notre constructeur puis on créé notre ACE:

 

On a désormais nos 2 ACE, on peut ajouter les audits

J’ai besoin maintenant du DistinguishedName de l’objet à modifier puis on effectue la modification du SACL selon le processus.

  • On récupère d’abord l’ACL de l’objet avec Get-ACL.
  • On ajoute nos 2 ACE avec la méthode AddAuditRule.
  • On applique la nouvelle ACL avec la commande Set-ACL.

 

 
Voici le code complet que j’ai utilisé :

Import-Module ActiveDirectory

$RootDSE = Get-ADRootDSE

$EveryoneGroup = [System.Security.Principal.SecurityIdentifier]'S-1-1-0'

### 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

    }

[System.Security.Principal.IdentityReference] $IdentityRef = $EveryoneGroup

[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "DeleteChild, CreateChild"

[System.Security.AccessControl.AuditFlags] $AuditFlags = "Success"

[System.DirectoryServices.ActiveDirectorySecurityInheritance] $SecInherit = "All"

$ACE01 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAuditRule -ArgumentList $IdentityRef,$ADRights,$AuditFlags,$SecInherit

[System.Security.Principal.IdentityReference] $IdentityRef = $EveryoneGroup

[System.DirectoryServices.ActiveDirectoryRights] $ADRights = "GenericWrite, Delete, WriteDacl, WriteOwner"

[System.Security.AccessControl.AuditFlags] $AuditFlags = "Success"

[System.DirectoryServices.ActiveDirectorySecurityInheritance] $SecInherit = "Descendents"

[system.guid]$GUID = $GuidMap["msDS-PasswordSettings"]

$ACE02 = New-Object -TypeName System.DirectoryServices.ActiveDirectoryAuditRule -ArgumentList $IdentityRef,$ADRights,$AuditFlags,$SecInherit,$GUID

$ObjectDN = "CN=Password Settings Container,CN=System," + $RootDSE.DefaultNamingContext

$ACL = Get-Acl ("AD:\ + $ObjectDN)

$ACL.AddAuditRule($ACE01)

$ACL.AddAuditRule($ACE02)

$ACL|Set-ACL -Path ("AD:\ + $ObjectDN)