Guida all'autenticazione OpenLDAP in Gentoo
1.
Iniziare con OpenLDAP
Cos'è LDAP?
LDAP è l'acronimo di Lightweight Directory Access Protocol. Basato su
X.500, comprende molte delle sue funzioni primarie, ma non include molte delle
funzioni esoteriche che X.500 possiede. Ma cos'è questo X.500 e cosa c'entra con
LDAP?
Nel concetto OSI, l'X.500 è un modello per i Directory Service. Contiene le
definizioni per i namespace ed i protocolli per la ricerca e l'aggiornamento
delle directory. Comunque, è stato riscontrato che X.500 risulta essere
eccessivo in molte situazioni. Entriamo in LDAP. Come l'X.500, provvede un
modello data/namespace per le directory ed anche un protocollo. Comunque, LDAP è
progettato per essere eseguito direttamente al di sopra dello stack TCP/IP. Si
pensi a LDAP come una versione più snella di X.500.
Cos'è una directory
Una directory è un database specializzato progettato per frequenti richieste ma
infrequenti aggiornamenti. Al contrario di database generali, non contiene il
supporto per transazioni o funzionalità di roll-back. Le directory sono
facilmente replicabili per incrementarne la disponibilità e l'affidabilità.
Quando le directory vengono replicate, sono permesse inconsistenze temporanee
finché non divengono eventualmente sincronizzate.
Come sono strutturate le informazioni
Tutte le informazioni all'interno di una directory sono strutturate in modo
gerarchico. Inoltre, se si vogliono inserire dati dentro una directory, la
directory deve sapere come memorizzare questi dati all'interno di un albero. Si
veda l'esempio di una finta compagnia e ad un albero stile Internet:
Codice 1.1: Struttura organizzativa di GenFic, una compagnia finta di Gentoo |
dc: com
|
dc: genfic
/ \
ou: People servers
/ \ ..
uid: .. John
|
Dato che non sono stati introdotti dati nel database in questo schema ascii,
ogni nodo di questo albero deve essere definito. Per dare un nome ad ogni nodo,
LDAP usa un schema di nomi. Molte distribuzioni LDAP (incluso OpenLDAP)
contengono già un certo numero di schemi predefiniti (generalmente approvati),
come inetorgperson, uno schema frequentemente usato per definire utenti.
Gli utenti interessati sono incoraggiati a leggere la OpenLDAP Admin Guide.
Per cosa si usa LDAP
LDAP può essere usato per vari scopi. Questo documento si focalizza sulla
gestione centralizzata degli utenti, mantenendo tutti gli account utente in una
singola collocazione LDAP (il che non significa che sia alloggiato su un singolo
server, LDAP supporta scalabilità e ridondanza), sono comunque raggiungibili
anche altri obiettivi usando LDAP.
- Infrastruttura per chiavi pubbliche
- Calendari condivisi
- Rubriche condivise
- Depositi per DHCP, DNS, ...
-
Direttive di classe per la configurazione di sistemi (tenendo traccia delle
configurazioni di vari server)
- ...
2.
Configurazione di OpenLDAP
Configurazione iniziale
Nota:
In questo documento si userà l'indirizzo genfic.com come esempio. Si dovrà
naturalmente cambiarlo per adattarlo allo scopo da raggiungere. Comunque, ci si
assicuri che il nodo iniziale sia il top level di un dominio ufficiale (net,
com, cc, be, it, ...).
|
Prima di tutto occorre installare OpenLDAP:
Codice 2.1: Installazione di OpenLDAP |
# emerge openldap
|
A questo punto generare una password criptata da usare successivamente:
Codice 2.2: Generare una password |
# slappasswd
New password: my-password
e-enter new password: my-password
{SSHA}EzP6I82DZRnW+ou6lyiXHGxSpSOw2XO4
|
Modificare la configurazione del Server LDAP tramite il file
/etc/openldap/slapd.conf. Più avanti verrà fornita una
configurazione di esempio che garantisca un semplice funzionamento. Per
un'analisi più dettagliata del file di configurazione, è utile leggere la guida
per amministratori di OpenLDAP.
Codice 2.3: /etc/openldap/slapd.conf |
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/misc.schema
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
serverID 0
loglevel 0
access to dn.base="" by * read
access to dn.base="cn=Subschema" by * read
access to *
by self write
by users read
by anonymous read
database hdb
suffix "dc=genfic,dc=com"
checkpoint 32 30
rootdn "cn=Manager,dc=genfic,dc=com"
rootpw "{SSHA}EzP6I82DZRnW+ou6lyiXHGxSpSOw2XO4"
directory "/var/lib/openldap-ldbm"
index objectClass eq
syncrepl rid=000
provider=ldap://ldap2.genfic.com
type=refreshAndPersist
retry="5 5 300 +"
searchbase="dc=genfic,dc=com"
attrs="*,+"
bindmethod="simple"
binddn="cn=ldapreader,dc=genfic,dc=com"
credentials="ldapsyncpass"
index entryCSN eq
index entryUUID eq
mirrormode TRUE
overlay syncprov
syncprov-checkpoint 100 10
|
Successivamente modificare il file di configurazione del Client LDAP:
Codice 2.4: /etc/openldap/ldap.conf |
# nano -w /etc/openldap/ldap.conf
BASE dc=genfic, dc=com
URI ldap://ldap.genfic.com:389/ ldap://ldap1.genfic.com:389/ ldap://ldap2.genfic.com:389/
TLS_REQCERT allow
TIMELIMIT 2
|
Modificare /etc/conf.d/slapd e impostare la seguente linea OPTS:
Codice 2.5: /etc/conf.d/slapd |
OPTS="-h 'ldaps:// ldap:// ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock'"
|
Infine, creare la directory /var/lib/openldap-ldbm:
Codice 2.6: Preparare la directory openldap-ldbm |
~# mkdir -p /var/lib/openldap-ldbm
~# chown ldap:ldap /var/lib/openldap-ldbm
~# chmod 700 /var/lib/openldap-ldbm
|
Avviare slapd:
Codice 2.7: Avvio di SLAPd |
# /etc/init.d/slapd start
|
Si può fare un test col seguente comando:
Codice 2.8: Testare il demone SLAPd |
# ldapsearch -x -D "cn=Manager,dc=genfic,dc=com" -W
|
Se si riceve un errore, provare ad aggiungere -d 255 per incrementare la
prolissità dell'output e risolvere il problema.
3.
Replicazione
Se occorre l'alta affidabilità
Se il proprio ambiente richiede alta affidabilità, allora occorre allestire la
replicazione dei cambiamenti attraverso sistemi LDAP multipli. La replicazione
di OpenLDAP è, in questa guida, impostata usando un account specifico per questa
operazione (ldapreader) che ha permessi in lettura nel server LDAP
primario e che replica i cambiamenti dal server LDAP primario al secondario.
Dunque questa dunque è una configurazione mirror, che consente a un server LDAP
secondario di agire come se fosse un primario. Grazie alla struttura interna di
LDAP, i cambiamenti non sono applicati più volte se sono già nella struttura
LDAP.
Impostare la replicazione
Per impostare la replicazione, preparare un secondo server LDAP, nello stesso
modo del precedente. Tuttavia si faccia attenzione, nel file di configurazione,
-
il privider syncrepl punta all'altro sistema
-
il serverID di ogni sistema OpenLDAP è differente
Poi, creare l'account di sincronizzazione. Si creerà un file LDIF (il formato
usato per l'immissione di dati nei server LDAP) e si aggiungerà ad ogni server
LDAP:
Codice 3.1: Creare l'accont ldapreader |
~# slappasswd -s myreaderpassword
{SSHA}XvbdAv6rdskp9HgFaFL9YhGkJH3HSkiM
~# cat ldapreader.ldif
dn: cn=ldapreader,dc=genfic,dc=com
userPassword: {SSHA}XvbdAv6rdskp9HgFaFL9YhGkJH3HSkiM
objectClass: organizationalRole
objectClass: simpleSecurityObject
cn: ldapreader
description: LDAP reader used for synchronization
~# ldapadd -x -W -D "cn=Manager,dc=genfic,dc=com" -f ldapreader.ldif
Password:
|
4.
Configurazione del Client
Migrare i dati esistenti in ldap
Configurare OpenLDAP per l'amministrazione centralizzata di elementi comuni
Linux/Unix non è semplice, ma grazie a qualche strumento e script disponibili in
Internet, migrare un sistema amministrato come sistema singolo verso un sistema
basato su OpenLDAP, ad amministrazione centralizzata non è poi così duro.
Andare a http://www.padl.com/OSS/MigrationTools.html
e prelevare gli script. Occorrono gli script MigrationTool e
make_master.sh.
Poi estrarre il Migration Tool e copiare lo script make_master.sh nella
directory dove si è estratto il primo:
Codice 4.1: Estrarre il MigrationTools |
~# mktemp -d
/tmp/tmp.zchomocO3Q
~# cd /tmp/tmp.zchomocO3Q
~# tar xvzf /path/to/MigrationTools.tgz
~# mv /path/to/make_master.sh MigrationTools-47
~# cd MigrationTools-47
|
Il passo successivo e migrare le informazioni del proprio sistema in OpenLDAP.
Lo script make_master.sh farà il lavoro, dopo avergli fornito le
informazioni riguardanti la propria struttura LDAP e il proprio ambiente.
Nel momento in cui è stata scritta questa guida, lo strumento ha richiesto le
seguenti immissioni:
| Input |
Descrizione |
Esempio |
| LDAP BaseDN |
La directory inizale (root) dell'albero |
dc=genfic,dc=com |
| Mail domain |
Il dominio da utilizzare per gli indirizzi email |
genfic.com |
| Mail host |
L'hostname completo di dominio (FQDN) dell'infrastruttura del server di posta |
smtp.genfic.com |
| LDAP Root DN |
Informazioni amministrative della struttura LDAP |
cn=Manager,dc=genfic,dc=com |
| LDAP Root Password |
La password dell'account di amministrazione, vedi sopra il comando
slappasswd
|
|
Lo strumento chiederà anche quali impostazioni degli account si desidera
migrare.
Configurazione di PAM
Il primo passo è di configurare PAM per permettere l'autorizzazione LDAP.
Installare sys-auth/pam_ldap per fornire il supporto dell'autorizzazione
LDAP a PAM e sys-auth/nss_ldap in modo tale che il sistema possa far
fronte ai server LDAP per informazioni aggiuntive (usate da
nsswitch.conf).
Codice 4.2: Installare pam_ldap e nss_ldap |
# emerge pam_ldap nss_ldap
|
Aggiungere le linee seguenti nella posizione corretta in
/etc/pam.d/system-auth
Codice 4.3: /etc/pam.d/system-auth |
auth sufficient pam_ldap.so use_first_pass
account sufficient pam_ldap.so
password sufficient pam_ldap.so use_authtok use_first_pass
session optional pam_ldap.so
#%PAM-1.0
auth required pam_env.so
auth sufficient pam_unix.so try_first_pass likeauth nullok
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account sufficient pam_ldap.so
account required pam_unix.so
password required pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 try_first_pass retry=3
password sufficient pam_unix.so try_first_pass use_authtok nullok md5 shadow
password sufficient pam_ldap.so use_authtok use_first_pass
password required pam_deny.so
session required pam_limits.so
session required pam_unix.so
session optional pam_ldap.so
|
Cambiare /etc/ldap.conf in modo da avere:
Codice 4.4: /etc/ldap.conf |
suffix "dc=genfic,dc=com"
bind_policy soft
bind_timelimit 2
ldap_version 3
nss_base_group ou=Group,dc=genfic,dc=com
nss_base_hosts ou=Hosts,dc=genfic,dc=com
nss_base_passwd ou=People,dc=genfic,dc=com
nss_base_shadow ou=People,dc=genfic,dc=com
pam_filter objectclass=posixAccount
pam_login_attribute uid
pam_member_attribute memberuid
pam_password exop
scope one
timelimit 2
uri ldap://ldap.genfic.com/ ldap://ldap1.genfic.com ldap://ldap2.genfic.com
|
Copiare quindi il file ldap.conf dal server ai client in modo che
siano consapevoli dell'ambiente LDAP:
Codice 4.5: Copiare l'OpenLDAP ldap.conf |
# scp ldap-server:/etc/openldap/ldap.conf /etc/openldap
|
Si configurino infine i propri client in modo che controllino l'LDAP per
recuperare gli account di sistema:
Codice 4.6: /etc/nsswitch.conf |
passwd: files ldap
group: files ldap
shadow: files ldap
|
Se si nota che una delle linee poste nel proprio /etc/ldap.conf era
commentata (la linea rootbinddn), non c'è da preoccuparsi, non ce n'è
bisogno a meno che non si voglia cambiare la password degli utenti come
superuser. In questo caso c'è bisogno di mettere in chiaro la password di root
in /etc/ldap.secret. Questo è PERICOLOSO e si
dovrebbe cambiare l'accesso del file in 600. Quello che si può fare è lasciare
questo file vuoto e quando c'è bisogno di cambiare la password a qualcuno che è
sia in ldap che in /etc/passwd, mettere la password di root nel
file per 10 secondi mentre viene cambiata la password dell'utente e quindi
rimuoverla subito dopo il termine dell'operazione.
5.
Impostazioni di sicurezza per il Server LDAP
Permessi OpenLDAP
Se si dà un'occhiata a /etc/openldap/slapd.conf si può notare che è
possibile specificare le ACL (o permessi) di quali dati gli utenti possono
leggere e/o scrivere:
Codice 5.1: /etc/openldap/slapd.conf |
access to *
by dn="uid=root,ou=People,dc=genfic,dc=com" write
by users read
by anonymous auth
access to attrs=userPassword,gecos,description,loginShell
by self write
|
Questo dà l'accesso a tutto ciò che un utente può modificare. Se questa è
un'informazione proprietaria, se ne ha l'accesso in scrittura; se l'informazione
è di un altro utente, la si può leggere; utenti anonimi devono inviare login e
password per avere l'accesso. Ci sono quattro livelli, partendo dal più basso al
più alto: auth search read write.
La prossima ACL è leggermente più sicura, blocca infatti ad un utente normale la
lettura delle password shadow di altri utenti:
Codice 5.2: /etc/openldap/slapd.conf |
access to attrs="userPassword"
by dn="uid=root,ou=People,dc=genfic,dc=com" write
by dn="uid=John,ou=People,dc=genfic,dc=com" write
by anonymous auth
by self write
by * none
access to *
by dn="uid=root,ou=People,dc=genfic,dc=com" write
by dn="uid=John,ou=People,dc=genfic,dc=com" write
by * search
|
Questo esempio dà a root e John l'accesso in lettura/scrittura/ricerca in tutto
l'albero sotto dc=genfic,dc=com. Questo permette agli utenti di
cambiare le proprie userPassword. Così per come finisce la
dichiarazione del filtro ognuno ha la possibilità di ricercare ma non di leggere
i risultati di tale ricerca. Si possono avere acl multiple ma le regole vengono
processate dal basso verso l'alto, così quelle iniziali dovrebbero essere quelle
più restrittive.
6.
Lavorare con OpenLDAP
Manutenzione delle directory
Si può iniziare ad usare le directory per autenticare gli utenti in
apache/proftpd/qmail/samba. Si possono amministrare con phpldapadmin, diradm,
jxplorer o lat, che forniscono facili interfacce di amministrazione.
7.
Riconoscimenti
Si ringrazia Matt Heler per averci prestato il suo computer per gli scopi di
questa guida. Grazie anche agli amici in #ldap @ irc.freenode.net
I contenuti di questo documento sono rilasciati sotto la licenza Creative
Commons - Attribution / Share Alike.
|