Chi centralizza lâautenticazione su un directory LDAP non elimina il problema delle credenziali, lo sposta: dalla /etc/shadow di ogni host a un singolo servizio di rete e alla sua configurazione. Qui guardo a OpenLDAP 2.2 (la linea corrente, prima release a dicembre 2003) come a una superficie dâattacco, non come a un prodotto da adottare.
Contesto
OpenLDAP è lâimplementazione open source di riferimento di LDAPv3, il protocollo definito da RFC 2251 (dicembre 1997) e dallâinsieme di documenti che RFC 3377 (settembre 2002) indica come specifica completa. Il codice discende dal server LDAP sviluppato allâUniversitĂ del Michigan, la cui ultima release risale al 1996; il progetto OpenLDAP nasce nel 1998 a partire da quel sorgente.
Il demone è slapd (Standalone LDAP Daemon). La sua struttura viene dal codice del Michigan: un frontend che gestisce accesso di rete e protocollo, separato da un backend che si occupa solo dellâarchiviazione. La separazione ha un peso sulla sicurezza, perchĂŠ frontend e backend hanno modelli di fiducia diversi: il frontend parla con client non fidati, il backend con il filesystem locale.
Il caso dâuso che giustifica il directory è la lettura. Un login produce una bind seguita da una search; le modifiche alle credenziali sono rare. Su unâinfrastruttura mista Linux/FreeBSD/Solaris, dove Active Directory non câè, slapd diventa il punto unico contro cui ogni servizio â PAM, posta, web, VPN â verifica le identitĂ . Punto unico vuol dire anche bersaglio unico.
Architettura
Il modello dei dati è un albero, il DIT (Directory Information Tree). Ogni entry ha un DN (Distinguished Name) univoco, per esempio uid=mrossi,ou=people,dc=example,dc=com. Lo schema vincola classi e attributi: una entry inetOrgPerson ammette cn, mail, userPassword. Lo schema è estensibile, ed è qui che si prende la prima decisione di sicurezza: gli attributi che si sceglie di esporre, e le ACL che li proteggono, definiscono cosa un client anonimo o autenticato può leggere.
In OpenLDAP 2.2 il backend transazionale di riferimento è BDB, costruito su Berkeley DB, con transazioni e recovery dopo un crash; câera giĂ dalla 2.1 (giugno 2002). Esistono LDBM e altri backend, ma per un servizio di autenticazione quel che serve è la consistenza dopo unâinterruzione, non la velocitĂ grezza.
La novitĂ strutturale della 2.2 sono gli overlay: moduli che si innestano nella pipeline delle richieste e cambiano il comportamento di slapd senza toccare il backend. Due overlay hanno conseguenze dirette sulla sicurezza. ppolicy porta le politiche sulle password dentro al directory â scadenza, lunghezza minima, blocco dopo N tentativi falliti â invece di lasciarle a ogni client. syncrepl gestisce la replica del contenuto.
syncrepl prende il posto del vecchio slurpd, il demone di replica ereditato dal Michigan, che lavorava in push: il provider spingeva i cambiamenti verso le repliche. syncrepl ribalta lo schema: è il consumer a chiedere, e definisce la propria replica come risultato di una search (searchbase, scope, filter, attrs). Le modalitĂ sono due, refreshOnly con polling periodico e refreshAndPersist con connessione persistente che riceve gli aggiornamenti man mano. Il meccanismo è descritto dal documento draft-zeilenga-ldup-sync dellâIETF, a questa data ancora Internet-Draft e non RFC.
Il punto critico
La sicurezza si decide nel trasporto della bind. Una simple bind manda il DN e la password in chiaro dentro al protocollo. Se il canale non è cifrato, ogni login espone la credenziale sul filo: chi intercetta il segmento di rete tra client e slapd raccoglie password in chiaro senza dover violare nulla.
OpenLDAP offre due strade, e vanno tenute distinte. TLS cifra il canale: parte sulla porta 636 (ldaps) oppure sulla 389 con lâestensione StartTLS di RFC 2830. SASL (RFC 2222) è invece il livello di autenticazione: apre a meccanismi come DIGEST-MD5, che evita di trasmettere la password in chiaro anche su un canale non cifrato, o GSSAPI per integrare Kerberos. Le due cose non si escludono: SASL EXTERNAL su un canale TLS con certificato client lega lâidentitĂ al certificato verificato durante lâhandshake.
La conseguenza pratica è secca. Una simple bind senza TLS non si usa fuori da localhost. Lato server lo si impone con la direttiva security nella configurazione di slapd, che fissa una forza minima â per esempio rifiuta le bind che non raggiungono un certo ssf (security strength factor). Senza questo vincolo la decisione resta a ogni client, e basta un client configurato male per buttare a terra la cifratura imposta agli altri.
Restano le ACL. In slapd il controllo dâaccesso è dichiarativo e ordinato: le regole access to ... by ... si valutano nellâordine, decide la prima che corrisponde. Lâattributo userPassword vuole una regola esplicita che lo renda leggibile solo allâentry stessa (e a chi amministra) e scrivibile in auth per la bind â mai leggibile da un client anonimo. Una search anonima che riesce a leggere gli hash trasforma il directory in un dump di credenziali offline.
Implicazioni
Centralizzare lâautenticazione concentra anche la conseguenza di un errore. UnâACL troppo larga su userPassword, una simple bind senza TLS, una replica syncrepl che viaggia in chiaro verso un consumer in unâaltra sede: ognuna di queste, da sola, espone lâintero insieme di credenziali, non quelle di un singolo host. Il directory eredita il modello di minaccia di tutti i servizi che vi si appoggiano.
In cambio, la concentrazione rende verificabili poche cose ben definite. Lo stato di sicurezza di unâinfrastruttura OpenLDAP si legge in un numero limitato di punti: le direttive TLS* e security nella configurazione, il blocco access to per gli attributi sensibili, i meccanismi SASL abilitati, il canale usato da syncrepl. Sono testabili dallâesterno: una bind anonima e una search su userPassword dicono in pochi secondi se le ACL reggono.
Limiti
Qui guardo alla configurazione del server, non alla catena dei client. PAM e nss_ldap sullâhost hanno la loro configurazione TLS e il loro modo di gestire un directory che non risponde; un host che ricade su credenziali locali quando slapd è irraggiungibile apre un percorso che il server non controlla. La parte syncrepl la descrivo come meccanismo di replica del contenuto, senza valutarla sotto attacco attivo al provider, che è un tema a sĂŠ. E conta la versione: quanto sopra vale per la linea 2.2, e direttive e default cambiano tra una serie e lâaltra.
https://www.openldap.org/doc/admin22/guide.html https://www.rfc-editor.org/rfc/rfc2251 https://www.rfc-editor.org/rfc/rfc3377 https://www.rfc-editor.org/rfc/rfc2830 https://tools.ietf.org/html/draft-zeilenga-ldup-sync-05 https://www.openldap.org/pub/umich/guide.pdf https://www.noze.it/insights/openldap-open-source/
Immagine di copertina: Diagramma ad albero di una directory LDAP con il nodo radice dc=meudomini,dc=org che si dirama in cn=admin, ou=People e ou=Groups,⌠â diagramma di Rferrero, CC BY-SA 4.0 â https://commons.wikimedia.org/wiki/File:EsquemaDominiLDAP.jpg