OpenLDAP e Microsoft Active Directory
Da Security e-Book.
Spesso e' facile integrare le macchine unix modificando la struttura di Microsoft Active Directory usando SFU[1] o le relative estensioni che sono disponibili a partire da Windows 2003 R2 e successive. Nelle grosse realta' enterprises non sempre e' possibile questa integrazione, piu' per problemi organizzativi che tecnici, perche' le persone che si occupano dell'amministrazione di ambienti Windows non sono le stesse che gestiscono gli ambienti Unix/Linux. Inoltre spesso prodotti commerciali hanno bisogno di installare dei plugin per poter intercettare il cambio della password da parte di un utente, in quanto Active Directory usa un hash proprietario.
Come fare quindi per gestire in un unico punto le password anche per gli ambienti Unix/Linux? E' possibile, tramite un apposito disegno architetturale, fare in modo che un LDAP adatto ad ambienti open, quale ad esempio OpenLDAP[2], si integri con Active Directory per gestire la base utenti.
Indice |
L'architettura
Sono stati provati numerosi prodotti, come ad esempio meta directory che fossero in grado di correlare in tempo reale informazioni da Active Directory e da altre fonti dati, quali ad esempio databases. Queste soluzioni si sono rivelate troppo pesanti e complesse per l'utilizzo normale o alcune volte troppo instabili.
La soluzione adottata e' stata quindi di usare un LDAP open source (OpenLDAP): che conterra' le informazioni aggiuntive degli utenti (es: UID, GID, ecc..) e che utilizzera' una chain authentication. OpenLDAP, infatti, permette di utilizzare per autenticare un utente il meccanismo della libreria SASL, quindi permettendo autenticazioni quale ad esempio PAM e GSSAPI. Sfruttando quindi le PAM, potremmo "agganciare" Active Directory e autenticare l'utente con la password di dominio. Anche se e' possibile collegarsi ad Active Directory utilizzando direttamente Kerberos tramite GSSAPI, si e' scelto di utilizzare le PAM per permettere un'autenticazione flessibile: usando le PAM potremmo sfruttare ulteriori meccanismi per autenticare l'utente come ad esempio un sistema di One Time Password (OTP).
In Figura 1 e' rappresentata la visione di insieme dello schema architetturale utilizzato. Il server, che chiameremo Proxy LDAP, verra' interrogato da clients LDAP quali ad esempio workstation Unix e sistemi server Unix, in particolare la soluzione e' stata provata con Linux e Solaris. Il proxy server prendera' in carico la richiesta, interfacciandosi con i server di autenticazione ovvero i Domain Controllers di Windows e il radius server che gestisce i token OTP.
La Figura 2 va nel dettaglio del Proxy LDAP ed e' diviso in tre macro aree funzionali: il server LDAP, il provisioning e la sincronizzazione con Active Directory.
Il server LDAP e' la parte principale del sistema e provvede a gestire le queries LDAP provenienti dai client. Il sistema e' basato su OpenLDAP ed e' organizzato come un LDAP standard. OpenLDAP permette di agganciare un meccanismo di sicurezza esterno tramite l'utilizzo delle librerie SASL[3]. SASL permette di agganciare differenti schemi di autenticazione tramite il SASL Authentication server (saslauthd): sfruttando questa potenzialita', e' possibile utilizzare come meccanismo di autenticazione le librerie PAM[4]. In questo modo siamo liberi di scegliere il meccanismo di autenticazione del sistema operativo piu' opportuno: utilizzeremo quindi winbind per verificare l'autenticazione dell'utente con Active Directory ed eventualmente il modulo pam_radius per l'autenticazione con il server OTP.
La sincronizzazione con Active Directory avviene attraverso uno programma chiamato adimport. Questo programma prende informazioni dal Domain Controller relative all'utente, attraverso una interfaccia a riga di comando, e le inserisce nel server LDAP utilizzando un Directory Information Tree (DIT) standard.
Il provisioning e' l'ultimo componente del sistema Proxy LDAP e consiste in un'interfaccia web-based per la gestione delle utenze e dei gruppi LDAP. Il provisioning e' stato realizzanto a partire dal programma GOsa², opportunamente configurato in modo che solo le utenze e i gruppi unix possano essere modificati e che l'utente o l'amministratore non possa cambiare la password, in quanto la password e' effettivamente indicata in Active Directory.
[figure 1- LDAP chain] The OpenLDAP can use external authentication through the SASL authentication server (saslauthd). The authentication server supports different authentication mechanisms such as ldap, kerberos, shadown and PAM. The PAM libraries can be configured for authenticate to different systems, such as winbind, radius, ... Although Active Directory can be directly linked with SASL through Kerberos, I've decided to use the PAM mechanism, so that the end-user can be free to choose different schemas. In the customer case, it was implemented though winbind, leaving the choice open for integrating OTP tokens through PAM radius.
[figure 2 – authentication overview]
The result is a chain authentication: 1.The client ask the LDAP server 2.The user record in the LDAP has lookup information for SASL 3.SASL authentication server asks PAM libraries for authentication information 4.PAM invoke winbind server 5.The user is checked against Active Directory
Finding the User ID Sync/Import from Active Directory Web interface
Il server LDAP
Configurazione di Samba
Configurare il sistema per agganciare i Domain Controllers tramite Samba. E' importante sottolineare il tipo di idmap backend rid, che consente di generare gli UID/GID degli utenti a partire dal SID di Windows. Attraverso un algoritmo, due winbind indipendenti saranno capaci di generare lo stesso UID e GID. Questo ci servira' per la fasa di importazione.
[global] workgroup = AZIENDA realm = AZIENDA.LAN netbios name = PROXYLDAP server string = proxyldap security = ads password server = * domain master = No dns proxy = No template homedir = /tmp template shell = /bin/bash client schannel = Auto server schannel = Auto client signing = Auto server signing = Auto client use spnego = No socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 use kerberos keytab = true winbind enum users = Yes winbind enum groups = Yes winbind use default domain = Yes winbind separator = / allow trusted domains = no idmap uid = 20000-100000 idmap gid = 20000-100000 idmap backend = rid local master = No
Faremo quindi la join al dominio con il seguente comando:
net ads join -U Administrator
SASL
Modifichiamo il file /etc/sysconfig/saslauthd, cambiando il parametro MECH come segue:
MECH=pam
In questo modo agganciamo le librerie PAM dal server saslauthd. Creiamo il file /usr/lib/sasl2/slapd.conf in modo tale che il server OpenLDAP usi come password check mechanism il server saslauthd. Il file deve contenere quanto segue:
pwcheck_method: saslauthd
PAM
Creiamo il file /etc/pam.d/ldap che verra' utilizzato dal daemon slapd di OpenLDAP per verificare la password degli utenti. Noterete il modulo winbind (pam_winbind.so) e il modulo RADIUS (pam_radius_auth.so)
auth required pam_env.so auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 500 quiet auth sufficient pam_winbind.so use_first_pass auth sufficient pam_radius_auth.so use_first_pass auth required pam_deny.so account required pam_unix.so broken_shadow account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 500 quiet account [default=bad success=ok user_unknown=ignore] pam_winbind.so account required pam_permit.so password requisite pam_cracklib.so try_first_pass retry=3 password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok password sufficient pam_winbind.so use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so
OpenLDAP
# comment dn: dc=azienda,dc=lan dc: azienda description: Azienda Spa objectClass: dcObject objectClass: organization o: namchi.com dn: ou=users,dc=azienda,dc=lan ou: users objectClass: organizationalUnit dn: ou=groups,dc=azienda,dc=lan ou: groups description: Group List objectClass: top objectClass: organizationalUnit
Importazione da Active Directory
Provisioning
Architettura di produzione
In produzione (Figura 3) si e' raddoppiato il sistema proxy, inserendo uno slave LDAP in un sito geograficamente differente. La replica ha solamente la funzionalita' di server LDAP, con un aggancio ad Active Directory e all'OTP server per l'autenticazione.
Note
- ↑ Windows Services for UNIX
- ↑ OpenLDAP e' un popolare LDAP server OpenSource
- ↑ SASL e' un acronimo di Simple Authentication and Security Layer
- ↑ PAM e' un acronimo per Pluggable Authentication Modules