Progetto

Generale

Profilo

ApacheAuthAD » Cronologia » Versione 18

Versione 17 (Simone Piccardi, 21-05-2024 13:04) → Versione 18/19 (Simone Piccardi, 21-05-2024 13:09)

h1. Autenticazione HTTP su Active Directory con Apache 

 Il server web Apache fornisce diverse modalità che consentono di gestire un accesso autenticato a delle pagine web riservate. Il meccanismo dell'autenticazione HTTP è infatti previsto dal protocollo, in genere questa viene gestita nella forma più semplice di un file @.htpasswd@ in cui viene salvato un elenco di utenti con relativa password. Vedremo in questo articolo come, con il web server Apache,    la si possa realizzare appoggiandosi ad un server Active Directory, in modo da poter utilizzare gli utenti già presenti in un dominio Windows.    In realtà in questo caso si tratta di usare il supporto generico di Apache per l'autenticazione su LDAP, usando questo protocollo per collegarsi ad Active Directory. Le istruzioni seguenti sono relative ad un sistema basato su Debian, i concetti restano gli stessi per tutte le distribuzioni, così come i comandi e le direttive di configurazione, ma i file di configurazione coinvolti potranno essere diversi. 

 Nel caso di Debian i moduli di Apache necessari all'autenticazione su LDAP sono installati insieme al server, ma non sono abilitati di default, pertanto per poterli utilizzare andranno abilitati eseguendo i comandi: 

 <pre> 
 a2enmod ldap  
 a2enmod authnz_ldap 
 </pre> 

 Rispetto all'autenticazione HTTP con un server LDAP ordinario (per una trattazione dettagliata si rimanda al capitolo 3.2.1 del testo "Integrazione sistemistica con LDAP":https://www.truelite.it/Integrazione-Sistemistica-con-LDAP/), quella fatta su Active Directory comporta alcune difficoltà aggiuntive.    Con AD infatti non sono possibili interrogazioni anonime, ed occorrerà pertanto disporre di un utente per poter effettuare l'accesso preliminare che serve ad ottenere dal nome utente inserito nel browser il _distinguished name_ ad essi corrispondente con cui eseguire l'autenticazione su LDAP. Inoltre, per ovvi motivi di sicurezza, per effettuare un accesso autenticato su AD è necessario usare una connessione cifrata con TLS/SSL, ma il certificato di un server AD non ha praticamente mai una firma valida, essendo generato internamente, per cui di default il client rifiuterà la connessione. 

 Il primo passo per la configurazione è verificare la raggiungibilità ed il corretto funzionamento della connessione ad Active Directory con LDAP con l'utente che useremo per le interrogazioni preliminari, a partire dall'utilizzo del corretto _distinguished name_ dello stesso. Assumendo che il dominio servito dal server AD sia @example.com@ e che l'utente per il collegamento sia @apacheauth@ (non è necessario che abbia nessun privilegio, per cui è opportuno usare un utente dedicato senza nessun permesso specifico) potremo usare per la verifica della connessione il comando @ldapsearch@ (installabile su Debian con il pacchetto @ldap-utils@), con qualcosa del tipo: 

 <pre> 
 root@server~: LDAPTLS_REQCERT=never ldapsearch -x -H ldaps://IND.IP.AD.SERV -D "cn=apacheauth,cn=Users,dc=example,dc=com" -b "dc=example,dc=com" -w apachepwd '(sAMAccountName=apacheauth)' | grep result: 
 result: 0 Success 
 </pre> 

 dove il prefisso @LDAPTLS_REQCERT=never@ è necessario per disabilitare la verifica del certificato SSL del server AD, che come detto non risulterà valido, mentre @CN=apacheauth,CN=Users,DC=example,DC=com@ è la forma standard del _distinguished name_ che corrisponde all'utente @apacheauth@.   

 Una volta verificato che l'accesso LDAP al server AD sta funzionando, si potrà passare alla configurazione di Apache, questa in genere andrà divisa in due parti, la prima per la configurazione generale delle interrogazioni LDAP, che si può fare con il seguente frammento (da inserire ad esempio in @/etc/apache2/conf-available/ad-ldap.conf@ ed abilitare con @a2enconf ad-ldap@): 

 <pre> 
 # do not verify server certificate, for AD is invalid 
 LDAPVerifyServerCert Off 

 # if you have installed in /etc/ssl/certs/ad-server-cert.pem the AD server certificate  
 # (you can get it with: openssl s_client -connect IND.IP.AD.SERV:636| openssl x509 > ad-server-cert.pem) 
 # you can comment the previous directive and uncomment the next one 
 # LDAPTrustedGlobalCert CA_BASE64 /etc/ssl/certs/ad-server-cert.pem 
 </pre> 

 dove si indica ad Apache di non verificare il certificato del server AD con @LDAPVerifyServerCert@, o, alternativamente, ottenuto il certificato dello stesso come indicato nel commento, lo si imposta forzatamente come come fidato con @LDAPTrustedGlobalCert@.  

 A questo punto le direttive da includere in un virtual host, all'interno delle direttive @Directory@ o @Location@ che selezionano le pagine su cui si vuole impostare un accesso autenticato con gli utenti del server AD, sono le seguenti: 

 <pre> 
     AuthType Basic 
     AuthBasicProvider ldap 		
     AuthName "AD domain user" 
     AuthLDAPURL "ldaps://IND.IP.AD.SERV/cn=Users,dc=example,dc=com?sAMAccountName?sub?(objectClass=*)" 
     AuthLDAPBindDN "cn=apacheauth,cn=Users,dc=example,dc=com" 
     AuthLDAPBindPassword apachepwd 
     AuthzLDAPAuthoritative on 
     Require valid-user 
 </pre> 

 dove in sostanza @AuthLDAPBindDN@ indica il _distinguished name_ dell'utente di servizio che abbiamo verificato (e @AuthLDAPBindPassword@ la sua password) mentre @AuthLDAPURL@ indica la URL da usare con il protocollo LDAP per eseguire la ricerca dell'username fornito dal browser, che deve essere fatta sui valori dell'attributo @sAMAccountName@.  

 In questo caso le istruzioni, con la direttiva @Require valid-user@, valid-user@ vincolano l'accesso ad una    autenticazione con un qualunque utente valido, si su può indicare una restrizione più precisa ad uno specifico utente sostituendo questa riga con @Require ldap-user "someuser"@, indicandolo per nome (con cui verrà cercato su @AuthLDAPURL@) o più specificatamente indicandolo per _distinguished name_ con    @Require ldap-dn "cn=someuser,cn=Users,dc=example,dc=com"@. 

 Infine è possibile però anche essere più selettivi restrittivi ed utilizzare un gruppo di utenti, di nuovo ottenibile da Active Directory, in tal caso occorrerà dire ad Apache come verificare l'appartenenza di un utente ad un gruppo, e le precedenti direttive andranno modificate in: 

 <pre> 
     AuthType Basic 
     AuthBasicProvider ldap 		
     AuthName "AD domain user" 
     AuthLDAPURL "ldaps://IND.IP.AD.SERV/cn=Users,dc=example,dc=com?sAMAccountName?sub?(objectClass=*)" 
     AuthLDAPBindDN "cn=apacheauth,cn=Users,dc=example,dc=com" 
     AuthLDAPBindPassword apachepwd 
     AuthzLDAPAuthoritative on 
     # parameters for group authentication 
     AuthLDAPGroupAttribute member 
     AuthLDAPGroupAttributeIsDN On 
     # you need to identify group by its distinguished name 
     Require ldap-group cn=website,cn=Users,dc=example,dc=com 
 </pre> 

 dove si presume che gli utenti autorizzati all'accesso siano quelli del gruppo @website@ di Active Directory, da indicare di nuovo con il suo _distinguished name_.