Aller au contenu

Active Directory

Un domaine Windows via LDAP, en lecture seule : les contrôleurs de domaine et qui détient chaque rôle FSMO, les membres des groupes privilégiés, la politique de mot de passe, les compteurs de comptes, et les faits de sécurité bruts qu’un audit cherche en premier — comptes exposés au Kerberoasting ou à l’AS-REP roasting, délégation sans contrainte, un vieux mot de passe krbtgt, ordinateurs sans LAPS, versions de Windows hors support.

DumbMonit se connecte avec un compte de service dédié qui est un utilisateur de domaine ordinaire, membre d’aucun groupe. Dans Active Directory, chaque utilisateur authentifié peut lire ce que DumbMonit lit ; aucun droit administratif n’est nécessaire, et aucun ne devrait être donné. DumbMonit n’écrit jamais dans l’annuaire, ne lit jamais un attribut de mot de passe (de LAPS il lit la date d’expiration, jamais le mot de passe) et ne demande jamais les droits de réplication qui exposeraient des secrets.

Une seule surveillance couvre tout le domaine : pointez-la vers un contrôleur de domaine et DumbMonit trouve les autres dans la partition de configuration.

Du serveur DumbMonit (ou de son agent relais) vers l’équipement :

PortProtocoleUsage
636TCPLDAPS (par défaut), aussi vers les autres contrôleurs de domaine
389TCPSeulement avec l’option StartTLS ou LDAP en clair
53UDPSeulement avec l’option des serveurs DNS
53TCPSeulement avec l’option des serveurs DNS

LDAP montre l’annuaire comme il est, pas les journaux de ce qui s’y est passé. En particulier :

  • La réplication. Le contrôleur de domaine interrogé ne publie l’état de ses partenaires de réplication entrants (dernier succès, échecs consécutifs, dernière erreur) qu’à un compte détenant le droit Monitor active directory replication. Sans lui, le panneau dit statut de réplication non lisible plutôt que de deviner. Seule la vue du contrôleur de domaine interrogé est montrée : pour voir les partenaires d’un autre, ajoutez-le comme une seconde surveillance.
  • Pas visible via LDAP : journaux d’événements (connexions, verrouillages au moment où ils arrivent, changements de groupe comme événements), contenu de la Group Policy, SYSVOL, zones DNS, et les hashs de mot de passe eux-mêmes.
  • Les dates de dernière connexion viennent de lastLogonTimestamp, que les contrôleurs de domaine ne répliquent que tous les 9 à 14 jours : un compte compté comme inactif est inactif à deux semaines près.
  • L’appartenance aux groupes est lue avec imbrication (la règle LDAP_MATCHING_RULE_IN_CHAIN), via member/memberOf. Un groupe principal réglé par primaryGroupID n’est pas un lien member et n’est pas vu.

Deux rythmes :

  • À chaque vérification (chaque minute par défaut) : connexion et bind, le RootDSE (niveaux fonctionnels, horloge, synchronisation), l’objet domaine (politique de mot de passe, quota de comptes machine), les cinq rôles FSMO, les contrôleurs de domaine depuis la partition de configuration, les groupes privilégiés et leurs membres effectifs, la fonctionnalité Corbeille, et une connexion TCP vers le port LDAP de chaque autre contrôleur de domaine.
  • En arrière-plan toutes les inventory_minutes (15 par défaut) : chaque compte utilisateur et ordinateur, avec seulement les attributs dont les constats ont besoin, par pages de 500. Énumérer tout l’annuaire chaque minute chargerait les contrôleurs de domaine pour rien.

La première vérification attend quelques secondes l’inventaire ; sur un grand domaine, les constats sur les comptes apparaissent à la vérification suivante.

Toutes les métriques sont préfixées dumbmonit_ad_.

MétriqueQuoiLabels
bind_ok1 quand le compte de service est accepté, 0 quand le contrôleur de domaine le refuse
connect_seconds, bind_secondstemps pour ouvrir la connexion (TLS inclus) et pour se connecter
tls_verified1 quand le certificat est vérifié
domain_infovaleur 1domain, forest, dc
domain_functional_level, forest_functional_level0 (2000) à 7 (2016), 10 (2025)
dc_synchronized, dc_global_catalog_readyle contrôleur de domaine interrogé a terminé sa réplication initiale, son catalogue global est prêt
clock_skew_secondshorloge du contrôleur de domaine moins horloge de l’hôte DumbMonit
recycle_bin_enabled1 quand la Corbeille AD est activée
dc_countcontrôleurs de domaine du domaine
dc_infovaleur 1dc, site, gc, rodc, os
dc_reachable1 ou 0 par contrôleur de domaine ; aucune série quand son nom ne se résout pas depuis DumbMonitdc
fsmo_rolevaleur 1role (schema, domain_naming, pdc, rid, infrastructure), holder
replication_readable1 quand le statut de réplication entrante peut être lu
replication_consecutive_failures, replication_last_success_age_secondspar partenaire entrant et partitionsource, naming_context
privileged_group_members, privileged_group_enabled_membersmembres effectifs, imbrication incluse, groupes laissés de côtégroup
privileged_group_fingerprintun hash des membres : change quand quelqu’un rejoint ou partgroup
users_total, users_enabled, users_disabled, users_locked_out, users_password_never_expires, users_stalecomptes utilisateur
computers_total, computers_enabled, computers_stale, groups_totalordinateurs et groupes
admincount_accountsutilisateurs protégés par AdminSDHolder (adminCount=1)
krbtgt_password_age_secondsâge du mot de passe krbtgt
laps_schema, laps_computers, laps_eligible_computersLAPS dans le schéma ; ordinateurs non-DC activés avec une expiration LAPS, sur tous
password_min_length, password_history_length, password_max_age_seconds (0 = jamais), password_complexity, lockout_threshold, machine_account_quotapolitique de domaine par défaut
finding_countobjets concernés par un constat, 0 quand examiné et sainfinding, severity, title
inventory_age_seconds, scrape_errorsâge du dernier inventaire complet ; parties de l’annuaire qui n’ont pas pu être lues

Les groupes privilégiés sont trouvés par leur identifiant bien connu, pas leur nom, un domaine installé dans une autre langue fonctionne donc pareil : Domain Admins (RID 512), Enterprise Admins (519) et Schema Admins (518) — les deux derniers seulement dans le domaine racine de la forêt — et les intégrés Administrators, Account Operators, Server Operators, Print Operators et Backup Operators.

Les constats sont des faits bruts — combien d’objets, et lesquels — pas un score ; le score de sécurité de la surveillance les pèse. Chacun a un id stable, une gravité sur l’échelle du score (low, medium, high, critical, montrée sur la page comme Info, Avis et Avertissement), une catégorie, un compteur et jusqu’à vingt noms de compte en exemple. Un constat qui a été examiné et n’a rien trouvé est gardé avec un compteur de 0, un problème corrigé devient donc vert plutôt que de disparaître ; les constats sur les comptes apparaissent une fois le premier inventaire en arrière-plan terminé. Ils sont servis tels quels par GET /api/targets/{id}/ad/findings et publiés comme dumbmonit_ad_finding_count{finding, severity, title}.

idGravitéQuoi
unconstrained_delegationcriticalcomptes activés de confiance pour une délégation sans contrainte, contrôleurs de domaine à part
kerberoastable_privilegedcriticalmembres activés de groupes privilégiés avec un nom principal de service
asrep_roastable_usershighcomptes activés avec la préauthentification Kerberos désactivée (DONT_REQ_PREAUTH)
kerberoastable_usershighutilisateurs activés avec un nom principal de service
krbtgt_password_agehighmot de passe krbtgt plus ancien que 180 jours
laps_coveragehigh quand LAPS est absent, medium quand partielordinateurs activés (contrôleurs de domaine à part) sans mot de passe LAPS
reversible_encryptionhighutilisateurs dont le mot de passe est stocké avec chiffrement réversible
guest_enabledhighle compte Guest intégré (RID 501) est activé
obsolete_oshighordinateurs activés sous Windows XP, Vista, 7, 8, 2000, Server 2003, 2008 ou 2012
dc_unreachablehighcontrôleurs de domaine dont le port LDAP ne répond pas
replication_failinghighpartenaires de réplication entrante avec des échecs consécutifs
dc_not_synchronizedhighle contrôleur de domaine interrogé n’a pas terminé sa réplication initiale
fsmo_role_orphanedhighun rôle FSMO détenu par un contrôleur de domaine supprimé
password_policyhigh sous 8 caractères ou sans verrouillage, medium sinonlacunes dans la politique de domaine par défaut contre la référence : 14 caractères, un seuil de verrouillage, complexité
privileged_group_sizemediumplus de 5 comptes activés dans Domain Admins, Enterprise Admins et Administrators ensemble
stale_accountsmediumutilisateurs et ordinateurs activés inactifs depuis plus que les seuils
protocol_transition_delegationmediumdélégation contrainte avec transition de protocole
des_onlymediumcomptes restreints aux clés Kerberos DES
password_not_requiredmediumutilisateurs autorisés à avoir un mot de passe vide (PASSWD_NOTREQD)
privileged_password_never_expiresmediumutilisateurs privilégiés dont le mot de passe n’expire jamais
privileged_stalemediumutilisateurs privilégiés inactifs depuis plus que stale_days_users
schema_admins_not_emptymediumSchema Admins a des membres
functional_level_oldmediumniveau fonctionnel de domaine sous 2012 R2
clock_skewmediumplus de cinq minutes entre le contrôleur de domaine et DumbMonit
windows10_end_of_supportmediumordinateurs activés sous Windows 10
admincount_orphanslowutilisateurs adminCount=1 plus dans aucun groupe privilégié
password_never_expireslowutilisateurs activés dont le mot de passe n’expire jamais
machine_account_quotalown’importe quel utilisateur peut joindre des ordinateurs au domaine
recycle_bin_disabledlowla Corbeille AD n’est pas activée

Les règles intégrées qui s’appliquent :

  • Contrôleur de domaine inaccessible : un autre contrôleur de domaine du domaine arrête de répondre sur son port LDAP depuis cinq minutes (Avertissement). Celui interrogé est couvert par Surveillance inaccessible.
  • Connexion Active Directory échouée : le contrôleur de domaine refuse le compte de service — mot de passe expiré, désactivé ou verrouillé (Avis).
  • Appartenance à un groupe privilégié changée : quelqu’un a rejoint ou quitté un groupe privilégié, imbrication incluse (Avis, se résout une heure plus tard).
  • Réplication Active Directory en échec : un partenaire entrant échoue pendant une demi-heure (Avis), quand le statut de réplication est lisible.
  • Mot de passe krbtgt plus ancien que 180 jours (Info).

Le panneau Active Directory montre le domaine (niveaux fonctionnels, le contrôleur de domaine interrogé, décalage d’horloge), les contrôleurs de domaine avec leur site, rôles et s’ils répondent, les groupes privilégiés avec leurs membres, la politique de mot de passe et les compteurs de compte, et le tableau des constats avec les mots de gravité.

Créer un compte de service en lecture seule pour DumbMonit

Section intitulée « Créer un compte de service en lecture seule pour DumbMonit »
  1. Active Directory Users and Computers → votre domaine → Users → New → User : nommez-le comme suit, définissez un long mot de passe aléatoire et ne l’ajoutez à aucun groupe.

    svc-dumbmonit
  2. Sur son onglet Account, cochez Password never expires, sinon l’authentification échoue le jour où le mot de passe expire.

  3. Facultatif, pour voir l’état de la réplication entrante : accordez au compte le droit listé ci-dessous sur l’objet du domaine.

    dsacls "DC=corp,DC=example,DC=com" /G "CORP\svc-dumbmonit:CA;Monitor active directory replication"
  4. Pour LDAPS, exportez le certificat de votre autorité de certification au format X.509 encodé en Base-64 et collez-le comme certificat CA ci-dessous.

  5. Dans DumbMonit, saisissez le nom d’un contrôleur de domaine tel que son certificat le nomme (dc1.corp.example.com) et connectez-vous en [email protected].

  • Domain Users membership only — Aucun groupe ni délégation n’est nécessaire pour lire
  • Monitor active directory replication — Facultatif : état de la réplication entrante

Documentation de l’éditeur : https://learn.microsoft.com/en-us/troubleshoot/windows-server/active-directory/enable-ldap-over-ssl-3rd-certification-authority

Un simple utilisateur du domaine suffit : tout utilisateur authentifié peut lire ce que DumbMonit lit. Si les mots de passe expirent dans votre domaine, DumbMonit signale Active Directory bind failed le jour où celui-ci expire. LDAPS exige un certificat sur chaque contrôleur de domaine ; une autorité de certification d’entreprise (AD CS) en émet un automatiquement. Le même utilisateur depuis PowerShell, avec le module Active Directory :

New-ADUser -Name svc-dumbmonit -UserPrincipalName [email protected] -AccountPassword (Read-Host -AsSecureString 'Password') -Enabled $true

Le droit de réplication s’accorde avec dsacls car l’assistant de délégation ne le propose pas sous ce nom. Il ne révèle ni mot de passe ni secret. DumbMonit ne fait que lire : il n’écrit jamais dans l’annuaire, et de LAPS il lit la date d’expiration, jamais le mot de passe.

Pour empêcher le compte d’ouvrir une session n’importe où, refusez-lui Log on locally et Log on through Remote Desktop Services par Group Policy : un bind LDAP n’est pas affecté. Ne le restreignez pas avec Log On To ou Deny access to this computer from the network : les contrôleurs de domaine refuseraient alors le bind.

  • Le compte n’a besoin d’aucun groupe au-delà de Domain Users, que chaque compte a.
  • N’utilisez pas un compte de service managé (gMSA) : il ne peut pas faire un simple bind LDAP.
  • N’accordez pas Replicating Directory Changes (ou All) : c’est le droit DCSync, qui expose chaque hash de mot de passe. DumbMonit n’en a jamais besoin.
  • Monitor active directory replication ne permet que de lire les métadonnées de réplication (partenaires, dernier succès, codes d’erreur). C’est optionnel.
  • LDAPS (port 636) est le défaut. Chaque contrôleur de domaine d’un domaine avec une autorité de certification d’entreprise reçoit un certificat automatiquement ; sans ça, le contrôleur de domaine n’écoute pas sur 636. Le certificat doit porter le nom que DumbMonit utilise : saisissez le contrôleur de domaine par son nom DNS, pas son adresse IP, sauf si le certificat liste l’adresse.
  • Certificat CA : collez le PEM de l’autorité racine (ou émettrice). Seule cette autorité est alors de confiance. Sans ça, DumbMonit fait confiance aux racines publiques et au magasin système de son conteneur, qui ne connaissent pas une autorité d’entreprise privée.
  • StartTLS (port 389) chiffre de la même façon, après une salutation en texte clair. Utilisez-le quand le port 636 est filtré.
  • Accepter un certificat non vérifiable garde la connexion chiffrée mais accepte n’importe quel certificat : quiconque sur le chemin pourrait se faire passer pour le contrôleur de domaine et recevoir le mot de passe du compte de service.
  • La liaison de canal LDAP (LdapEnforceChannelBinding) concerne les binds NTLM et Kerberos sur TLS ; le bind simple que DumbMonit utilise n’est pas affecté.

Les contrôleurs de domaine sont joints par leur nom (le certificat le porte), et les autres contrôleurs du domaine sont aussi trouvés par leur nom. Si le serveur DNS de la machine DumbMonit ne connaît pas le domaine, deux solutions :

  • L’option Serveurs DNS : saisissez les adresses IP des serveurs DNS qui connaissent le domaine, par exemple 10.0.0.10, 10.0.0.11. Toutes les résolutions de ce moniteur (le contrôleur saisi, les autres contrôleurs, Vérifier chaque contrôleur de domaine) passent alors par eux seuls, en UDP puis en TCP. La connexion garde le nom pour la vérification du certificat. Vide : le résolveur du système. Un agent relais fait de même de son côté.
  • Ou donner ces serveurs à tout le conteneur, avec dns: dans docker-compose.yml :
services:
dumbmonit:
dns:
- 10.0.0.10
- 10.0.0.11

Si un nom est inconnu de ces serveurs, l’erreur le dit : dc01.corp.local did not resolve through 10.0.0.10.

ChampValeur
Nom d’utilisateur[email protected], CORP\svc-dumbmonit, ou le DN complet du compte
Mot de passele mot de passe du compte, stocké chiffré et jamais remontré

Un mot de passe vide est refusé : Active Directory l’accepterait comme un bind non authentifié sans rien vérifier.

OptionDéfautQuoi
Sécurité de connexion (security)ldapsldaps, starttls ou plain
Port (port)636, ou 389utilisé si l’adresse n’en donne pas
Certificat CA (ca_cert)PEM de l’autorité qui a émis les certificats des contrôleurs de domaine
Accepter un certificat non vérifiable (insecure_tls)désactivé
Autoriser le LDAP simple (allow_plaintext)désactivérequis pour plain
Serveurs DNS (dns_servers)videIP des serveurs DNS pour toutes les résolutions de ce moniteur ; vide = DNS du système
Vérifier chaque contrôleur de domaine (check_all_dcs)activéconnexion TCP au port LDAP de chaque contrôleur de domaine
Utilisateur inactif après (stale_days_users)90jours
Ordinateur inactif après (stale_days_computers)90jours
Inventaire complet toutes les (inventory_minutes)15minutes, de 1 à 1440
Délai (request_timeout_seconds)8par opération LDAP, de 1 à 60
  • Certificat TLS rejeté : collez le certificat de l’autorité comme Certificat CA, et saisissez le contrôleur de domaine par un nom que son certificat liste.
  • Bind refusé : mauvais nom d’utilisateur ou mot de passe (LDAP result 49) : le code de diagnostic du contrôleur de domaine est traduit — mot de passe expiré, compte désactivé, verrouillé, ou doit changer son mot de passe à la prochaine connexion.
  • Le contrôleur de domaine exige une connexion protégée : la signature LDAP est imposée ; passez à LDAPS ou StartTLS.
  • Un contrôleur de domaine se montre non résolu : son nom ne se résout pas depuis l’hôte DumbMonit. Pointez le DNS de DumbMonit vers les serveurs DNS du domaine, ou décochez Vérifier chaque contrôleur de domaine. Les noms non résolus ne déclenchent jamais d’alerte.
  • Statut de réplication non lisible : accordez Monitor active directory replication comme à l’étape 3, ou acceptez que la réplication ne soit pas montrée.