Gentoo Guide all'autenticazione OpenLDAP
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 centra 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, X.500 è stato trovato 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 gerarchicamente. 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:
Esempio 1: Struttura organizzativa di GenFic, una compagnia finta di Gentoo |
dc: com
|
dc: genfic
/ \
ou: people servers
/ \ ..
uid: .. jhon
|
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 naming scheme.
Molte distribuzioni LDAP (incluso OpenLDAP) contengono già
un certo numero di schemi predefiniti (generalmente approvati),
come inetorgperson, uno schema frequentemente usato
per definire utenti.
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 tutti i componenti necessari
sul proprio server:
Esempio 2: Installazione di OpenLDAP |
# emerge openldap pam_ldap nss_ldap migrationtools
# chown ldap:ldap /var/lib/openldap-ldbm /var/lib/openldap-data /var/lib/openldap-slurp
|
Editare /etc/openldap/slapd.conf e aggiungere
ciò che segue a destra di core.schema:
Esempio 3: /etc/openldap/slapd.conf |
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
password-hash {md5}
TLSCertificateFile /etc/ssl/ldap.pem
TLSCertificateKeyFile /etc/openldap/ssl/ldap.pem
TLSCACertificateFile /etc/ssl/ldap.pem
database ldbm
suffix "dc=genfic,dc=com"
rootdn "cn=Manager,dc=genfic,dc=com"
rootpw {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
directory /var/lib/openldap-ldbm
index objectClass eq
|
Editare il file di configurazione di LDAP:
Esempio 4: /etc/openldap/ldap.conf |
# nano -w /etc/openldap/ldap.conf
BASE dc=genfic, dc=com
URI ldaps://auth.genfic.com:636/
TLS_REQCERT allow
|
Si generi ora un certificato SSL per rendere
sicura la directory. Occorre rispondere alle domande che si ricevono
nel miglior modo possibile. Alla richiesta del Common Name, si inserisca
il nome che i client useranno quando contatteranno il server.
Di solito è il domainname completo del server (p.e. auth.genfic.com).
Esempio 5: Generazione di un certificato SSL |
# cd /etc/ssl
# openssl req -config /etc/ssl/openssl.cnf -new -x509 -nodes -out \
ldap.pem -keyout /etc/openldap/ssl/ldap.pem -days 999999
|
Editare ora /etc/conf.d/slapd e aggiungere ciò che
segue, scommentando le linee esistenti:
Esempio 6: /etc/conf.d/slapd |
OPTS="-h 'ldaps:// ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock'"
|
Far partire slapd:
Esempio 7: Avvio di SLAPd |
# /etc/init.d/slapd start
|
Si può fare un test col seguente comando:
Esempio 8: Testare il demone SLAPd |
# ldapsearch -D "cn=Manager,dc=genfic,dc=com" -W
|
Se si riceve un errore, provare ad aggiungere -d 255
per incermentare la verbosità e risolvere il problema.
3.Migrare dati esistenti
Migrare account utente
Si migreranno ora gli account utente. Aprire
/usr/share/migrationtools/migrate_common.ph
ed editare ciò che segue:
Esempio 9: /usr/share/migrationtools/migrate_common.ph |
$DEFAULT_BASE = "dc=genfic,dc=com";
$EXTENDED_SCHEMA = 1;
|
Eseguire quindi gli script per la migrazione:
Esempio 10: Esecuzione dei migration script |
# export ETC_SHADOW=/etc/shadow
# cd /usr/share/migrationtools
# ./migrate_base.pl > /tmp/base.ldif
# ./migrate_group.pl /etc/group /tmp/group.ldif
# ./migrate_hosts.pl /etc/hosts /tmp/hosts.ldif
# ./migrate_passwd.pl /etc/passwd /tmp/passwd.ldif
|
Questi ultimi passi migrano i file specificati nei file ldif
letti da LDAP. Aggiungere quindi i file alla directory:
Esempio 11: Importare i dati nella directory |
# ldapadd -D "cn=Manager,dc=gentoo,dc=org" -W -f /tmp/base.ldif
# ldapadd -D "cn=Manager,dc=gentoo,dc=org" -W -f /tmp/group.ldif
# ldapadd -D "cn=Manager,dc=gentoo,dc=org" -W -f /tmp/passwd.ldif
# ldapadd -D "cn=Manager,dc=gentoo,dc=org" -W -f /tmp/hosts.ldif
|
Se si raggiunge un errore nei file ldif, si può riprendere da dove
si è terminato usando ldapadd -c.
4.Configurazione del client
Configurazione di PAM
Il primo passo è di configurare PAM per permettere l'autorizzazione
LDAP. Installare
net-libs/pam_ldap per fornire il supporto dell'autorizzazione
LDAP a PAM e
net-libs/nss_ldap in modo tale che il sistema
possa far fronte ai server LDAP per informazioni aggiuntive
(usate da nsswitch.conf).
Esempio 12: Installare pam_ldap e nss_ldap |
# emerge pam_ldap nss_ldap
|
Editare /etc/pam.d/system-auth in modo tale che assomigli a quello che segue:
Esempio 13: /etc/pam.d/system-auth |
auth required /lib/security/pam_env.so
auth sufficient /lib/security/pam_unix.so likeauth nullok shadow
auth sufficient /lib/security/pam_ldap.so use_first_pass
auth required /lib/security/pam_deny.so
account sufficient /lib/security/pam_unix.so
account sufficient /lib/security/pam_ldap.so
password required /lib/security/pam_cracklib.so retry=3
password sufficient /lib/security/pam_unix.so nullok use_authtok shadow md5
password sufficient /lib/security/pam_ldap.so use_authtok
password required /lib/security/pam_deny.so
session required /lib/security/pam_limits.so
session required /lib/security/pam_unix.so
session required /lib/security/pam_mkhomedir.so skel=/etc/skel/ umask=0
session optional /lib/security/pam_ldap.so
|
Cambiare /etc/ldap.conf in modo da avere:
Esempio 14: /etc/ldap.conf |
ssl start_tls
ssl on
suffix "dc=genfic,dc=com"
uri ldaps://auth.genfic.com/
pam_password exop
ldap_version 3
pam_filter objectclass=posixAccount
pam_login_attribute uid
pam_member_attribute memberuid
nss_base_passwd ou=People,dc=genfic,dc=com
nss_base_shadow ou=People,dc=genfic,dc=com
nss_base_group ou=Group,dc=genfic,dc=com
nss_base_hosts ou=Hosts,dc=genfic,dc=com
scope one
|
Copiare quindi il file ldap.conf dal server ai client in modo che siano consapevoli dell'ambiente LDAP:
Esempio 15: Copiare l'OpenLDAP ldap.conf |
# scp ldap-server:/etc/openldap/ldap.conf /etc/openldap
|
Si configurino infine i propri client in modo che
controllino il LDAP per gli account di sistema:
Esempio 16: /etc/nsswitch.conf |
passwd: files ldap
group: files ldap
shadow: files ldap
|
Per testare le modifiche, digitare:
Esempio 17: Test LDAP Auth |
# getent passwd|grep 0:0
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
|
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 faccio io è di lasciare questo
file in bianco e quando ho bisogno di cambiare la password
a qualcuno che è sia in ldap che in /etc/passwd,
metto la password di root nel file suddetto per 10 secondi mentre
cambio la password dell'utente e quindi la rimuovo subito
dopo che ho terminato.
5.Configurazioni per LDAP Server Security
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:
Esempio 18: /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
|
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:
Esempio 19: /etc/openldap/slapd.conf |
access to dn=".*,dc=genfic,dc=com" attr="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 * search
access to *
by dn="uid=root,ou=People,dc=genfic,dc=com" write
by * read
|
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 Webmin,
che provvede un'interfaccia veramente facile. Si può anche
usare gq o directory_administrator.
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
|