1. Introduction

Le système Microsoft Windows est doté d'un sous-système d'audit puissant mais ce sous-système est rarement utilisé par méconnaissance de son existence et aussi par ignorance des fonctionnalités qu'il peut offrir. Le sous-système d'audit permet de mettre en place une véritable politique d'audit et en plus, il peut s'avérer une aide inestimable pour le débogage et le suivi de certaines applications orientées "système".

Cet article est organisé comme suit :

  • le paragraphe 2 présente la mise en place d'une politique d'audit et les différents paramètres d'audit dans les environnements Microsoft Windows ;
  • le paragraphe 3 présente la mise en place des paramètres d'audit en ce qui concerne les répertoires, les fichiers et les clés de la base de registre ;
  • le paragraphe 4 présente les journaux générés par les événements d'audit et les outils disponibles pour lire ces événements ;
  • le paragraphe 5 présente l'API de programmation pour tout ce qui concerne la gestion de l'audit ;
  • le paragraphe 6 présente un programme d'exemple écrit en C manipulant les fonctions de l'API de programmation de gestion de l'audit ;
  • et enfin, le paragraphe 7 se propose de conclure cet article.

2. La mise en place d'une politique d'audit

2.1. Définition de la politique d'audit

La mise en place d'une politique d'audit doit commencer obligatoirement par la spécification de cette politique.

Cette spécification consiste à définir en termes simples, dans un langage courant, le besoin, c'est-à-dire ce que l'on veut auditer, et surtout pourquoi on veut l'auditer. Si le "pourquoi" est flou, c'est que le "besoin" n'est pas clair et qu'il convient de l'affiner.

Un deuxième besoin consiste à spécifier le périmètre de la politique d'audit. Il y a probablement des serveurs ou des services qui auront une politique différente. En effet, le serveur de gestion de la paye n'a pas du tout les mêmes contraintes que le serveur de sauvegarde de l'équipe de développement.

Ce besoin peut être par exemple :

  • Je veux savoir si des personnes se connectent la nuit sur mon système d'informations alors que normalement, les locaux sont fermés.
  • Ce fichier est stratégique pour mon entreprise car il contient la liste de mes clients et je veux savoir qui y accède en lecture et qui le modifie.
  • Je développe une application et je voudrai savoir pourquoi elle n'arrive pas à modifier l'heure du système alors que tout semble correct au niveau du code.

Une fois que la politique d'audit est définie, il convient de l'implémenter avec les moyens mis à disposition par le système d'exploitation.

2.2. Les paramètres d'audit

Les 9 paramètres d'audit connus par Windows sont identifiés dans le tableau suivant. Ce tableau contient 3 colonnes :

  • la colonne 1 "Description" est une description rapide du paramètre d'audit. ;
  • la colonne 2 "Explication" contient des informations plus détaillées sur ce paramètre d'audit ;
  • la colonne 3 "Valeur par défaut" enfin donne les valeurs par défaut du paramètre d'audit ("Réussite", "Echec" ou "Aucune"). Certaines valeurs peuvent être différentes suivant que la machine est une station de travail (identifiées par WKS), un serveur (identifiées par SRV) ou un contrôleur de domaine (identifiées par DC).
Description Explication Valeur par défaut
Auditer la gestion des comptes Ce paramètre de sécurité détermine s'il convient d'auditer chaque événement de gestion des comptes sur un ordinateur. Exemples d'événements de gestion des comptes :

* Un compte ou un groupe d'utilisateurs est créé, modifié ou supprimé ;

* Un compte d'utilisateur est renommé, désactivé ou activé ;

* Un mot de passe est défini ou changé.

Si vous définissez ce paramètre de stratégie, vous pouvez spécifier s'il convient d'auditer les réussites, les échecs, ou de ne pas du tout auditer le type d'événement. Les audits de réussite génèrent une entrée d'audit lorsqu'un événement de gestion de compte réussit. Les audits d'échec génèrent une entrée d'audit lorsqu'un événement de gestion de compte échoue. Pour définir cette valeur à Pas d'audit, dans la boîte de dialogue Propriétés de ce paramètre de stratégie, activez la case à cocher Définir ces paramètres de stratégie et désactivez les cases à cocher Réussite et Échec.
DC : Réussite.

WKS et SRV : Aucune.
Auditer l'accès au service d'annuaire Ce paramètre de stratégie détermine s'il convient d'auditer l'événement d'un accès utilisateur à un objet Active Directory dont la propre liste de contrôle d'accès système (SACL) est spécifiée.

Par défaut, cette valeur est définie à Pas d'audit dans l'objet de stratégie de groupe (GPO) du contrôleur de domaine par défaut, et reste non définie pour les stations de travail et les serveurs où elle n'est pas significative.

Si vous définissez ce paramètre de stratégie, vous pouvez spécifier s'il convient d'auditer les réussites, d'auditer les échecs, ou de ne pas du tout auditer le type d'événement. Les audits de réussite génèrent une entrée d'audit lorsqu'un utilisateur accède à un objet Active Directory pour lequel une liste SACL a été spécifiée. Les audits d'échecs génèrent une entrée d'audit lorsqu'un utilisateur effectue une tentative infructueuse d'accès à un objet Active Directory pour lequel une liste SACL a été spécifiée. Pour définir cette valeur à Pas d'audit, dans la boîte de dialogue "Propriétés pour ce paramètre de stratégie", activez la case à cocher Définir ces paramètres de stratégie et désactivez les cases à cocher Réussite et Échec.

Notez que vous pouvez définir une liste SACL sur un objet Active Directory en utilisant l'onglet Sécurité dans la boîte de dialogue Propriétés de cet objet. Cette opération est identique à un accès à un objet Audit, sauf qu'elle s'applique uniquement aux objets Active Directory et non aux objets du système de fichiers et du Registre.
DC : Réussite.

WKS et SRV : Aucune.
Auditer l'accès aux objets Ce paramètre de sécurité détermine s'il convient d'auditer l'événement d'accès à un objet par un utilisateur, par exemple, un fichier, un dossier, une clé de Registre, une imprimante, etc., dont la propre liste de contrôle d'accès système (SACL) est spécifiée.

Si vous définissez ce paramètre de stratégie, vous pouvez spécifier s'il convient d'auditer les réussites, d'auditer les échecs, ou de ne pas du tout auditer le type d'événement. Les audits de réussite génèrent une entrée d'audit lorsqu'un utilisateur réussit à accéder à un objet pour lequel une liste SACL appropriée est spécifiée. Les audits d'échec génèrent une entrée d'audit lorsqu'un utilisateur tente en vain d'accéder à un objet pour lequel une liste SACL est spécifiée.

Pour définir cette valeur à Pas d'audit, dans la boîte de dialogue Propriétés de ce paramètre de stratégie, activez la case à cocher Définir ces paramètres de stratégie et désactivez les cases à cocher Réussite et Échec.

Notez que vous pouvez définir une liste SACL sur un objet de système de fichiers en utilisant l'onglet Sécurité dans la boîte de dialogue Propriétés de cet objet.
Aucune.
Auditer le suivi des processus Ce paramètre de sécurité détermine s'il convient d'auditer les informations de suivi détaillé pour des événements tels que l'activation d'un programme, la fin d'un processus, la duplication d'un descripteur et l'accès indirect à un objet.

Si vous définissez ce paramètre de stratégie, vous pouvez spécifier s'il convient d'auditer les réussites, d'auditer les échecs, ou de ne pas du tout auditer le type d'événement. Les audits de réussite génèrent une entrée d'audit lorsque le processus suivi réussit. Les audits d'échec génèrent une entrée d'audit lorsque le processus suivi échoue.

Pour définir cette valeur à Pas d'audit, dans la boîte de dialogue Propriétés de ce paramètre de stratégie, activez la case à cocher Définir ces paramètres de stratégie et désactivez les cases à cocher Réussite et Échec.
Aucune.
Auditer les événements de connexion Ce paramètre de sécurité détermine s'il convient d'auditer chaque instance d'une ouverture ou d'une fermeture de session par un utilisateur sur un ordinateur.

Les événements de connexion à un compte sont générés sur les contrôleurs de domaine pour une activité de compte de domaine et sur les ordinateurs locaux pour une activité de compte local. Si les catégories de connexion à un compte et de stratégie d'audit de connexion sont toutes deux activées, les connexions qui utilisent un compte de domaine génèrent un événement d'ouverture de session ou de fermeture de session sur la station de travail ou le serveur, et elles génèrent un événement de connexion à un compte sur le contrôleur de domaine. En outre, les connexions interactives à un serveur membre ou à une station de travail qui utilisent un compte de domaine génèrent un événement de connexion sur le contrôleur de domaine car les scripts et les stratégies de connexion sont récupérés lorsqu'un utilisateur se connecte. Pour plus d'informations sur les événements de connexion à un compte, voir Auditer les événements de connexion aux comptes.

Si vous définissez ce paramètre de stratégie, vous pouvez spécifier s'il convient d'auditer les réussites, d'auditer les échecs, ou de ne pas du tout auditer le type d'événement. Les audits de réussite génèrent une entrée d'audit lorsqu'une tentative de connexion aboutit. Les audits d'échec génèrent une entrée d'audit lorsqu'une tentative de connexion échoue.

Pour définir cette valeur à Pas d'audit, dans la boîte de dialogue Propriétés de ce paramètre de stratégie, activez la case à cocher Définir ces paramètres de stratégie et désactivez les cases à cocher Réussite et Échec.
Réussite.
Auditer les événements de connexion aux comptes Ce paramètre de stratégie détermine s'il convient d'auditer chaque instance d'ouverture ou de fermeture de session sur un autre ordinateur dans laquelle cet ordinateur est utilisé pour valider le compte. Des événements d'ouverture de session de compte sont générés lorsqu'un compte d'utilisateur de domaine est authentifié sur un contrôleur de domaine. L'événement est enregistré dans le journal de sécurité du contrôleur de domaine. Des événements d'ouverture de session sont générés lorsqu'un utilisateur local est authentifié sur un ordinateur local. L'événement est enregistré dans le journal de sécurité local. Aucun événement de fermeture de session de compte n'est généré.

Si vous définissez ce paramètre de stratégie, vous pouvez spécifier s'il convient d'auditer les réussites, d'auditer les échecs, ou de ne pas du tout auditer le type d'événement. Les audits de réussite génèrent une entrée d'audit lorsqu'une ouverture de session de comptes aboutit. Les audits d'échec génèrent une entrée d'audit lors de l'échec d'une ouverture de session de compte.

Pour définir cette valeur à Pas d'audit, dans la boîte de dialogue Propriétés de ce paramètre de stratégie, activez la case à cocher Définir ces paramètres de stratégie et désactivez les cases à cocher Réussite et Échec.

Si l'audit de réussite des événements d'ouverture de session de compte est activé sur un contrôleur de domaine, une entrée est enregistrée pour chaque utilisateur qui est validé sur ce contrôleur de domaine, même si l'utilisateur est actuellement connecté sur une station de travail qui est jointe au domaine.
Réussite.
Auditer les événements du système Ce paramètre de sécurité détermine s'il convient d'auditer lorsqu'un utilisateur redémarre ou arrête l'ordinateur ou lorsqu'un l'événement qui se produit affecte la sécurité du système ou le journal de sécurité.

Si vous définissez ce paramètre de stratégie, vous pouvez spécifier s'il convient d'auditer les réussites, d'auditer les échecs, ou de ne pas du tout auditer le type d'événement. Les audits de réussite génèrent une entrée d'audit lorsqu'un événement système est exécuté avec succès. Les audits d'échec génèrent une entrée d'audit lorsqu'un événement système est tenté sans succès.

Pour définir cette valeur à Pas d'audit, dans la boîte de dialogue Propriétés de ce paramètre de stratégie, activez la case à cocher Définir ces paramètres de stratégie et désactivez les cases à cocher Réussite et Échec.
DC : Réussite.

WKS et SRV : Aucune.
Auditer les modifications de stratégie Ce paramètre de stratégie détermine s'il convient d'auditer chaque incident d'une modification aux stratégies d'affectation de droits de l'utilisateur, aux stratégies d'audit ou aux stratégies d'approbation.

Si vous définissez ce paramètre de stratégie, vous pouvez spécifier s'il convient d'auditer les réussites, d'auditer les échecs, ou de ne pas du tout auditer le type d'événement. Les audits de réussite génèrent une entrée d'audit lorsqu'une modification aux stratégies d'affectation de droits de l'utilisateur, aux stratégies d'audit ou aux stratégies d'approbation aboutit. Les audits d'échec génèrent une entrée d'audit lorsqu'une modification aux stratégies d'affectation de droits de l'utilisateur, aux stratégies d'audit ou aux stratégies d'approbation échoue.

Pour définir cette valeur à Pas d'audit, dans la boîte de dialogue Propriétés de ce paramètre de stratégie, activez la case à cocher Définir ces paramètres de stratégie et désactivez les cases à cocher Réussite et Échec.
DC : Réussite.

WKS et SRV : Aucune.
Auditer l'utilisation des privilèges Ce paramètre de sécurité détermine s'il convient d'auditer chaque instance d'un utilisateur exerçant un droit de l'utilisateur.

Si vous définissez ce paramètre de stratégie, vous pouvez spécifier s'il convient d'auditer les réussites, d'auditer les échecs, ou de ne pas du tout auditer le type d'événement. Les audits de réussite génèrent une entrée d'audit lorsque l'exercice d'un droit de l'utilisateur réussit. Les audits d'échec génèrent une entrée d'audit lorsque l'exercice d'un droit de l'utilisateur échoue.

Pour définir cette valeur à Pas d'audit, dans la boîte de dialogue Propriétés de ce paramètre de stratégie, activez la case à cocher Définir ces paramètres de stratégie et désactivez les cases à cocher Réussite et Échec.

Des audits ne sont pas générés pour l'utilisation des droits de l'utilisateur suivants, même si des audits de réussite ou des audits d'échec sont spécifiés pour Auditer l'utilisation des privilèges. L'activation de l'audit de ces droits de l'utilisateur tend à générer de nombreux événements dans le journal de sécurité, ce qui peut compromettre les performances de votre ordinateur. Pour auditer les droits de l'utilisateur suivants, activez la clé de Registre FullPrivilegeAuditing.

* Contourner la vérification de parcours ;

* Déboguer les programmes ;

* Créer un objet-jeton ;

* Remplacer un jeton de niveau processus ;

* Générer des audits de sécurité ;

* Sauvegarder les fichiers et les répertoires ;

* Restaurer les fichiers et les répertoires.

Attention, une modification incorrecte du Registre peut gravement endommager le système. Avant d'apporter des modifications au Registre, il convient de sauvegarder toutes les données importantes de l'ordinateur.
Aucune.

Vous avez des précisions à apporter au sujet de ces paramètres, un lien ou une traduction concernant leurs descriptions, n'hésitez pas à les signaler dans la discussion dédiée (2 commentaires), cet article sera mis à jour.

2.3. La modification des paramètres d'audit

La gestion des paramètres d'audit se fait à l'aide d'un plug-in lancé par une MMC (Microsoft Management Console) se trouvant dans le panneau de configuration, dans les outils d'administration et qui s'appelle "Stratégie de sécurité locale" (du moins sur un système Windows Seven Professionnel français).

Ce plug-in peut aussi être lancé directement par la ligne de commande suivante : "%windir%\system32\secpol.msc /s".

Le gestionnaire des paramètres d'audit secpol.msc
Le gestionnaire des paramètres d'audit secpol.msc

Cette copie d'écran montre clairement que certains paramètres d'audit ("Auditer la gestion des comptes" par exemple) ont été mis à jour par une stratégie de groupe du domaine (GPO ou Group Policy Object).

Il semble que ce plug-in n'existe pas par défaut sur les versions familiales de Microsoft Windows.

La gestion des paramètres de l'audit se trouve dans la section "Stratégies locales" / "Stratégie d'audit" de la partie gauche de l'arbre.

Il est possible de modifier les valeurs des différents paramètres d'audit. Pour cela, il suffit de sélectionner un des paramètres affichés et ensuite, de faire un clic droit et de sélectionner l'option "Propriétés".

Les propriétés d'un paramètre d'audit
Les propriétés d'un paramètre d'audit

3. Le paramètre d'audit "Auditer l'accès aux objets"

Parmi les neuf paramètres de l'audit, il y en a huit qui sont binaires. Il ne nécessitent pas de réglages supplémentaires, ils sont activés ou désactivés.

Par contre, le paramètre d'audit "Auditer l'accès aux objets", nécessite des réglages supplémentaires, il faut spécifier sur quels objets portera cet audit.

Ceci se fait à l'aide de l'explorer Windows dans la fenêtre "Sécurité" en cliquant sur le bouton "Paramètres avancés".

Les paramètres de sécurité d'un répertoire
Les paramètres de sécurité d'un répertoire

Ce bouton ouvre une fenêtre qui permet de spécifier les autorisations de ce fichier ou répertoire mais il y a aussi un onglet qui permet de spécifier les paramètres d'audit de ce fichier ou répertoire.

Les paramètres d'audit d'un répertoire
Les paramètres d'audit d'un répertoire

Cette copie d'écran montre que l'audit du répertoire c:\temp et ses descendants pour tous les accès ("Contrôle total") a été activé pour l'utilisateur "Guest" de la machine locale.

Le réglage de l'audit pour certaines valeurs ou branches de la base de registre se fait de la même manière avec l'outil "regedit.exe".

Les paramètres d'audit d'une clé de la base de registre
Les paramètres d'audit d'une clé de la base de registre

Cette copie d'écran montre que l'audit de la clé HKEY_CURRENT_USER et ses descendants pour tous les accès ("Contrôle total") a été activé pour l'utilisateur "Guest" de la machine locale.

4. Le suivi de la politique d'audit

Une fois que la stratégie d'audit a été mise en place sur la machine, il ne reste plus qu'à analyser les journaux générés par cet audit.

Cette tâche est souvent sous estimée. En effet, elle nécessite un travail récurrent d'analyse sinon, l'audit ne sert strictement à rien (mis à par remplir le disque).

4.1. Le journal d'audit

Les journaux de l'audit sont gérés par le sous-système Microsoft "EventLog". Je vous encourage à consulter ce tutoriel La journalisation dans le monde Microsoft, découvrez l'API EventLog pour plus d'informations au sujet de ce sous-système.

Les événements d'audit sont archivés dans le journal "Security". Ce journal est consultable avec le programme "EventViewer" accessible à partir du panneau de configuration dans les outils systèmes ou bien en tapant la commande "eventvwr" dans le menu "Démarrer / Exécuter" de Windows.

Le journal des événements d'audit
Le journal des événements d'audit

4.2. Les événements d'audit

Les textes des différents messages d'audit se trouvent dans la DLL MSAuditE.dll.

  • Sur un système Windows XP Professional SP3, cette DLL définit 165 messages dont les identifiants varient entre 512 et 801.
  • Sur un système Windows Seven Professional, cette DLL définit 309 messages dont les identifiants varient entre 512 et 1031.

Cette évolution du nombre de messages entre Windows XP et Windows Seven montre bien que Microsoft continue à travailler et à enrichir le sous-système d'audit.

La liste complète des messages peut être visualisée avec l'utilitaire EventLogDump (à lancer en tant qu'administrateur).

5. L'API de gestion de l'audit

La gestion de l'audit se fait avec les fonctions suivantes :

AuditComputeEffectivePolicyBySid() Computes the effective audit policy for one or more subcategories for the specified security principal. The function computes effective audit policy by combining system audit policy with per-user policy.
AuditComputeEffectivePolicyByToken() Computes the effective audit policy for one or more subcategories for the security principal associated with the specified token. The function computes effective audit policy by combining system audit policy with per-user policy.
AuditEnumerateCategories() Enumerates the available audit-policy categories.
AuditEnumeratePerUserPolicy() Enumerates users for whom per-user auditing policy is specified.
AuditEnumerateSubCategories() Enumerates the available audit-policy subcategories.
AuditFree() Frees the memory allocated by audit functions for the specified buffer.
AuditLookupCategoryGuidFromCategoryId() Retrieves a GUID structure that represents the specified audit-policy category.
AuditLookupCategoryIdFromCategoryGuid() Retrieves an element of the POLICY_AUDIT_EVENT_TYPE enumeration that represents the specified audit-policy category.
AuditLookupCategoryName() Retrieves the display name of the specified audit-policy category.
AuditLookupSubCategoryName() Retrieves the display name of the specified audit-policy subcategory.
AuditQueryPerUserPolicy() Retrieves per-user audit policy in one or more audit-policy subcategories for the specified principal.
AuditQuerySystemPolicy() Retrieves system audit policy for one or more audit-policy subcategories.
AuditSetPerUserPolicy() Sets per-user audit policy in one or more audit subcategories for the specified principal.
AuditSetSystemPolicy() Sets system audit policy for one or more audit-policy subcategories.
Auditing Constants The following constants represent categories of audit-policy events. These constants are defined as GUID (Global Unique IDentifier) structures in Ntsecapi.h.

Toutes ces fonctions sont disponibles uniquement à partir de la version Windows Vista pour les stations de travail et de la version Windows 2008 pour les serveurs.

6. Programme d'exemple

6.1. But du programme

Le programme présenté dans cet article est relativement simple, il se propose :

  • d'afficher les différentes catégories d'audit ;
  • pour chacune des catégories trouvée, il affiche les sous-catégories d'audit ;
  • pour chacune des sous-catégories, il affiche son état de configuration (Success ou Failure).

Comme ce programme utilise la fonction AuditQuerySystemPolicy(), il est nécessaire que l'utilisateur dispose du privilège SE_SECURITY_NAME. Ce privilège n'est pas attribué par défaut aux utilisateurs standards, il faut donc exécuter ce programme avec les privilèges d'administrateur (Exécuter en tant que Administrateur). Pour plus d'informations au sujet des privilèges, consulter l'article Présentation des privilèges d'exécution dans l'environnement Microsoft Windows.

Afin de montrer autre chose que la configuration par défaut, l'audit (Success et Failure) a été activé sur les éléments d'audit "Auditer les événements de connexion aux comptes" et "Audit la gestion des comptes".

6.2. Environnement de développement

Le programme de test a été développé avec l'environnement suivant :

  • Microsoft Windows Seven Profesionnel avec tous les correctifs de sécurité appliqués au jour de la rédaction de l'article (15 septembre 2009) ;
  • Visual Studio 2005 ;
  • programme en mode console compilé en Unicode ;
  • la gestion des erreurs est ultra-simpliste ;
  • le programme est écrit volontairement en C afin que d'autres langages puissent utiliser les idées développées dans ce code.

Pour les plus impatients, le binaire peut être téléchargé ici et le projet complet (au format Visual Studio 2005) peut être téléchargé ici.

Si une erreur se produit lors du lancement du programme Audit.exe, il faut installer les redistribuables VS 2005. Ce setup peut être téléchargé ici.

6.3. Les fonctions utilisées

Ce paragraphe liste les fonctions spécifiques à la gestion de l'audit Microsoft et utilisées par le programme de démonstration :

  • la fonction AuditEnumerateCategories() permet d'obtenir la liste des GUID (Global Unique IDentifier) des catégories principales d'audit ;
  • la fonction AuditLookupCategoryName() permet d'obtenir le nom d'une catégorie principale d'audit dont on fournit le GUID ;
  • la fonction AuditFree() permet de libérer un bloc de mémoire alloué par les différentes fonctions de gestion de l'audit. Il est impératif d'utiliser cette fonction et pas une autre ;
  • la fonction AuditEnumerateSubCategories() permet d'obtenir la liste des GUID des sous-catégories d'audit dont la catégorie principale est donnée en paramètre ;
  • la fonction AuditLookupSubCategoryName() permet d'obtenir le nom d'une sous-catégorie d'audit dont on fournit le GUID ;
  • la fonction AuditQuerySystemPolicy() permet d'obtenir la configuration de l'audit pour une sous-catégorie d'audit dont on fournit le GUID.

6.4. Le résultat généré

Le résultat de l'exécution de la version Release du programme de démonstration sur un poste Windows Seven professionnel produit le résultat suivant :

Résultat du programme de démonstration
CacherSélectionnez
  1. D:\Raymond\Developpement\Test\Audit\Release>Audit.exe 
  2. Catégorie = Système 
  3.         Modification de l'état de la sécurité (Success) 
  4.         Extension système de sécurité 
  5.         Intégrité du système (Success, Failure) 
  6.         Pilote IPSEC 
  7.         Autres événements système (Success, Failure) 
  8. Catégorie = Ouverture/Fermeture de session 
  9.         Ouvrir la session (Success) 
  10.         Fermer la session (Success) 
  11.         Verrouillage du compte (Success) 
  12.         Mode principal IPsec 
  13.         Mode rapide IPsec 
  14.         Mode étendu IPsec 
  15.         Ouverture de session spéciale (Success) 
  16.         Autres événements d'ouverture/fermeture de session 
  17.         Serveur NPS (Success, Failure) 
  18. Catégorie = Accès aux objets 
  19.         Système de fichiers 
  20.         Registre 
  21.         Objet de noyau 
  22.         SAM 
  23.         Services de certification 
  24.         Généré par application 
  25.         Manipulation de handle 
  26.         Partage de fichiers 
  27.         Rejet de paquet par la plateforme de filtrage 
  28.         Connexion de la plateforme de filtrage 
  29.         Autres événements d'accès à l'objet 
  30.         Partage de fichiers détaillé 
  31. Catégorie = Utilisation de privilège 
  32.         Utilisation de privilèges sensibles 
  33.         Utilisation de privilèges non sensibles 
  34.         Autres événements d'utilisation de privilèges 
  35. Catégorie = Suivi détaillé 
  36.         Création du processus 
  37.         Fin du processus 
  38.         Activité DPAPI 
  39.         Événements RPC 
  40. Catégorie = Changement de stratégie 
  41.         Modification de la stratégie d'audit (Success) 
  42.         Modification de la stratégie d'authentification (Success) 
  43.         Modification de la stratégie d'autorisation 
  44.         Modification de la stratégie de niveau règle MPSSVC 
  45.         Modification de la stratégie de plateforme de filtrage 
  46.         Autres événements de modification de stratégie 
  47. Catégorie = Gestion des comptes 
  48.         Gestion des comptes d'utilisateur (Success, Failure) 
  49.         Gestion des comptes d'ordinateur (Success, Failure) 
  50.         Gestion des groupes de sécurité (Success, Failure) 
  51.         Gestion des groupes de distribution (Success, Failure) 
  52.         Gestion des groupes d'applications (Success, Failure) 
  53.         Autres événements de gestion des comptes (Success, Failure) 
  54. Catégorie = Accès DS 
  55.         Accès au service d'annuaire 
  56.         Modification du service d'annuaire 
  57.         Réplication du service d'annuaire 
  58.         Réplication du service d'annuaire détaillé 
  59. Catégorie = Connexion de compte 
  60.         Validation des informations d'identification (Success, Failure) 
  61.         Opérations de ticket du service Kerberos (Success, Failure) 
  62.         Autres événements d'ouverture de session (Success, Failure) 
  63.         Service d'authentification Kerberos (Success, Failure) 
  64.   
  65. D:\Raymond\Developpement\Test\Audit\Release> 

6.5. Le code du programme

Le code du programme de démonstration est le suivant :

Code du programme de démonstration
CacherSélectionnez
  1. #ifndef _WIN32_WINNT 
  2. #define _WIN32_WINNT 0x0501 
  3. #endif 
  4.   
  5. #include <tchar.h> 
  6. #include <locale.h> 
  7. #include <stdio.h> 
  8.   
  9. #include <windows.h> 
  10. #include <Ntsecapi.h> 
  11.   
  12. static void DisplayError(LPCTSTR message); 
  13. static void EnumerateCategories(void); 
  14. static void EnumerateSubCategories(const GUID *Guid); 
  15. static void PrintStatus(const GUID *SubCategoryGuid); 
  16.   
  17. int _tmain() 
  18. { 
  19.    _tsetlocale(LC_ALL, _T("")); 
  20.   
  21.    EnumerateCategories(); 
  22.   
  23.    return 0; 
  24. } 
  25.   
  26. static void DisplayError(LPCTSTR message) 
  27. { 
  28.    LPTSTR buffer = NULL; 
  29.    if(message == NULL) 
  30.       message = _T("Error"); 
  31.   
  32.    if(FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, GetLastError(), 0, (LPTSTR)&buffer, 0, NULL) == 0) 
  33.    { 
  34.       if(GetLastError() == ERROR_NOT_ENOUGH_MEMORY) 
  35.          _tprintf(_T("%s : not enough memory\n"), message); 
  36.       else 
  37.          _tprintf(_T("FormatMessage() failed : %lu\n"), GetLastError()); 
  38.    } 
  39.    else 
  40.    { 
  41.       _tprintf(_T("%s : %s"), message, buffer); 
  42.       LocalFree(buffer); 
  43.       buffer = NULL; 
  44.    } 
  45. } 
  46.   
  47. static void EnumerateCategories(void) 
  48. { 
  49. GUID *Tbl; 
  50. DWORD Size; 
  51. BOOL ret; 
  52. DWORD boucle; 
  53.   
  54.    ret = AuditEnumerateCategories(&Tbl, &Size); 
  55.    if(ret == FALSE) 
  56.    { 
  57.       DisplayError(_T("Erreur AuditEnumerateCategories()")); 
  58.       return; 
  59.    } 
  60.   
  61.    for(boucle = 0; boucle != Size; boucle++) 
  62.    { 
  63.       LPTSTR Str; 
  64.   
  65.       /* display category name */ 
  66.       ret = AuditLookupCategoryName(&Tbl[boucle], &Str); 
  67.       if(ret == FALSE) 
  68.       { 
  69.          DisplayError(_T("Erreur AuditLookupCategoryName()")); 
  70.          return; 
  71.       } 
  72.       _tprintf(_T("Catégorie = %s\n"), Str); 
  73.       AuditFree(Str); 
  74.   
  75.       /* display sub categories */ 
  76.       EnumerateSubCategories(&Tbl[boucle]); 
  77.    } 
  78.    AuditFree(Tbl); 
  79. } 
  80.   
  81. static void EnumerateSubCategories(const GUID *Guid) 
  82. { 
  83. GUID *SubTbl; 
  84. DWORD SubSize; 
  85. DWORD boucle2; 
  86. BOOL ret; 
  87. LPTSTR Str; 
  88.   
  89.    /* get sub categories */ 
  90.    ret = AuditEnumerateSubCategories(Guid, FALSE, &SubTbl, &SubSize); 
  91.    if(ret == FALSE) 
  92.    { 
  93.       DisplayError(_T("Erreur AuditEnumerateSubCategories()")); 
  94.       return; 
  95.    } 
  96.   
  97.    for(boucle2 = 0; boucle2 != SubSize; boucle2++) 
  98.    { 
  99.       ret = AuditLookupSubCategoryName(&SubTbl[boucle2], &Str); 
  100.       if(ret == FALSE) 
  101.       { 
  102.          DisplayError(_T("Erreur AuditLookupSubCategoryName()")); 
  103.          return; 
  104.       } 
  105.       _tprintf(L"\t%s", Str); 
  106.       AuditFree(Str); 
  107.   
  108.       PrintStatus(&SubTbl[boucle2]); 
  109.    } 
  110.    AuditFree(SubTbl); 
  111. } 
  112.   
  113. static void PrintStatus(const GUID *SubCategoryGuid) 
  114. { 
  115. BOOL ret; 
  116. AUDIT_POLICY_INFORMATION *p_information; 
  117. BOOL at_least_one = FALSE; 
  118.   
  119.    ret = AuditQuerySystemPolicy(SubCategoryGuid, 1, &p_information); 
  120.    if(ret == FALSE) 
  121.    { 
  122.       DisplayError(_T("Erreur AuditQuerySystemPolicy()")); 
  123.       return; 
  124.    } 
  125.   
  126.    if( (p_information->AuditingInformation & POLICY_AUDIT_EVENT_SUCCESS) == POLICY_AUDIT_EVENT_SUCCESS) 
  127.    { 
  128.       if(at_least_one == FALSE) 
  129.       { 
  130.          at_least_one = TRUE; 
  131.          _tprintf(_T(" (")); 
  132.       } 
  133.       else 
  134.       { 
  135.          _tprintf(_T(", ")); 
  136.       } 
  137.       _tprintf(_T("Success")); 
  138.    } 
  139.   
  140.    if( (p_information->AuditingInformation & POLICY_AUDIT_EVENT_FAILURE) == POLICY_AUDIT_EVENT_FAILURE) 
  141.    { 
  142.       if(at_least_one == FALSE) 
  143.       { 
  144.          at_least_one = TRUE; 
  145.          _tprintf(_T(" (")); 
  146.       } 
  147.       else 
  148.       { 
  149.          _tprintf(_T(", ")); 
  150.       } 
  151.       _tprintf(_T("Failure")); 
  152.    } 
  153.   
  154.    if( (p_information->AuditingInformation & POLICY_AUDIT_EVENT_NONE) == POLICY_AUDIT_EVENT_NONE) 
  155.    { 
  156.       if(at_least_one == FALSE) 
  157.       { 
  158.          at_least_one = TRUE; 
  159.          _tprintf(_T(" (")); 
  160.       } 
  161.       else 
  162.       { 
  163.          _tprintf(_T(", ")); 
  164.       } 
  165.       _tprintf(_T("None")); 
  166.    } 
  167.   
  168.    if(at_least_one == TRUE) 
  169.    { 
  170.       _tprintf(_T(")")); 
  171.    } 
  172.    _tprintf(_T("\n")); 
  173.   
  174.    AuditFree(p_information); 
  175. } 

7. Conclusions

La rédaction de cet article a été, pour moi, l'occasion d'une double surprise :

  • j'ai découvert l'existence des sous-catégories d'audit que je ne soupçonnais même pas (je connaissais uniquement les catégories d'audit). Il faut dire que l'outil Microsoft de gestion de l'audit (secpol.msc) ne semble pas non plus les gérer (du moins extérieurement).
  • l'autre surprise a été de découvrir que l'API de gestion de l'audit n'est publique, officielle et documentée que depuis les versions Vista (pour les stations de travail) et 2008 (pour les serveurs) de Microsoft. Avant, cette API devait probablement exister mais pas de manière "officielle" (j'ai souvenir de l'outil secpol.msc sur machine NT4).

Ce rapide tour d'horizon concernant les capacités d'audit dans l'environnement Microsoft est terminé. Maintenant, c'est à vous de jouer. N'hésitez pas à commenter cet article ou à apporter des précisions dans la discussion prévue à cet effet : 2 commentaires

7.1. Remerciements

Je tiens à remercier Mahefasoa pour ses conseils avisés lors de la relecture de cet article.