Web Proxy Trasparente con Antivirus e Blacklist degli URL

Lo scopo di questo documento è descrivere la realizzazione di un Web Proxy con controllo antivirus sulle pagine web e blacklist/whitelist sui siti. Il documento è suddiviso nelle seguenti sezioni:

  • Perché utilizzare un proxy web con antivirus?
  • Modalità Transparent Proxy
  • Configurazione e attivazione del servizio proxy
    • Log degli accessi e privacy
    • Controllo antivirus sulle immagini
    • Aggiornamento automatico delle signature di ClamAV
  • Blacklist e Whitelist dei siti web
  • Testare il funzionamento del proxy e dell’antivirus

Perché utilizzare un proxy web con antivirus?

Le pagine web sono sempre più spesso il mezzo con cui Worm e Virus si diffondono in Internet. Può capitare infatti, che dei siti web, intenzionalmente o perché vulnerabili e quindi modificati all’insaputa degli autori legittimi, abbiano dei riferimenti a codice eseguibile capace di infettare i computer degli utenti. La situazione è peggiorata peraltro, da quando alcune vulnerabilità nel sistema di visualizzazione delle immagini ha permesso di trasportare virus anche in file JPEG. Infine, la sempre maggiore diffusione di Applet Java sta incrementando il numero di virus multipiattaforma capaci di giungere via http ed operare indipendentemente dalla piattaforma (PC, palmare, cellulare) e dal sistema operativo su cui giungono.
La soluzione principe per questo tipo di problemi è dotare tutti i dispositivi client che si connettono ad Internet di un buon antivirus con protezione in tempo reale, che controlli ogni file proveniente dall’esterno. Ma ciò può non bastare per due motivi: nessun antivirus, benché disponga di meccanismi di auto-aggiornamento delle signature, può fornine una garanzia al 100% contro ogni virus; il controllo in tempo reale dei contenuti entranti pesa notevolmente dal punto di vista computazionale e specialmente su dispositivi non troppo performanti, può rallentare talmente il sistema da indurre chi lo usa a disabilitare il controllo antivirus.
Per questi motivi, sempre più si tenta di attuare un controllo dei virus a monte, prima che questi giungano sul client dell’utente. In altre parole, si utilizzano dei sistemi di antivirus centralizzati sui server che offrono un determinato servizio. L’esempio più diffuso è quello del server di posta elettronica che dispone di un sistema che scompone i messaggi in ingresso e uscita via SMTP e sottopone gli allegati al controllo di un antivirus. In questo caso, applicare un controllo antivirus su di un gateway SMTP è abbastanza naturale poiché questo è un punto di passaggio obbligato per gli e-mail, prima che giungano nelle Inbox degli utenti. Per il servizio http, invece, la cosa non è così banale visto che un client di una LAN, può potenzialmente connettersi direttamente ad uno qualsiasi dei server web presenti in Internet. La soluzione a questo problema, consiste nell’introduzione all’interno della LAN di un gateway a livello applicativo che raccolga le richieste http dei client e le inoltri ai server web di competenza. Tale gateway applicativo prende il nome di Proxy Web e poiché è capace di interpretare il protocollo http, può non solo filtrare in base agli URL, ma anche scomporre i contenuti trasportati (HTML, JavaScript, Applet Java, immagini, …) e controllarli mediante un antivirus. Una delle funzionalità finora più diffuse dei proxy è quella di web cache, cioè di archiviare su disco le pagine web già visitate in maniera da accelerarne la visualizzazione in caso di successive richieste ai medesimi URL. Lo scopo di ciò è anche quello di ridurre il consumo di banda verso Internet ed uno dei sistemi di proxy più conosciuti, in grado di svolgere la funzione di web cache è Squid, distribuito in Open Source.
Zeroshell non integra Squid poiché non si propone di svolgere il lavoro di web cache. Il compito di antivirus centralizzato sulle pagine web e di filtraggio dei contenuti, mediante blacklist degli URL, viene affidato ad HAVP come sistema proxy e a ClamAV come software antivirus. Entrambi sono distribuiti sotto licenza GPL.

Modalità Transparent Proxy

Uno dei problemi maggiori quando si utilizza un server proxy è quello di dover configurare tutti i browser web ad utilizzarlo. Bisogna cioè specificare il suo indirizzo IP o nome host e la porta TCP su cui risponde (generalmente la 8080). Ciò potrebbe essere un onere gravoso nel caso di LAN con numerosi utenti, ma ancor peggio, non potrebbe garantire contro gli utenti che rimuovano tale configurazione per accedere direttamente al web, sfuggendo così al controllo antivirus, al logging degli accessi e alle blacklist di siti.
A soluzione di questo problema, Zeroshell, utilizza la modalità Transparent Proxy che consiste nell’intercettare automaticamente le richieste dei client sulla porta 80 TCP. È ovvio, che affinché Zeroshell possa intercettare tali richieste web, deve essere configurato come gateway di rete, in maniera che il traffico dei client verso Internet lo attraversi. Zeroshell gestirà automaticamente la cattura delle richieste http sia che si tratti di un gateway di livello 2 (bridge tra interfacce Ethernet, WiFi o VPN) che di un gateway in layer 3 (router). Si tenga tuttavia presente che, è necessario specificare su quali interfacce di rete o subnet IP il redirect delle richieste debba avvenire. Ciò è possibile aggiungendo le cosiddetteHTTP Capturing Rules come mostrato nella figura sotto: 

proxy-rules

Configurazione delle regole di cattura delle richieste http

Nell’esempio della figura, vengono intercettate le richieste http provenienti dalle interfacce di rete ETH00 e ETH03. Da queste richieste restano escluse quelle destinate ai server web appartenenti alla subnet IP 172.16.0.0/16 e quelle provenienti dal client avente indirizzo IP 192.168.0.1. I motivi per cui su alcuni client e per alcuni server web sia necessario escludere l’intervento del proxy trasparente possono essere diversi. Per esempio, un server web potrebbe restringere l’accesso solo ai client con un determinato IP presente nelle sue ACL. In tal caso, se il proxy intercettasse le richieste verso il suddetto server, le farebbe giungere con il suo IP e ciò impedirebbe l’accesso. D’altra parte, non si potrebbe autorizzare l’indirizzo IP del proxy nelle ACL del server web poiché ciò significherebbe concedere l’accesso indiscriminato a tutti i client che utilizzano il proxy. È quindi evidente, che l’unica soluzione è quella di evitare l’intercettazione delle richieste da parte del proxy trasparente.
Si noti infine, che le regole iptables per effettuare il redirect verso il servizio proxy (8080 tcp) sono poste a valle di quelle che intervengono nel funzionamento del Captive Portal. Grazie a ciò, Captive Portal e Transparent Proxy possono essere abilitati contemporaneamente sulla medesima interfaccia di rete.

Configurazione e attivazione del servizio proxy

Come illustrato nella figura sottostante, la configurazione del servizio proxy con antivirus è molto semplice. Dopo aver configurato il box Zeroshell per agire da router e avendolo configurato sui client come Default Gateway, oppure configurandolo come bridge e interponendolo in un punto della LAN da cui fluisce il traffico da e verso Internet, basta abilitare il flag [Enabled] affinché il proxy inizi a funzionare. Come accennato nel paragrafo precedente, le richieste web che effettivamente vengono intercettate e sottoposte all’azione del proxy sono quelle specificate mediante la configurazione delle [HTTP Capturing Rules]

proxy

Interfaccia web di configurazione del proxy

Si noti, che l’avvio del servizio proxy è molto più lento rispetto ad altri servizi e su hardware non troppo veloce può impiegare anche 30-40 secondi. Ciò è dovuto alla necessità, da parte delle librerie dell’antivirus ClamAV, di dover caricare e decodificare in memoria un numero molto alto di signature di virus. Per evitare che ciò blocchi a lungo l’interfaccia web di configurazione e gli script di startup, si è scelto di avviare il servizio in maniera asincrona. Pertanto, quando si abilita il proxy o lo si riconfigura, la voce Status non riporta ACTIVE(in verde) immediatamente, ma passa prima dallo stato STARTING (in arancione) che indica che il servizio sta caricando le signature. Per capire quando effettivamente il proxy inizia a svolgere il suo compito, bisogna cliccare su [Manage] in modo da fare il refresh della pagina di configurazione, oppure, semplicemente fare click su [Proxy log] per visualizzare i messaggi di startup del daemon havp. Durante il periodo di avvio del daemon havp, le regole iptables di cattura delle richieste http vengono temporaneamente rimosse, consentendo al traffico web di fluire regolarmente, anche se non sottoposto al controllo dell’antivirus.
Nei successivi paragrafi sono analizzate più in dettaglio alcune voci di configurazione.

Log degli accessi e privacy

Poiché un web proxy è un gateway applicativo in grado di interpretare le richieste http, inevitabilmente, proprio per poter svolgere il suo lavoro, decodifica gli URL visitati dagli utenti. Per default, Zeroshell non manda nei log di sistema tali informazioni, che associate all’indirizzo IP dei client richiedenti le pagine web, possono far risalire ai contenuti visitati dagli utenti.
Tuttavia, il logging di tali informazioni può essere abilitato modificando la voce [Access Logging] da “Only URL containing Virus” a “Any Access”. Così facendo, ogni URL visitato viene registrato nei log associato all’indirizzo IP del client. Si raccomanda, prima di abilitare tale opzione, di consultare la normativa del proprio paese per verificare che il logging degli URL visitati non violi qualche norma sulla Privacy degli utenti.
Peraltro, bisogna essere consapevoli, che così come, abilitando il NAT su di un router di accesso a Internet, ogni richiesta proveniente dai client, risulta all’esterno come effettuata dal router stesso, anche le richieste http passanti per un proxy risultano effettuate con l’indirizzo IP sorgente di quest’ultimo. Ciò può creare difficoltà nel risalire all’identità di un utente che abbia commesso delle azioni illecite su server remoti. Una possibile soluzione a quest’ultimo problema, meno invasiva dal punto di vista della privacy, potrebbe essere quella di attivare il logging del Connection Tracking (dall’interfaccia web di Zeroshell [Firewall][Connection Tracking]). In tal modo, qualsiasi connessione TCP/UDP viene registrata nei log riportando IP sorgente, porta sorgente, IP di destinazione e porta di destinazione. Non sarà pertanto possibile risalire al contenuto dell’attività dell’utente, ma si terrà traccia delle connessioni effettuate. Anche in questo caso, si consulti la normativa prima di abilitare il connection tracking.

Controllo antivirus sulle immagini

Per molto tempo si è ritenuto che un file che contenga un’immagine come una JPEG o una GIF non potesse contenere un virus, in quanto costituito semplicemente da dati formattati in un formato prestabilito, opportunamente interpretabile dal sistema di visualizzazione del sistema operativo. Ultimamente invece, alcune componenti di rendering delle immagini hanno dimostrato di avere delle falle se non opportunamente aggiornate con delle patch. Un’immagine costruita ad arte, potrebbe creare un Buffer Overrun ed eseguire codice arbitrario sul sistema. È facilmente intuibile la gravità di ciò, visto che buona parte dei contenuti degli ipertesti del WWW sono immagini.
Il proxy HAVP configurato in Zeroshell, per default, sottopone le immagini al controllo antivirus di ClamAV. Tuttavia, su hardware lento, lo scanning delle immagini potrebbe ritardare l’apertura delle pagine web costituite da molte figure. In tal caso, si dovrebbe valutare l’ipotesi di disabilitare il controllo sui file contenenti immagini, impostando l’opzione [Check Images (jpg, gif, png)] da “Enabled” a “Disabled”.

Aggiornamento automatico delle signature di ClamAV

La rapidità con cui vengono immessi in rete ed identificati nuovi virus, fa si che le signature degli antivirus aumentino e vengano modificate molto frequentemente. Non fa eccezione a ciò il database di ClamAV, che grazie al daemon freshclam, può essere aggiornato online ad intervalli regolari di tempo.
Zeroshell configura per default freshclam per effettuare il check sul database delle signature 12 volte al giorno. Tale intervallo, può essere impostato mediante il parametro [Number of Checks per Day], da un minimo di 1 controllo al giorno fino ad un massimo di 48. È anche importante impostare correttamente il parametro [Country of the Mirror], mediante cuifreshclam sceglie il sito più vicino da cui scaricare le signature dei virus. Si noti comunque, che l’aggiornamento periodico è un’operazione veloce che non genera molto traffico, poiché viene utilizzato un sistema di update differenziale.

Blacklist e Whitelist dei siti web

proxy-blacklist

Spesso si ha la necessità di bloccare la visualizzazione di alcuni siti poiché il loro contenuto non è ritenuto adatto all’utenza a cui il servizio web è destinato. Si pensi per esempio, ai siti contenenti materiale per soli adulti, la cui visualizzazione andrebbe evitata sui Personal Computer a cui hanno accesso dei bambini. Una soluzione molto efficace per questo problema è rappresentata dal forzare i client web ad accedere a Internet attraverso un proxy, che tramite l’uso di software di Content Filtering come DansGuardian, esamina il contenuto delle pagine html bloccando quelle ritenute appartenenti ad una categoria non desiderata. I meccanismi con cui lavorano questi filtri sono paragonabili a quelli dei sistemi antispam. Purtroppo però, non è chiaro se la licenza con cui DansGuardian viene rilasciato sia compatibile con l’integrazione all’interno di un sistema come Zeroshell e, pertanto, si è preferito evitarne l’uso allo scopo di non rischiare di violarla.
Al momento, per ciò che si è detto, l’unico modo di bloccare o permettere la visualizzazione delle pagine web, è quello di utilizzare le Blacklist e le Whitelist degli indirizzi web così come mostrato in figura. 
Configurazione della Blacklist del web proxy

Sia la blacklist che la whitelist sono composte da una sequenza di URL disposti su linee distinte. Ogni linea può corrispondere a più pagine web se si utilizza il carattere jolly *. Se si vuole bloccare tutto il sito http://www.example.com bisogna inserire nella blacklist www.example.com/*, mentre la linea www.example.com, cioè senza il carattere *, bloccherebbe soltanto la home page del sito.
La whitelist ha priorità sulla blacklist. In altre parole, se una pagina web corrisponde ad un item nella blacklist e contemporaneamente nella whitelist, l’accesso alla pagina viene consentito.
Si noti peraltro, che lo scopo della whitelist non è soltanto quello di permettere l’accesso a pagine che sarebbero altrimenti vietate dalla blacklist, ma anche quello di bypassare il controllo antivirus. Si presti attenzione a ciò.
Se l’amministratore di una LAN vuole adottare la politica di fornire accesso soltanto ad un insieme limitato di siti, potrà specificare nella blacklist la linea */* che vieterà l’accesso a tutte le pagine tranne quelle elencate nella whitelist.

Testare il funzionamento del proxy e dell’antivirus

Ci possono essere essenzialmente due ragioni per cui il proxy potrebbe non funzionare correttamente. In primo luogo bisogna assicurarsi, sia se il box Zeroshell è configurato come router oppure come bridge, che il traffico da e verso Internet lo attraversi effettivamente. In secondo luogo, bisogna essere certi della corretta configurazione delle [HTTP Capturing Rules] che determinano quali richieste http effettivamente deviare verso il processo che espleta la funzione di proxy (havp è in listen su 127.0.0.1:8080). In particolare poi, se si impone l’intercettazione delle richieste http su di un’interfaccia di rete che fa parte di un bridge, ci si deve assicurare che su quest’ultimo sia definito almeno un indirizzo IP.
La maniera più semplice per verificare se il proxy sta lavorando correttamente, è quella di abilitare temporaneamente il logging di tutti gli accessi e visualizzare i log del proxy dopo aver richiesto delle pagine web da un client.
Una volta sicuri che il proxy intercetti le richieste web nella maniera che ci si aspetta è necessario verificare il buon funzionamento dell’antivirus ClamAV. Per far ciò, controllare per prima cosa, dai log del freshclam, che gli aggiornamenti delle signature avvengano regolarmente. Poi, dall’URL http://www.eicar.org/anti_virus_test_file.htm provare se il virus di test (a detta degli autori è innocuo) EICAR-AV-Test viene intercettato e bloccato. 
Si noti infine, che il proxy non può servire richieste https (http cifrato con SSL/TLS) visto che, non disponendo della chiave privata del server web, non potrebbe decifrare il contenuto e gli URL di tali richieste incapsulate in tunnel cifrati.