Cybersécurité : installer et configurer Sysmon sur Windows avec une GPO
Sommaire
I. Présentation
Dans ce tutoriel, nous allons évoquer l'installation et la configuration de Sysmon sur Windows par l'intermédiaire d'une stratégie de groupe (GPO), en environnement Active Directory. Ceci va nous permettre d'automatiser le déploiement de Sysmon et de gérer sa configuration de façon centralisée.
Outil gratuit présent dans la suite SysInternals de Microsoft, Sysmon est un outil très intéressant pour enrichir les journaux Windows et tracer les activités suspectes sur un poste de travail ou un serveur.
Pour en savoir plus sur son fonctionnement et son utilisation, consultez notre précédent article :
II. Méthodologie de déploiement
A. Sysmon et le fichier de configuration XML
Pour appliquer une nouvelle configuration à Sysmon, nous devons utiliser un fichier de configuration au format XML. Ce fichier de configuration contient un ensemble de règles permettant d'indiquer à Sysmon quelles sont les actions qu'il doit surveiller et journaliser. Ce fichier permet aussi de gérer les exceptions, de façon à éviter les faux positifs.
Lorsqu'une nouvelle configuration est chargée, le driver de Sysmon récupère les données du fichier XML afin de les stocker dans le Registre Windows, après avoir converti les données. Cela signifie qu'il n'y a aucune dépendance de Sysmon vis-à-vis de son fichier de configuration.
Notre premier réflexe pourrait-être d'héberger le fichier de configuration XML sur un partage puis de faire en sorte qu'il soit lu par nos "agents" Sysmon déployés sur les machines Windows. Effectivement, cela pourrait fonctionner. Le problème, c'est que ce fichier de configuration pourrait être accessible par un potentiel attaquant. Il pourrait prendre connaissance de notre configuration Sysmon, ce qui lui permettrait de savoir comment agir pour ne pas être détecté et il pourrait essayer de la contourner.
Comment faire alors ?
A. Injecter la configuration Sysmon dans le Registre
La réponse se trouve dans cette phrase de l'article : "Lorsqu'une nouvelle configuration est chargée, le driver de Sysmon récupère les données du fichier XML afin de les stocker dans le Registre Windows, après avoir converti les données." - Nous allons directement injecter la configuration dans le Registre ! Ceci va nécessiter quelques manipulations, mais l'avantage, c'est que la configuration sera difficilement accessible, lisible et interprétable par un attaquant.
Sachez que cette méthode, qui est celle que nous allons déployer, est également recommandée par l'ANSSI dans son guide "Recommandations de sécurité pour la journalisation des systèmes Microsoft Windows en environnement Active Directory".
Nous allons devoir procéder de la façon suivante :
1 - Créer une stratégie de groupe pour installer Sysmon, sans configuration personnalisée.
2 - Créer une configuration personnalisée à partir d'une machine de référence.
3 - Exporter la configuration Sysmon, à partir du Registre.
4 - Créer une stratégie de groupe pour injecter les valeurs de Registre sur les machines où Sysmon doit être configuré.
Désormais, nous allons voir comment mettre en œuvre cette méthode fondée sur 4 grandes étapes.
Si malgré tout, vous souhaitez utiliser un fichier XML pour gérer votre configuration Sysmon, je vous recommande de masquer le partage sur lequel le fichier est hébergé et de brider les droits autant que possible. Autorisez seulement les objets ordinateurs où Sysmon est déployé à venir lire la configuration.
III. GPO - Déploiement de Sysmon sur Windows
Intéressons-nous à l'installation de Sysmon sur Windows. Nous allons partir du principe que seule la version 64 bits est utilisée et notre script PowerShell va permettre déployer cette version. Une fois que le script sera prêt, il sera exécuté au travers d'une stratégie de groupe.
A. Script PowerShell pour installer Sysmon
Pour rappel, lorsque Sysmon est installé sur une machine, il crée différentes clés de Registre dont celles-ci (une seule selon la version) :
Sysmon - 32 bits
HKLM\SYSTEM\CurrentControlSet\Services\sysmon
Sysmon - 64 bits
HKLM\SYSTEM\CurrentControlSet\Services\sysmon64
Nous allons utiliser un script PowerShell pour réaliser l'installation de Sysmon64. Si l'application est déjà installée, le script ne cherchera pas à la réinstaller. Dans le script ci-dessous, vous devez adapter la valeur de la variable "$SysmonShare" car elle contient le chemin vers l'exécutable de Sysmon. Vous pouvez stocker cet exécutable dans le partage "SYSVOL" de votre domaine Active Directory ou dans un autre partage correctement configuré.
# Partage - Chemin réseau vers l'exécutable de SYSMON
$SysmonShare = "\\it-connect.local\SYSVOL\it-connect.local\scripts\Sysmon64.exe"
# Avant de poursuivre, on vérifie que le chemin vers l'exécutable est correct
if(Test-Path -Path $SysmonShare -PathType Leaf)
{
# Chemin vers la clé de Registre de Sysmon (version 64 bits)
$SysmonRegKey = "HKLM:\SYSTEM\CurrentControlSet\Services\Sysmon64"
# Chemin vers le fichier exécutable de Sysmon64 via lecture du Registre
$SysmonRegImagePath = (Get-ItemProperty -Path $SysmonRegKey -Name ImagePath -ErrorAction SilentlyContinue).ImagePath
# Si $SysmonRegImagePath n'est pas nul, c'est que Sysmon est installé
if ($SysmonRegImagePath)
{
Write-Output "Sysmon64 est déjà installé sur cette machine"
}
# Sinon, Sysmon doit être installé à partir de l'exécutable présent dans le partage
else
{
Write-Output "Sysmon64 va être installé sur cette machine"
& $SysmonShare -i -accepteula
}
}
Si vous avez besoin d'un script PowerShell plus complet, vous pouvez utiliser celui de l'ANSSI accessible via le lien ci-dessous. Ce script est capable de gérer les versions 32 bits et 64 bits, mais aussi la mise à jour de Sysmon, ainsi que les configurations particulières basées sur un pilote Sysmon renommé (ce qui influence le nom de la clé de Registre liée au service).
Plutôt que d'utiliser un script PowerShell, nous pourrions utiliser un script Batch. En revanche, il n'existe pas de paquet MSI pour Sysmon.
B. Exécuter le script dans une GPO
Désormais, nous allons exécuter ce script PowerShell à l'aide d'une stratégie de groupe que l'on va créer avec la console "Gestion de stratégie de groupe". Dans cet exemple, la GPO est nommée "Installer Sysmon (PS1)" et elle est liée à l'OU "Serveurs" de l'annuaire Active Directory.
Modifiez la GPO et suivez la procédure suivante :
1 - Accédez à : Configuration ordinateur > Stratégies > Paramètres Windows > Scripts (démarrage / arrêt).
2 - Double-cliquez sur "Démarrage".
3 - Cliquez sur "Afficher les fichiers" pour accéder au répertoire des scripts de la GPO et collez le fichier PS1 à cet emplacement. Vous pouvez aussi stocker le script à la racine du SYSVOL.
4 - Cliquez sur "Ajouter" puis sur "Parcourir".
5 - Sélectionnez le script, ici, il s'appelle simplement "Sysmon.ps1".
6 - Cliquez sur "OK" à deux reprises.
Pour information, voici où est stocké le script sur mon environnement de démo :
Voilà, la GPO pour installer Sysmon est prête !
Il ne reste plus qu'à tester son bon fonctionnement sur une machine. Pour rappel, Sysmon sera déployé dans sa configuration par défaut, c'est-à-dire sans aucune règle personnalisée. Sur une machine où Sysmon a été installée, vous pouvez voir le service "Sysmon64", comme ceci :
Remarque : si vous utilisez un script PowerShell pour déployer Sysmon, il est recommandé de le signer à l'aide d'un certificat de signature de code. À ce sujet, vous pouvez lire les deux articles suivants :
- PowerShell - Signer un script avec un certificat (ADCS)
- PowerShell - Signer un script avec un certificat auto-signé
IV. Configuration centralisée de Sysmon
A. Créer un modèle de configuration de Sysmon
Vous allez devoir définir un modèle de configuration Sysmon correspondant à vos besoins et aux spécificités de votre infrastructure. Vous pouvez utiliser comme base la configuration Sysmon de SwiftOnSecurity déjà évoquée dans notre précédent tutoriel sur Sysmon.
Dans cet exemple, c'est ce fichier que nous allons utiliser. Voici le lien :
Vous devez utiliser une machine sur laquelle Sysmon est installé afin de mettre à jour la configuration. Je vous rappelle que l'objectif est d'utiliser cette machine comme "machine de référence" pour la configuration de Sysmon. Le fichier XML de Sysmon doit être présent uniquement sur cette machine.
Voici la commande à exécuter pour mettre à jour la configuration de Sysmon à partir d'un fichier XML :
.\Sysmon64.exe -c sysmonconfig-export.xml
Remarque : en modifiant les paramètres, vous pouvez aussi installer Sysmon et lui associer directement cette configuration.
La prise en compte de cette configuration est immédiate. Désormais, nous allons devoir l'exporter à partir des valeurs présentes dans le Registre Windows.
B. Exporter la configuration Sysmon à partir du Registre
La configuration Sysmon est stockée dans la clé de Registre correspondante au pilote Sysmon : "SysmonDrv" (nom par défaut). Ceci correspond à cet emplacement du Registre :
Nous allons devoir exporter les données des valeurs de Registre suivantes :
- DnsLookup
- HashingAlgorithm
- Options
- Rules
La configuration de notre fichier XML est stockée dans "Rules" mais nous devons également prendre en compte les autres valeurs. Certaines valeurs étant en binaire, il n'est pas possible d'exporter les données dans un format interprétable par l'éditeur de GPO à partir de "regedit.exe".
Nous avons deux options :
- Utiliser PowerShell pour lire les données et exporter les données de chaque valeur dans un fichier texte. Ensuite, nous pourrons copier-coller le contenu de chaque fichier texte dans notre GPO.
- Utiliser l'Assistant Registre de la console de Gestion des stratégies de groupe pour aller lire les données dans le Registre directement et les ajouter à la GPO. C'est sans aucun doute la façon la plus simple, mais cela implique d'avoir les outils RSAT sur le serveur de référence ou de pouvoir s'y connecter à distance via la console de Gestion des stratégies de groupe (connexion RPC).
Dans la suite de ce tutoriel, nous allons appliquer la méthode via l'Assistant Registre, mais voici des instructions pour effectuer la manipulation via PowerShell.
La commande ci-dessous permet d'exporter les données de la valeur "Rules" dans le fichier texte "C:\TEMP\Export_Sysmon_Rules.txt". Nous utilisons la méthode "ToString" associée au format "X2" pour que les données soient converties au format hexadécimal. Ce format est pris en charge par l'éditeur de GPO, ce qui nous permettra de préciser les valeurs dans un format accepté.
((Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\sysmonDrv\Parameters").Rules | ForEach-Object { $_.ToString("X2") }) -join '' > "C:\TEMP\Export_Sysmon_Rules.txt"
Ce qui donnera un fichier similaire à celui-ci :
L'opération doit être répétée pour chaque valeur du Registre.
Pour vous aider, voici un bout de code pour générer un fichier texte pour chaque valeur. Vous pouvez changer la valeur de la variable "$SysmonSvcOutput" pour modifier le chemin du dossier de sortie.
$SysmonSvcOutput = "C:\TEMP"
$SysmonSvcReg = "HKLM:\SYSTEM\CurrentControlSet\Services\SysmonDrv\Parameters"
$SysmonSvcRegValueBinary = @("DnsLookup","Rules")
$SysmonSvcRegValueDword = @("HashingAlgorithm","Options")
foreach($value in $SysmonSvcRegValueBinary){
((Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\sysmonDrv\Parameters").$value | ForEach-Object { $_.ToString("X2") }) -join '' > "$SysmonSvcOutput\Sysmon_Export_$value.txt"
}
foreach($value in $SysmonSvcRegValueDword){
(Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\sysmonDrv\Parameters").$value > "$SysmonSvcOutput\Sysmon_Export_$value.txt"
}
Désormais, nous allons voir comment ajouter ces informations à une GPO.
C. Configurer Sysmon par GPO
Pour configurer Sysmon, nous allons créer une nouvelle GPO. Pour ma part, elle s'appelle "Configurer Sysmon (GPP)".
1 - Modifiez la GPO et accédez à l'emplacement suivant : Configuration ordinateur > Préférences > Paramètres Windows > Registre.
2 - Effectuez un clic droit puis sous "Nouveau", choisissez "Assistant Registre". Attention, si vous avez exporté les données via PowerShell, choisissez "Élément Registre" et configurez chaque valeur de Registre.
Un assistant s'exécute. Si votre machine de référence correspond à la machine locale, choisissez "Ordinateur local", sinon prenez la seconde option et recherchez votre machine.
Ensuite, parcourez l'arborescence du Registre jusqu'à pouvoir cocher les 4 valeurs que nous souhaitons importer. Cliquez sur "Terminer".
Voilà, les valeurs et les données associées sont immédiatement importées dans la GPO. Pratique.
Voici le résultat obtenu :
Si vous avez besoin de différencier Sysmon 32 bits et Sysmon 64, utilisez une règle de "Ciblage au niveau de l'élément" sur chaque règle de la GPO. Cette règle devra aller vérifier la présence de la clé de Registre "Sysmon" ou "Sysmon64" pour déterminer la version de l'application.
De plus, sachez que le schéma du fichier XML de Sysmon peut évoluer au fil des versions, donc nous devons en tenir compte. Sinon, la configuration peut devenir "illisible" par l'outil. C'est pour cette raison que nous allons ajouter une condition de ciblage sur chaque règle de la GPO. Pour connaître la version de Sysmon, il suffit de regarder dans les propriétés de l'exécutable Sysmon. Ici, il s'agit de la version "15.14.0.0".
Ensuite, nous allons créer une condition de cette façon :
1 - Modifiez une première valeur dans la GPO, cliquez sur "Commun", puis cochez "Ciblage au niveau de l'élément" et cliquez sur le bouton "Ciblage".
2 - Cliquez sur "Nouvel élément" et choisissez "Correspondance fichier".
3 - Choisissez le type de correspondance nommé "Faire correspondre la version de fichier".
4 - Indiquez le chemin d'accès en version 64 bits (si vous gérez les deux versions, vous devez créer plusieurs conditions et utiliser l'opérateur "OU").
%WinDir%\Sysmon64.exe
5 - Indiquez votre version comme valeur maximale, en indiquant la valeur complète (y compris les zéros). Choisissez l'opérateur "<=" à la place de "<" sinon la règle ne s'appliquera pas. Si besoin, nous pourrions aussi ajuster la version minimale (valeur de gauche).
Validez et répétez l'opération pour les autres règles de la GPO.
V. Tester la configuration
Désormais, il ne reste plus qu'à tester la GPO sur une machine ciblée par celle-ci. Voici l'état d'une machine sur laquelle Sysmon a été installé par GPO mais qui n'a pas appliqué de fichier de configuration. Nous voyons que la valeur "Rules" n'est même pas présente.
Après application de la GPO, les valeurs de Registre sont bien actualisées et nous pouvons le confirmer en regardant le Registre :
Il faut savoir qu'il n'y a pas besoin de redémarrer le service Sysmon. Il va détecter de lui-même la modification de la configuration (valeur "Rules") et l'appliquer immédiatement.
Nous venons de déployer une configuration de Sysmon par GPO sans l'exposer dans un fichier XML ! Ainsi, notre configuration est protégée des regards indiscrets.
VI. Conclusion
En suivant ce tutoriel sur Sysmon, vous devriez être en mesure de l'installer et de le configurer de façon automatique sur vos machines Windows ! La prochaine étape consistera à collecter ses événements dans le but de pouvoir les analyser.
Top ! Merci beaucoup pour le tuto hardening.
J’ai testé en bon informaticien faignant mais efficient ^^, il est possible de mettre le ciblage sur la clé Parameters au lieu de passer sur les 4 valeurs, ça fait gagner un p’tit peu de temps.
Top ! Vivement la prochaine étape !