Nelle librerie del C ci sono una serie di funzioni che permettono di ottenere informazioni riguardo l'ambiente locale (password, nomi degli utenti, nomi delle macchine, corripondenze fra numeri di porta e nomi dei servizi). Tradizionalmente le fonti di queste informazioni erano mantenute un una singola modalità ben definita (in genere negli opportuni file di configurazione) ma con l'introduzione di servizi come il DNS e NIS, incominciarono ad essere disponibili modalità alternative per ottenere le stesse informazioni.
Nasceva così il problema di come indicare in maniera pulita dove le varie funzioni di libreria dovessero prendere le informazioni. All'inizio questo veniva fatto introducendo tutta la casistica possibile dentro l'implementazione delle funzioni stesse, con degli ovvi problemi di estendibilità e compatibilità. Per risolvere questo problema è stata introdotta una interfaccia apposita, il Name Service Switch, che permettesse di demandare a delle librerie esterne, configurabili in maniera indipendente, le modalità con cui queste informazioni vengono ottenute.
Il grande vantaggio del Name Service Switch è che diventa possibile definire in maniera modulare ed estendibile sia delle classi di informazioni (cosicché qualora si debba fornire qualche nuovo servizio si ha l'infrastruttura già pronta) che il supporto (file, database o quello che si vuole, come LDAP, per esempio) su cui queste informazioni sono mantenute.
Le modalità di funzionamento del Name Service Switch vengono gestite attraverso il file di configurazione /etc/nsswitch.conf, che specifica come le varie informazioni vengono recuperate; il formato del file prevede una riga per ogni classe di informazione, la prima colonna indica la la classe ed è seguita da :, sono possibili valori come hosts, group, passwd, aliases, protocols (che permettono di sostituire gli analoghi file sotto /etc; per l'elenco completo si veda la pagina di manuale con man nsswitch.conf). Il resto della riga indica la procedura con cui dette informazioni vengono cercate sui vari supporti possibili (i file, un database, NIS, il DNS o LDAP), identificate da parole chiave come files, db, nis, dns e ldap con la possibilità di specificare l'ordine in cui detti supporti verranno esaminati e una eventuale reazione ai risultati della ricerca.
Un estratto del file installato in un sistema base Debian GNU/Linux è il seguente:
# /etc/nsswitch.conf # # Example configuration of GNU Name Service Switch functionality. # If you have the `glibc-doc' and `info' packages installed, try: # `info libc "Name Service Switch"' for information about this file. passwd: compat group: compat shadow: compat hosts: files dns networks: files protocols: db files services: db files ethers: db files rpc: db files netgroup: nis
Con le GNU libc il sistema è completamente modulare in quanto è possibile inserire un nuovo tipo di supporto semplicemente fornendo una libreria dinamica nel /lib/libnss_SERVICE.so.X9, dove SERVICE corrisponde alla parola chiave specificata in /etc/nsswitch.conf; così per utilizzare il supporto di LDAP per il Name Service Switch basterà installare il pacchetto libnss-ldap, che fornisce la libreria dinamica /lib/libnss_ldap.so.2.
Il pacchetto permette di inserire le informazioni relativa ad una qualunque delle classi gestite dal Name Service Switch su LDAP; ad esempio se si vogliono spostare la informazioni di /etc/hosts su LDAP (come vedremo in sez. 5.2) dovremo inserire in /etc/nsswitch.conf una riga del tipo:
hosts: files dns ldap
L'accesso all'elenco è controllato dal file di configurazione /etc/libnss-ldap.conf,10 che ha la stessa sintassi di ldap.conf. Lì cui vanno riportate le informazioni di base; la configurazione automatica di debconf non prevede l'uso di TLS, per cui occorrerà impostarla a mano. Il file installato di default non attiva nessun servizio, e vedremo più avanti come dovrà essere modificato, tutto quello che deve essere fatto in generale è allora indicare in maniera adeguata all'uso di TLS il server da utilizzare.
In sostanza, rispetto alla configurazione base, occorre rimuovere la linea che specifica il server con la direttiva host, ed usare invece la direttiva uri, occorre definire l'utente con il quale ci si vuole autenticare presso il server quando l'utente è root (che di norma è lo stesso specificato in /etc/ldap/ldap.conf), e inserire le solite righe che specificano la locazione del certificato della CA utilizzato per autenticare il server; un esempio di /etc/libnss-ldap.conf è pertanto:
#host ldap.gnulinux.it base dc=gnulinux,dc=it uri ldaps://ldap.gnulinux.it rootbinddn cn=admin,dc=gnulinux,dc=it scope one tls_checkpeer yes tls_cacertfile /etc/ssl/certs/cacert.pem
Come detto occorre commentare la configurazione standard che prevede solo l'indicazione di un host, per settare la comunicazione con il server su TLS/SSL direttamente con la direttiva uri. Deve essere indicata la radice dell'elenco, con la direttiva base, e l'utente a cui devono essere collegate le interrogazioni fatte da root, con la direttiva rootbinddn. La direttiva scope definisce l'ambito della ricerca, il valore one indica che questa va effettuata su un solo dalla base dell'elenco; valori alternativi possono essere base, che parte sempre sub che effettua la ricerca su tutti i livelli successivi. Infine va richiesto il controllo dell'identità del server fornendo la locazione del certificato della CA con cui il controllo deve essere effettuato.