Configurazione di Linux con Kerberos e LDAP

linuxPer configurare il client Linux al fine di autenticare e assegnare i profili all’utente si è agito sul Pluggable Authentication Module (PAM) e sul Name Service Switch (NSS). Come accennato precedentemente, il laboratorio è stato effettuato con un client Linux, ma è possibile effettuare la stessa configurazione anche su tutti quei sistemi Unix che dispongono di entrambi i sottosistemi.

Il sottosistema PAM si occupa di autenticare/autorizzare l’utente, ad esempio con la password, limitandolo, ad esempio, a determinati orari o terminali, mentre NSS permette di reperire le informazioni necessarie all’utente ed al sistema, come ad esempio gli attributi utenti e gli host. Sia Linux che altri ambienti Unix necessitano però delle estensioni necessarie al fine di usare PAM e NSS con Kerberos e LDAP: nel nostro caso useremo il modulo Kerberos per PAM e il modulo LDAP per NSS. Si poteva scegliere di usare un modulo LDAP per PAM per autenticare l’utente: il risultato di autenticazione si sarebbe ottenuto in entrambi i casi (forse con meno sforzo), ma non rientrerebbe nello scopo del laboratorio. Il modulo PAM Kerberos, al contrario di LDAP, permette di ottenere un TGT che consentirà successivamente di non immettere ulteriori utenze e password.

Tutte le distribuzioni Linux e molti vendor Unix includono tra i loro pacchetti i moduli Kerberos e LDAP per PAM e NSS, in Debian rispettivamente libpam-krb5 e libnss-ldap. Nel caso si desiderasse, è possibile scaricare i sorgenti dal sito http://www.padl.com/ (modulo PAM e NSS per LDAP) e http://pam-krb5.sourceforge.net/ (modulo PAM).

I file di configurazione del PAM si trovano generalmente in /etc/pam.d; ognuno si riferisce ad un determinato servizio (ad esempio il file ssh si riferisce all’omonimo servizio e contiene la metodologia di autenticazione). Alcune distribuzioni, come ad esempio RedHat, usano il modulo pam_stack per accentrare la configurazione dei vari servizi in un singolo file. Per praticità si descrive un file di configurazione completo, che contiene sia l’autenticazione che l’accounting e il cambio della password.

Questo file può essere usato come template per tutti i servizi (ad esempio creando dei symlink):

auth        sufficient    /lib/security/pam_krb5.so forwardable
auth        sufficient    /lib/security/pam_unix.so use_first_pass likeauth nullok md5 shadow
auth        required      /lib/security/pam_deny.so
account     sufficient    /lib/security/pam_unix.so
account     required      /lib/security/pam_deny.so
password    required      /lib/security/pam_cracklib.so retry=3
password    sufficient    /lib/security/pam_krb5.so use_authok
password    sufficient    /lib/security/pam_unix.so use_first_pass nullok use_authtok md5 shadow
password    required      /lib/security/pam_deny.so
session     required      /lib/security/pam_limits.so
session     sufficient    /lib/security/pam_krb5.so forwardable
session     required      /lib/security/pam_unix.so

Si copi questo file (o si creino i relativi symlink) almeno sui file login e passwd per permettere il login al prompt e il cambio della password. Prima di procedere con la configurazione del Name Service Switch, è necessario modificare i parametri di default relativi ad LDAP. Generalmente il file di configurazione è /etc/ldap.conf, ma su Debian il file dei parametri per il plugin LDAP di NSS è /etc/libnss-ldap.conf. Vediamo come andrebbe configurato per il nostro esempio:

# See ldap.conf(5) for details
# This file should be world readable but not world writable.

base dc=azienda,dc=it
uri ldaps://ldap.azienda.it
timelimit 10
bind_timelimit 2
scope sub
nss_base_passwd         ou=People,dc=azienda,dc=it?one
nss_base_shadow         ou=People,dc=azienda,dc=it?one
nss_base_group          ou=Group,dc=azienda,dc=it?one

A questo punto è possibile modificare la configurazione di NSS, ovvero /etc/nsswitch.conf, inserendo i riferimenti a LDAP.

# 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:         files ldap
group:          files ldap 
shadow:         files 

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

Come test, da root, potremmo ad esempio provare a cercare l’utente mrossi definito in LDAP:

# id mrossi
uid=500(mrossi) gid=100(users) groups=100(users)

Il risultato, e i gruppi di appartenenza, viene estrapolato dal server LDAP. Creiamo, a titolo di esempio, una home directory per l’utente. In un ambiente complesso si consiglia di usare NFS con l’automount o anche il mouting della home directory Windows/Samba attraverso un apposito modulo PAM chiamato pam_mount.

# mkdir /home/mrossi
# chown mrossi:users /home/mrossi

Prima di provare il logon, sul server zeus, creiamo il principal corrispondente all’utente mrossi, in modo da verificare username e password, ed un principal relativo alla workstation kirk, che servirà alla workstation per validare il ticket dell’utente con il KDC:

# kadmin.local -q “addprinc -pw miapassword3 mrossi@AZIENDA.IT”
# kadmin.local -q “addprinc -pw miapassword4 host/kirk.azienda.it@AZIENDA.IT”
# kadmin.local -q “ktadd -k /tmp/kirk.key host/kirk.azienda.it@AZIENDA.IT”

L’ultimo comando crea un file /tmp/kirk.key contenente la chiave Kerberos corrispondente alla workstation Linux: è necessario trasferire in modo sicuro (ad esempio tramite ssh) la chiave da zeus a kirk e copiare la stessa sul file /etc/krb5.keytab. A questo punto siamo pronti per provare il log-in con l’utente mrossi. In un nuovo virtual terminal del client Linux, digitiamo la username e la password corrispondente. Se tutto funziona correttamente, ci troveremo collegati al sistema con una shell ed inoltre avremo a disposizione un TGT con cui poterci collegare ad altre macchine, o meglio ad altri servizi. Vediamo il nostro TGT con l’utility klist:

$ klist
Ticket cache: FILE:/tmp/krb5cc_500
Default principal: mrossi@AZIENDA.IT

Valid starting     Expires            Service principal
03/10/04 18:13:40  03/11/04 04:13:07  krbtgt/AZIENDA.IT@AZIENDA.IT

Kerberos 4 ticket cache: /tmp/tkt500
klist: You have no tickets cached