Gentoo Logo

[ << ] [ < ] [ Home ] [ > ] [ >> ]


12. Firewall

Indice:

12.a. Un firewall

Le persone spesso pensano che un firewall fornisce la massima sicurezza, ma non è così. Nella maggior parte dei casi un firewall configurato male fornisce meno sicurezza che non averne uno installato. Un firewall inoltre è una parte di software e tale dovrebbe essere trattato, perchè può benissimo contenere bug.

Quindi è consigliato pensarci prima di installare un firewall. Se ne ha veramente bisogno? Se si pensa che è necessario, allora scrivere da una parte per cosa dovrebbe funzionare, quale tipo di firewall e chi se ne dovrebbe occupare. Ma prima si legga questa guida.

I firewall sono usati per due scopi:

  • Per tenere (worm/attaccanti) fuori
  • Per tenere (impiegati/bambini) dentro

Ci sono tre tipi di firewall:

  • Filtraggio di pacchetti
  • Circuit relay
  • Gateway di applicazione

Un firewall dovrebbe essere un sistema dedicato, che non esegue servizi (o che esegue solo sshd), come consigliato da questa guida.

12.b. Filtraggio di pacchetti

Tutto il traffico di rete è mandato sotto forma di pacchetti. Una grande quantità di traffico è divisa in piccoli pacchetti per facilitare la gestione, e poi riassemblata quando arriva a destinazione. Nell'intestazione di ogni pacchetto ci sono informazioni su come e dove dovrebbe essere portato. E queste informazioni sono quelle che usa un filtraggio di pacchetti. Il filtraggio è basato su:

  • Accettare o meno pacchetti basati sull'indirizzo IP sorgente o di destinazione
  • Accettare o meno pacchetti basati sulla porta sorgente o di destinazione
  • Accettare o meno pacchetti basati sul protocollo
  • Accettare o meno pacchetti basati sulle flag con un protocollo specifico

In altre parole, questo filtraggio è basato su tutti i dati con una intestazione del pacchetto e non sul loro contenuto.

Svantaggi:

  • L'informazione di un indirizzo in un pacchetto può essere un indirizzo IP falso (o come si dice spoofed dal mittente).
  • I dati o le richieste in un pacchetto che ha avuto il permesso, possono contenere dati non desiderati che l'attaccante può usare per sfruttare bug nei servizi o nel firewall
  • Un suo fallimento può generare gravi problemi al sistema

Vantaggi:

  • Semplice e facile da installare
  • Può dare avvisi di un possibile attacco prima che questo accada (per esempio port scan)
  • Buono per fermare attacchi SYN

Esempi di filtraggio di pacchetti su Linux:

Nota: E' consigliato usare iptables. Ipchains è obsoleto.

12.c. Circuit relay

Un circuito di livello gateway è un firewall che convalida le connessioni prima che sia accettato lo scambio dati. Non accetta o nega solo pacchetti basati sull'intestazione del pacchetto, ma determina se la connessione è valida secondo le regole di configurazione, prima che si apre una sessione di scambio di dati. Il filtraggio è basato su:

  • Indirizzo IP sorgente o di destinazione
  • Porta sorgente o di destinazione
  • Un periodo di tempo
  • Protocollo
  • Utente
  • Password

Tutto il traffico è convalidato e monitorato, e il traffico non desiderato può essere eliminato.

Svantaggi:

  • Opera sul Transport Layer e può richiedere modifiche sostanziali del programma che fornisce le funzioni di trasporto.

12.d. Gateway di applicazione

L'applicazione di livello gateway è un proxy per applicazioni, scambio di dati con sistemi remoti sulla parte dei client. E' tenuta non pubblica da un DMZ (De-Militarized Zone: la parte di una rete privata visibile con il firewall) o da un firewall che non permette connessioni da fuori. Il filtraggio è basato su:

  • Accettare o meno indirizzi IP sorgenti o di destinazione
  • Contenuto del pacchetto
  • Limitare l'accesso ai file basati sul tipo di file o estensione

Vantaggi:

  • Può fare la cache ai file, e aumentare le performance della rete
  • Logging dettagliati di tutte le connessioni
  • Scalare bene (alcuni server proxy possono "condividere" dati nella cache)
  • Nessun accesso diretto da fuori
  • Può anche alterare il contenuto del pacchetto al volo

Svantaggi:

  • La configurazione è complessa

I gateway di applicazione sono considerati la soluzione più sicura poichè non devono essere eseguiti come root e i loro host non sono raggiungibili da Internet.

Esempi di gateway di applicazione:

12.e. Iptables

Per poter usare iptables, deve essere abilitato il kernel. Qui si sono aggiunti iptables come moduli (il comando iptables li caricherà poichè necessari) e si è ricompilato il kernel (ma si potrebbe volere iptables compilato, se si vuole disabilitare Loadable Kernel Modules come discusso precedentemente). Per ulteriori informazioni su come configurare il kernel per iptables andare in Iptables Tutorial Chapter 5: Preparations. Dopo aver compilato il nuovo kernel (o mentre lo si sta compilando), si deve aggiungere il comando iptables. Un emerge iptables dovrebbe funzionare.

Per testare il suo funzionamento, digitare iptables -L. Se non funziona, ricontrollare la propria configurazione.

Iptables è il nuovo e migliorato filtro di pacchetti nel kernel 2.4.x. E' il successore di ipchains nel kernel 2.2.x. Uno dei maggiori miglioramenti è che iptables può effettuare un completo filtraggio di pacchetti. E grazie a questo, è possibile tenere traccia di ogni connessione TCP stabilita.

Una connessione TCP è una serie di pacchetti che contiene informazioni sull'indirizzo IP sorgente, l'indirizzo IP di destinazione, la porta sorgente, quella di destinazione, e una sequenza di numeri, così che il pacchetto può essere riassemblato senza perdere dati. TCP è un protocollo orientato alla connessione, in contrasto con UDP, che è senza connessione.

Esaminando l'intestazione del pacchetto TCP, un completo filtro di pacchetti può determinare se un pacchetto TCP ricevuto è parte di una connessione già stabilita o meno e decidere se accettare o no il pacchetto.

E' possibile ingannare un non completo filtro di pacchetti quando si accettano pacchetti che si dovrebbero eliminare, manipolando l'intestazione del pacchetto TCP. Può essere fatto con la manipolazione della flag SYN o di altre flag nell'intestazione TCP, per far sembrare un pacchetto pericoloso come parte della connessione stabilita (poichè il filtro di pacchetti non fa una traccia delle connessioni). Con un completo filtro di pacchetti è possibile ridurre questi pacchetti poichè non sono parte di una connessione già stabilita. Questo fermerà anche la possibilità di "stealth scans", un tipo di port scan con il quale si manda pacchetti con flag che sono più probabili di essere loggati da un firewall che da pacchetti ordinari SYN.

Iptables fornisce molte altre caratteristiche come NAT (Network Address Translation) e il rate limiting. Quest'ultimo è utile quando si cerca di prevenire attacchi DoS (Denial of Service) come SYN flood.

Una connessione TCP è stabilita in tre tempi (three-way handshake). Quando si stabilisce la connessione TCP il client manda un pacchetto al server con la flag SYN. Quando il server riceve il pacchetto SYN, risponde mandando un pacchetto SYN+ACK al client. Quando riceve SYN+ACK, il client risponde con un terzo pacchetto ACK che riconosce la connessione.

Un attacco SYN flood è effettuato con il mandare un pacchetto SYN e con una mancata risposta al pacchetto SYN+ACK. Il client può fare un pacchetto con un indirizzo IP sorgente falso perchè non ha bisogno di una replica. Il server aggiungerà una voce a una queue di connessioni metà aperte, quando riceve il pacchetto SYN e poi aspetta il pacchetto finale ACK prima di eliminare la voce dalla queue. La queue ha un numero limitato di slot e se tutti gli slot sono pieni, non si può aprire un'altra connessione. Se il pacchetto ACK non è ricevuto prima di un tempo specificato, la voce sarà eliminata dalla queue. Le impostazione del tempo specificato variano, ma sono di solito 30-60 secondi o più. Il client inizia l'attacco con molti pacchetti SYN con indirizzi IP di diversa sorgente, e li manda agli indirizzi IP da colpire e riempiono la queue delle connessioni metà aperte e non fanno stabilire a altri client una connessione con il server.

In questi casi diventa di aiuto il rate limit. E' possibile limitare una parte di pacchetti SYN accettati con -m limit --limit 1/s. Limita il numero di pacchetti SYN accettati a uno per secondo e restringe il SYN flood nelle risorse.

Nota: Un'altra opzione per prevenire il SYN flood sono SYN cookies, che permette al computer di rispondere a pacchetti SYN senza riempire spazio nella queue di connessione. SYN cookie possono essere abilitati nella configurazione del kernel Linux, ma per il momento sono considerati sperimentali.

Alcuni esempi pratici.

Quando iptables è caricato nel kernel, ha cinque sezioni in cui si possono elencare le regole, e sono INPUT, OUTPUT, FORWARD, PREROUTING e POSTROUTING. Ognuna di queste è chiamata chain e consiste in un elenco di regole. Ogni regola indica come è fatta l'intestazione del pacchetto, e poi che cosa fare con il pacchetto. Se la regola non coincide con il pacchetto, si cosulta la prossima regola nella chain.

Si possono mettere le regole direttamente nelle 5 chain principali o creare nuove chain e aggiungerle come regole di una esistente chain. Iptables supporta le seguenti opzioni.

Opzione: Descrizione:
-A Aggiungere
-D Eliminare
-I Inserire
-R Sostituire
-L Elencare
-F Eliminare tutte le regole nella chain o in tutte le chain
-Z Zero contatori nella chain o in tutte le chain
-C Testare questo pacchetto sulla chain
-N Creare una nuova chain definita dall'utente
-X Eliminare una chain definita dall'utente
-P Cambiare la politica sulla chain selezionata
-E Cambiare il nome della chain
-p Protocollo
-s address/mask sorgente
-d address/mask di destinazione
-i Nome input (nome ethernet)
-o Nome output (nome ethernet)
-j Jump (obiettivo della regola)
-m Corrispondenza estesa (potrebbe usare estensione)
-n output numerico di indirizzi e porte
-t Tabella da modificare
-v modo verbose
-x Numeri estesi (visualizza valori esatti)
-f Prende in considerazione solo secondi frammenti o altri
-V Versione del pacchetto
--line-numbers Numero della riga

Iniziare con bloccare tutti i pacchetti ICMP nella propria macchina, per familiarizzare con iptables.

Codice 5.1: Bloccare tutti i pacchetti ICMP

# iptables -A INPUT -p icmp -j DROP

Si specifica la chain nella quale dovrebbe essere aggiunta la regola, poi il protocollo del pacchetto coincidente e l'obiettivo. Quest'ultimo può essere il nome di una chain specificata dall'utente o uno degli obiettivi speciali ACCEPT, DROP, REJECT, LOG, QUEUE o MASQUERADE. In questo caso si usa DROP, che ignora il pacchetto senza la risposta al client.

Nota: L'obiettivo LOG è conosciuto come "non-terminating". Se un pacchetto coincide con una regola con l'obiettivo LOG, la valutazione della regola non si può interrompere, e il pacchetto continuerà a corrispondere a regole successive. Questo permette di loggare pacchetti mentre sono in processo normalmente.

Dare un ping localhost. Non si ottiene nessun messaggio di risposta, poichè iptables ignora tutti i messaggi ICMP in arrivo. Non si possono pingare altre macchine, perchè si ignora anche il pacchetto ICMP reply. Si elimina la chain.

Codice 5.2: Eliminare tutte le regole

# iptables -F

Si pone in rilievo il filtraggio di pacchetti completo in iptables. Se si vuole abilitare una ispezione completa dei pacchetti in arrivo su eth0, si digiti il comando:

Codice 5.3: Accettare i pacchetti originati da una connessione già stabilita

# iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

Nel comando sopra, si accettano pacchetti da una connessione già stabilita o associata nella chain INPUT. E si potrebbero eliminare i pacchetti che non sono nella tabella con iptables -A INPUT -i eth0 -m state --state INVALID -j DROP prima del comando precedente. Si abilita il filtraggio di pacchetti completo in iptables caricando l'estensione "state". Se si vuole permettere a altri di connettersi alla propria macchina, si potrebbe usare la flag --state NEW. Iptables contiene alcuni moduli per scopi differenti. Alcuni di questi sono:

Modulo Descrizione Opzioni estese
mac Verificare che l'estensione corrisponda ai pacchetti in arrivo su un mac address. --mac-source
state Abilitare ispezioni complete --state (state sono ESTABLISHED,RELATED, INVALID, NEW)
limit Definire un limite sul flusso --limit, --limit-burst
owner Cercare caratteristiche in base al creatore del pacchetto --uid-owner userid --gid-owner groupid --pid-owner processid --sid-owner sessionid
unclean Vari test sui pacchetti

Cercare di creare una chain definita dall'utente e applicarla a una chain esistente:

Codice 5.4: Creare una chain definita dall'utente

(Creare una nuova chain con una regola)
# iptables -X mychain
# iptables -N mychain
# iptables -A mychain -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
(Tutto il traffico in uscita è accettato. Quello in entrata no.)
# iptables -P OUTPUT ACCEPT
# iptables -P INPUT DROP
(Aggiungerla alla chain INPUT)
# iptables -A INPUT -j mychain

Applicando la regola alla chain input si ottiene: Tutti i pacchetti in uscita sono accettati e quelli in entrata no.

Si può trovare documentazione in Netfilter/iptables documentation.

Si vede un esempio completo.

  • Connessioni al firewall sono accettate solo attraverso SSH (porta 22)
  • La rete locale dovrebbe avere accesso a HTTP, HTTPS e SSH (anche a DNS)
  • Il traffico ICMP può contenere payload e non dovrebbe essere accettato. Solo certo traffico ICMP deve essere accettato.
  • Port scan dovrebbero essere rilevati e loggati
  • Attacchi SYN dovrebbero essere evitati
  • Tutto il traffico rimanente dovrebbe essere eliminato e loggato

Codice 5.5: /etc/init.d/firewall

#!/sbin/runscript
IPTABLES=/sbin/iptables
IPTABLESSAVE=/sbin/iptables-save
IPTABLESRESTORE=/sbin/iptables-restore
FIREWALL=/etc/firewall.rules
DNS1=212.242.40.3
DNS2=212.242.40.51
#inside
IIP=10.0.0.2
IINTERFACE=eth0
LOCAL_NETWORK=10.0.0.0/24
#outside
OIP=217.157.156.144
OINTERFACE=eth1

opts="${opts} showstatus panic save restore showoptions rules"

depend() {
  need net
}

rules() {
  stop
  ebegin "Setting internal rules"

  einfo "Setting default rule to drop"
  $IPTABLES -P FORWARD DROP
  $IPTABLES -P INPUT   DROP
  $IPTABLES -P OUTPUT  DROP

  #default rule
  einfo "Creating states chain"
  $IPTABLES -N allowed-connection
  $IPTABLES -F allowed-connection
  $IPTABLES -A allowed-connection -m state --state ESTABLISHED,RELATED -j ACCEPT
  $IPTABLES -A allowed-connection -i $IINTERFACE -m limit -j LOG --log-prefix \ 
      "Bad packet from ${IINTERFACE}:"
  $IPTABLES -A allowed-connection -j DROP

  #ICMP traffic
  einfo "Creating icmp chain"
  $IPTABLES -N icmp_allowed
  $IPTABLES -F icmp_allowed
  $IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \ 
      time-exceeded -j ACCEPT
  $IPTABLES -A icmp_allowed -m state --state NEW -p icmp --icmp-type \ 
      destination-unreachable -j ACCEPT
  $IPTABLES -A icmp_allowed -p icmp -j LOG --log-prefix "Bad ICMP traffic:"
  $IPTABLES -A icmp_allowed -p icmp -j DROP

  #Incoming traffic
  einfo "Creating incoming ssh traffic chain"
  $IPTABLES -N allow-ssh-traffic-in
  $IPTABLES -F allow-ssh-traffic-in
  #Flood protection
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \ 
      ALL RST --dport ssh -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \ 
      ALL FIN --dport ssh -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m limit --limit 1/second -p tcp --tcp-flags \ 
      ALL SYN --dport ssh -j ACCEPT
  $IPTABLES -A allow-ssh-traffic-in -m state --state RELATED,ESTABLISHED -p tcp --dport ssh -j ACCEPT

  #outgoing traffic
  einfo "Creating outgoing ssh traffic chain"
  $IPTABLES -N allow-ssh-traffic-out
  $IPTABLES -F allow-ssh-traffic-out
  $IPTABLES -A allow-ssh-traffic-out -p tcp --dport ssh -j ACCEPT

  einfo "Creating outgoing dns traffic chain"
  $IPTABLES -N allow-dns-traffic-out
  $IPTABLES -F allow-dns-traffic-out
  $IPTABLES -A allow-dns-traffic-out -p udp -d $DNS1 --dport domain \ 
      -j ACCEPT
  $IPTABLES -A allow-dns-traffic-out -p udp -d $DNS2 --dport domain \ 
     -j ACCEPT

  einfo "Creating outgoing http/https traffic chain"
  $IPTABLES -N allow-www-traffic-out
  $IPTABLES -F allow-www-traffic-out
  $IPTABLES -A allow-www-traffic-out -p tcp --dport www -j ACCEPT
  $IPTABLES -A allow-www-traffic-out -p tcp --dport https -j ACCEPT

  #Catch portscanners
  einfo "Creating portscan detection chain"
  $IPTABLES -N check-flags
  $IPTABLES -F check-flags
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -m limit \ 
      --limit 5/minute -j LOG --log-level alert --log-prefix "NMAP-XMAS:" 
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -m limit --limit \ 
      5/minute -j LOG --log-level 1 --log-prefix "XMAS:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL ALL -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG \ 
      -m limit --limit 5/minute -j LOG --log-level 1 --log-prefix "XMAS-PSH:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -m limit \ 
      --limit 5/minute -j LOG --log-level 1 --log-prefix "NULL_SCAN:"
  $IPTABLES -A check-flags -p tcp --tcp-flags ALL NONE -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -m limit \ 
      --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/RST:"
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit \ 
      --limit 5/minute -j LOG --log-level 5 --log-prefix "SYN/FIN:"
  $IPTABLES -A check-flags -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

  # Apply and add invalid states to the chains
  einfo "Applying chains to INPUT"
  $IPTABLES -A INPUT -m state --state INVALID -j DROP
  $IPTABLES -A INPUT -p icmp -j icmp_allowed
  $IPTABLES -A INPUT -j check-flags
  $IPTABLES -A INPUT -i lo -j ACCEPT
  $IPTABLES -A INPUT -j allow-ssh-traffic-in
  $IPTABLES -A INPUT -j allowed-connection

  einfo "Applying chains to FORWARD"
  $IPTABLES -A FORWARD -m state --state INVALID -j DROP
  $IPTABLES -A FORWARD -p icmp -j icmp_allowed
  $IPTABLES -A FORWARD -j check-flags
  $IPTABLES -A FORWARD -o lo -j ACCEPT
  $IPTABLES -A FORWARD -j allow-ssh-traffic-in
  $IPTABLES -A FORWARD -j allow-www-traffic-out
  $IPTABLES -A FORWARD -j allowed-connection

  einfo "Applying chains to OUTPUT"
  $IPTABLES -A OUTPUT -m state --state INVALID -j DROP
  $IPTABLES -A OUTPUT -p icmp -j icmp_allowed
  $IPTABLES -A OUTPUT -j check-flags
  $IPTABLES -A OUTPUT -o lo -j ACCEPT
  $IPTABLES -A OUTPUT -j allow-ssh-traffic-out
  $IPTABLES -A OUTPUT -j allow-dns-traffic-out
  $IPTABLES -A OUTPUT -j allow-www-traffic-out
  $IPTABLES -A OUTPUT -j allowed-connection

  #Allow client to route through via NAT (Network Address Translation)
  $IPTABLES -t nat -A POSTROUTING -o $OINTERFACE -j MASQUERADE 
  eend $?
}

start() {
  ebegin "Starting firewall"
  if [ -e "${FIREWALL}" ]; then
    restore
  else
    einfo "${FIREWALL} does not exists. Using default rules."
    rules
  fi
  eend $?
}

stop() {
  ebegin "Stopping firewall"
  $IPTABLES -F
  $IPTABLES -t nat -F
  $IPTABLES -X
  $IPTABLES -P FORWARD ACCEPT
  $IPTABLES -P INPUT   ACCEPT
  $IPTABLES -P OUTPUT  ACCEPT
  eend $?
}

showstatus() {
  ebegin "Status"
  $IPTABLES -L -n -v --line-numbers
  einfo "NAT status"
  $IPTABLES -L -n -v --line-numbers -t nat
  eend $?
}

panic() {
  ebegin "Setting panic rules"
  $IPTABLES -F
  $IPTABLES -X
  $IPTABLES -t nat -F
  $IPTABLES -P FORWARD DROP
  $IPTABLES -P INPUT   DROP
  $IPTABLES -P OUTPUT  DROP
  $IPTABLES -A INPUT -i lo -j ACCEPT
  $IPTABLES -A OUTPUT -o lo -j ACCEPT
  eend $?
}

save() {
  ebegin "Saving Firewall rules"
  $IPTABLESSAVE > $FIREWALL
  eend $?
}

restore() {
  ebegin "Restoring Firewall rules"
  $IPTABLESRESTORE < $FIREWALL
  eend $?
}

restart() {
  svc_stop; svc_start
}

showoptions() {
  echo "Usage: $0 {start|save|restore|panic|stop|restart|showstatus}"
  echo "start)      will restore setting if exists else force rules"
  echo "stop)       delete all rules and set all to accept"
  echo "rules)      force settings of new rules"
  echo "save)       will store settings in ${FIREWALL}"
  echo "restore)    will restore settings from ${FIREWALL}"
  echo "showstatus) Shows the status" 
}

Alcuni consigli sulla creazione di firewall:

  1. Creare le indicazioni che il firewall deve seguire prima di installarlo
  2. Farlo semplice
  3. Sapere come funziona ogni protocollo (leggere RFC(Request For Comments))
  4. Un firewall è una parte di software che si esegue da root.
  5. Testarlo

Se si pensa che iptables è difficile da capire o richiede un lungo setup, si può usare Shorewall. Usa iptables per generare le regole, e si concentra su esse e non su specifici protocolli.

12.f. Squid

Squid è un server proxy potente. Può filtrare il traffico basato sul tempo, espressioni regolari su path/URI, indirizzo IP sorgente e di destinazione, dominio, browser, user name autenticato, MIME type, e numero della porta (protocollo).

Nel seguente esempio si è aggiunto un filtro per i banner invece di uno basato sui siti porno. Gentoo.org non dovrebbe essere elencato tra i siti porno, e non si vuole perdere tempo a cercarne alcuni.

Le indicazioni:

  • Navigare sul web (HTTP/HTTPS) è permesso durante le ore lavorative (lun-ven 8-17 e sab 8-13), ma se gli impiegati sono al lavoro dopo queste ore, dovrebbero lavorare, non navigare
  • Non è permesso scaricare file (.exe, .com, .arj, .zip, .asf, .avi, .mpg, .mpeg, etc)
  • Non piacciono i banner, e sono filtrati e sostituiti con una gif trasparente.
  • Tutte le altre connessioni verso e da Internet sono negate.

Quattro sono i semplici passi.

Codice 6.1: /etc/squid/squid.conf

# Bind to a ip and port
http_port 10.0.2.1:3128

# Standard configuration
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY

# Add basic access control lists
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255

# Add who can access this proxy server
acl localnet src 10.0.0.0/255.255.0.0

# And ports
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl purge method PURGE

# Add access control list based on regular
# expressions within urls
acl archives urlpath_regex "/etc/squid/files.acl"
acl url_ads url_regex "/etc/squid/banner-ads.acl"

# Add access control list based on time and day
acl restricted_weekdays time MTWHF 8:00-17:00
acl restricted_weekends time A 8:00-13:00

acl CONNECT method CONNECT

#allow manager access from localhost
http_access allow manager localhost
http_access deny manager

# Only allow purge requests from localhost
http_access allow purge localhost
http_access deny purge

# Deny requests to unknown ports
http_access deny !Safe_ports

# Deny CONNECT to other than SSL ports
http_access deny CONNECT !SSL_ports

# My own rules

# Add a page do be displayed when
# a banner is removed
deny_info NOTE_ADS_FILTERED url_ads

# Then deny them
http_access deny url_ads

# Deny all archives
http_access deny archives

# Restrict access to work hours
http_access allow localnet restricted_weekdays
http_access allow localnet restricted_weekends

# Deny the rest
http_access deny all

Mettere i tipi di file che non si vuole che siano scaricati dagli utenti, qui si sono aggiunti zip, viv, exe, mp3, rar, ace, avi, mov, mpg, mpeg, au, ra, arj, tar, gz e z.

Codice 6.2: /etc/squid/files.acl

\.[Zz][Ii][pP]$
\.[Vv][Ii][Vv].*
\.[Ee][Xx][Ee]$
\.[Mm][Pp]3$
\.[Rr][Aa][Rr]$
\.[Aa][Cc][Ee]$
\.[Aa][Ss][Ff]$
\.[Aa][Vv][Ii]$
\.[Mm][Oo][Vv]$
\.[Mm][Pp][Gg]$
\.[Mm][Pp][Ee][Gg]$
\.[Aa][Uu]$
\.[Rr][Aa]$
\.[Aa][Rr][Jj]$
\.[Tt][Aa][Rr]$
\.[Gg][Zz]$
\.[Zz]$

Nota: Notare le [] con le maiuscole e le minuscole di ogni carattere. Questo perchè così non si può ingannare il filtro con l'accesso a un file chiamato AvI invece di avi.

Si aggiungono le espressioni regolari per identificare i banner.

Codice 6.3: /etc/squid/banner-ads.acl

/adv/.*\.gif$
/[Aa]ds/.*\.gif$
/[Aa]d[Pp]ix/
/[Aa]d[Ss]erver
/[Aa][Dd]/.*\.[GgJj][IiPp][FfGg]$
/[Bb]annerads/
/adbanner.*\.[GgJj][IiPp][FfGg]$
/images/ad/
/reklame/
/RealMedia/ads/.*
^http://www\.submit-it.*
^http://www\.eads.*
^http://ads\.
^http://ad\.
^http://ads02\.
^http://adaver.*\.
^http://adforce\.
adbot\.com
/ads/.*\.gif.*
_ad\..*cgi
/Banners/
/SmartBanner/
/Ads/Media/Images/
^http://static\.wired\.com/advertising/
^http://*\.dejanews\.com/ads/
^http://adfu\.blockstackers\.com/
^http://ads2\.zdnet\.com/adverts
^http://www2\.burstnet\.com/gifs/
^http://www.\.valueclick\.com/cgi-bin/cycle
^http://www\.altavista\.com/av/gifs/ie_horiz\.gif

E come ultima parte si vuole che sia mostrato questo file quando è rimosso un banner. E' un file metà HTML con una immagine gif 4x4 trasparente.

Codice 6.4: /etc/squid/errors/NOTE_ADS_FILTERED

<HTML>
<HEAD>
<META HTTP-EQUIV="REFRESH" CONTENT="0; URL=http://localhost/images/4x4.gif">
<TITLE>ERROR: The requested URL could not be retrieved</TITLE>
</HEAD>
<BODY>
<H1>Add filtered!</H1>

Nota: Non chiudere i tag <HTML> <BODY>. Sarà fatto da squid.

Come si può vedere, Squid ha molte possibilità e funziona bene come filtro e proxy. Possono essere usati proxy alternativi Squid per funzionare bene con una grande rete. La configurazione elencata va bene per una piccola rete di 1-20 utenti.

Usare il filtro di pacchetti (iptables) e il gateway di applicazione (Squid) è la migliore soluzione, anche se nessuno può accedere a Squid da fuori. Fare attenzione agli attacchi da dentro.

Si deve configurare il browser per usare il server proxy. Il gateway non permette il contatto con l'esterno agli utenti, a meno che si usi il proxy.

Nota: In Mozilla Firefox si deve andare in Edit->Preferences->Advanced->Network.

Si può usare iptables per mandare tutto il traffico outbound a un proxy Squid. Si aggiunge una regola forwarding/prerouting sul gateway:

Codice 6.5: Abilitare il portforwarding nel proxyserver

# iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to proxyhost:3128
# iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to proxyhost:3128

Nota: Se il proxy si esegue sull'host del filtraggio di pacchetti (non consigliato, può essere necessario non avere macchine libere), usare REDIRECT invece di DNAT (REDIRECT manda i pacchetti al localhost).

12.g. Lezioni imparate

Si è imparato che:

  1. Un firewall può essere un rischio. Un firewall configurato male è peggio che non averne uno.
  2. Come impostare un gateway di base e un proxy.
  3. Per avere un buon firewall si deve conoscere il protocollo che si vuole permettere.
  4. Che il traffico IP non sempre contiene dati sicuri, esempio pacchetti ICMP, che possono contenere pericolosi payload.
  5. Come prevenire un attacco SYN.
  6. Filtrare il traffico HTTP con la cancellazione di immagini offensive e scaricamenti di virus.
  7. Combinare filtri di pacchetti e gateway di applicazione fornisce un migliore controllo.

Se si è pronti, creare un firewall che corrisponda alle proprie esigenze.


[ << ] [ < ] [ Home ] [ > ] [ >> ]


Stampa

Visualizza tutto

Aggiornato il 2 aprile 2010

Oggetto: Filtrare i pacchetti.

Kim Nielsen
Autore

John P. Davis
Redazione

Eric R. Stockbridge
Redazione

Carl Anderson
Redazione

Jorge Paulo
Redazione

Sven Vermeulen
Redazione

Benny Chuang
Redazione

Sune Jeppesen
Redazione

Tiemo Kieft
Redazione

Zack Gilburd
Redazione

Dan Margolis
Redazione

Joshua Saddler
Redazione

Stefano Pacella
Traduzione

Cristiano Chiucchiolo
Traduzione

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.