OpenLDAP 
Introduzione LDAP (Lightweight Directory Access Protocol) è uno standard aperto
ed è un protocollo client-to-server che implementa un servizio di
directory, una sorta di elenco telefonico dove per ciascun utente è possibile impostare diverse informazioni: indirizzo di posta
elettronica, password cifrata, numeri di telefono, indirizzo, foto,
posizione all'interno dell''azienda, etc. Le informazioni sono
organizzate come all'interno di un database con la differenza che le
informazioni sono basate su una serie di attributi. All'interno della 'Directory' ottimizzata per la lettura, le
informazioni sono organizzate gerarchicamente ad albero e la gerarchia
può essere ispirata per motivi geografici, aziendali o secondo diverse
scelte. LDAP è noto anche come X.500 Lite. X.500, uno standard internazionale
per le directory, include numerose caratteristiche interessanti, ma è molto complesso e richiede grandi risorse di elaborazione e uno stack
OSI completo. LDAP, al contrario, funziona in modo corretto su ogni PC
ed è compatibile con il protocollo TCP/IP. LDAP può accedere alle
directory X.500, ma non supporta tutte le funzioni di X.500.
Configurazione OpenLDAP Server
I pacchetti RPM da installare sono i seguenti:
openldap
openldap-clients
openldap-devel
nss_ldap
openldap-servers I principali file di riferimento di OpenLDAP sono i seguenti: /etc/openldap/slapd.conf (file di configurazione di LDAP)
/etc/openldap/schema (directory dove sono contenute le strutture dei dati relative alle informazioni da assegnare ad ogni record)
La directory contenente i databases LDAP è rispettivamente /var/lib/ldap
Per gestire le voci di un database LDAP si utilizzano i seguenti comandi:
ldapadd (per popolare il database)
ldapmodify (per modificare le voci esistenti)
ldapdelete (per eliminare le voci esistenti)
Esempio di configurazione Supponiamo di implementare LDAP in un'azienda denominata 'example.com'(organization).
Col seguente comando, andremo a creare una subdir all'interno di
/var/lib/ldap che prenderà il nome della nuova organization la quale
conterrà i database di 'example.com'
# mkdir /var/lib/ldap/example.com
poi assegneremo utente e gruppo 'ldap' come proprietario della directory example.com
# chown ldap:ldap /var/lib/ldap/example.com
Tale
organization è poi suddivisa in gruppi(organization unit o OU) in cui
lavorano diversi dipendenti(person), ciascuno con la propria scheda
personale; l'amministratore di LDAP è l'utente 'admin' .
L'amministratore
di LDAP, è l'unico utente autorizzato a creare, importare ed esportare
dati dai databases LDAP. Per questo utente è richiesta una password,
possibilmente crittografata.
Possiamo generare una password crittografata semplicemente eseguendo il seguente comando da un terminale:
# slappasswd
Password generata -> {SSHA}upTtbZB+WgdP8l57637bab+sFZCExpC/ (non usate questa password!)
Tale password, va impostata sulla direttiva 'rootpw' del file di configurazione slapd.conf
Configurazione del file slapd.conf
Sul file di configurazione /etc/openldap/slapd.conf dobbiamo aggiungere/modificare le seguenti direttive
database ldbm
suffix "dc=example,dc=com"
rootdn "cn=admin,dc=example,dc=com"
rootpw {SSHA}upTtbZB+WgdP8l57637bab+sFZCExpC/
directory /var/lib/ldap/example.com
La riga suffix "dc=... richiama il dominio per il quale il server LDAP fornisce le informazioni
L'entry rootdn "cn=... è il Distinguished Name (DN) per un utente che non
ha limitazioni nei controlli di accesso o nei parametri limite
amministrativi impostati per le operazioni sulla directory LDAP.
L'utente rootdn può essere considerato un utente root per la directory
LDAP
L'entry "rootpw {SSHA}..."
rappresenta la password dell'utente rootdn di ldap.
La direttiva directory /var/lib/ldap/example.com rappresenta la directory contenente i database di LDAP.
Le
entry LDAP vengono inserite sui database mediante l'impiego di appositi
file ASCII in formato testo, denominati LDIF(LDAP Data Interchange
Format), all'interno dei quali definiamo le entry e i loro attributi.
I file che importano o esportano dati da un server LDAP, devono essere in formato LDIF.
Un 'entry rappresenta una unità in una directory LDAP, identificata dal proprio e unico Distinguished Name (DN).
Quindi,
ogni entry possiede degli attributi, ovvero parti di informazione
direttamente associate alla stessa entry. Per esempio, un'azienda
denominata example.com, potrebbe essere un'entry LDAP. Il sito
internet, l'indirizzo e-mail, numero di fax, l'indirizzo possono essere
gli attributi associati a example.com
Le persone potrebbero essere altre entry nella directory LDAP. Gli
attributi legati alle persone sono il numero di telefono, l'indirizzo
e-mail e così via.
Alcuni attributi sono necessari, mentre altri sono facoltativi. Una
objectclass evidenzia gli attributi necessari e quelli opzionali. Tutte
le definizioni sintattiche degli attributi e le definizioni objectclass
si trovano nei vari file schema all'interno della directory
/etc/openldap/schema
LDAPADD - inserimento delle entry sul database LDAP Creare una Root LDAP entry
Dopo questa breve panoramica, passiamo all'inserimento della prima
entry sul database riguardante il DC (Domain Component) example.com
ossia la Root LDAP entry
Il file LDIF di example.com si presenta come segue:
dn: dc=example,dc=com dc: example description: Root LDAP entry for example.com objectClass: dcObject objectClass: organizationalUnit ou: rootobject Create
un file di testo su cui inserire le righe precedenti, poi, copiatelo
all'interno di /etc/openldap ed eseguite il prossimo comando dal
terminale.
Attenzione i caratteri blank o eventuali spazi, potrebbero causare errori durante la procedura di inserimento sul database ldap.
# ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f /etc/openldap/example.com.LDIF
Enter LDAP Password: ***** [digitate la password dell'amministratore ldap]
adding new entry "dc=example,dc=com"
Creare una Organization Unit (OU) su LDAP.
Poi continuiamo con l'inserimento di una Organization Unit (OU),
denominata 'Utenti'; il file LDIF lo chiameremo utenti.example.com.LDIF,
qui un esempio:
dn: ou=Utenti, dc=example,dc=com ou: Utenti description: Unità Organizzativa Utenti objectClass: organizationalUnit Poi eseguite il prossimo comando da un terminale per creare la nuova OU:
# ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f /etc/openldap/utenti.example.com.LDIF
Enter LDAP Password:
adding new entry "ou=Utenti, dc=example,dc=com"
Creare un utente su LDAP.
Infine creiamo un utente denominato 'drigattieri' appartente
all'Organization Unit(OU) 'Utenti'; la template del file LDIF è la
seguente, il nome del file sarà drigattieri.utenti.example.com.LDIF.
dn: uid=drigattieri,ou=Utenti,dc=example,dc=com
uid: drigattieri
cn: drigattieri
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {SSHA}LbnFzcqZwGSd7wvPifk9ft77H/iSiQIO
shadowLastChange: 13209
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 501
gidNumber: 501
homeDirectory: /home/drigattieri
Per generare la password utente crittografata , utilizziamo sempre il tool 'slappasswd' Per continuare con l'inserimento eseguite il prossimo comando:
# ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f /etc/openldap/drigattieri.utenti.example.com
Enter LDAP Password:
adding new entry "uid=drigattieri,ou=Utenti,dc=example,dc=com"
Affinchè l'utente drigattieri possa ritrovarsi sulla propria home directory dopo
il processo di autenticazione, bisognare creare l'utente in questione
sul server LDAP:
# groupadd -g 200 utentildap # useradd -u 550 -g 200 -h /home/drigattieri
Come migrare gli utenti di sistema sul database LDAP.
Utilizzando uno script perl presente sulla distro Fedora, è possibile
convertire un file passwd in un file formato LDIF.
Creiamo un gruppo e un utente di test ed assegnamogli una password:
# groupadd ldapuser # useradd -g ldapuser user1 # passwd user1
Esportiamo dal file /etc/passwd, il record inerente all'utente user1:
# grep user1 /etc/passwd > /etc/openldap/user1.passwd
Convertiamo il file user1.passwd in user1.LDIF
# /usr/share/openldap/migration/migrate_passwd.pl /etc/openldap/user1.passwd /etc/openldap/user1.LDIF
Attenzione! Lo script 'migrate_passwd.pl' imposterà di default tutte le entry sulla
OU 'People' col dominio 'padl.com', mentre invece noi vogliamo che i
nuovi utenti LDAP appartengano alla OU 'Utenti' e al dominio
'example.com'.
Quindi modificate la prima riga del file /etc/openldap/user1.LDIF
da: dn: uid=user1,ou=People,dc=padl,dc=com
a: dn: uid=user1,ou=Utenti,dc=example,dc=com
Se
state effettuando una migrazione totale degli utenti di sistema e
dunque vi ritrovate parecchie righe da modificare, potete editare il
file in VI ed eseguire il seguente comando dal prompt(VI) per
sostituire tutte le righe in un colpo solo:
:%s/padl/example/g
LDAPSEARCH - ricerca all'interno del database LDAP.
E' un comando che permette di effettuare la ricerca di attributi all'interno del database LDAP.
Vediamo alcuni esempi utili.
Ricerca del dominio example.com:
# ldapsearch -x 'dc=example'
Ricerca dell'OU Utenti:
# ldapsearch -x 'ou=Utenti'
Ricerca di tutte le objectclass che contengono organizationalUnit:
# ldapsearch -x 'objectclass=organizationalUnit'
Ricerca dell'utente user1:
# ldapsearch -x 'cn=user1'
Visualizzare tutto il database LDAP:
ldapsearch -x
LDAPMODIFY - AGGIUNGERE / MODIFICARE / RIMUOVERE gli attributi di un'entry ldap. Per AGGIUNGERE un attributo all'interno di una entry, create un nuovo file LDIF chiamandolo user1-update.LDIF ed aggiungete le seguenti direttive:
dn: uid=user1,ou=Utenti,dc=example,dc=com changetype: modify add: description description: utente ldap
Poi eseguite il comando per apportare la modifica:
# ldapmodify -x -D "cn=admin,dc=example,dc=com" -W -f /etc/openldap/user1-update.LDIF
adesso verifichiamo la modifica apportata col seguente comando:
# ldapsearch -x 'cn=user1'
Per MODIFICARE un attributo, configurate il file LDIF nel seguente modo per modificare l'attributo 'description':
dn: uid=user1,ou=Utenti,dc=example,dc=com changetype: modify replace: description description: utente
Poi eseguite il comando:
# ldapmodify -x -D "cn=admin,dc=example,dc=com" -W -f /etc/openldap/user1-update.LDIF
Per RIMUOVERE un attributo, configurate il file LDIF nel seguente modo per eliminare l'attributo 'description':
dn: uid=user1,ou=Utenti,dc=example,dc=com changetype: modify delete: description
Abbiamo
visto come aggiungere, modificare ed eliminare l'attributo
'description'. Stessa cosa può essere fatta con altri tipi attributi.
LDAPDELETE per eliminare un'entry dal database ldap. Risulta piuttosto semplice eliminare una entry ldap dal database. Supponiamo di voler eliminare l'utente 'user1' dal database:
# ldapdelete -vx 'uid=user1,ou=Utenti,dc=example,dc=com' -D "cn=admin,dc=example,dc=com" -W
Configurazione del Client LDAP. I seguenti pacchetti RPM sono richiesti su un Client LDAP:
openldap
openldap-clients
openldap-devel
nss_ldap
Su RedHat/Fedora, abbiamo a disposizione diversi tools per la configurazione del client LDAP.
Il tool grafico 'system-config-authentication' permette di configurare
velocemente i parametri per connettersi al server LDAP. Basta eseguire
il comando da un terminale o selezionare dal menu di Avvio >
Amministrazione, l'icona Autenticazione, selezionare 'abilita il
supporto LDAP' e cliccare su 'configura ldap' per specificare il Base
DN(dc=example,dc=com) e l'indirizzo IP del server ldap.
Altrimenti,
se vogliamo utilizzare il tool testuale, digitare sul terminale
'setup', poi scegliere 'Authentication Configuration', selezionare il
flag 'Use LDAP' nella colonna di sinistra 'User Information', nella
colonna di destra 'Authentication' selezionare il flag 'Use LDAP
Authentication' e proseguire, infine apparirà una box ove occorre
specificare l'indirizzo IP del server ldap e il 'Base DN' che nel
nostro esempio è 'dc=example,dc=com'
Oppure, per
quelli che vogliono toccare con mano i file di configurazione è possibile editare i file ldap.conf e nsswitch.conf in presenti /etc:
sul file di configurazione ldap.conf, modificare le seguenti direttive:
host 192.168.1.200 #IP Address del server LDAP
base dc=example,dc=com
Infine, sul file nsswitch.conf, specificare l'ordine in cui il sistema deve ricercare gli utenti; prima sui files locali e poi su ldap:
passwd: files ldap shadow: files ldap group: files ldap
Dopo aver completato la configurazione del client possiamo finalmente testare l'autenticazione ldap.
Se il vostro client è avviato in modalità grafica, meglio switchare
sulla console 1 per lavorare in modalità testuale, escludendo eventuali
problemi di autenticazione via GDM, quindi con la combinazione di tasti
[alt] + [f1] passiamo alla console 1 - per ritornare alla console
grafica [alt] + [f7]
Se invece vi trovate già in modalità text o runlevel 3, eseguite un logout.
Adesso siamo pronti per effettuare il login con l'utente user1:
Fedora Core release 5 (Bordeaux)
Kernel 2.6.16.19 on an i686
hurricane login: user1
Password:
Last login: Tue Jul 11 17:02:28 from 172.16.84.129
No directory /home/user1!
Logging in with home = "/".
-sh-3.1$
Se avete configurato tutto per bene, dovreste ottenere qualcosa di simile, quindi l'autenticazione su LDAP funziona.
Da notare il messaggio "No directory /home/user1!", significa che non è stata trovata la home directory dell'utente user1.
Per ovviare a questo problema, è possibile far eseguire al client ldap
un automount della /home, con AutoFS, via NFS sul Server LDAP, in
maniera tale che, ad ogni login, il client possa montare
automaticamente la home directory dell'utente autenticato.
Configurazione Server NFS.
Sul Server LDAP, inserite la seguente direttiva all'interno del file /etc/export:
/home *(rw)
Il
carattere '*' abilita qualsiasi client ad effettuare il mount della
directory, dal punto di vista della security non è consigliato, meglio
restringere l'accesso specificando il range IP come nel seguente
esempio oppure utilizzare il tcp_wrappers - consultare la sezione Guida
NFS per maggiori info:
/home 192.168.0.0/255.255.255.0(rw)
Infine avviate i servizi NFS e Portmap:
# service portmap start
# service nfs start
Configurazione Autofs sul client ldap.
Dunque desideriamo che il client, monti in automatico la /home con AutoFS via NFS.
Prima di tutto, occorre rinominare la home directory locale sul client,
da '/home' a '/localhome ' in quanto il servizio 'Autofs' crea
automaticamente il mount point sulla quale montare la risorsa, quindi
la /home non deve esistere sulla '/' dal momento che quest'ultima(home)
verrà creata dinamicamente sulla root(/).
Quindi autenticatevi sul client come root e sostituite sul file
/etc/passwd la riga '/home' con '/localhome' per consentire agli utenti
locali di ritrovare la propria home.
Adesso procediamo con la configurazione del servizio autofs.
Aprite un terminale e configurate il file /etc/auto.master aggiungendo la seguente direttiva:
/home /etc/auto.ldaphome --timeout=60
poi, configurate il file /etc/auto.ldaphome aggiungendo la seguente direttiva:
rw,soft,intr,rsize=8192,wsize=8192 IP_ADDRESS_SERVERLDAP:/home/&
Infine avviate il servizio autofs
# chkconfig autofs on
# service autofs start
Se invece non vogliamo utilizzare il servizio Autofs per l'automount, possiamo configurare il client per montare in automatico tutta la directory /home configurando il file /etc/fstab come segue:
ip_address_server_nfs:/home /home nfs defaults 0 0
Finalmente
siamo pronti per effettuare il login e verificare che il sistema monti
in automatico la home dir dell'utente 'user1' via NFS.
Attenzione!
Dal momento che sul client ldap la /home è stata rinominata in
/localhome ricordiamo di assegnare il path corretto nel caso in cui si
vogliano creare nuovi utenti locali sul client col seguente comando:
useradd -d /localhome/nuovo_utente nuovo_utente
|