Progetto

Generale

Profilo

ApacheAuthAD » Cronologia » Versione 16

Simone Piccardi, 21-05-2024 12:45

1 14 Simone Piccardi
h1. Autenticazione HTTP su Active Directory con Apache
2 1 Christopher R. Gabriel
3 14 Simone Piccardi
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.
4 1 Christopher R. Gabriel
5 14 Simone Piccardi
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:
6 11 Simone Piccardi
7 1 Christopher R. Gabriel
<pre>
8
a2enmod ldap 
9
a2enmod authnz_ldap
10
</pre>
11 10 Simone Piccardi
12 14 Simone Piccardi
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.
13 1 Christopher R. Gabriel
14 14 Simone Piccardi
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:
15 11 Simone Piccardi
16 10 Simone Piccardi
<pre>
17 14 Simone Piccardi
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:
18 11 Simone Piccardi
result: 0 Success
19 8 Amministratore Truelite
</pre>
20 1 Christopher R. Gabriel
21 14 Simone Piccardi
dove il prefisso @LDAPTLS_REQCERT=never@ è necessario per disabilitare la verifica del certificato SSL del server AD, che come detto non risulterà valido,  @CN=apacheauth,CN=Users,DC=example,DC=com@ è la forma standard del _distinguished name_ che corrisponde all'utente @apacheauth@.  
22 11 Simone Piccardi
23 14 Simone Piccardi
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@):
24 11 Simone Piccardi
25 1 Christopher R. Gabriel
<pre>
26
# do not verify server certificate, for AD is invalid
27
LDAPVerifyServerCert Off
28 14 Simone Piccardi
29 4 Amministratore Truelite
# if you have installed in /etc/ssl/certs/ad-server-cert.pem the AD server certificate 
30 14 Simone Piccardi
# (you can get it with: openssl s_client -connect IND.IP.AD.SERV:636| openssl x509 > ad-server-cert.pem)
31 1 Christopher R. Gabriel
# you can comment the previous directive and uncomment the next one
32 11 Simone Piccardi
# LDAPTrustedGlobalCert CA_BASE64 /etc/ssl/certs/ad-server-cert.pem
33
</pre>
34 1 Christopher R. Gabriel
35 14 Simone Piccardi
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@. 
36 1 Christopher R. Gabriel
37 14 Simone Piccardi
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:
38
39 1 Christopher R. Gabriel
<pre>
40
    AuthType Basic
41
    AuthBasicProvider ldap		
42
    AuthName "AD domain user"
43 14 Simone Piccardi
    AuthLDAPURL "ldaps://IND.IP.AD.SERV/cn=Users,dc=example,dc=com?sAMAccountName?sub?(objectClass=*)"
44
    AuthLDAPBindDN "cn=apacheauth,cn=Users,dc=example,dc=com"
45 1 Christopher R. Gabriel
    AuthLDAPBindPassword apachepwd
46
    AuthzLDAPAuthoritative on
47
    Require valid-user
48 14 Simone Piccardi
</pre>
49
50
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@. 
51
52 16 Simone Piccardi
In questo caso le istruzioni, con la direttiva @Require valid-user@ vincolano l'accesso ad una  autenticazione con un qualunque utente valido, 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"@.
53 1 Christopher R. Gabriel
54 16 Simone Piccardi
Infine è possibile però anche essere più 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:
55 14 Simone Piccardi
56
<pre>
57
    AuthType Basic
58
    AuthBasicProvider ldap		
59
    AuthName "AD domain user"
60
    AuthLDAPURL "ldaps://IND.IP.AD.SERV/cn=Users,dc=example,dc=com?sAMAccountName?sub?(objectClass=*)"
61
    AuthLDAPBindDN "cn=apacheauth,cn=Users,dc=example,dc=com"
62
    AuthLDAPBindPassword apachepwd
63
    AuthzLDAPAuthoritative on
64
    # parameters for group authentication
65
    AuthLDAPGroupAttribute member
66 1 Christopher R. Gabriel
    AuthLDAPGroupAttributeIsDN On
67 14 Simone Piccardi
    # you need to identify group by its distinguished name
68 16 Simone Piccardi
    Require ldap-group cn=website,cn=Users,dc=example,dc=com
69 9 Simone Piccardi
</pre>
70 15 Simone Piccardi
71
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_.