Surveiller les changements des GPOs : Monitorer le SYSVOL
Nous allons dans ce post expliquer comment monitorer les changements sur les GPOs de votre domaine en contrôllant le GPT. Seuls les effacements, modifications de la configuration ordinateur/utilisateur, créations de GPOs sont surveillés. A propos du monitoring d’objets de stratégie de groupe via le journal d’événements vous pouvez lire cet article. Les méthodes utilisées dans le lien précédent indiquent, entre autres, comment activer un audit sur le partage \\domainname\sysvol\domainfqdn\Policies et remonter via le journal de sécurité de chaque DC les changements intervenus sur la partie GPT d’une GPO. Nous allons décrire une autre méthode pour enregistrer les modifications de vos GPOs dans votre domaine.
Lors de la réplication d’objets GPO dans votre domaine la partie GPT est répliquée via la les systèmes DFS-R sous Windows 2008 et FRS sous Windows 2003 (pour migrer c’est ici.) Le même répertoire partagé, le SYSVOL, est modifié lors d’une création/suppression/changement de paramètre d’une GPO. Nous pouvons donc enregistrer sur un seul DC les modifications effectuées par vos administrateurs.
Lors de la création/suppression d’une GPO dans votre domaine le dossier \\domainname\sysvol\domainfqdn\Policies\{%GPO_GUID%} est créé ou effacé. Lors de la modification des paramètres ordinateur/utilisateur le fichier \\domainname\sysvol\domainfqdn\Policies\{%GPO_GUID%}\gpt.ini est modifié comme l’indique ce post. Le but de notre script est donc de notifier en presque temps réel les modifications sur ce dossier et fichier sur un DC.
Quels sont les avantages/inconvénients par rapport à la méthode de notification via le journal de sécurité?
- Inconvénients: Un seul DC est sollicité, une charge CPU/Mémoire est à prévoir pour ce serveur, de plus un site de LAG est à prévoir pour obtenir des informations sur la suppression de GPOs sous Windows 2003. Nous n’avons pas le nom de compte de la personne ayant effectué la modification. Nous sommes notifiés une fois la réplication du SYSVOL survenue sur le DC sur lequel tourne le script, nous n’avons donc pas une remontée des événements en temps réel qui sont enregistrés dans le journal de sécurité de chaque DC via l’audit de fichiers.
- Avantages: Afin d’avoir un enregistrement en temps réel des événements du journal de sécurité de chaque DC un logiciel payant de Syslog est necessaire (Kiwi et Snare par ex), ma méthode est gratuite. Un seul DC est sollicité et vous n’avez pas besoin d’activer l’audit du système de fichiers sur le SYSVOL de tous les DCs et d’y installer l’agent Snare, ce qui limite la charge CPU/Mémoire de l’ensemble des DCs.
Le but de cet article est de montrer comment installer sur un seul DC de votre domaine un service (script) qui détecte les changements de GPOs. Pour réaliser ce script nous allons utiliser WMI code creator pour monitorer les créations/effacements de dossiers {%GPO_GUID%} et modifications des fichiers {%GPO_GUID%}gpt.ini sur le SYSVOL.
Voici comment générer le script pour surveiller la création d’un dossier {%GPO_GUID%}:
Lors de l’étape 5 le nom des sous-dossier à surveiller sont dans le dossier ‘Win32_Directory.Name=””F:\WINDOWS\SYSVOL\domain\Policies””‘”, ce qui correspond à l’emplacement de tous les sous répertoires {%GPO_GUID%} du dossier incluant les politiques du SYSVOL.
Ce qui nous donne la requête WMI suivante:
Pour plus d’information concernant les requêtes asynchrones en WMI vous pouvez lire cet article. Nous pouvons avec ce type de requête enregistrer plusieurs événements accessibles via le WMI arrivant en même temps sur une machine. Avec le script suivant nous allons pouvoir enregistrer la création/suppression de dossiers {%GPO_GUID%} sur le SYSVOL:
On error resume next strComputer = "." DomainDN = "DC=ldap389,DC=info" DomainDNSFQDN = "ldap389.info" LAGDC = "LAG_DC" BackupLocationTool = "G:\Tool" Const ForAppending = 8 Set FSO = CreateObject("Scripting.FileSystemObject") Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") Set MySink = WScript.CreateObject( _ "WbemScripting.SWbemSink","SINK_") Set MySink2 = WScript.CreateObject( _ "WbemScripting.SWbemSink","SINK2_") objWMIservice.ExecNotificationQueryAsync MySink, _ "SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE " & _ "TargetInstance ISA 'Win32_SubDirectory'" & _ " AND TargetInstance.GroupComponent = 'Win32_Directory.Name=""F:\\\\WINDOWS\\\\SYSVOL\\\\domain\\\\Policies""'" objWMIservice.ExecNotificationQueryAsync MySink2, _ "SELECT * FROM __InstanceDeletionEvent WITHIN 10 WHERE " & _ "TargetInstance ISA 'Win32_SubDirectory'" & _ " AND TargetInstance.GroupComponent = 'Win32_Directory.Name=""F:\\\\WINDOWS\\\\SYSVOL\\\\domain\\\\Policies""'" While (True) Wscript.Sleep(1000) Wend Sub SINK_OnObjectReady(objObject, objAsyncContext) gpofullpath = objObject.TargetInstance.Properties_.item("PartComponent").value gpoid1 = split(lcase(gpofullpath),"policies\\") gpouid = replace(gpoid1(1),chr(34),"") strGPODN = "CN="&gpouid&",CN=Policies,CN=System,"&DomainDN Set objGPO = GetObject("LDAP://" & strGPODN) StrGPOName = objGPO.DisplayName Set df80 = FSO.OpenTextFile(BackupLocationTool&"\GPM-Modified.log",ForAppending) df80.writeline(now&";CREATED;"&gpouid&";"&StrGPOName) df80.close End Sub Sub SINK2_OnObjectReady(objObject, objAsyncContext) gpofullpath = objObject.TargetInstance.Properties_.item("PartComponent").value StrGPOName = "N/A" gpoid1 = split(lcase(gpofullpath),"policies\\") gpouid = replace(gpoid1(1),chr(34),"") if LAGDC <> "" then strGPODN = "CN="&gpouid&",CN=Policies,CN=System,"&DomainDN err.clear Set objGPO = GetObject("LDAP://" &LAGDC&"/"&strGPODN) if err.number <> 0 then StrGPOName = "N/A" else StrGPOName = objGPO.DisplayName End if End if Set df80 = FSO.OpenTextFile(BackupLocationTool&"\GPM-Modified.log",ForAppending) df80.writeline(now&";DELETED;"&gpouid&";"&StrGPOName) df80.close End Sub Sub SINK_OnCompleted(objObject, objAsyncContext) End Sub |
Pour télécharger le script c’est ici:
Il faudra changer en début de script les valeurs suivantes:
- DomainDN = “DC=ldap389,DC=info”, le Distinguished Name de votre domaine.
- DomainDNSFQDN = “ldap389.info”, le FQDN de votre domaine.
- BackupLocationTool = “G:Tool”, Le dossier se trouvant votre script.
- LAGDC = “LAG_DC”, Si vous voulez le connaître le nom de la GPO supprimée et pas seulement son GUID, il vous faudra un site de LAG, le DC sur le LAG SITE va vous permettre de connaître le displayname de la GPO supprimée. Si vous n’avez pas de DC avec une replication retardée mettre LAGDC = “”
Il ne vous reste plus qu’a surveiller les fichiers GPT.INI modifiés sur la partition hébergeant le SYSVOL, pour cela utiliser le code suivant:
objWMIservice.ExecNotificationQueryAsync MySink3, _ "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE " & _ "TargetInstance ISA 'CIM_DataFile'" & _ " AND TargetInstance.Drive = 'F:'" & _ " AND TargetInstance.Extension = 'ini'" & _ " AND TargetInstance.FileName = 'gpt'" Sub SINK3_OnObjectReady(objObject, objAsyncContext) if objObject.TargetInstance.Properties_.item("LastModified").value <> objObject.PreviousInstance.Properties_.item("LastModified").value then gpofullpath = objObject.TargetInstance.Properties_.item("Name").value if instr(gpofullpath,DomainDNSFQDN) = 0 then gpoid1 = split(lcase(gpofullpath),"policies\") gpoid2 = split(lcase(gpoid1(1)),"\gpt.ini") gpouid = gpoid2(0) strGPODN = "CN="&gpouid&",CN=Policies,CN=System,"&DomainDN Set objGPO = GetObject("LDAP://" & strGPODN) StrGPOName = objGPO.DisplayName End if End if End Sub |
Pour télécharger c’est ici:
Si vous monitorez avec WMI les modifications d’un système de fichiers vous pouvez lire ce post des scripting guy’s. Nous avons donc maintenant notre script de monitoring des GPOs, ce script une fois adapté fonctionne si vous n’avez pas un SYSVOL trop conséquent.
Si vous avez beaucoup de GPOs dans votre domaine il se peut que vous soyez limité par les quotas WMI dans votre requête. L’erreur est du type wmi quota violation 0x8004106C ( pour les codes d’erreur WMI c’est ici). Sur notre SYSVOL nous avons plus de 3500 GPOs, le script WMI crashait au bout de quelques minutes, nous avons donc utilisé wbemtest.exe pour changer les valeurs de la super classe __ArbitratorConfiguration de la manière suivante: %Total = %PerUser de façon à lancer ce script en tant que service avec un compte dédié, sans limitations de quota utilisateur liées à WMI, seul un quota total est respecté. Attendez vous donc à avoir une charge CPU/Mémoire supplémentaire sur ce DC si vous avez un nombre conséquent d’objets de stratégie de groupe à surveiller. Graph CPU pour un Dual Core 2,5GHz surveillant 3500 GPOs:
Nous allons voir maintenant voir comment créer un service à partir d’un script VBS, pour cela lire cet article très bien expliqué. Voici ce que cela donne pour notre outil:
Ajoutez une dépendance au service WMI:
Et voila, votre service de surveillance du SYSVOL est en place.
Vous savez maintenant comment surveiller les principaux changements d’objets de stratégie de groupe au niveau GPT sur votre infrascture. L’objet du prochain post est le monitoring des liens de GPOs, ce qui veut dire sur quels containers s’appliquent vos GPOs, pour cela nous surveillerons l’attribut GPLink audité par défaut, au niveau unité d’organisation et site, sur votre AD . Voir le tableau suivant:
Une fois les changements de GPLinks sur une OU/site/domaine détectés, vous pourrez connaitre les modifications importantes de GPOs sur votre domaine:
- Création de GPO
- Suppression de GPO
- Modification de paramètre Ordinateur/Utilisateur de la GPO.
- Modification/suppression/création d’un lien de GPO.
La suite bientot.
This post is also available in: Anglais