Filtraggio della navigazione Web

di Marco Buratto

Pubblicato 17 Dicembre 2009
Aggiornato 20 Febbraio 2014 12:08

logo PMI+ logo PMI+
Come filtrare la navigazione in una rete aziendale con Dansguardian e rendere più sicuro il perimetro della propria infrastruttura di rete

In un precedente articolo abbiamo analizzato i proxy, gli strumenti che permettono ad un amministratore di rete di, tra le altre cose, filtrare i contenuti che transitano sulla rete aziendale. In questo articolo, molto lungo e dettagliato, vedremo invece come configurare in pratica un proxy di filtraggio della navigazione Web basato su due software open source: Dansguardian e Squid.

DansGuardian è un software opensource, molto veloce e scritto in C++, che, accoppiato ad un proxy (di sovente a Squid), viene utilizzato per il filtraggio della navigazione Web. Gira su tutti i sistemi *nix (Linux, FreeBSD, OpenBSD, NetBSD, Mac OS X, HP-UX e Solaris).

Nella pratica, DansGuardian è un nodo ulteriore: si frappone tra tutti i browser di una rete locale ed il proxy Squid. I browser vengono impostati per utilizzare DansGuardian come proxy di navigazione; questo inoltra, quindi, il traffico tra browser e proxy Squid solo nel caso in cui la richiesta non violi alcuna regola interna imposta dall’amministratore del filtro.

Il filtraggio si attua a livello applicativo HTTP, tramite analisi dell’URL, del dominio, del formato di file delle risorse Web (estensione e descrizione MIME) e del contenuto testuale; per quest’ultimo controllo viene usata la corrispondenza dello stesso a determinati pattern (stringhe e/o espressioni regolari). È presente infine un controllo sui file spediti dai browser al webserver (in POST).

È possibile scaricare dalla rete e far utilizzare direttamente a DansGuardian delle blacklist di URL, domini e pattern da filtrare, aggiornate frequentemente, che annoverano migliaia di risorse considerate pericolose o semplicemente non adatte ad un pubblico non adulto oppure di advertisment online. Sarà compito di chi amministra tale proxy di abilitare o meno le sue diverse peculiarità ed opzioni. La blacklist “ufficiale” del programma, aggiornata giornalmente, è reperibile su: http://urlblacklist.com/?sec=download. Per il suo utilizzo è richiesta una sottoscrizione mensile od annuale, sebbene essa sia liberamente scaricabile.

Una blacklist attua il concetto di “lasciar passare” solo ciò che non sia contenuto nella blacklist stessa; DansGuardian può tuttavia esser configurato anche con filosofia opposta, ovvero bloccare tutto tranne ciò che viene definito in determinate whitelist.

Se, infine, la vostra filosofia di vita è In medio stat virtus, allora DansGuardian fa anche al caso vostro, in quanto può utilizzare ambo le filosofie assieme!

Vorrei da ultimo precisare che DansGuardian e Squid formano un sistema di proxy trasparente, ovvero non nascondono al webserver destinazione l’esatta origine della connessione, come mostrano di seguito i log del server Apache stesso a fronte di connessioni di prova (basti vedere l’informazione relativa ai browser):

192.168.0.46 – – [30/Jul/2009:17:06:35 +0200] “GET / HTTP/1.1” 200 645 “-” “Opera/9.64 (X11; Linux i686; U; en) Presto/2.1.1”
192.168.0.46 – – [30/Jul/2009:17:12:36 +0200] “GET / HTTP/1.1” 200 645 “-” “Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.0.12) Gecko/2009072221 Iceweasel/3.0.6 (Debian-3.0.6-1)”

Sottolineo quindi come il compito del sistema di proxy in esame sia quello di filtro dei contenuti, per lo più in ingresso, ciò che ben si distanzia dallo scopo di altri sistemi di proxy quali TOR e Privoxy, che puntano l’accento sulla privacy ed il nascondimento delle tracce di chi naviga.

Per gli esempi pratici che seguono utilizzeremo Squid come proxy di “appoggio” a DansGuardian, ma non ci soffermeremo sulla sua descrizione e lo daremo come prerequisito essenziale; per far sì che la presente mini guida possa comunque essere seguita da tutti, daremo tuttavia a breve le istruzioni minime ed indispensabili per installare Squid di modo che possa esser usato da DansGuardian nella sua configurazione standard. Tratteremo per lo più l’approccio a blacklist.

* Terza e ultima parte

Liste e file di configurazione secondario

dansguardianf1.conf configura quanto il programma andrà effettivamente a filtrare, ovvero punta alle già citate liste di domini, URL e pattern – sia “black” che “white” – necessarie al suo efficace funzionamento, suddivise in un ordine gerarchico piuttosto ramificato.

Tale file di configurazione è relativo al gruppo di utenti di default: DansGuardian permette di suddividere gli utenti che si collegano ad esso in diversi gruppi aventi diverse tipologie di impostazioni.

Per quest’articolo introduttivo, tuttavia, utilizzeremo l’unico gruppo di utenti di default, come consiglia, del resto, lo stesso DansGuardian per facilitare un’esecuzione più veloce dei processi.

Tra le direttive di configurazione, prendiamo ora come esempio bannedsitelist e bannedurllist, probabilmente, assieme a bannedextensionlist, le più utilizzate.

bannedsitelist = ‘/etc/dansguardian/lists/bannedsitelist’
bannedurllist = ‘/etc/dansguardian/lists/bannedurllist’
bannedextensionlist = ‘/etc/dansguardian/lists/bannedextensionlist’

bannedsitelist e bannedurllist differiscono per il raggio di azione: il primo blocca interi siti (domini), mentre il secondo può andare a filtrare singoli URL, quindi solamente una determinata parte di un sito.

Visualizziamo il contenuto del primo file (parziale) e notiamo l’elevata ramificazione di questi file:

.Include</etc/dansguardian/lists/blacklists/ads/domains>
#Remove the # from the following and edit as needed to use a stock
#squidGuard/urlblacklists collection.
#.Include</etc/dansguardian/lists/blacklists/adult/domains>
#.Include</etc/dansguardian/lists/blacklists/artnudes/domains>
#.Include</etc/dansguardian/lists/blacklists/audio-video/domains>
[…]
#.Include</etc/dansguardian/lists/blacklists/porn/domains>
#.Include</etc/dansguardian/lists/blacklists/proxy/domains>
[…]
#.Include</etc/dansguardian/lists/blacklists/violence/domains>
#.Include</etc/dansguardian/lists/blacklists/virusinfected/domains>
#.Include</etc/dansguardian/lists/blacklists/warez/domains>
# You will need to edit to add and remove categories you want

Per ognuna delle tipologie elencate (tranne la prima) si ha, a questo punto, la necessità di avere le blacklist inerenti vere e proprie. Come accennato ad inizio articolo, utilizzeremo le blacklist ufficiali del progetto. Per il loro utilizzo è richiesta una sottoscrizione mensile od annuale.

Per l’installazione delle stesse, una volta scompattato l’archivio, è solamente necessario copiare tutte le directory in: /etc/dansguardian/lists/blacklists. Esempio di blacklist inerente i domini giudicati contenere contenuti violenti:

[…]
patriot .ch
racist-jokes .com
rainbowanimations .com
rotten .com
sniper .com
spartanwhores .tk
stickpage .com
[…]

L’amministratore del filtro ha, chiaramente, la possibilità di modificare ogni aspetto a piacere al fine di configurare il malleabilissimo filtro in rapporto alle esigenze aziendali.

Filtraggio tramite espressioni regolari

Oltre che al filtraggio in base alla corrispondenza o correlazione tra stringhe, si ha la possibilità di filtrare in base ad espressioni regolari. Nel file /etc/dansguardian/lists/bannedregexpurllist troviamo una lista di “regexp” suddivise per argomenti; un esempio, comprendente i siti di appuntamenti, è il seguente:

######################################################

# Dating Sites
######################################################
#(meet|hook|mailord|latin|(asi|mexic|dominic|russi|kore|colombi|balk)an|brazil|filip|french|chinese|ukrain|thai|tour|foreign|date){1,}.*(dar?[lt]ing|(sing|coup)le|m[ae]n|girl|boy|guy|mat(e|ing)|l[ou]ve?|partner|meet)
#(marr(y|i[ae])|roman(ce|tic)|fiance|bachelo|dating|affair|personals)

Per abilitare il filtraggio su reg exp, basta decommentare semplicemente le righe opportune.

Aggiornamento automatico delle liste

Sul sito urlblacklist è presente un utilissimo script, da utilizzare manualmente o tramite crontab, che permette l'aggiornamento automatico delle liste.. Molto semplicemente, lo script scarica le nuove liste dal sito Web tramite il comando wget (che dev’esser installato nel sistema), le sostituisce a quelle vecchie e riavvia il servizio.

Aggirare DansGuardian

Posta l’impossibilità di connettersi ad un Web server filtrato (al fine di visualizzare una risorsa filtrata), è necessario utilizzare un qualche altro servizio non bloccato che si occupi di scaricare tale risorsa in vece nostra.

Poniamo, per esempio, che il dominio html.it (quindi *.html.it) sia bloccato a livello di DansGuardian tramite black list (bannedsitelist):

Figura 5: Accesso non consentito ad un dominio

Accesso non consentito ad un dominio

Se a questo punto, come utenti (molto!) insoddisfatti della scelta dell’amministratore del filtro, volessimo cercare di leggere ugualmente le notizie e le guide del portale? L’idea va sicuramente ad un Web proxy, cioè un programma Web (che andremo a visualizzare quindi tramite browser) che funge da proxy HTTP, ovvero che, come ormai sappiamo bene, scaricherà il contenuto del sito html.it e lo visualizzerà (lo invierà al nostro browser).

Purtroppo, però, DansGuardian ci ha anticipato, in quanto – già di default – blocca i Web proxy principalmente tramite weighted frase list (file /etc/dansguardian/lists/weightedphraselist):

#System Management and Security
[…]
.Include</etc/dansguardian/lists/phraselists/malware/weighted>
.Include</etc/dansguardian/lists/phraselists/proxies/weighted>
.Include</etc/dansguardian/lists/phraselists/warezhacking/weighted>
[…]
cat /etc/dansguardian/lists/phraselists/proxies/weighted
[…]

#General Proxy Lists
< anonymous >,< transparent >,< prox><50>
<keep your identity hidden><50>
<anonymous>,<proxy><50>
<anonymous>,<surfing><50>
<anonymous>,<internet><50>
<high anonymity><30>
< anonymity>,<proxy><70>
< proxy><5>
< proxies><30>
<public prox><30>
<proxy list><20>
[…]

#Proxy and Filter bypass
<bypass>,<proxy><75>
<bypass>,<website blocking><75>
<bypass>,<website filter><75>
<bypass>,<web filter><75>
<bypass>,<content filter><75>
<bypass>,<internet filter><75>

Con il risultato seguente:

Figura 6: Dansguardian blocca anche i proxy

Dansguardian blocca anche i proxy

La nostra ricerca deve quindi puntare ad un Web proxy che non contenga, nella sua pagina HTML, parole bandite o che comunque non risulti troppo “riconoscibile”. Uno splendido esempio di “semplicità” è il Web proxy Picidae “Break through the Internet Censorship”, scritto in PHP e Phyton, il cui nome in Latino significa "picchi" (pl. di picchio).

La caratteristica più innovativa di questo Web proxy sta nel fatto che la risorsa viene scaricata, renderizzata e convertita in immagine, la quale contiene aree sensibili al click del mouse che fungono da link: solo un’innocua immagine, contestualizzata in una pagina HTML con le coordinate della mappa, verrà spedita al nostro browser!

Seconda parte

Un primissimo utilizzo

Per effettuare un primo test a file di configurazione intonso, possiamo navigare verso il sito che possiamo leggere in /etc/dansguardian/lists/bannedsitelist (che è meglio qui non riportare..), unico dominio bannato di default dal programma senza l’uso delle blacklist citate. Se tutto funziona a dovere, il navigante vedrà respinta la sua richiesta di connessione – non che, a dirla tutta, avrei, personalmente, mai pensato di navigare verso tali acque… Vedere per credere!

Oltre all’accesso negato a particolari domini o singoli URL, possiamo testare come la configurazione di default di DansGuardian non ammetta lo scaricamento di molte (quasi tutte!) le tipologie di file dati. Ad esempio, volendo scaricare un file in formato Iso, notiamo come l’accesso alla risorsa venga impedito:

Figura 3: Accesso negato per i file

Accesso negato per i file

La lista delle tipologie di file non consentite si trova nella directory /etc/dansguardian/lists/bannedextensionlist ed ha la seguente forma:

# File extensions with executable code
# The following file extensions can contain executable code.
# This means they can potentially carry a virus to infect your computer.
.ade # Microsoft Access project extension
.adp # Microsoft Access project
[……]

Come conseguenza del blocco, nel file di log (/var/log/dansguardian/access.log) viene nel contempo registrato il tentativo di accesso:

<data> – <client IP> http://saimei.acc.umu.se/debian-cd/5.0.2/i386/iso-cd/debian-502-i386-netinst.iso *DENIED* Banned extension: .iso

Apprezzato il comportamento di DansGuardian non configurato, andremo ora a capire come configurare il programma secondo le esigenze dell’organizzazione in cui sarà installato. Tutto ciò elencando le direttive salienti nei suoi file di configurazione e fornendo qualche immancabile esempio.

File di configurazione principale – 1

Il file di configurazione principale, /etc/dansguardian/dansguardian.conf, nella consueta forma “direttiva = valore”, è ottimamente documentato; in questa sezione ne vedremo le direttive più significative per un utilizzo di base.

Direttive sul reporting a video

La direttiva reportinglevel definisce ciò che l’utente vedrà in caso di accesso negato ad una risorsa Web.

# Web Access Denied Reporting (does not affect logging)
#
# -1 = log, but do not block – Stealth mode
# 0 = just say ‘Access Denied’
# 1 = report why but not what denied phrase
# 2 = report fully
# 3 = use HTML template file (accessdeniedaddress ignored) – recommended
#
reportinglevel = 3

Se impostata al valore -1, il filtro si limita a registrare su file di log le richieste dell’utente che violino le regole imposte, ma non impedisce la connessione stessa: l’utente sarà ignaro di cosa il proxy stia facendo. Gli altri valori definiscono un grado sempre più ricco d’informazione di reporting all’utente, per giungere al valore 3, di default, che visualizza una pagina HTML di avviso, basata su un template predefinito e modificabile, situato in /etc/dansguardian/languages dipendentemente dalla lingua scelta (che modificheremo in Italiano):

# language to use from languagedir.
language = ‘italian’

File di configurazione principale – 2

Direttive sul logging

Definiscono tipologia, forma e locazione del file di log del proxy sul server.

# 0 = none 1 = just denied 2 = all text based 3 = all requests
loglevel = 2
# Log File Format
# 1 = DansGuardian format (space delimited)
# 2 = CSV-style format
# 3 = Squid Log File Format
# 4 = Tab delimited
logfileformat = 1
# Log file location
# Defines the log directory and filename.
loglocation = ‘/var/log/dansguardian/access.log’ # (Anche commentato è il default)

I log possono portare o meno con sé la sorgente della richiesta (IP/hostname del computer che richiede la richiesta filtrata).

Direttive sulla rete

La direttiva filterip specifica la o le interfaccia/e di rete dell’host (sistema fisico o virtuale su cui gira) dalla/e quale/i il proxy può accettare le richieste dai browser. Normalmente il campo viene lasciato vuoto per permettere a DansGuardian di accettare connessioni TCP attraverso una qualunque delle interfacce di rete presenti fisicamente o virtualmente sulla macchina.

filterip =

filterport è la porta TCP su cui il servizio si metterà in ascolto.

filterport = 8080

proxyip e proxyport sono rispettivamente l’IP e la porta di Squid. Se Squid e DansGuardian grano sul medesimo host, 127.0.0.1 (localhost) è la ovvia configurazione da impostare.

proxyip = 127.0.0.1
proxyport = 3128

Direttive sui controlli da pattern

Una pagina HTML è soggetta ai controlli su URL e dominio, ma anche a controlli basati su pattern sul suo contenuto.

DansGuardian mette a disposizione la possibilità di filtrare completamente tutte le risorse che contengano particolari frasi elencate oppure la possibilità di valutare il grado di correlazione (tramite conteggio delle ricorrenze): in questo caso, se la correlazione tra stringhe fornite e testo della risorsa è elevata, con buona probabilità la risorsa non soddisfa alle regole imposte e viene bloccata anche nel caso in cui non sia inserita nelle blacklist di URL/dominio.

Le direttive di cui sotto definiscono il comportamento. Il valore weightedphrasemode = 2 rende il filtro un po’ meno selettivo, quindi più “morbido”, diminuendo di conseguenza i falsi positivi.

showweightedfound = on
weightedphrasemode = 2

Nei file in /etc/dansguardian/lists/phraselists/ troviamo una lista di stringhe suddivise per argomenti; un esempio (in Italiano!) è il seguente:

<per soli adulti >,<riservato ><100>
<sito per adulti >,<attenzione ><100>
<sito per adulti >,< avvisa ><100>
<sito per adulti >,<si avvisa ><100>

Direttive sul caching

Caching per risorse già valutate come “bianche” dal filtro:

urlcachenumber = 5000
urlcacheage = 900

Caching dei file di configurazione, per una scansione decisamente più veloce:

createlistcachefiles = on

Direttive analoghe saranno descritte innanzi.

File di configurazione principale – 3

Reverse lookup

Tramite “Reverse lookups for banned site and URLs”, il programma converte l’URL ricercato in IP al fine di impedire la navigazione di domini o pagine Web attraverso il loro IP se nelle blacklist è invece presente il solo dominio/URL. In realtà con il protocollo HTTP 1.1 il virtual hosting è diventato la realtà quotidiana e non credo quest’opzione sia più che tanto utile in Internet.

È possibile anche il reverse lookup inverso – che gioco di parole!

reverseaddresslookups = off
reverseclientiplookups = off

Content scanner

DansGuardian, per mezzo di software terzi, può effettuare un controllo delle risorse scaricate alla ricerca di virus. Accorgimenti opportuni devono essere effettuati per evitare il timeout dei browser dacché una risorsa, al fine di esser scansita alla ricerca di virus, dev’esser innanzitutto scaricata totalmente dal proxy, con un conseguente ritardo temporale altrimenti inammissibile per il browser.

Da notare che:

  • di default vengono scartati i file “grandi” e che impiegano troppo tempo per essere processati dal “content scanner”, escludendo di fatto per questi ultimi la protezione da virus;
  • sul proxy viene mantenuta una cache per i file scansiti con esito negativo, cioè per i file giudicati non pericolosi.

contentscanner = ‘/etc/dansguardian/contentscanners/clamav.conf’
downloadmanager = ‘/etc/dansguardian/downloadmanagers/fancy.conf’
downloadmanager = ‘/etc/dansguardian/downloadmanagers/default.conf’
scancleancache = on

Al fine di abilitare un content scanner, decommentare una tra le opzioni fornite. Nel prosieguo utilizzerò quale esempio ClamAV, un antivirus a scansione da linea di comando. L’installazione avviene nella consueta maniera (se l’antivirus non è stato già installato dallo stesso DansGuardian):

apt-get install clamav-daemon clamav-freshclam

Ciò installerà ClamAV e FreshClam, il quale si occuperà di mantenere il database dei virus aggiornato (de default ogni ora). Il file di configurazione di ClamAV è: /etc/clamav/clamd.conf. Nella figura vediamo il funzionamento a fronte del (tentato) scaricamento del vetusto trojan Back Orifice:

Figura 2: Accesso negato ad un virus

Accesso negato ad un virus

Direttive sugli upload

È possibile limitare il peso dei file che i client della rete spediscono dai propri browser in POST:

maxuploadsize = -1

Il default è non bloccare alcun upload dalla LAN all’Internet.

Altre direttive

Le due direttive seguenti definiscono l’utente col quale DansGuardian girerà sul sistema *Nix; di default esso gira come utente senza particolari privilegi, ciò che è preferibile in quanto a sicurezza dell’host.

#daemonuser = ‘dansguardian’
#daemongroup = ‘dansguardian’

Requisiti (Squid)

Come detto più volte, utilizzeremo Squid come proxy di appoggio; DansGuardian è già di default configurato per connettersi a Squid (porta 3128). Squid e DansGuardian verranno per questo articolo installati sul medesimo host, ma, con evidenza, nulla vieta che girino su macchine differenti in rete. Nel caso Squid non fosse già presente, per la sua installazione su Linux Debian / Ubuntu è sufficiente dare il comando:

apt-get install squid

da shell in qualità dell’utente root (sudo apt-get install squid). L’operazione reperirà il programma e le dipendenze dal repository della distribuzione in uso, lo installerà e lo configurerà per ascoltare connessioni di rete alla porta TCP 3128. Per appurare ciò, diamo:

netstat -ap | grep -i squid

tcp 0 0 *:3128 *:* LISTEN 3194/(squid)
udp 0 0 *:icpv2 *:* 3194/(squid)
udp 0 0 *:42833 *:* 3194/(squid)

Nel caso in cui la porta TCP non fosse quella menzionata – probabilmente a causa di una precedente installazione o di esigenze particolari – sarà sufficiente modificare il file di configurazione di DansGuardian per il corretto interfacciamento, come in seguito indicato nella descrizione dello stesso file. Per ulteriori informazioni su Squid si veda la sua documentazione.

Installazione di DansGuardian

Una volta soddisfatti i prerequisiti, al fine di installare il programma in oggetto, DansGuardian, sui sistemi Debian-based utilizziamo il consueto comando (come root):

apt-get install dansguardian

Ad installazione completata si viene avvertiti che è necessario, prima di tutto, modificare il file di configurazione principale (Please edit /etc/dansguardian/dansguardian.conf manually then rerun this script). Per permettere a DansGuardian di partire, dev’esser sicuramente eliminata la riga "UNCONFIGURED – Please remove this line after configuration" dal file /etc/dansguardian/dansguardian.conf.

Una volta terminata la configurazione, della quale parleremo diffusamente a breve, avviamo il servizio:

/etc/init.d/dansguardian start

DansGuardian ascolterà quindi di default sulla porta 8080. IP (l’IP dell’host su cui gira) e porta di DansGuardian saranno i parametri fondamentali al fine di configurarlo come proxy di navigazione nei browser in uso.

Configurazione dei client

Tutti i browser della rete locale dovranno essere configurati per uscire sull’Internet per mezzo di DansGuardian.

Per una corretta politica di sicurezza (mi riferisco qui specificatamente alla navigazione Web) dev’esser nel contempo evitato che i client possano scavalcare la protezione offerta da DansGuardian ed evitare loro la connessione diretta sia a Squid sia al router di frontiera; oppure, meglio, definire a livello di firewall che solo il proxy Squid possa comunicare coi webserver dell’Internet, posto che solo DansGuardian possa comunicare a sua volta con Squid. Oppure, ancor meglio, è necessario che le regole di instradamento dei pacchetti siano eseguite tutte al di fuori dei browser degli utenti, con un’adeguata infrastruttura di rete.

Ciò non vieta ovviamente che l’utente possa però collegarsi ad altri proxy Internet al fine di scavalcare le protezioni. Credo di dire cosa sensata nell’affermare che bloccare siti di interesse comune in un’organizzazione possa spingere i dipendenti malcontenti a cercare – e, molto più spesso di quanto gli amministratori di rete pensino, trovare – strade alternative al fine di scavalcare il filtro di contenuti, ciò che può portare spesso a gravi ricadute sulla sicurezza della LAN stessa.

Di seguito sono esemplificati i passi per configurare rispettivamente Firefox ed Opera (optiamo per il metodo più semplice); non ha ovviamente alcuna importanza il sistema operativo sul quale i client girano, che può spaziare da Windows ad Android – al contrario del sistema su cui gira il proxy che, come abbiamo inteso, dev’essere un Linux o Unix-derivato.

Firefox

Su Firefox (nell’immagine: Ubuntu 9.04) è sufficiente portarsi su Strumenti > Opzioni > Avanzate > Rete e quindi su Impostazioni, inserendo poi come coppia host e porta del proxy i valori dell’IP dell’host su cui gira DansGuardian (es.:192.168.0.254) e 8080 rispettivamente.

Nella figura sotto è impostato localhost in quanto per questo articolo ho installato tutto in locale, ma è un'impostazione che mai si verificherà in una rete aziendale.

Figura 1: Le impostazioni per Firefox

Le impostazioni per Firefox

Opera

In Opera, Strumenti > Preferenze > Avanzate > Rete e quindi Server proxy.

Figura 2: Le impostazioni per Opera

Le impostazioni per Opera

La seconda parte dell'articolo verrà pubblicata la prossima settimana.