Progetto

Generale

Profilo

ApacheAuthAD » Cronologia » Versione 19

Simone Piccardi, 19-06-2024 12:52

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