Zum Inhalt springen

Active Directory

Eine Windows-Domäne über LDAP, nur-lesend: die Domänencontroller und wer jede FSMO-Rolle hält, die Mitglieder der privilegierten Gruppen, die Passwortrichtlinie, Kontenzahlen, und die rohen Sicherheitsfakten, nach denen ein Audit zuerst sucht — für Kerberoasting oder AS-REP-Roasting offene Konten, uneingeschränkte Delegation, ein altes krbtgt-Passwort, Computer ohne LAPS, nicht mehr unterstützte Windows-Versionen.

DumbMonit bindet sich mit einem dedizierten Dienstkonto, das ein einfacher Domänenbenutzer ohne Gruppenmitgliedschaft ist. In Active Directory kann jeder authentifizierte Benutzer lesen, was DumbMonit liest; kein administratives Recht wird benötigt, und keines sollte gewährt werden. DumbMonit schreibt nie in das Verzeichnis, liest nie ein Passwort-Attribut (von LAPS liest es das Ablaufdatum, nie das Passwort) und fragt nie nach den Replikationsrechten, die Secrets exponieren würden.

Ein Monitor deckt die gesamte Domäne ab: Richten Sie ihn auf einen Domänencontroller, und DumbMonit findet die anderen in der Konfigurationspartition.

LDAP zeigt das Verzeichnis, wie es ist, nicht die Logs, was darin geschah. Insbesondere:

  • Replikation. Der abgefragte Domänencontroller veröffentlicht den Zustand seiner eingehenden Replikationspartner (letzter Erfolg, aufeinanderfolgende Fehlschläge, letzter Fehler) nur an ein Konto mit dem Recht Monitor active directory replication. Ohne es sagt das Panel replication status not readable, statt zu raten. Nur die Sicht des abgefragten Domänencontrollers wird gezeigt: Um die Partner eines anderen zu sehen, fügen Sie ihn als zweiten Monitor hinzu.
  • Über LDAP nicht sichtbar: Ereignisprotokolle (Logons, Sperrungen, wenn sie passieren, Gruppenänderungen als Ereignisse), Group-Policy-Inhalte, SYSVOL, DNS-Zonen, und die Passwort-Hashes selbst.
  • Letzte Login-Daten kommen von lastLogonTimestamp, das Domänencontroller nur alle 9 bis 14 Tage replizieren: Ein als inaktiv gezähltes Konto ist auf zwei Wochen genau inaktiv.
  • Gruppenmitgliedschaft wird mit Verschachtelung gelesen (die Regel LDAP_MATCHING_RULE_IN_CHAIN), über member/memberOf. Eine durch primaryGroupID gesetzte primäre Gruppe ist kein member-Link und wird nicht gesehen.

Zwei Geschwindigkeiten:

  • Bei jeder Prüfung (standardmäßig jede Minute): Verbindung und Bind, die RootDSE (Funktionsebenen, Uhr, Synchronisation), das Domänenobjekt (Passwortrichtlinie, Maschinenkonto-Kontingent), die fünf FSMO-Rollen, die Domänencontroller aus der Konfigurationspartition, die privilegierten Gruppen und ihre effektiven Mitglieder, das Recycle-Bin-Feature, und eine TCP-Verbindung zum LDAP-Port jedes anderen Domänencontrollers.
  • Im Hintergrund alle inventory_minutes (standardmäßig 15): jedes Benutzer- und Computerkonto, mit nur den von den Befunden benötigten Attributen, in Seiten zu 500. Das gesamte Verzeichnis jede Minute zu enumerieren würde die Domänencontroller umsonst belasten.

Die erste Prüfung wartet ein paar Sekunden auf das Inventar; auf einer großen Domäne erscheinen die Konto-Befunde bei der nächsten Prüfung.

Alle Metriken haben das Präfix dumbmonit_ad_.

MetrikWasLabels
bind_ok1, wenn das Dienstkonto akzeptiert wird, 0, wenn der Domänencontroller es ablehnt
connect_seconds, bind_secondsZeit zum Öffnen der Verbindung (TLS eingeschlossen) und zum Binden
tls_verified1, wenn das Zertifikat geprüft wird
domain_infoWert 1domain, forest, dc
domain_functional_level, forest_functional_level0 (2000) bis 7 (2016), 10 (2025)
dc_synchronized, dc_global_catalog_readyder abgefragte Domänencontroller hat seine erste Replikation abgeschlossen, sein Global Catalog ist bereit
clock_skew_secondsUhr des Domänencontrollers minus Uhr des DumbMonit-Hosts
recycle_bin_enabled1, wenn das AD Recycle Bin aktiviert ist
dc_countDomänencontroller der Domäne
dc_infoWert 1dc, site, gc, rodc, os
dc_reachable1 oder 0 pro Domänencontroller; keine Zeitreihe, wenn sein Name von DumbMonit aus nicht aufgelöst wirddc
fsmo_roleWert 1role (schema, domain_naming, pdc, rid, infrastructure), holder
replication_readable1, wenn der eingehende Replikationsstatus gelesen werden kann
replication_consecutive_failures, replication_last_success_age_secondspro eingehendem Partner und Partitionsource, naming_context
privileged_group_members, privileged_group_enabled_memberseffektive Mitglieder, Verschachtelung eingeschlossen, Gruppen ausgelassengroup
privileged_group_fingerprintein Hash der Mitglieder: ändert sich, wenn jemand beitritt oder gehtgroup
users_total, users_enabled, users_disabled, users_locked_out, users_password_never_expires, users_staleBenutzerkonten
computers_total, computers_enabled, computers_stale, groups_totalComputer und Gruppen
admincount_accountsdurch AdminSDHolder geschützte Benutzer (adminCount=1)
krbtgt_password_age_secondsAlter des krbtgt-Passworts
laps_schema, laps_computers, laps_eligible_computersLAPS im Schema; aktivierte Nicht-DC-Computer mit LAPS-Ablauf, von allen
password_min_length, password_history_length, password_max_age_seconds (0 = nie), password_complexity, lockout_threshold, machine_account_quotaStandard-Domänenrichtlinie
finding_countvon einem Befund betroffene Objekte, 0, wenn geprüft und sauberfinding, severity, title
inventory_age_seconds, scrape_errorsAlter des letzten vollständigen Inventars; nicht lesbare Teile des Verzeichnisses

Die privilegierten Gruppen werden über ihre bekannte Kennung gefunden, nicht ihren Namen, daher funktioniert eine in einer anderen Sprache installierte Domäne genauso: Domain Admins (RID 512), Enterprise Admins (519) und Schema Admins (518) — die letzten zwei nur in der Forest-Root-Domäne — und die eingebauten Administrators, Account Operators, Server Operators, Print Operators und Backup Operators.

Befunde sind rohe Fakten — wie viele Objekte, und welche — kein Score; der Security Score des Monitors gewichtet sie. Jeder hat eine stabile id, einen Schweregrad auf der Skala des Scores (low, medium, high, critical, auf der Seite als Info, Advisory und Warning angezeigt), eine Kategorie, eine Zählung und bis zu zwanzig Beispiel-Kontonamen. Ein geprüfter und als unauffällig befundener Befund wird mit einer Zählung von 0 behalten, sodass ein behobenes Problem grün wird statt zu verschwinden; Befunde über Konten erscheinen, sobald das erste Hintergrund-Inventar abgeschlossen ist. Sie werden unverändert von GET /api/targets/{id}/ad/findings ausgeliefert und als dumbmonit_ad_finding_count{finding, severity, title} veröffentlicht.

idSchweregradWas
unconstrained_delegationcriticalaktivierte Konten, denen uneingeschränkte Delegation vertraut wird, Domänencontroller ausgenommen
kerberoastable_privilegedcriticalaktivierte Mitglieder privilegierter Gruppen mit einem Service Principal Name
asrep_roastable_usershighaktivierte Konten mit deaktivierter Kerberos-Präauthentifizierung (DONT_REQ_PREAUTH)
kerberoastable_usershighaktivierte Benutzer mit einem Service Principal Name
krbtgt_password_agehighkrbtgt-Passwort älter als 180 Tage
laps_coveragehigh, wenn LAPS fehlt, medium, wenn teilweiseaktivierte Computer (Domänencontroller ausgenommen) ohne LAPS-Passwort
reversible_encryptionhighBenutzer, deren Passwort reversibel verschlüsselt gespeichert wird
guest_enabledhighdas eingebaute Guest-Konto (RID 501) ist aktiviert
obsolete_oshighaktivierte Computer auf Windows XP, Vista, 7, 8, 2000, Server 2003, 2008 oder 2012
dc_unreachablehighDomänencontroller, deren LDAP-Port nicht antwortet
replication_failinghigheingehende Replikationspartner mit aufeinanderfolgenden Fehlschlägen
dc_not_synchronizedhighder abgefragte Domänencontroller hat seine erste Replikation nicht abgeschlossen
fsmo_role_orphanedhigheine FSMO-Rolle, die von einem gelöschten Domänencontroller gehalten wird
password_policyhigh unter 8 Zeichen oder ohne Lockout, sonst mediumLücken in der Standard-Domänenrichtlinie gegen die Baseline: 14 Zeichen, ein Lockout-Schwellenwert, Komplexität
privileged_group_sizemediummehr als 5 aktivierte Konten in Domain Admins, Enterprise Admins und Administrators zusammen
stale_accountsmediumaktivierte Benutzer und Computer, inaktiv über die Schwellenwerte hinaus
protocol_transition_delegationmediumeingeschränkte Delegation mit Protokollübergang
des_onlymediumauf DES-Kerberos-Schlüssel beschränkte Konten
password_not_requiredmediumBenutzer, denen ein leeres Passwort erlaubt ist (PASSWD_NOTREQD)
privileged_password_never_expiresmediumprivilegierte Benutzer, deren Passwort nie abläuft
privileged_stalemediumprivilegierte Benutzer, inaktiv über stale_days_users hinaus
schema_admins_not_emptymediumSchema Admins hat Mitglieder
functional_level_oldmediumDomänenfunktionsebene unter 2012 R2
clock_skewmediummehr als fünf Minuten zwischen dem Domänencontroller und DumbMonit
windows10_end_of_supportmediumaktivierte Computer auf Windows 10
admincount_orphanslowadminCount=1-Benutzer, nicht mehr in einer privilegierten Gruppe
password_never_expireslowaktivierte Benutzer, deren Passwort nie abläuft
machine_account_quotalowjeder Benutzer kann Computer der Domäne beitreten lassen
recycle_bin_disabledlowdas AD Recycle Bin ist nicht aktiviert

Die geltenden eingebauten Regeln:

  • Domain controller unreachable: ein anderer Domänencontroller der Domäne hört seit fünf Minuten auf, auf seinem LDAP-Port zu antworten (Warning). Der abgefragte ist von Monitor unreachable abgedeckt.
  • Active Directory bind failed: der Domänencontroller lehnt das Dienstkonto ab — abgelaufenes Passwort, deaktiviert oder gesperrt (Advisory).
  • Privileged group membership changed: jemand ist einer privilegierten Gruppe beigetreten oder hat sie verlassen, Verschachtelung eingeschlossen (Advisory, löst sich eine Stunde später).
  • Active Directory replication failing: ein eingehender Partner schlägt eine halbe Stunde lang fehl (Advisory), wenn der Replikationsstatus lesbar ist.
  • krbtgt password older than 180 days (Info).

Das Active-Directory-Panel zeigt die Domäne (Funktionsebenen, der abgefragte Domänencontroller, Uhrenabweichung), die Domänencontroller mit ihrer Site, Rollen und ob sie antworten, die privilegierten Gruppen mit ihren Mitgliedern, die Passwortrichtlinie und Kontenzahlen, und die Befundtabelle mit Schweregrad-Worten.

Ein nur-lesendes Dienstkonto für DumbMonit erstellen

Abschnitt betitelt „Ein nur-lesendes Dienstkonto für DumbMonit erstellen“
  1. Erstellen Sie einen dedizierten Benutzer für DumbMonit, zum Beispiel svc-dumbmonit, und fügen Sie ihn keiner Gruppe hinzu. Ein einfacher Domänenbenutzer reicht: jeder authentifizierte Benutzer kann lesen, was DumbMonit liest. In PowerShell, mit dem Active-Directory-Modul:

    New-ADUser -Name svc-dumbmonit -UserPrincipalName svc-dumbmonit@corp.example.com -AccountPassword (Read-Host -AsSecureString 'Password') -Enabled $true
  2. Geben Sie ihm ein langes Zufallspasswort. Wenn Passwörter in Ihrer Domäne ablaufen, hebt DumbMonit Active Directory bind failed am Tag, an dem dieses abläuft.

  3. Optional: Um den Status der eingehenden Replikation zu sehen, gewähren Sie dem Konto das Recht Monitor active directory replication am Domänenobjekt selbst. Es enthüllt kein Passwort und kein Secret.

    dsacls "DC=corp,DC=example,DC=com" /G "CORP\svc-dumbmonit:CA;Monitor active directory replication"
  4. LDAPS braucht ein Zertifikat auf jedem Domänencontroller; eine Enterprise-Zertifizierungsstelle (AD CS) stellt automatisch eines aus. Exportieren Sie das Zertifikat dieser Autorität im Base-64-codierten X.509-Format und fügen Sie es unten als CA certificate ein.

  5. Geben Sie in DumbMonit den Namen eines Domänencontrollers ein, wie sein Zertifikat ihn benennt, zum Beispiel “dc1.corp.example.com”, und loggen Sie sich als svc-dumbmonit@corp.example.com ein. DumbMonit findet die anderen Domänencontroller selbst und prüft, dass jeder antwortet.

  6. DumbMonit liest nur: Es schreibt nie in das Verzeichnis, und von LAPS liest es das Ablaufdatum, nie das Passwort.

Um das Konto davon abzuhalten, irgendwo eine Sitzung zu öffnen, verweigern Sie ihm per Group Policy Log on locally und Log on through Remote Desktop Services: Ein LDAP-Bind ist davon nicht betroffen. Beschränken Sie es nicht mit Log On To oder Deny access to this computer from the network: Die Domänencontroller würden den Bind dann ablehnen.

  • Das Konto braucht keine Gruppe außer Domain Users, die jedes Konto hat.
  • Nutzen Sie kein Managed Service Account (gMSA): Es kann keinen einfachen LDAP-Bind ausführen.
  • Gewähren Sie nicht Replicating Directory Changes (oder All): Das ist das DCSync-Recht, das jeden Passwort-Hash exponiert. DumbMonit braucht es nie.
  • Monitor active directory replication erlaubt nur das Lesen von Replikations-Metadaten (Partner, letzter Erfolg, Fehlercodes). Es ist optional.
  • LDAPS (Port 636) ist der Standard. Jeder Domänencontroller einer Domäne mit einer Enterprise-Zertifizierungsstelle erhält automatisch ein Zertifikat; ohne eine hört der Domänencontroller nicht auf 636. Das Zertifikat muss den Namen tragen, den DumbMonit nutzt: Geben Sie den Domänencontroller mit seinem DNS-Namen ein, nicht seiner IP-Adresse, sofern das Zertifikat die Adresse nicht listet.
  • CA certificate: Fügen Sie das PEM der Root- (oder ausstellenden) Autorität ein. Nur dieser Autorität wird dann vertraut. Ohne sie vertraut DumbMonit den öffentlichen Roots und dem System-Store seines Containers, die eine private Enterprise-Autorität nicht kennen.
  • StartTLS (Port 389) verschlüsselt genauso, nach einer Klartext-Begrüßung. Nutzen Sie es, wenn Port 636 gefiltert ist.
  • Accept an unverifiable certificate hält die Verbindung verschlüsselt, akzeptiert aber jedes Zertifikat: Jeder auf dem Weg könnte sich als der Domänencontroller ausgeben und das Passwort des Dienstkontos erhalten.
  • LDAP channel binding (LdapEnforceChannelBinding) betrifft NTLM- und Kerberos-Binds über TLS; der von DumbMonit genutzte einfache Bind ist nicht betroffen.
FeldWert
User namesvc-dumbmonit@corp.example.com, CORP\svc-dumbmonit, oder der vollständige DN des Kontos
Passworddas Passwort des Kontos, verschlüsselt gespeichert und nie wieder angezeigt

Ein leeres Passwort wird abgelehnt: Active Directory würde es als nicht authentifizierten Bind akzeptieren, ohne irgendetwas zu prüfen.

OptionStandardWas
Connection security (security)ldapsldaps, starttls oder plain
Port (port)636, oder 389genutzt, falls die Adresse keinen angibt
CA certificate (ca_cert)PEM der Autorität, die die Zertifikate der Domänencontroller ausgestellt hat
Accept an unverifiable certificate (insecure_tls)aus
Allow plain LDAP (allow_plaintext)ausfür plain erforderlich
Check every domain controller (check_all_dcs)einTCP-Verbindung zum LDAP-Port jedes Domänencontrollers
Inactive user after (stale_days_users)90Tage
Inactive computer after (stale_days_computers)90Tage
Full inventory every (inventory_minutes)15Minuten, 1 bis 1440
Timeout (request_timeout_seconds)8pro LDAP-Operation, 1 bis 60
  • TLS certificate rejected: Fügen Sie das Zertifikat der Autorität als CA certificate ein, und geben Sie den Domänencontroller mit einem Namen ein, den sein Zertifikat listet.
  • Bind refused: wrong user name or password (LDAP result 49): Der Diagnosecode des Domänencontrollers wird übersetzt — Passwort abgelaufen, Konto deaktiviert, gesperrt, oder muss beim nächsten Login das Passwort ändern.
  • The domain controller requires a protected connection: LDAP-Signierung wird erzwungen; wechseln Sie zu LDAPS oder StartTLS.
  • Ein Domänencontroller zeigt sich als unresolved: Sein Name wird vom DumbMonit-Host aus nicht aufgelöst. Richten Sie DumbMonits DNS auf die DNS-Server der Domäne, oder entfernen Sie das Häkchen bei Check every domain controller. Nicht aufgelöste Namen lösen nie einen Alarm aus.
  • Replication status not readable: Gewähren Sie Monitor active directory replication wie in Schritt 3, oder akzeptieren Sie, dass Replikation nicht angezeigt wird.