Gentoo Guide all'autenticazione OpenLDAP

Contenuti:

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         (Organisation)
          /      \
ou:   people   servers    (Organisational Units)
      /    \     ..     
uid: ..   jhon            (OU-specific data)

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

# Includere i data schemes necessari
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/nis.schema

# Usare md5 per fare l'hash delle password
password-hash {md5}

# Definire le proprietà SSL e TLS  (opzionale)
TLSCertificateFile /etc/ssl/ldap.pem
TLSCertificateKeyFile /etc/openldap/ssl/ldap.pem
TLSCACertificateFile /etc/ssl/ldap.pem

Più avanti nel file...

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


Si può avere una password cryptata come quella sopra, con slappasswd -h {Md5}

Editare il file di configurazione di LDAP:

Esempio 4: /etc/openldap/ldap.conf

# nano -w /etc/openldap/ldap.conf
Aggiungere...

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;
# Commentate queste linee a meno che non abbiate un mail sheme caricato
#$DEFAULT_MAIL_DOMAIN = "genfic.com";
#$DEFAULT_MAIL_HOST = "mail.genfic.com";

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

#host 127.0.0.1
#base dc=padl,dc=com

ssl start_tls
ssl on
suffix          "dc=genfic,dc=com"
#rootbinddn uid=root,ou=People,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

  	 (Sostituire a ldap-server il nome del proprio LDAP )
  	 # 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

Si dovrebbero ricevere due righe di risposta:
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



Ultimo aggiorn.:
10 Giugno 2005
Benjamin Coles
Autore

Sven Vermeulen
Revisore

Brandon Hale
Revisore

Benny Chuang
Revisore

Enrico Morelli
Traduttore

Team Italiano
Traduttore

Sommario:  Questa guida introduce le basi di LDAP e mostra come configurare OpenLDAP allo scopo di autenticare un gruppo di computer Gentoo.
- 2002 Gentoo.it - Domande, commenti e/o correzioni? Email gentoo-dev@gentoo.it.