Salta ai contenuti

Active Directory

Un dominio Windows via LDAP, di sola lettura: i controller di dominio e chi detiene ogni ruolo FSMO, i membri dei gruppi privilegiati, la policy delle password, i conteggi di account, e i fatti grezzi di sicurezza che un audit cerca per primi — account esposti a Kerberoasting o AS-REP roasting, delegazione non vincolata, una vecchia password krbtgt, computer senza LAPS, release Windows fuori supporto.

DumbMonit si collega con un account di servizio dedicato che è un utente di dominio semplice, membro di nessun gruppo. In Active Directory ogni utente autenticato può leggere ciò che DumbMonit legge; nessun diritto amministrativo è necessario, e nessuno dovrebbe essere dato. DumbMonit non scrive mai nella directory, non legge mai un attributo password (di LAPS legge la data di scadenza, mai la password) e non chiede mai i diritti di replicazione che esporrebbero segreti.

Un monitor copre l’intero dominio: puntalo su un controller di dominio e DumbMonit trova gli altri nella partizione di configurazione.

LDAP mostra la directory com’è, non i log di ciò che è accaduto in essa. In particolare:

  • Replicazione. Il controller di dominio interrogato pubblica lo stato dei suoi partner di replicazione in entrata (ultimo successo, fallimenti consecutivi, ultimo errore) solo a un account che possiede il diritto Monitor active directory replication. Senza di esso, il pannello dice replication status not readable invece di indovinare. Viene mostrata solo la vista del controller di dominio interrogato: per vedere i partner di un altro, aggiungilo come un secondo monitor.
  • Non visibile tramite LDAP: log degli eventi (accessi, blocchi mentre avvengono, cambi di gruppo come eventi), contenuti delle Group Policy, SYSVOL, zone DNS, e gli hash delle password stessi.
  • Le date di ultimo accesso provengono da lastLogonTimestamp, che i controller di dominio replicano solo ogni 9-14 giorni: un account contato come inattivo è inattivo entro due settimane.
  • L’appartenenza ai gruppi viene letta con nidificazione (la regola LDAP_MATCHING_RULE_IN_CHAIN), tramite member/memberOf. Un gruppo primario impostato da primaryGroupID non è un link member e non viene visto.

Due ritmi:

  • A ogni controllo (ogni minuto per impostazione predefinita): connessione e bind, la RootDSE (livelli funzionali, orologio, sincronizzazione), l’oggetto dominio (policy delle password, quota account macchina), i cinque ruoli FSMO, i controller di dominio dalla partizione di configurazione, i gruppi privilegiati e i loro membri effettivi, la funzionalità Recycle Bin, e una connessione TCP alla porta LDAP di ogni altro controller di dominio.
  • In background ogni inventory_minutes (15 per impostazione predefinita): ogni account utente e computer, con solo gli attributi di cui i risultati hanno bisogno, in pagine di 500. Enumerare l’intera directory ogni minuto caricherebbe i controller di dominio per nulla.

Il primo controllo attende qualche secondo per l’inventario; su un grande dominio i risultati sugli account appaiono al controllo successivo.

Tutte le metriche hanno il prefisso dumbmonit_ad_.

MetricaCosaEtichette
bind_ok1 quando l’account di servizio è accettato, 0 quando il controller di dominio lo rifiuta
connect_seconds, bind_secondstempo per aprire la connessione (TLS incluso) e per il bind
tls_verified1 quando il certificato è verificato
domain_infovalore 1domain, forest, dc
domain_functional_level, forest_functional_levelda 0 (2000) a 7 (2016), 10 (2025)
dc_synchronized, dc_global_catalog_readyil controller di dominio interrogato ha terminato la sua replicazione iniziale, il suo global catalog è pronto
clock_skew_secondsorologio del controller di dominio meno orologio dell’host DumbMonit
recycle_bin_enabled1 quando l’AD Recycle Bin è abilitato
dc_countcontroller di dominio del dominio
dc_infovalore 1dc, site, gc, rodc, os
dc_reachable1 o 0 per controller di dominio; nessuna serie quando il suo nome non risolve da DumbMonitdc
fsmo_rolevalore 1role (schema, domain_naming, pdc, rid, infrastructure), holder
replication_readable1 quando lo stato di replicazione in entrata può essere letto
replication_consecutive_failures, replication_last_success_age_secondsper partner in entrata e partizionesource, naming_context
privileged_group_members, privileged_group_enabled_membersmembri effettivi, nidificazione inclusa, gruppi esclusigroup
privileged_group_fingerprintun hash dei membri: cambia quando qualcuno si unisce o lasciagroup
users_total, users_enabled, users_disabled, users_locked_out, users_password_never_expires, users_staleaccount utente
computers_total, computers_enabled, computers_stale, groups_totalcomputer e gruppi
admincount_accountsutenti protetti da AdminSDHolder (adminCount=1)
krbtgt_password_age_secondsetà della password krbtgt
laps_schema, laps_computers, laps_eligible_computersLAPS nello schema; computer non-DC abilitati con una scadenza LAPS, su tutti quanti
password_min_length, password_history_length, password_max_age_seconds (0 = mai), password_complexity, lockout_threshold, machine_account_quotapolicy di dominio predefinita
finding_countoggetti interessati da un risultato, 0 quando esaminato e pulitofinding, severity, title
inventory_age_seconds, scrape_errorsetà dell’ultimo inventario completo; parti della directory che non è stato possibile leggere

I gruppi privilegiati vengono trovati dal loro identificatore conosciuto, non dal loro nome, così un dominio installato in un’altra lingua funziona lo stesso: Domain Admins (RID 512), Enterprise Admins (519) e Schema Admins (518) — gli ultimi due solo nel dominio radice della foresta — e gli Administrators, Account Operators, Server Operators, Print Operators e Backup Operators integrati.

I risultati sono fatti grezzi — quanti oggetti, e quali — non un punteggio; il punteggio di sicurezza del monitor li pesa. Ciascuno ha un id stabile, una severità sulla scala del punteggio (low, medium, high, critical, mostrata sulla pagina come Info, Advisory e Warning), una categoria, un conteggio e fino a venti nomi di account di esempio. Un risultato che è stato esaminato e non ha trovato nulla viene mantenuto con un conteggio di 0, così un problema risolto diventa verde invece di scomparire; i risultati sugli account appaiono una volta completato il primo inventario in background. Vengono serviti così come sono da GET /api/targets/{id}/ad/findings e pubblicati come dumbmonit_ad_finding_count{finding, severity, title}.

idSeveritàCosa
unconstrained_delegationcriticalaccount abilitati fidati per delegazione non vincolata, controller di dominio esclusi
kerberoastable_privilegedcriticalmembri abilitati di gruppi privilegiati con un service principal name
asrep_roastable_usershighaccount abilitati con la pre-autenticazione Kerberos disattivata (DONT_REQ_PREAUTH)
kerberoastable_usershighutenti abilitati con un service principal name
krbtgt_password_agehighpassword krbtgt più vecchia di 180 giorni
laps_coveragehigh quando LAPS è assente, medium quando parzialecomputer abilitati (controller di dominio esclusi) senza una password LAPS
reversible_encryptionhighutenti la cui password è memorizzata con cifratura reversibile
guest_enabledhighl’account Guest integrato (RID 501) è abilitato
obsolete_oshighcomputer abilitati su Windows XP, Vista, 7, 8, 2000, Server 2003, 2008 o 2012
dc_unreachablehighcontroller di dominio la cui porta LDAP non risponde
replication_failinghighpartner di replicazione in entrata con fallimenti consecutivi
dc_not_synchronizedhighil controller di dominio interrogato non ha terminato la sua replicazione iniziale
fsmo_role_orphanedhighun ruolo FSMO detenuto da un controller di dominio eliminato
password_policyhigh sotto 8 caratteri o senza lockout, medium altrimentilacune nella policy di dominio predefinita rispetto alla baseline: 14 caratteri, una soglia di lockout, complessità
privileged_group_sizemediumpiù di 5 account abilitati in Domain Admins, Enterprise Admins e Administrators insieme
stale_accountsmediumutenti e computer abilitati inattivi oltre le soglie
protocol_transition_delegationmediumdelegazione vincolata con transizione di protocollo
des_onlymediumaccount limitati alle chiavi Kerberos DES
password_not_requiredmediumutenti a cui è consentita una password vuota (PASSWD_NOTREQD)
privileged_password_never_expiresmediumutenti privilegiati la cui password non scade mai
privileged_stalemediumutenti privilegiati inattivi oltre stale_days_users
schema_admins_not_emptymediumSchema Admins ha membri
functional_level_oldmediumlivello funzionale di dominio sotto 2012 R2
clock_skewmediumpiù di cinque minuti tra il controller di dominio e DumbMonit
windows10_end_of_supportmediumcomputer abilitati su Windows 10
admincount_orphanslowutenti adminCount=1 non più in un gruppo privilegiato
password_never_expireslowutenti abilitati la cui password non scade mai
machine_account_quotalowqualsiasi utente può unire computer al dominio
recycle_bin_disabledlowl’AD Recycle Bin non è abilitato

Le regole integrate che si applicano:

  • Domain controller unreachable: un altro controller di dominio del dominio smette di rispondere sulla sua porta LDAP per cinque minuti (Warning). Quello interrogato è coperto da Monitor unreachable.
  • Active Directory bind failed: il controller di dominio rifiuta l’account di servizio — password scaduta, disattivato o bloccato (Advisory).
  • Privileged group membership changed: qualcuno si è unito o ha lasciato un gruppo privilegiato, nidificazione inclusa (Advisory, si risolve un’ora dopo).
  • Active Directory replication failing: un partner in entrata fallisce per mezz’ora (Advisory), quando lo stato di replicazione è leggibile.
  • krbtgt password older than 180 days (Info).

Il pannello Active Directory mostra il dominio (livelli funzionali, il controller di dominio interrogato, lo scarto dell’orologio), i controller di dominio con il loro sito, ruoli e se rispondono, i gruppi privilegiati con i loro membri, la policy delle password e i conteggi degli account, e la tabella dei risultati con le parole di severità.

Creare un account di servizio di sola lettura per DumbMonit

Sezione intitolata “Creare un account di servizio di sola lettura per DumbMonit”
  1. Crea un utente dedicato per DumbMonit, per esempio svc-dumbmonit, e non aggiungerlo a nessun gruppo. Un utente di dominio semplice è sufficiente: ogni utente autenticato può leggere ciò che DumbMonit legge. In PowerShell, con il modulo Active Directory:

    New-ADUser -Name svc-dumbmonit -UserPrincipalName [email protected] -AccountPassword (Read-Host -AsSecureString 'Password') -Enabled $true
  2. Dagli una password lunga e casuale. Se le password scadono nel tuo dominio, DumbMonit genera Active Directory bind failed il giorno in cui questa scade.

  3. Opzionale: per vedere lo stato di replicazione in entrata, concedi all’account il diritto Monitor active directory replication sull’oggetto dominio stesso. Non rivela alcuna password o segreto.

    dsacls "DC=corp,DC=example,DC=com" /G "CORP\svc-dumbmonit:CA;Monitor active directory replication"
  4. LDAPS richiede un certificato su ogni controller di dominio; un’autorità di certificazione enterprise (AD CS) ne emette uno automaticamente. Esporta il certificato di quell’autorità in formato X.509 codificato Base-64 e incollalo come CA certificate sotto.

  5. In DumbMonit, inserisci il nome di un controller di dominio come il suo certificato lo nomina, per esempio “dc1.corp.example.com”, e accedi come [email protected]. DumbMonit trova gli altri controller di dominio da solo e verifica che ognuno risponda.

  6. DumbMonit legge soltanto: non scrive mai nella directory, e di LAPS legge la data di scadenza, mai la password.

Per impedire all’account di aprire una sessione ovunque, negagli Log on locally e Log on through Remote Desktop Services tramite Group Policy: un bind LDAP non ne è influenzato. Non limitarlo con Log On To o Deny access to this computer from the network: i controller di dominio allora rifiuterebbero il bind.

  • L’account non ha bisogno di alcun gruppo oltre Domain Users, che ogni account ha.
  • Non usare un account di servizio gestito (gMSA): non può fare un semplice bind LDAP.
  • Non concedere Replicating Directory Changes (o All): quello è il diritto DCSync, che esporrebbe ogni hash di password. DumbMonit non ne ha mai bisogno.
  • Monitor active directory replication permette solo di leggere i metadati di replicazione (partner, ultimo successo, codici di errore). È opzionale.
  • LDAPS (porta 636) è il predefinito. Ogni controller di dominio di un dominio con un’autorità di certificazione enterprise riceve un certificato automaticamente; senza una, il controller di dominio non ascolta sulla 636. Il certificato deve portare il nome che DumbMonit usa: inserisci il controller di dominio con il suo nome DNS, non il suo indirizzo IP, a meno che il certificato non elenchi l’indirizzo.
  • CA certificate: incolla il PEM dell’autorità root (o emittente). Solo quell’autorità viene allora fidata. Senza, DumbMonit fida le radici pubbliche e lo store di sistema del suo container, che non conoscono un’autorità enterprise privata.
  • StartTLS (porta 389) cifra allo stesso modo, dopo un saluto in chiaro. Usalo quando la porta 636 è filtrata.
  • Accept an unverifiable certificate mantiene la connessione cifrata ma accetta qualsiasi certificato: chiunque sul percorso potrebbe fingersi il controller di dominio e ricevere la password dell’account di servizio.
  • LDAP channel binding (LdapEnforceChannelBinding) riguarda i bind NTLM e Kerberos su TLS; il bind semplice che DumbMonit usa non ne è interessato.
CampoValore
User name[email protected], CORP\svc-dumbmonit, oppure il DN completo dell’account
Passwordla password dell’account, memorizzata cifrata e mai mostrata di nuovo

Una password vuota viene rifiutata: Active Directory l’accetterebbe come un bind non autenticato senza controllare nulla.

OpzionePredefinitoCosa
Connection security (security)ldapsldaps, starttls o plain
Port (port)636, oppure 389usata se l’indirizzo non ne fornisce una
CA certificate (ca_cert)PEM dell’autorità che ha emesso i certificati dei controller di dominio
Accept an unverifiable certificate (insecure_tls)disattivato
Allow plain LDAP (allow_plaintext)disattivatorichiesto per plain
Check every domain controller (check_all_dcs)attivoconnessione TCP alla porta LDAP di ogni controller di dominio
Inactive user after (stale_days_users)90giorni
Inactive computer after (stale_days_computers)90giorni
Full inventory every (inventory_minutes)15minuti, da 1 a 1440
Timeout (request_timeout_seconds)8per operazione LDAP, da 1 a 60
  • TLS certificate rejected: incolla il certificato dell’autorità come CA certificate, e inserisci il controller di dominio con un nome che il suo certificato elenca.
  • Bind refused: wrong user name or password (LDAP result 49): il codice diagnostico dal controller di dominio viene tradotto — password scaduta, account disattivato, bloccato, oppure deve cambiare la password al prossimo accesso.
  • The domain controller requires a protected connection: la firma LDAP è imposta; passa a LDAPS oppure StartTLS.
  • A domain controller shows as unresolved: il suo nome non risolve dall’host DumbMonit. Punta il DNS di DumbMonit sui server DNS del dominio, oppure deseleziona Check every domain controller. I nomi non risolti non generano mai un avviso.
  • Replication status not readable: concedi Monitor active directory replication come nel passaggio 3, oppure accetta che la replicazione non venga mostrata.