Implementazione di una soluzione firewall e Web-Content-Filtering basata sui software opensource Shorewall e Squid

There is a mobile optimized version of this page, view AMP Version.

wcf0_thumb1In questo articolo illustriamo i passaggi necessari per configurare Shorewall e Squid su un server con centOS (installato seguendo questa guida) da utilizzare per il web content filtering.

Chiaramente avremo bisogno di un server con due schede di rete, una collegata alla nostra rete interna e una collegata al router. La prima scheda avrà un indirizzo privato che farà da gateway per la rete, la seconda avrà un indirizzo pubblico, se disponibile o un indirizzo privato (ma in tal caso il router dovra’ essere in grado di fare nat statico).
Shorewall e’ un compilatore per iptables che utilizza la logica degli zone-based-firewall. Nel nostro caso definiremo due zone:
-la zona “loc”, di cui fara’ parte l’interfaccia eth0 collegata alla lan, con indirizzo 192.168.0.1
-la zona “net”, di cui fara’ parte l’interfaccia eth1 collegata al router, con indirizzo 1.2.3.4
Squid e’ un caching proxy che configureremo come transparent proxy  per ottimizzare l’utilizzo della banda e fare content-filtering.

wcf1_thumb2

Per prima cosa digitiamo il comando
# setup
che apre la schermata di configurazione di centOS.

Nella sezione “Firewall configuration” impostiamo Security level e SELinux a Disabled
Nella sezione “Network configuration” configuriamo gli indirizzi delle schede di rete. Nel nostro caso l’interfaccia eth0 con un indirizzo privato e l’interfaccia eth1 con un indirizzo pubblico.

Nella sezione “System services”  disabilitiamo alcuni servizi non necessari come bluetooth, cpuspeed, ip6tables, isdn e abilitiamo il servizio squid.

A questo punto selezioniamo Quit e torniamo alla riga di comando.

Aggiorniamo il sistema con il comando:
# yum update
scarichiamo il pacchetto rpm delll’ultima versione stabile di shorewall dal sito http://www.shorewall.net/download.htm e installiamo con
# rpm –Uvh shorewall-ultima-versione-stable.rpm
I file di configurazione di shorewall si trovano nella directory /etc/shorewall e sono da editare nel seguente modo:

-zones
Nel file zones dichiariamo le zone che utilizzeremo nella configurazione. Aggiungiamo quindi le seguenti righe al file
loc    ipv4
net    ipv4

-interfaces
Nel file interfaces definiamo  quali interfacce appartengono a quali zone. Aggiungiamo quindi le seguenti righe al file
net    eth1    detect    routefilter,tcpflags,nosmurfs
loc    eth0    detect    tcpflags,nosmurfs

-shorewall.conf
L’unica modifica da fare in questo file è abilitare l’avvio di shorewall, quindi impostiamo
Startup_Enabled=Yes

-masq
Nel file masq definiamo su quale interfaccia fare il NAT tra gli indirizzi della rete interna e quello della rete esterna. Aggiungiamo quindi la seguente riga al file
eth1    192.168.0.0/24        1.2.3.4

-policy
Nel file policy definiamo le regole di default per le connessioni tra le diverse zone che abbiamo dichiarato in precedenza. La zona $FW è il firewall stesso. La regola generale è: accettare le connessioni da una zona più sicura ad una meno sicura e rifiutare tutto il resto. Aggiungiamo quindi le seguenti righe al file

loc    $FW    ACCEPT
loc    net    ACCEPT
loc    all    REJECT    info
$FW    loc    REJECT    info
$FW    net    ACCEPT
$FW    all    REJECT    info
net    $FW    DROP    info
net    loc    DROP    info
net    all    DROP    info

-rules
Infine nel file rules possiamo definire tutte le regole per il corretto funzionamento del nostro firewall
Ad esempio possiamo permettere le connessioni ssh al firewall
SSH(ACCEPT)     net     $FW

oppure possiamo impostare il forwarding della porta 3389 (RDP) verso il server interno

REDIRECT    net    loc:indirizzo.ip.del.server    tcp    3389

ma soprattutto dobbiamo impostare il redirect di tutto il traffico web verso squid che e’ in ascolto sulla porta 3128

REDIRECT    loc    3128    tcp    www

Occupiamoci ora della configurazione di Squid. L’unico file di configurazione da editare e’ squid.conf che si trova sotto la directory /etc/squid. Il file e’ diviso in sezioni, ciascuna identificata da un tag.
-TAG: acl
in questa sezione definiamo le acl. Definire le acl in squid è l’analogo della dichiarazione di variabili nei linguaggi di programmazione. Dobbiamo definire il nome, il tipo ed il valore di ogni acl che poi useremo  per impostare le regole per il traffico.
Tra i tipi di acl abbiamo: “src” per una lista di indirizzi o subnet, “dstdomain” per una lista di domini, “dstdom_regex” per una lista di regular expression, “time” per una lista di giorni e intervalli orari.
Vediamo alcune acl di diverso tipo che useremo per permettere il traffico da alcuni pc verso alcuni siti e bloccare il traffico verso i siti che desideriamo non siano raggiungibili durante l’orario di lavoro (ma che saranno raggiungibili in pausa pranzo e dopo la chiusura). Inoltre definiamo delle acl specifiche per impedire l’utilizzo di messenger. Aggiungiamo quindi le seguenti righe al file

acl pc_ok src “/etc/squid/pc_ok.txt”
#il file pc_ok.txt contiene gli indirizzi ip dei pc che vogliamo escludere dal filtro
acl consentiti dstdomain -i “/etc/squid/consentiti.txt”
#il file consentiti.txt contiene la lista dei domini che vogliamo siano raggiungibili da tutti
acl bloccati dstdom_regex -i “/etc/squid/bloccati.txt”
acl blacklist dstdomain -i “/etc/squid/blacklist.txt”
#i file bloccati.txt e blacklist.txt contengono la lista dei domini bloccati
acl ora_pranzo time M T W H F 13:30-15:00
acl ora_uscita time M T W H F 19:00-23:00
acl our_networks src 192.168.1.0/24
#acl per bloccare messenger
acl msnmime req_mime_type -i ^application/x-msn-messenger
acl msngw url_regex -i gateway.dll
acl msndom dstdomain login.live.com
acl msnlive dstdomain .messenger.live.com
acl jabberport port 5222-5223
acl loginport port 1863

Il file blacklist.txt può essere generato da un servizio di blacklist tipo http://www.shallalist.de. Lo switch -i serve a dire a squid di interpretare in modo case insensitive l’input.

-TAG: http_access
in questa sezione utilizziamo le acl appena definite. Aggiungiamo quindi le seguenti righe al file
#permettiamo il traffico agli indirizzi e verso I domini definiti
http_access allow pc_ok
http_access allow consentiti
#blocchiamo messenger
http_access deny msnmime
http_access deny msngw
http_access deny msndom
http_access deny msnlive
http_access deny jabberport
http_access deny loginport
#filtriamo i domini indesiderati durante l’orario di lavoro
http_access deny bloccati !ora_pranzo !ora_uscita
http_access deny blacklist !ora_pranzo !ora_uscita
#ed infine permettiamo tutto il resto del traffico
http_access allow our_networks

 

-TAG: http_port
in questa sezione definiamo il comportamento generale di squid, nel nostro caso dovra’ operare in modalita’ trasparente. Aggiungiamo quindi la seguente riga al file
http_port 3128 intercept

-TAG: maximum_object_size_in_memory
in questa sezione definiamo la dimensione massima dei file da memorizzare in cache. Se un file ha dimensioni maggiori non verra’ salvato. Aggiungiamo quindi la seguente riga al file
maximum_object_size 200 MB

-TAG: cache_dir

in questa sezione definiamo la posizione, la dimensione massima della cache e il numero di sottodirectory di primo e secondo livello che la compongono. La dimensione massima e’ in kilobyte, 10000 nel nostro caso. Attenzione a non mettere un valore troppo grande, massimo 80% della dimensione della partizione in cui risiede la directory. Aggiungiamo quindi la seguente riga al file
cache_dir ufs /var/spool/squid 10000 16 256

-TAG: cache

in questa sezione possiamo escludere l’utilizzo della cache per alcuni pc o domini, utilizzando il solito sistema di dichiarazione di acl. Aggiungiamo quindi le seguenti righe al file
acl pc_no_cache src “/etc/squid/pc_no_cache.txt”
#il file pc_no_cache.txt contiene gli indirizzi ip dei pc che vogliamo escludere dalla cache
acl domain_no_cache dstdomain -i “/etc/squid/domain_no_cache.txt”
#i file domain_no_cache.txt contiene la lista dei domini da escludere dalla cache

cache deny pc_no_cache
cache deny domain_no_cache

-TAG: visible_hostname
Possiamo settare questo parametro se vogliamo che squid si presenti con un nome diverso da quello della macchina su cui e’ installato.
visible_hostname firewall

-TAG: cache_mgr
Con questo parametro possiamo impostare l’indirizzo email che compare nella pagina a cui sono reindirizzate tutte le richieste bloccate da squid.
cache_mgr administrator@nomedominio.it

-TAG: header_access
Impostando questo parametro evitiamo che squid specifichi l’indirizzo sorgente dei pc dietro al proxy nello header delle richieste http.

header_access X-Forwarded-For deny all

 

A questo punto abbiamo completato la configurazione della nostra macchina per il web content filtering. Non ci resta che controllare la configurazione di shorewall

# shorewall check

e riavviarlo

# shorewall restart

Quindi riavviare squid per fargli caricare le modifiche.

# /etc/init.d/squid restart

Share

2 pensieri su “Implementazione di una soluzione firewall e Web-Content-Filtering basata sui software opensource Shorewall e Squid

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *