• Firewall: IP Tables un esempio su Linux

    Date: 2012.01.11 | Category: Sicurezza dei Sistemi Informatici | Tags:

    Un firewall (dall’inglese muro anticendio) è necessario perché le reti sono contigue l’una all’altra tramite dispositivi di rete router o switch. Se una rete viene attaccata, dobbiamo trovare un meccanismo che ci permetta di impedire che tale l’attacco si propaghi anche nella altre reti.

    Il punto dove si posiziona un firewall non è tra internet e la vostra rete (questo è uno dei possibili punti) ma in termini più generali si posiziona tra due reti con due livelli di sicurezza differenti.

    La rete con maggior sicurezza viene chiamata “rete interna” mentre quella con minor livello di sicurezza “rete esterna“.

    Quindi un firewall si posiziona in tutti i punti in cui ci siano due livelli di sicurezza differenti.

    Attenzione che un firewall ci protegge solo dove è chiuso, dove è aperto non ci protegge per niente.

    Ingress vs Egress Firewall

    Un firewall controlla una comunicazione di tipo bidirezionale. Spesso si distingue la funzionalità di “ingress” ed “egress” firewall.

    L’ingress firewall gestisce i collegamenti “incoming” (attenzione collegamenti non pacchetti) – è il tipico caso che si verifica quando dall’esterno vogliano comunicare con la nostra macchina. Ad esempio, aprire un canale TCP verso il mio server WEB è INGRESS.

    Nell’egress firewall si gestiscono i collegamenti “outgoing” e si controlla l’attività del personale.
    Questa per le aziende, è un attività importante perché è anche responsabile civile l’amministratore delegato dell’azienda stessa.

    La distinzione tra INGRESS / EGRESS firewall è molto semplice per tutti quei servizi orientati ai client. In tutte le applicazioni basati su TCP (connection oriented), chi inizia il collegamento è colui che manda il pacchetto SYN. Se invece si utilizza un protocollo connectionless come UDP, determinare la direzione del collegamento non è banale. Inoltre, siccome UDP non è affidabile, non è detto che cisano tutti i datagrammi e risulta molto più complicato determinare il termine della comunicazione.

    I tre comandamenti del firewall (D.Cheswick e S.Bellowin)

    1. Il FIREWALL deve essere l’unico punto di contatto della rete interna con quella esterna
    2. Solo il traffico autorizzato può attraversare il FIREWALL
    3. Il FIREWALL deve essere un sistema altamente sicuro esso stesso

    Il primo “comandamento” ci indica che il firewall deve essere l’unico punto di contatto tra la rete interna ed esterna. Si pensi al caso in cui i dipendenti usano le chiavette per collegarsi ad internet per navigare su siti come Facebook. Questo per il gestore della sicurezza aziendale è un vero incubo perché quel traffico non è protetto da firewall e quindi potenzialmente attaccabile dai “cattivi”. Un altro caso comune, è collegarsi a una rete wifi vicina che non è protetta per navigare su internet.

    Il secondo “comandamento” ci dice che solo il traffico autorizzato può attraversare il FIREWALL – ma cosa vuol dire esattamente “autorizzato” ? Non è semplice definirlo.

    Il terzo comandamento dice che il firewall deve essere un sistema altamente sicuro esso stesso,nel senso che DEVE avere SOLO quel compito. Su un firewall non bisogna mettere su altri software che non è quello di sicurezza, perché se quel software ha un baco, l’attaccante entra nel FIREWALL stesso.
    I componenti del firewall devono essere elementi dedicati e sicuri.

    L’indicie della sicurezza

    Più aumenta la sicurezza e meno abbiamo la funzionalità.
    Più aumenta la funzionalità meno abbiamo la sicurezza.

    Politiche di autorizzazione

    Esistono due politiche di autorizzazione:

    1. Tutto ciò che non è espressamente permesso è vietato
    2. Tutto ciò che non è espressamente vietato è permesso

    Nella prima si ha maggior sicurezza ma è più difficile da gestire.
    Nella seconda si ha minor sicurezza (porte aperte) ma è più facile da gestire.

    Tra le due, la migliore è la prima: questa cosa è permessa e tutto il resto è vietato. Se non ci serve una porta, perché aprirla? Potrebbe essere fonte di problema.

    Considerazioni sui Firewall

    In generale è consigliabile creare un sistema semplice applicando la regola KISS (Keep It Simple Stupid) poiché più un sistema è complicato più è difficile da verificare.

    Ad esempio, l’inventore di DJBDNS ha usato la regola KISS applicandola anche alle librerie. Nel momento in cui ad esempio in c utilizziamo la funzione strcopy, in realtà includiamo la string.h (ma tutte le altre funzione della string.h non ci servono!!!). Questa è una buona regola di programmazione sicura.

    Un software contiene certamente dei bachi. Se il programma viene mandato in esecuzione, diventa un processo e di conseguenza un problema di sicurzza.
    Sul firewall bisogna far girare i processi essenziali. Questo è un lavoro molto importante difficile da applicare su sistemi operativi come Windows poiché è complicato capire cosa fanno i processi.
    Per questo motivo i firewall si fanno con Linux.

    Un firewall non è una macchina general purposte, quindi no software e no utenti.

    Il principio è che ognuno è colpevole finché non si dimostra che è innocente (per le persone il principio è il contrario ;-) )

    IPTABLES

    IP Tables fornisce funzionalità di manipolazione e filtraggio di pacchetti IP. IPtables si basa sul concetto di “chain”.
    Ma che cos’è una chain? Una chain non è altro che una lista ordinata di regole a cui è associata una politica di default.
    Esistono, per il filtraggio dei pacchetti, tre catene predefinite:

    • INPUT, contiene le regole che devono essere applicate ai pacchetti diretti alla macchina su cui è installato IPtables che si sta configurando;
    • OUTPUT, contiene le regole che devono essere applicate ai pacchetti in uscita dalla macchina su cui è installato IPtables che si sta configurando;
    • FORWARD, contiene le regole che devono essere applicate ai pacchetti che non provengono e non sono diretti alla macchina su cui e` installato IPtables ma che, se l’IP forwarding è abilitato, verranno inoltrati verso una specifica interfaccia.

    Come configurare IPTABLES

    IPtables può essere configurato con il comando iptables (man iptables per maggiori informazioni). Di seguito una lista dei principali comandi:

    • l’opzione -P chain target permette di modificare la politica di autorizzazione di default della cate- na chain (INPUT, OUTPUT, FORWARD o personalizzate) impostandola al valore target
    • -A chain e -I chain permettono di aggiunge una nuova regola rispettivamente in coda e in testa alla
      catena chain;
    • -D chain e -R chain permettono di cancellare o sostituire una regola in chain (tramite l’ordinale, se e`
      noto, o tramite un indirizzo IP);
    • -F [chain] cancella tutte le regole presenti in chain o tutte le catene, se non viene specificato il valore
      di chain (attenzione: la politica di default non viene pero` modificata).
    • -N chain crea una nuova catena di nome chain;
    • -X chain cancella la catena chain, creata dall’utente.

    Si mostra di seguito l’utilizzo del comando necessario a re-inizializzare tutte le catene:

    iptables -F

    oppure solo una, quella passata come parametro (in questo caso quella di OUTPUT):

    iptables -F OUTPUT

    Quando si specifica una regola di filtraggio, è necessario fare riferimento a diverse porzioni del pacchetto IP.
    Per questo IP Tables mette a disposizione una serie di comandi (la lista completa disponibile tramite man):

    • -s IP source, indirizzo IP sorgente;
    • 

    • -d IP dest, indirizzo IP destinazione;
    • 

    • –sport porta, porta sorgente;
    • 

    • –dport porta, porta destinazione;
    • 

    • -i interfaccia, interfaccia di invio/ricezione del pacchetto (catena di INPUT);
    • 

    • -o interfaccia, interfaccia di invio/ricezione del pacchetto (catena di OUTPUT);
    • 

    • -p proto, protocollo (es. tcp, udp);
    • 

    • -j azione, azione da intraprendere (il target in terminologia IP Tables);
    • 

    • -y o –syn, nel caso di opzione -p tcp, identifica un pacchetto con (solo) il flag SYN abilitato;
    • 

    • –icmp-type tipo, equivalente a -p icmp, tipo specifica il tipo di pacchetto ICMP
    • 

    • -l, abilita il log del risultato della valutazione di una regola in tramite syslog in /var/log/messages

    Azioni sui pacchetti

    Le azioni da intraprendere, in terminologia IP Tables i “target” sono i seguenti:
    

    • ACCEPT, accetta il pacchetto;
    • DROP, scarta il pacchetto e non invia notifica;
    •  REJECT, scarta il pacchetto ma invia una notifica, sconsigliato nella maggior parte dei casi perché accelera
      le procedure di scanning. Di default, viene inviato un pacchetto di tipo “ICMP port unreachable”, tuttavia
      questo pu`o essere cambiato impostando l’opzione –reject-with;
    •  RETURN, impone l’applicazione della default action anche se non `e stata esaminata tutta la catena.

    Visualizzare lo stato del Firewall

    Per visualizzare lo stato del firewall:

    iptables -L -n -v

    dove -L sta per List rules, -v per ottenere delle informazioni dettagliate mentre -n visualizza gli indirizzi ip e le porte in formato numerico senza usare un server DNS per risolvere i nomi.

    Esempi di configurazione IP TABLES

    Per bloccare un’indirizzo ip (esempio un attaccante):

    iptables -A INPUT -s 1.2.3.4 -j DROP

    dove 1.2.3.4 è l’indirizzo ip della macchina che vogliamo bloccare.

    Per bloccare un dominio (es. Facebook.com):

    iptables -A OUTPUT -p tcp -d www.facebook.com -j DROP
    iptables -A OUTPUT -p tcp -d facebook.com -j DROP

    Per bloccare le richieste ICMP:

    iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
    iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP

    Aprire un range di porte:

    iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT

    Aprire / Chiudere porte comuni:

    Replace ACCEPT with DROP to block port:
    ## open port ssh tcp port 22 ##
    iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
    iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT
     
    ## open cups (printing service) udp/tcp port 631 for LAN users ##
    iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT
    iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT
     
    ## allow time sync via NTP for lan users (open udp port 123) ##
    iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT
     
    ## open tcp port 25 (smtp) for all ##
    iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT
     
    # open dns server ports for all ##
    iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
    iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
     
    ## open http/https (Apache) server port to all ##
    iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
    iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT
     
    ## open tcp port 110 (pop3) for all ##
    iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT
     
    ## open tcp port 143 (imap) for all ##
    iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT
     
    ## open access to Samba file server for lan users only ##
    iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT
    iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT
    iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT
    iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT
     
    ## open access to proxy server for lan users only ##
    iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT
     
    ## open access to mysql server for lan users only ##
    iptables -I INPUT -p tcp --dport 3306 -j ACCEPT