samedi 2 août 2014

Comment déléguer : la gestion des Stratégies de Groupes, Partie 1

Bonjour à tous.

On continue dans notre série sur la délégation d'administration avec toujours pour objectif de tendre vers le "Zéro Admins".

Nous allons parler aujourd'hui de la gestion des Stratégies de Groupes.
De nombreuses tâches d’administration peuvent être en relation avec la gestion des Stratégies de Groupes.

Nous allons commencer par recenser toutes ces tâches :
  • Création de GPO
  • Modification de GPO
  • Liaison de GPO sur une OU ou à la racine du domaine
  • RSOP (Planning)
  • RSOP (Logging)
  • Liaison de GPO sur les Sites Active Directory
  • Création de Filtres WMI

Il y a donc un certains nombre de tâches d'administration possibles en relation avec la gestion des Stratégies de Groupes.


Création de GPO

Pour déléguer la création des GPO, plusieurs choix s'offrent à nous.
Nous pouvons tout d'abord utiliser le groupe prévu à cet effet, Group Policy Creator Owners.
Notre objectif étant de ne pas utiliser les groupes Built-in nous n'utiliserons pas cette méthode

Nous pouvons ensuite donner explicitement les droits sur les objets. Pour rappel, une GPO est composée de 2 partie,un objet de type Group Policy Container dans l'AD (GPC) et un dossier dans le SYSVOL (GPT).
Il faudrait donc déléguer les droits sur ces 2 parties ce qui est faisable mais on préfèrera éviter de toucher aux droits du SYSVOL directement.

Nous pouvons enfin utiliser la console GPMC.
Soit en via l'interface graphique, soit via l'interface IGPM (IGPM interface).
Généralement, on cherche à automatiser au maximum l'implémentation de notre modèle de délégation. On préfèrera donc utiliser l'interface IGPM qui nous permettra de scripter cette délégation.

 Voici un exemple de script :


Import-Module ActiveDirectory

$Domain = Get-ADDomain

$GroupAdminsGPO = Get-ADGroup -Identity "Admins GPO"

$GPM = New-Object -ComObject gpmgmt.gpm

$Constant=$GPM.GetConstants()
### Initialize the Domain object
$GPMDomain = $GPM.GetDomain($Domain.dnsroot, "", $Constant.UseAnyDC)

### Get a GPMSOM object representing the domain
$GPMSOM = $GPMDomain.GetSOM("")

### Get the current SecurityInfo object for the domain
$GPMSecInfo = $GPMSOM.GetSecurityInfo()

$GPMPermission = $GPM.CreatePermission($GroupAdminsGPO.Name,$Constant.PermSOMGPOCreate,$false)

$GPMSecInfo.Add($GPMPermission)
$GPMSOM.SetSecurityInfo($GPMSecInfo)

 



On peut vérifier via la console GPMC que le droit a bien été délégué.



Modification de GPO

Nous allons voir maintenant la modification des GPO.
Par défaut, lorsqu'une GPO est créée, seuls le créateur-propriétaire, les membres de "Domain Admins" et les membres de "Enterprise Admins" ont les permissions de modification de GPO.

Sur une petite structure, il est possible qu'il n'y ait qu'une seule personne qui administre les GPO.
Le comportement par défaut n'est donc pas problématique. En revanche lorsque plusieurs personnes doivent administrer les GPO, ce comportement devient problématique car seul le créateur de la GPO a les droits de modification.

Voici un exemple :



Il faut donc changer ce comportement. Pour cela nous allons modifier le DefaultSecurityDescriptor de la classe d'objet GroupPolicyContainer afin que notre groupe de délégation ait les droits sur les GPO à leur création. Cette modification est documentée chez Microsoft : How to change the default permissions on GPOs in Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, and Windows 2000 Server

Cette modification peut être effectuée soit via ADSIEDIT comme dans la KB, soit en powershell. Nous allons voir la méthode avec Powershell.

On récupère d'abord le Default Security Descriptor de la classe d'objet Group-Policy-Container.


Puis on ajoute les droits à notre groupe de délégation.


On peut finir par mettre à jour le cache du schéma pour que la modification soit prise en compte immédiatement.


On peut vérifier que notre groupe de délégation à bien les droits lorsque l'on créé une GPO.



Voici le code que j'ai utilisé :

Import-Module ActiveDirectory

$RootDSE = Get-ADRootDSE

$DNGroupPolicyContainer = "CN=Group-Policy-Container," + $RootDSE.schemaNamingContext
$GroupPolicyContainer = Get-ADObject $DNGroupPolicyContainer -Properties defaultSecurityDescriptor

$GroupAdminsGPO = Get-ADGroup -Identity "Admins GPO"
$NewDefaultSecurityDescriptor = $GroupPolicyContainer.defaultSecurityDescriptor + "(A;CI;RPWPCCDCLCLOLORCWOWDSDDTSW;;;" + $GroupAdminsGPO.SID +")"
$GroupPolicyContainer.defaultSecurityDescriptor = $NewDefaultSecurityDescriptor
Set-ADObject -Instance $GroupPolicyContainer

$SchemaOwner = [System.DirectoryServices.ActiveDirectory.ActiveDirectorySchema]::GetCurrentSchema()
$SchemaOwner.RefreshSchema()



Toutefois, cette modification n'est pas suffisante. En effet, la modification ne sera effective que pour les nouvelles GPO, il nous faut donc aussi traiter les GPO existantes.

Pour faire cette modification, nous allons utiliser les Cmdlet du module GroupPolicy.
Le code est assez simple, on prend toutes les GPO (dans mon cas, c'est à adapter), on vérifie si notre groupe de délégation a des droits sur la GPO et on corrige si ce n'est pas le cas.


Voici le code (les Out-Null sont là pour éviter l'affichage en sortie de toutes les GPO) :


Import-Module ActiveDirectory, GroupPolicy

$GroupAdminsGPO = Get-ADGroup -Identity "Admins GPO"

Get-GPO -All | foreach-object {
   
    if(!($_ | Get-GPPermissions -TargetName $GroupAdminsGPO.Name -TargetType Group -ErrorAction SilentlyContinue | Out-Null)){
        $_ | Set-GPPermissions -TargetName $GroupAdminsGPO.Name -TargetType Group -PermissionLevel GpoEditDeleteModifySecurity | Out-Null}
    }

 

Je vais m'arrêter ici pour cette première partie.
Il faudra bien évidemment adapter ces morceaux de code à votre contexte et à votre besoin, l'objectif ici étant juste de vous montrer que l'on peut scripter cette partie de la délégation des GPO.

A très bientôt.

1 commentaire:

  1. Big merci pour ces scripts ! Par contre, je suis en train de chercher un moyen de le faire non pas pour un seul compte (dans ton exemple AdminGPO) mais pour plusieurs groupes se trouvant dans un fichier txt, et là ça se complique. Tu aurais peut être une idée de comment il faudrait modifier ton script concernant l'ajout de SID dans l'attribut Default Security Descriptor de la classe d'objet Group-Policy-Container ?

    RépondreSupprimer