Introduzione
Perché utilizzare in Openldap dit multipli (Directory Information Tree) all’interno dello stesso server?
Ipotizziamo di dover offrire un database utenti a più clienti contemporaneamente dando ad ognuno di loro la gestione del proprio albero senza dover creare istanze di openldap differenti, o complesse ACL, utilizzeremo differenti DIT sulla stessa istanza di openldap.
L’utilizzo di DIT differenti elimina anche la possibilità di incappare in duplicazioni di chiavi tra i vostri clienti.
Vedremo come creare due DIT utilizzando il formato slapd.conf e la conversione nel nuovo formato slapd.d, le alc e i gruppi dinamici, aggiunti alla nuova versione 2.4 di openldap.
Openldap DIT Multipli
Il Directory Tree Information identifica la radice dell’albero LDAP. Solitamente il DIT coincide con il dominio di appartenenza come viene espresso negli esempi: dc=example,dc=com. Non esiste infatti una regola precisa, il DIT può anche essere semplicemente espresso in dc=example.com. In questo esempio creeremo i due DIT: dc=oneos,c=it e dc=oneos,c=eu, ed un terzo o=super.admin.
Lo slapd.conf
Appena installato, openldap crea un DIT di esempio, noi lo elimineremo, per creare un DIT che useremo come super admin.
Prima di tutto, eliminiamo i file db tranne DB_CONFIG.
$ sudo service slapd stop $ sudo cd /var/lib/ldap $ sudo ls -la drwx------ 6 openldap openldap 4096 gen 26 14:15 . drwxr-xr-x 57 root root 4096 gen 15 21:25 .. -rw-r--r-- 1 openldap openldap 2048 gen 17 12:15 alock -rw------- 1 openldap openldap 532479 gen 17 12:15 __db.001 -rw------- 1 openldap openldap 139263 gen 17 12:15 __db.002 -rw------- 1 openldap openldap 741375 gen 17 12:15 __db.003 -rw-r--r-- 1 openldap openldap 96 gen 15 22:23 DB_CONFIG -rw------- 1 openldap openldap 8192 gen 17 11:51 dn2id.bdb -rw------- 1 openldap openldap 393216 gen 17 11:51 id2entry.bdb -rw------- 1 openldap openldap 10485759 gen 17 12:15 log.0000000001 -rw------- 1 openldap openldap 8192 gen 17 11:51 objectClass.bd $ $ sudo find /var/lib/ldap -type f | grep -v "DB_CONFIG" | xargs rm
Eliminiamo anche i file di configurazione.
$ sudo cd /etc/ldap $ sudo rm -fr slapd.d/*
A questo punto occorre creare il file /etc/ldap/slapd.conf con le nostre definizioni.
Per comodità dividiamo lo slapd.conf in 3 parti: configurazione, dit admin, dit1 e dit2.
# slapd.conf # file di esempio per la creazione di DITs multipli # Totali 2 DIT, uno di amministrazione completa e 1 di esempio con ACL per dare # al super admin l'acceso in RW a tutti i DIT e un utente per l'amministrazione del proprio DIT # Parte 1 - Configurazione # inclusioni schema include /etc/ldap/schema/core.schema include /etc/ldap/schema/cosine.schema include /etc/ldap/schema/inetorgperson.schema include /etc/ldap/schema/dyngroup.schema include /etc/ldap/schema/nis.schema # pid file pidfile /var/run/slapd/slapd.pid # logging loglevel 128 #ACL # moduli moduleload back_hdb.la moduleload dynlist.la database config rootpw {SSHA}Bns4pc9vnlU6MDZBDF1XLBB6fRrNkcC5 # nonteladico access to * by self manage by * none
Analizziamo cosa abbiamo scritto. Le direttive “include” dicono a slapd di caricare gli schema necessari al funzionamento.
Ho impostato il file pid del processo ed il livello di logging a 128 Rif. che identifica il solo log delle ACL.
Carico i modoli necessari. hdb e dynlist per i gruppi dimanici.
Poi imposto il tipo di database, in questo caso il db speciale config, la password e l’acl che consente al root di questo db di avere il completo controllo del db e nego l’accesso a tutti gli altri.
Per creare l’hash nel formato SSHA possiamo utilizzare l’utility “slappasword” in questo modo:
$ sudo slappasword -h {SSHA} -s nonteladico {SSHA}Bns4pc9vnlU6MDZBDF1XLBB6fRrNkcC5
Passiamo alla seconda sezione del file.
# Dit di amministrazione # # dc=super.admin # database hdb suffix "dc=super.admin" # root o superuser rootdn "cn=admin,dc=super.admin" rootpw {SSHA}Nj2+pZ5UxZr3hb3E7krvOH3ZUf+Yjkdq # nonteladico_admin # directory del db directory /var/lib/ldap # indici index objectClass eq,pres index uid eq,pres,sub index ou,cn,mail,surname,givenname eq,pres,sub index default eq,sub # ACL, il rootdn potrà accedere ad ogni DIT in RW # tutti gli altri no. access to * by * none # Impostazioni della directory cachesize 10000 checkpoint 128 15 dbnosync dirtyread searchstack 8 # gruppi dinamici overlay dynlist dynlist-attrset groupOfURLs memberURL uniqueMember
Questa sezione crea il primo DIT che useremo come amministrativo globale.
La voce database è “hdb” il tipo di db, poi creo il suffix, la password per root ed il rootdn.
La directory che conterrà i file di db, gli indici e anche per questo le ACL.
La parte molto interessante è quella finale dove imposto l’uso dei gruppi dinamici.
Passiamo alla terza parte.
# Dit 1 - oneos.it # accesso in RW per il DN "cn=admin,dc=oneos,c=it" # e per il DN"cn=admin,dc=super.admin" database hdb suffix "dc=oneos,c=it" # root or superuser rootdn "cn=admin,dc=oneos,c=it" rootpw {SSHA}HXCz8umQbrq5MAcHhWwmkzjAdqaDwVln # nonteladico_1 # La directory per questo DIT diversa dalla principale, per matenere ordine, # IMPORTANTE: la dir deve esistere perima di avviare ldap e deve essere scrivibile dall'utente openldap, # inoltre deve contenere il dile DB_CONFIG directory /var/lib/ldap/oneos index objectClass eq,pres index uid eq,pres,sub index ou,cn,mail,surname,givenname eq,pres,sub index default eq,sub # ACL, accesso RW per il DN "cn=admin,dc=super.admin" e accesso RW per il DN "cn=admin,dc=oneos,dc=it" access to dn.subtree="dc=oneos,c=it" by dn.exact="cn=ro,dc=oneos,c=it" read by dn="cn=admin,dc=super.admin" manage access to dn.subtree="dc=oneos,c=it" attrs=userPassword by anonymous auth access to * by * none # Impostazioni della directory cachesize 10000 checkpoint 128 15 dbnosync dirtyread searchstack 8 overlay dynlist dynlist-attrset groupOfURLs memberURL uniqueMember
Fondamentalmente la configurazione è uguale tranne per la directory dove verranno scritti i file di db, e le ACL, come possiamo vedere esiste una regola che permette di accedere a tutto l’albero in sola lettura all’utente “cn=ro,dc=oneos,c=it“.
Ora che abbiamo creato Openldap DIT multipli nel file slapd.conf siamo pronti per creare la nostra directory.
Con l’utility “slaptest” possiamo controllare la bontà delle impostazioni nel file slapd.conf e convertirele nel nuovo formato slapd.d.
Prima di tutto occorre creare la directory oneos come specificato nel Dit 1 dello slapd.conf.
$ sudo mkdir /var/lib/ldap/oneos $ sudo chown openldap:openldap /var/lib/ldap/oneos
Slapd.d
Creiamo le configurazioni nel nuovo formato.
$ sudo slaptest -f /etc/ldap/slapd.conf -F /etc/ldap/slapd.d -Q slap_startup failed (test would succeed using the -u switch)
Possiamo ignorare questo avviso, perchè l’utility tenta di avviare il servizio ma i file scritti non sono leggibili dall’utente openldap e quindi fallisce, occorre quindi impostare i permessi giusti. Vi consiglio di andare a curiosare nella directory slapd.d per vedere come le nostre impostazioni sono state trasformate.
$ sudo chown -R openldap:openldap /etc/ldap/slapd.d/ $ sudo chown -R openldap:openldap /var/lib/ldap/
Possiamo avviare slapd.
$ sudo service slapd start
Se tutto è andato a buon fine possiamo iniziare a fare qualche query.
Ldif
A questo punto dobbiamo inserire i contenuti. Ho creato un file super.ldif con le informazioni del DIT. Inseriamo prima il DN: dc=super.admin e il suo utente,
# Voce 1: dc=super.admin dn: dc=super.admin dc: super.admin o: super.admin objectclass: top objectclass: dcObject objectclass: organization # Voce 2: cn=admin,dc=super.admin dn: cn=admin,dc=super.admin cn: admin description: LDAP administrator objectclass: simpleSecurityObject objectclass: organizationalRole objectclass: top userpassword: {SSHA}O5ApoYquacI2RZvbg1lYFk6M4IeWsj1J # super.admin.pw
Ora inseriamo i contenuti utilizzando la password che abbiamo messo nello slapd.conf per il Dit di amministrazione
$ sudo ldapadd -x -D cn=admin,dc=super.admin -W -f super.ldif Enter LDAP Password: adding new entry "dc=super.admin" adding new entry "cn=admin,dc=super.admin"
Di seguito il file oneos.ldif con le dichiarazioni degli oggetti ldap, possiamo caricare il contenuto come per il file super.ldif.
# Voce 1: dc=oneos,c=it dn: dc=oneos,c=it dc: oneos o: oneos objectclass: top objectclass: dcObject objectclass: organization # Voce 2: cn=admin,dc=oneos,c=it dn: cn=admin,dc=oneos,c=it cn: admin description: LDAP administrator objectclass: simpleSecurityObject objectclass: organizationalRole objectclass: top userpassword: {SSHA}7E+ZwB3qy2i5Lc6fkDGZCRdBDQ1IEKcd # admin.oneos dn: cn=ro,dc=oneos,c=it cn: ro description: LDAP administrator objectclass: simpleSecurityObject objectclass: organizationalRole objectclass: top userpassword: {SSHA}ezX3jFzNKY1psbQAuZczDnlU9ECe/Vvn # ro.oneos # Voce 3: ou=Computers,dc=oneos,c=it dn: ou=Computers,dc=oneos,c=it objectclass: organizationalUnit objectclass: top ou: Computers # Voce 4: uid=marvinlap,ou=Computers,dc=oneos,c=it dn: uid=marvinlap,ou=Computers,dc=oneos,c=it description: notebook federico macaddress: b8:6b:23:4e:99:1b objectclass: account objectclass: ieee802Device uid: marvinlap # Voce 5: ou=groups,dc=oneos,c=it dn: ou=groups,dc=oneos,c=it objectclass: organizationalUnit objectclass: top ou: groups # Voce 6: cn=admin,ou=groups,dc=oneos,c=it dn: cn=admin,ou=groups,dc=oneos,c=it cn: admin memberurl: ldap:///ou=People,dc=oneos,c=it?uid?sub?(businessCategory=admin) objectclass: groupOfURLs objectclass: top # Voce 7: cn=students,ou=groups,dc=oneos,c=it dn: cn=students,ou=groups,dc=oneos,c=it cn: students memberurl: ldap:///ou=People,dc=oneos,c=it?uid?sub?(businessCategory=students) objectclass: groupOfURLs objectclass: top # Voce 8: ou=People,dc=oneos,c=it dn: ou=People,dc=oneos,c=it objectclass: organizationalUnit objectclass: top ou: People # Voce 9: uid=federico.fiordoliva,ou=People,dc=oneos,c=it dn: uid=federico.fiordoliva,ou=People,dc=oneos,c=it businesscategory: students businesscategory: admin cn: Federico Fiordoliva mail: federico.fiordoliva@gmail.com objectclass: inetOrgPerson objectclass: person objectclass: top objectclass: ieee802Device sn: federico.fiordoliva uid: federico.fiordoliva userpassword: {SSHA}XxVUDhgAwagUB7rwVej4DuFLTz7Q4wyK # federico.oneos
Per questa directory ho aggiunto delle OU: groups e People. La cosa interessante è l’utilizzo dei gruppi dinamici, infatti nell’utente federico.fiordoliva c’è un attributo “businesscategory” con dentro il nome del gruppo, questo permette l’attribuzione dinamica dell’ utente, inoltre questo attributo è multivalore. Se guardiamo nei gruppi ci sono due cose fondamentali per il loro funzionamento, l’objectclass “gropOfURLs” e l’attributo “memberurl” che contiene una stringa di ricerca, questo popolerà automaticamente l’attributo “uniquemenber” del gruppo di appartenenza. L’inserimento dei gruppi dinamici ha reso molto più ordinato l’albero e più facili le ricerche, ma porta con se un consumo maggiore di risorse, specialmente se si abusa di questo meccanismo.
Ldapsearch
Ora che Openldap DIT multipli sono popolati possiamo verificare le ACL che abbiamo creato per vedere se funzionano. Proviamo a fare una query a Ldap chiedendo l’UID federico.fiordoliva nel DN “dc=oneos,c=it“.
$ ldapsearch -x -LLL -s sub -D "cn=admin,dc=oneos,c=it" -b "dc=oneos,c=it" uid=federico.fiordoliva -W Enter LDAP Password:nonteladico_1 dn: uid=federico.fiordoliva,ou=People,dc=oneos,c=it businessCategory: students businessCategory: admin cn: Federico Fiordoliva mail: federico.fiordoliva@gmail.com objectClass: inetOrgPerson objectClass: person objectClass: top objectClass: ieee802Device sn: federico.fiordoliva uid: federico.fiordoliva userPassword:: e1NTSEF9RDhGajZSTWE4V0VRM3h2TWozcW0vd0xFc2FLaGNQLzI=
Ora verifichiamo che il DN “cn=admin,dc=super.admin” possa leggere l’albero “dc=oneos,c=it”.
ldapsearch -x -LLL -s sub -D "cn=admin,dc=super.admin" -b "dc=oneos,c=it" uid=federico.fiordoliva -W Enter LDAP Password:nonteladico_admin dn: uid=federico.fiordoliva,ou=People,dc=oneos,c=it businessCategory: students businessCategory: admin cn: Federico Fiordoliva mail: federico.fiordoliva@gmail.com objectClass: inetOrgPerson objectClass: person objectClass: top objectClass: ieee802Device sn: federico.fiordoliva uid: federico.fiordoliva userPassword:: e1NTSEF9RDhGajZSTWE4V0VRM3h2TWozcW0vd0xFc2FLaGNQLzI=
Abbiamo verificato che la lettura funziona per entrambi gli utenti, ma solo nel DIT cn=oneos,c=it, controlliamo anche il DIT admin.
$ ldapsearch -x -LLL -s sub -D "cn=admin,dc=oneos,c=it" -b "dc=super.admin" -W Enter LDAP Password:nonteladico_1 No such object (32)
Facendo una query con il DN non permesso Openldap ritorna un messaggio di oggetto non trovato, questo perchè l’autenticazione va a buon fine, ma la ricerca è vietata,quindi non mostra nulla. A questo punto abbiamo verificato le ACL in lettura, verifichiamole anche il scrittura.
Ldapmodify
Questa utility consente di modificare/aggiungere/eliminare qualsiasi attributo di un albero Ldap. Prima di iniziare occorre creare un file ldif con le istruzioni. Utilizziamo il tipo “modifica” e modifichiamo la password dell’utente federico.fiordoliva.
dn: uid=federico.fiordoliva,ou=People,dc=oneos,c=it changetype: modify replace: userPassword userPassword: {SSHA}n6oeiUdfa2n7LUnEQOIe3E48+Ht9XFIo # nonteladico.federico
$ ldapmodify -H ldapi:/// -f modify.ldif -W -D cn=admin,dc=oneos,c=it Enter LDAP Password: nonteladico_1 modifying entry "uid=federico.fiordoliva,ou=People,dc=oneos,c=it"
Proviamo ora ad utilizzare l’utente “ro” per modificare la password.
$ ldapmodify -H ldapi:/// -f modify -W -D cn=ro,dc=oneos,c=it Enter LDAP Password: modifying entry "uid=federico.fiordoliva,ou=People,dc=oneos,c=it" ldap_modify: Insufficient access (50)
Come abbiamo visto le nostre ACL fanno quello che gli abbiamo chiesto.
Vediamo ora come aggiungere un attributo e popolarlo, l’utente test non era membro di nessun gruppo dinamico, aggiungiamolo al gruppo “students”. Creiamo il file add.ldif con questi parametri.
dn: uid=test,ou=People,dc=oneos,c=it changetype: modify add: businesscategory businesscategory: students
$ ldapmodify -H ldapi:/// -f add.ldif -W -D cn=admin,dc=oneos,c=it Enter LDAP Password: modifying entry "uid=test,ou=People,dc=oneos,c=it"
Gruppi dinamici
Nella creazione dei DIT abbiamo configurato i gruppi dinamici caricando il modulo “dyngroup.schema” e impostando gli ObjectClass “groupOfURLs memberURL uniqueMember” e nei file ldif abbiamo creato due gruppi, “admin” e “students”.
Verifichiamo il loro funzionamento in modo molto semplice.
Diciamo che vogliamo sapere tutti i membri del gruppo “students”.
$ ldapsearch -x -LLL -s sub -D "cn=ro,dc=oneos,c=it" -b "dc=oneos,c=it" -W businessCategory=students dn Enter LDAP Password: nonteladico_1 dn: uid=federico.fiordoliva,ou=People,dc=oneos,c=it dn: uid=test,ou=People,dc=oneos,c=it
L’attributo chiave che abbiamo assegnato all’utente è “businesscategory”, i sistema di gruppi dinamici legge l’albero e aggiunge dinamicamente un attributo multi valore al suo interno “uniquemember” con il DN esatto dell’utente. Analizzando l’utente federico.fiordoliva vediamo che l’attributo “businesscategory”, anch’esso multi valore, è popolato con entrambi i gruppi.
ldapsearch -x -LLL -s sub -D "cn=admin,dc=super.admin" -b "dc=oneos,c=it" uid=federico.fiordoliva -W Enter LDAP Password:nonteladico_admin dn: uid=federico.fiordoliva,ou=People,dc=oneos,c=it businessCategory: students businessCategory: admin cn: Federico Fiordoliva mail: federico.fiordoliva@gmail.com objectClass: inetOrgPerson objectClass: person objectClass: top objectClass: ieee802Device sn: federico.fiordoliva uid: federico.fiordoliva userPassword:: e1NTSEF9RDhGajZSTWE4V0VRM3h2TWozcW0vd0xFc2FLaGNQLzI=
I gruppi dinamici sono molto comodi, specialmente in un albero dove gli utenti cambiano spesso gruppo di appartenenza o se addirittura cambiano OU, perché occorre cambiare SOLO il valore dell’attributo businesscategory e non l’intero DN all’interno del gruppo come si faceva prima.
Spero che questa guida sia di aiuto a chi volesse implementare un Openldap nella propria azienda o per chi volesse semplicemente studiarne il funzionamento.
Enjoy!
- Coppia di chiavi RSA per ssh, come generarle - 18 Ago,2019
- Let’s Encrypt su pfSense – webConfigurator - 04 Apr,2017
- Isc Dhcpd Openldap su Ubuntu 16.04 - 03 Ott,2016
Leave a Comment