Squid 2.5 introduce la possibilità di estendere gli elementi che compongono le ACL con una nuova classe di ACL denominata external, tale classe si basa sul risultato di un helper esterno che agisce in modo similare al sistema di autenticazione.
Questa nuova funzionalità rende agevole, ad esempio, l'implemetazione di meccanismi di controllo relativo alla appartenenza di un utente a determinati gruppi, oppure esegue dei controlli più complessi tra i quali citiamo la corrispondenza tra un utente ed un indirizzo IP prefissato.
Al momento gli helper disponibili sono ancora pochi e sono esclusivamente dedicati al controllo di accesso a livello utente. La scelta degli helper da attivare viene effettuata al momento della configurazione dei parametri di compilazione di Squid, il nome dell'helper da specificare è il nome (case sensitive) dalla cartella presente nel source tree di Squid che contiene i sorgenti dell'applicazione
./configure --enable-external-acl-helpers="winbind_group ip_user" |
l'esempio di cui sopra rappresenta le instruzioni necessarie alla compilazione di due helpers esterni quali winbind_group e ip_user.
Questo helper permette la verifica di appartenza di un utente ad un gruppo globale di un Dominio Windows NT 4 o Active Directory. Deve essere utilizzato in concomitanza con gli helper di autenticazione Basic Winbindd e NTLM.
Per il suo corretto funzionamento necessita che Samba 2.2.4 (http://www.samba.org/) o seguenti siano installati sul nostro sistema. Per i dettagli relativi alla configurazione di Samba, riferirisi alle susseguenti sezioni relative all' Autenticazione con Samba 2.2.x e alla configurazione di Winbindd.
L'utilizzo di questo helper può semplificare in maniera notevole la gestione della configurazione di Squid e migliorarne le prestazioni globali. Per spiegarci meglio, definiremo un caso di studio: supponiamo di aver 500 utenti censiti in un dominio NT e che li si voglia suddividere in gruppi di restrizione relativamente all'accesso alla webcache. Utilizzando gli helper di autenticazione è possibile agire in due modi:
creare una ACL per ogni utente
creare una ACL basata su un regex[1] che legge la lista degli utenti da un file
In entrambi i casi appare chiaro che incontreremmo un notevole impatto sulle prestazioni della nostra cache, in quanto ad ogni auth-challenge, Squid dovrà verificare l'elenco delle access list, oppure confrontare tutta la lista degli utenti. Proprio per far fronte a questa problematica ci viene in contro l'external helper wb_group che deve essere usato congiuntamente a wb_ntlmauth. Ora creeremo dei gruppi d'utilizzo all'interno del dominio NT, per capirci meglio
InternetFull, nessuna limitazione
InternetNormal, Gli utenti possono solo navigare su determinati siti e non scaricare
InternetToDow, i membri possono navigare in maniera filtrata e scaricaricare liberamente.
InternetToNav, Gli utenti possono navigare senza limitazione ma non scaricare
A questo punto, sempre all'interno del dominio Windows NT, assegneremo gli utenti ai rispettivi gruppi. L'utilizzo del dominio NT è ora piuttosto trasparente a Squid, infatti nel file di configurazione squid.conf è possibile utilizzare un autenticatore qualsiasi, la scelta dello stesso non è più importante.
Definire il TAG external_acl
external_acl_type wb_group concurrency=5 ttl=900 %LOGIN \ /usr/squid/libexec/wb_group |
Creeremo all'interno della directory $PREFIX/etc/ dei file, ciascuno di questi file deve contenere i nomi dei gruppi da agganciare all'ACL. Per consentire una maggiore comprensione, si specifica anche che i files appena creati dovranno contenere al loro interno il solo nome del gruppo. Esempio: Gruppo InternetFull - nel file /usr/squid/etc/internetfull ci deve essere scritto unicamente "InternetFull"
Inseriremo ora, le ACL come segue:
acl password proxy_auth REQUIRED acl internetfull external wb_group -i "/usr/squid/etc/internetfull" acl internetnormal external wb_group -i "/usr/squid/etc/internetnormal" acl internettodow external wb_group -i "/usr/squid/etc/internettodow" acl internettonav external wb_group -i "/usr/squid/etc/internettonav" acl time_acl time M T W H F 8:30-19:00 acl nointernet src "/usr/squid/etc/nointernet" acl goodurl url_regex -i "/usr/squid/etc/goodurl" acl badurl url_regex -i "/usr/squid/etc/badurl" acl badmime url_regex -i "/usr/squid/etc/badmime" http_access allow password internetfull http_access allow password internetnormal time_acl !badurl !badmime http_access allow password internettonav time_acl !badmime http_access allow password internettodow time_acl !badurl http_access deny all |
Appare chiara la facilità con la quale si può ora amministrare grandi numeri di utenti compiendo pochi passi per eseguire la configurazione. Per la configurazione di Samba e wb_ntlmauth, consultare il paragrafo relativo.
A partire dalla versione 1.20 dell'helper wb_group, sono disponibili le seguenti opzioni:
-c use case insensitive compare -d enable debugging -h this message |
La modalità predefinita prevede che la comparazione sia case sensitive sui nomi dei gruppi, e quindi questi devono essere specificati esattamente come nel dominio NT/2000. L'opzione -c attiva la modalità di comparazione case insensitive, ma, utilizzando impostazioni locali di lingua differenti dall'inglese, il risultato potrebbe essere diverso dal previsto. Per dettagli vedere le man pages di toupper, sezione BUGS.
L'opzione -d consente una diagnostica abbastanza chiara e precisa dei problemi. Al fine di controllare il corretto funzionamento dell'helper wb_group, si consideri un utente di prova ed un gruppo di prova avviando l'helper wb_group come segue:
% /usr/squid/libexec/wb_group -d /wb_group[14984](wb_check_group.c:267): External ACL winbindd group helper build Jan 15 2003, 13:29:15 starting up... DOMINIO\\Utente Gruppo <--- inserire così (con il doppio "\") /wb_group[14984](wb_check_group.c:286): Got 'DOMINIO\\Utente Gruppo' from Squid (length: 35). /wb_group[14984](wb_check_group.c:188): SID: S-1-5-21-1836190980-1428173729-311576647-1168 /wb_group[14984](wb_check_group.c:154): Windows group: Gruppo1, Squid group: Gruppo /wb_group[14984](wb_check_group.c:188): SID: S-1-5-21-1836190980-1428173729-311576647-512 /wb_group[14984](wb_check_group.c:154): Windows group: Domain Admins, Squid group: Gruppo /wb_group[14984](wb_check_group.c:188): SID: S-1-5-21-1836190980-1428173729-311576647-1510 /wb_group[14984](wb_check_group.c:154): Windows group: Gruppo, Squid group: Gruppo OK |
L'helper wbinfo_group, cosí come wb_group, consente il controllo delle autorizzazioni di accesso in base all'appartenzenza a gruppi di dominio Windows NT/2000, ma é basato su di uno script perl che interagisce con l'utility Samba wbinfo, ció fa sí che esso sia "neutro" rispetto alla versione di Samba installata sul sistema.
wbinfo_group necessita di Samba e di una versione recente di perl che includa il modulo di libreria shellwords.pl. In mancanza di quest'ultimo, é possibile tentare di copiarlo da un altro sistema. Il suo utilizzo e le procedure di verifica di funzionamento sono strettamete equivalenti a quelle di wb_group.
Quindi l'external_acl definita in precedenza per wb_group diventerà
external_acl_type wb_group concurrency=5 ttl=900 %LOGIN /usr/squid/libexec/wbinfo_group |
L'helper win32_check_group, cosí come wb_group, consente il controllo delle autorizzazioni di accesso in base all'appartenzenza a gruppi di dominio Windows NT/2000, ma riguarda esclusivamente la piattaforma Win32. Non necessita di alcuna componente esterna in quanto si appoggia sulle API native del sistema operativo. win32_check_group può operare su gruppi globali di dominio o gruppi locali di macchina. Il suo utilizzo e le procedure di verifica di funzionamento sono strettamete equivalenti a quelle di wb_group:
external_acl_type NT_global_group %LOGIN c:/squid/libexec/win32_check_group.exe -G external_acl_type NT_local_group %LOGIN c:/squid/libexec/win32_check_group.exe acl GProxyUsers external NT_global_group GProxyUsers acl LProxyUsers external NT_local_group LProxyUsers acl password proxy_auth REQUIRED http_access allow password GProxyUsers http_access allow password LProxyUsers http_access deny all |
Nell'esempio precedente, tutti gli utenti NT validati appartenenti al gruppo globale di dominio GProxyUsers o al gruppo locale di macchina LProxyUsers sono autorizzati ad utilizzare la cache. L'helper win32_check_group é utilizzabile solamente in ambiente Windows nativo o Cygwin ed é disponibile nei relativi package Squid. Per questo helper sono disponibili le seguenti opzioni:
-G start helper in Global Group mode -c use case insensitive compare -d enable debugging -h this message |
La modalità predefinita prevede che la comparazione sia case sensitive sui nomi dei gruppi, e quindi questi devono essere specificati esattamente come nel dominio NT/2000. L'opzione -c attiva la modalità di comparazione case insensitive, ma, utilizzando impostazioni locali di lingua differenti dall'inglese, il risultato potrebbe essere diverso dal previsto. Per dettagli vedere le man pages di toupper, sezione BUGS.
L'opzione -d consente una diagnostica abbastanza chiara e precisa di eventuali problemi.
Questo helper permette la verifica di appartenza di un utente ad un gruppo di una directory LDAP. Il programma opera eseguendo delle ricerche tramite un search filter basato sul username dell'utente ed il gruppo richiesto, se viene trovato un match, l'utente appartiene al gruppo cercato.
Nel seguito di questo paragrafo verranno trattati alcuni argomenti la cui comprensione é strettamente dipendente da una buona conoscenza del protocollo LDAP, per maggiori dettagli al riguardo, riferirsi al sito del Progetto OpenLDAP.
Questo autenticatore consente l'interfacciamento con tutti i maggiori Directory Service attualmente disponibili
Microsoft Active Directory
Novell NDS
Lotus Notes Directory
Sun Java System Directory
esempio di configurazione
external_acl_type ldap_group %LOGIN /usr/local/squid/libexec/squid_ldap_group ... acl gruppo1 external ldap_group Gruppo1 acl gruppo2 external ldap_group Gruppo2 acl password proxy_auth REQUIRED http_access allow password Gruppo1 http_access allow password Gruppo2 http_access deny all |
in questo caso squid_ldap_group si trova in /usr/local/squid/libexec, e sono definite due acl relative ai gruppi LDAP Gruppo1 e Gruppo2. L'helper squid_ldap_group é utilizzabile solamente sulle piattaforme supportate da Squid sui cui sono disponibili le librerie OpenLDAP od un un altra C-API LDAP compatibile.
Sono disponibili le seguenti opzioni:
squid_ldap_group -b "base DN" -f "LDAP search filter"
[options] [ldap_server_name[:port]...|URI]
|
Le opzioni -b e -f devono essere sempre specificate. Per dettagli sulle opzioni si raccomanda di visionare la man page relativa a squid_ldap_group fornita con Squid.
Attenzione: sono supportate al massimo 16 occorrenze di %s negli argomenti dell'opzione -u
Questo helper permette la verifica di appartenza di un utente ad un gruppo standard UNIX®/Linux. Il programma opera eseguendo delle ricerche nel file /etc/group basate sullo username dell'utente ed il gruppo richiesto, un esempio di configurazione
external_acl_type Linux_group %LOGIN /usr/local/squid/libexec/squid_unix_group acl gruppo1 external Linux_group Gruppo1 acl gruppo2 external Linux_group Gruppo2 acl password proxy_auth REQUIRED http_access allow password Gruppo1 http_access allow password Gruppo2 http_access deny all |
in questo caso squid_unix_group si trova in /usr/local/squid/libexec, e sono definite due ACL relative ai gruppi Linux Gruppo1 e Gruppo2. L'helper squid_unix_group é utilizzabile solamente sulle piattaforme supportate da Squid sui cui l'appartenza a gruppi degli utenti é gestita tramite il file /etc/group. Sono disponibili le seguenti opzioni:
squid_unix_group [-g group1 -g group2 -g group3 ...] [-p] |
L'opzione -g permette di indicare i gruppi da verificare sulla command line dell'helper, ma il suo utilizzo é sconsigliabile, in quanto la definizione del gruppo da verificare direttamente tramite External ACL come in esempio é maggiormente flessibile. L'opzione -p attiva il lookup anche nei riguardi del gruppo primario indicato in /etc/passwd. Per maggiori dettagli si raccomanda di visionare la man page relativa a squid_unix_group fornita con Squid.
Attenzione: sono supportati al massimo 10 gruppi. Per aumentare tale valore é necessario modificare il define MAX_GROUP nel codice sorgente e ricompilare l'helper.
Questo helper permette di verificare la corrispondenza tra l'indirizzo IP del client su cui viene eseguito il Browser Internet e l'utente utilizzato per l'autenticazione. Il programma può operare su singoli indirizzi IP o su intere subnet, é inoltre possibile utilizzare come riferimento per la verifica dell'utente, gruppi standard UNIX®/Linux, in questo caso il programma esegue delle ricerche nel file /etc/group basate sullo username dell'utente. Le impostazioni dell'helper devono essere inserite all'interno di un apposito file di configurazione, vediamo un esempio di utilizzo:
external_acl_type IP_Check %SRC %LOGIN /usr/local/squid/libexec/ip_user_check -f /usr/local/squid/etc/ip_user_check.conf acl resticted external IP_Check acl password proxy_auth REQUIRED http_access allow password restricted http_access deny all |
in questo caso ip_user_check si trova in /usr/local/squid/libexec, il suo file di configurazione é /usr/local/squid/etc/ip_user_check.conf ed é definita una ACL per eseguire la verifica di corrispondenza. L'helper ip_user_check é utilizzabile solamente sulle piattaforme supportate da Squid sui cui l'appartenza a gruppi degli utenti é gestita tramite il file /etc/group. Sono disponibili le seguenti opzioni:
ip_user_check -f <configuration_file> |
L'opzione -f é obbligatoria e specifica il percorso del file di configurazione.
Il formato del file di configurazione é il seguente:
Le linee che iniziano con il carattere # sono ignorate (commenti)
Singolo utente:
ip[/mask] utente |
Utenti appartenenti ad un gruppo definito in /etc/group
ip[/mask] @gruppo |
Range IP vietato (nessun utente può usare la cache)
ip[/mask] NONE |
Range IP libero (qualunque utente può usare la cache)
ip[/mask] ALL |
Indirizzo IP e maschera devono essere specificati nel formato X.Y.Z.W
Il risultato della verifica si basa sulla logica di first match, é quindi necessario fare molta attenzione all'oridine in cui vengono inserite le direttive. Esempio:
# Tutti gli utenti della rete 192.168.1.0/24 sono autorizzati 192.168.1.0/255.255.255.0 ALL # # Gli utenti della rete 192.168.2.0/24 non sono autorizzati # tranne l'utente `boss´ che può autenticarsi ovunque 0.0.0.0/0.0.0.0 boss 192.168.2.0/255.255.255.0 NONE # # L'utente `gianni´ può autenticarsi solo dall'indirizzo IP delle propria stazione 192.168.3.45 jayk # # Gli utenti appartenenti al gruppo `cad´ possono autenticarsi solo dalla propria VLAN 10.0.0.0/255.255.0.0 @cad |
| [1] |
regex è acronimo di regular expression. Le espressioni regolari (ER, «regular expression») sono definite dallo standard POSIX 1003.2, la loro sintassi può essere utilizzata per definire dei modelli che possono essere utilizzati per eseguire delle liste di confronto |