Project

General

Profile

Actions

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. Si tenga presente che il meccanismo di autenticazione HTTP avviene a livello del protocollo e prevede il passaggio delle credenziali in chiaro, pertanto deve essere sempre utilizzato previa impostazione dell’uso dello stesso all’interno di un collegamento in https (una impostazione di questo tipo è stata trattata in UsareLetsEncrypt).

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:

a2enmod ldap 
a2enmod authnz_ldap

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), 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:

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

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):

# 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

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:

    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

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, vincolano l'accesso ad una autenticazione con un qualunque utente valido, si 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 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:

    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

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.

Updated by Simone Piccardi 6 months ago · 19 revisions