Firewall

Che cosa è un firewall

  • Firewall significa letteralmente muro tagliafuoco, quindi è un componente che si pone tra noi ed il fuoco di Internet
  • Un muro tagliafuoco non è una difesa assoluta dal fuoco, ma può difendere dal fuoco, in base alla sua forza, per periodi maggiori o minori
  • Un Firewall, di fatto, è un sistema che consente di decidere quali comunicazioni sono lecite e quali no, in base a dei criteri

Che cosa è un firewall

  • I criteri possono essere i più diversi, come ad esempio:
    • Il protocollo (TCP, UDP, ICMP)
    • L'indirizzo IP del mittente
    • L'indirizzo IP del destinatario
    • La porta sorgente
    • La porta di destinazione
    • Se il pacchetto (TCP) fa parte di una comunicazione già instaurata

Che cosa è un firewall

  • Un firewall può essere esterno (un dispositivo di rete) oppure interno ad una macchina, che svolge altre funzioni

Cosa non fa un firewall

  • Un firewall non protegge dai virus
  • Un firewall non protegge da un attacco sferrato da una macchina interna
  • Un firewall non evita che una macchina esterna sfrutti un errore di programmazione di un server per prenderne possesso o mandarlo fuori servizio
  • Un firewall non può evitare che una macchina interna scarichi virus o trojan da servizi standard

Cosa fa un firewall

  • Un firewall può evitare che macchine esterne alla nostra rete attacchino macchine interne alla nostra rete
  • Un firewall può limitare l'accesso delle macchine interne alla rete esterna
  • Un firewall può tradurre gli indirizzi per consentire di accedere alla rete pubblica usando indirizzi privati per le macchine interne
  • Un firewall può consentire un'accesso regolamentato da parte della rete esterna verso alcuni server della rete interna (o meglio ad una rete destinata ai server pubblici)

Il firewall di Linux

  • Linux, a partire dal kernel 2.2, possiede un firewall incorporato nel suo software di rete (se configurato).
  • Nelle ultime versioni del kernel (2.4 e 2.6) questo firewall prende il nome di IPTABLES.
  • Questo firewall è molto completo e molto sofisticato e lavora a basso livello nel software di rete, per garantire un'ottima sicurezza
  • IPTABLES è adatto sia per realizzare un firewall esterno, che funga da router per una rete, sia per proteggere una macchina usata come server o come client.

Il firewall di Linux

  • La scrittura delle regole di filtraggio per IPTABLES può diventare molto complicata, quinid spesso ci si avvale di software di configurazione, alcuni dei quali sono a pagamento.

Le tabelle di IPTABLES - e la politica di default

  • IPTABLES divide le regole in tabelle, ognuna delle quali è associata a particolari operazioni.
  • A loro volta, le tabelle contengono una serie di catene, che vengono applicate ai pacchetti in particolari situazioni.
  • A sua volta, ogni catena è composta da una serie di regole, che vengono applicate una dopo l'altra ai pacchetti da filtrare
  • Se un pacchetto non viene riconosciuto da nessuna delle regole di una catena, esso viene gestito dalla politica di default

Le tabelle di IPTABLES - e la politica di default

  • La politica di default può indicare:
    • ACCEPT se i pacchetti vanno accettati, quindi lasciati passare
    • REJECT indica di scartare il pacchetto, inviando un messaggio ICMP di errore al mittente
    • DROP indica di scartare il pacchetto senza inviare risposta al mittente

Le tabelle di IPTABLES - filter

  • La tabella filter è la tabella su cui operiamo se non se ne indica un'altra con il parametro -t <tabella>
  • Questa tabella riguarda la normale gestione dei pacchetti, quindi cosa si accetta, cosa si trasferisce (routing) e cosa si produce.

Le tabelle di IPTABLES - filter

  • Questa tabella contiene tre code:
    • INPUT che gestisce i pacchetti destinati a questa macchina
    • OUTPUT che gestisce i pacchetti prodotti da questa macchina
    • FORWARD che gestisce i pacchetti entrati in questa macchina, ma destinati ad un'altra

Le tabelle di IPTABLES - filter

  • Naturalmente, perché la macchina trasferisca pacchetti da una rete ad un'altra non basta che le regole della catena FORWARD lo permettano. Il routing deve essere abilitato con il seguente comando:
    echo 1 > /proc/sys/net/ipv4/ip_forward

Le tabelle di IPTABLES - nat

  • La tabella NAT consente (come ovvio) di impostare le regole per il nat dei pacchetti.
  • Anche questa tabella contiene tre code:
    • PREROUTING per modificare i pacchetti che dovranno essere inoltrati ad un'altra macchina, prima del processo di inoltro.
    • POSTROUTING per modificare i paccheti che saranno inoltrati, subito prima che vengano mandati all'interfaccia di uscita
    • OUTPUT per modificare i paccheti prodotti in questa macchina

Le tabelle di IPTABLES - nat

  • Nelle regole di questa tabella potranno essere impiegate anche altre azioni:
    • DNAT modifica l'indirizzo di destinazione dei pacchetti e può essere usato solo nelle code PREROUTING e OUTPUT. Riciederà che si indichi anche il parametro --to-destination <indirizzo ip>[:<porta>]
    • MASQUERADE modifica la sorgente dei pacchetti, può essere inserito nella coda POSTROUTING e và associato ad un'interfaccia, per consentire di condividere una connessione con IP dinamico
    • SNAT modifica l'indirizzo di sorgente, come MASQUERADE, ma utilizzando un IP fisso, da indicare con il parametro --to-source <indirizzo ip>; può essere usato solo nella catena POSTROUTING.

Le tabelle di IPTABLES - mangle

  • Questa tabella è utilizzata per speciali azioni che modificano i pacchetti
  • Tramite questa tabella è possibile fare una serie di azioni che possono consentire di evitare alcuni tipi di attacco
  • Questa tabella contiene cinque code, corrispondenti a tutte le code delle tabelle precedenti, vale a dire INPUT, OUTPUT, FORWARD, PREROUTING e POSTROUTING
  • Le operazioni che si fanno con queste code richiedono una conoscenza molto approfondita dei protocolli TCP/IP, quindi non ne parleremo

Le tabelle di IPTABLES - mangle

  • Se, nel guardare la configurazione di qualche firewall, ne troverete, saprete a cosa si riferiscono.

Le regole

  • Una regola deve indicare dei criteri per selezionare dei pacchetti ed una azione da fare con i pacchetti selezionati

Le regole

  • Per selezionare un pacchetto potremo indicare i seguenti parametri del comando IPTABLES:
    • -s [!] indirizzo[/maschera] per indicare o escludere uno o più indirizzi di sorgente
    • -d [!] indirizzo[/maschera] per indicare o escludere uno o più indirizzi di destinazione
    • -i interfaccia per indicare l'interfaccia da cui è entrato il pacchetto
    • -o interfaccia per indicare l'interfaccia da cui deve uscire il pacchetto
    • -p protocollo indica il protocollo del pacchetto (TCP, UDP, ICMP)
    • --dports porte per indicare la porta di destinazione de pacchetti
    • --sports porta per indicare le porte di partenza del pacchetto

Le regole - azioni

  • Una volta individuati i pacchetti, occorre indicare che cosa farne.
  • Per indicare l'azione da fare si indica l'opzione -j <azione>

Le regole - azioni

  • Come azione si possono usare gli stessi valori usati per la politica di default, vale a dire:
    • ACCEPT se i pacchetti vanno accettati, quindi lasciati passare
    • REJECT indica di scartare il pacchetto, inviando un messaggio ICMP di errore al mittente
    • DROP indica di scartare il pacchetto senza inviare risposta al mittente

Le regole - azioni

  • Oltre a queste azioni si può usare:
    • LOG per produrre un messaggio nei log di sistema
    • coda si può indicare il nome di una coda, usato in qualche modo come una procedure nei linguaggi di programmazione

Un esempio di protezione di un server

  • Se noi dobbiamo configurare un server (ma anche un client), sarà opportuno che lasciamo aperte solo le porte che effettivamente ci servono
  • In prima approssimazione potremo consentire alla nostra macchina di accedere a qualunque altra macchina per qualunque servizio, mentre all'esterno saranno accessibili solo i servizi che effettivamente intendiamo concedere al pubblico
  • Le modifiche che dovremo fare saranno nella tabella filter
  • Non dobbiamo inoltrare pacchetti altrui, quindi non toccheremo la catena FORWARD

Un esempio di protezione di un server

  • Tutte le chiamate dall'interno sono lecite, quindi imposteremo la politica ACCEPT per la coda OUTPUT, che lasceremo peraltro vuota

Un esempio di protezione di un server - lo script

  • Lo script per realizzare questa protezione è il seguente:
    #!/bin/bash
    # Consente accesso solo a WEB (port 80) ed FTP (port 21)
    # Posso andare dovunque
    iptables -P OUTPUT ACCEPT
    # Inizio con politica "aperta" (pericolosetto nel reale)
    iptables -P INPUT ACCEPT
    ## Comincio il lavoro vero
    ## Accetto i pacchetti delle connessioni secondarie (RELATED)
    ## e gia' aperte (ESTABLISHED)
    iptables -A INPUT --protocol tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
    ## Accetto i pacchetti delle connessioni gia' aperte (ESTABLISHED)
    iptables -A INPUT --protocol udp -m state --state ESTABLISHED -j ACCEPT
    ## Accetto i pacchetti destinati alle porte 80 e 21, protocollo TCP
    iptables -A INPUT --protocol tcp --destination-port 80 -j ACCEPT
    iptables -A INPUT --protocol tcp --destination-port 21 -j ACCEPT
    ## Accetto tutti i pacchetti ICMP
    iptables -A INPUT --protocol icmp -j ACCEPT
    #Aggiungo una regola per fare il reject dei paccheti TCP ed una per l'UDP
    iptables -A INPUT --protocol tcp -j REJECT
    iptables -A INPUT --protocol udp -j REJECT
    ## Tutto il resto lo scarto
    iptables -P INPUT DROP

Un esempio di firewall con tre zone

  • Se vogliamo usare la nostra macchina come firewall per la rete, dovremo incominciare a prendere in considerazione il forwarding
  • Dovremo accettare i pacchetti che provengono dalla rete interna e vanno verso la esterna o alla DMZ
  • Dovremo accettare i pacchetti che provengono dalla DMZ e vanno verso la rete esterna
  • Dovremo accettare i pacchetti provenienti dall'esterno e diretti verso le porte abilitate del server nella DMZ

Un esempio di firewall con tre zone

  • Dovremo, come al solito, accettare i pacchetti correlati o appartenenti ad una connessione aperta
  • Dovremo prendere delle decisioni relative ai pacchetti ICMP (per ora li facciamo passare tutti)
  • Potremo aggiungere delle regole per scartare in modo "cortese" i pacchetti non accettati
  • La politica di default sarà di scartare il resto

Un esempio di firewall con tre zone - lo script

  • Lo script per realizzare questo firewall è il seguente:
    #!/bin/bash
    ## RETE:
    ## 10.0.155.0 -> esterna (10.0.155.155)
    ## 192.168.1.0 -> interna (192.168.1.251)
    ## 172.16.0.0 -> DMZ (172.16.0.1)
    ## 172.16.0.2 -> Server (web/ftp)
    ## Sulla macchina locale, nulla
    ##iptables -P OUTPUT ACCEPT
    # Inizio con politica "aperta" (pericolosetto nel reale)
    iptables -P INPUT ACCEPT
    ## disabilito il routing
    iptables -P FORWARD DROP# Per finire abilita il routing
    echo 1 > /proc/sys/net/ipv4/ip_forward
    ## Comincio il lavoro vero
    ## Accetto i pacchetti delle connessioni secondarie (RELATED)
    ## e gia' aperte (ESTABLISHED)
    iptables -A INPUT --protocol tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
    ## Accetto i pacchetti delle connessioni gia' aperte (ESTABLISHED)
    iptables -A INPUT --protocol udp -m state --state ESTABLISHED -j ACCEPT
    ## Accetto tutto il traffico per localhost
    iptables -A INPUT -d 127.0.0.1 -j ACCEPT
    ## Accetto tutti i pacchetti ICMP
    iptables -A INPUT --protocol icmp -j ACCEPT
    #Aggiungo una regola per fare il reject dei paccheti TCP ed una per l'UDP
    iptables -A INPUT --protocol tcp -j REJECT
    iptables -A INPUT --protocol udp -j REJECT
    ## Tutto il resto lo scarto
    iptables -P INPUT DROP
    ## Adesso gestisco il routing:
    ## Accetto i pacchetti delle connessioni secondarie (RELATED)
    ## e gia' aperte (ESTABLISHED)
    iptables -A FORWARD --protocol tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
    ## Accetto i pacchetti delle connessioni gia' aperte (ESTABLISHED)
    iptables -A FORWARD --protocol udp -m state --state RELATED,ESTABLISHED -j ACCEPT
    ## Faccio passare tutti gli ICMP
    iptables -A FORWARD --protocol icmp -j ACCEPT
    ## Da interna ad esterna, tutto
    iptables -A FORWARD -s 192.168.1.0/255.255.255.0 -o eth0 -j ACCEPT
    ## Da interna a DMZ, tutto
    iptables -A FORWARD -s 192.168.1.0/255.255.255.0 -o eth1 -j ACCEPT
    ## Da dmz ad esterna, tutto
    iptables -A FORWARD -s 172.16.0.0/255.255.0.0 -o eth0 -j ACCEPT
    ## Accetto i pacchetti destinati alle porte 80 e 21, protocollo TCP
    iptables -A FORWARD -d 172.16.0.2 --protocol tcp --destination-port 80 -jACCEPT
    iptables-AFORWARD -d 172.16.0.2 --protocol tcp --destination-port 21 -j ACCEPT
    #Aggiungo una regola perfare il reject dei paccheti TCP ed una per l'UDP
    iptables -A FORWARD --protocol tcp -j REJECT
    iptables -A FORWARD --protocol udp -j REJECT

Aggiungiamo il NAT al router con tre zone

  • Se ora vogliamo aggiungere il NAT, dovremo incominciare a lavorare con la tabella NAT
  • Dovremo aggiungere due regole nella catena POSTROUTING che indichino di fare il SNAT dei pacchetti provenienti da rete interna e DMZ
  • Dovremo anche aggiungere una riga nella catena PREROUTING che indichi il DNAT verso la macchina server, indicando a quali pacchetti applicarla

Aggiungiamo il NAT al router con tre zone - lo script

  • Per realizzare questo firewall si può usare il seguente script:
    #!/bin/bash
    ## RETE:
    ## 10.0.155.0 -> esterna (10.0.155.155)
    ## 192.168.1.0 -> interna (192.168.1.251)
    ## 172.16.0.0 -> DMZ (172.16.0.1)
    ## 172.16.0.2 -> Server (web/ftp)
    ## Sulla macchina locale, nulla
    ##
    iptables -P OUTPUT ACCEPT
    # Inizio con politica "aperta" (pericolosetto nel reale)
    iptables -P INPUT ACCEPT
    # Per finire abilita il routing
    echo 1 > /proc/sys/net/ipv4/ip_forward
    # Svuota tutte le catene di "filter"
    iptables -F
    # Svuota tutte le catene di "nat"
    iptables -t nat -F
    ## Comincio il lavoro vero
    ## Accetto i pacchetti delle connessioni secondarie (RELATED)
    ## e gia' aperte (ESTABLISHED)
    iptables -A INPUT --protocol tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
    ## Accetto i pacchetti delle connessioni gia' aperte (ESTABLISHED)
    iptables -A INPUT --protocol udp -m state --state ESTABLISHED -j ACCEPT
    ## Accetto tutto il traffico per localhost
    iptables -A INPUT -d 127.0.0.1 -j ACCEPT
    ## Accetto tutti i pacchetti ICMP
    iptables -A INPUT --protocol icmp -j ACCEPT
    #Aggiungo una regola per fare il reject dei paccheti TCP ed una per l'UDP
    iptables -A INPUT --protocol tcp -j REJECT
    iptables -A INPUT --protocol udp -j REJECT
    ## Tutto il resto lo scarto
    iptables -P INPUT DROP
    ## Adesso gestisco il routing:
    ## Accetto i pacchetti delle connessioni secondarie (RELATED)
    ## e gia' aperte (ESTABLISHED)
    iptables -A FORWARD --protocol tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
    ## Accetto i pacchetti delle connessioni gia' aperte (ESTABLISHED)
    iptables -A FORWARD --protocol udp -m state --state ESTABLISHED -j ACCEPT
    ## Faccio passare tutti gli ICMP
    iptables -A FORWARD --protocol icmp -j ACCEPT
    ## Da interna ad esterna, tutto
    iptables -A FORWARD -s 192.168.1.0/255.255.255.0 -o eth0 -j ACCEPT
    ## Da interna a DMZ, tutto
    iptables -A FORWARD -s 192.168.1.0/255.255.255.0 -o eth1 -j ACCEPT
    ## Da dmz ad esterna, tutto
    iptables -A FORWARD -s 172.16.0.0/255.255.0.0 -o eth0 -j ACCEPT
    ## Accetto i pacchetti destinati alle porte 80 e 21, protocollo TCP
    iptables -A FORWARD -d 172.16.0.2 --protocol tcp --destination-port 80 -j ACCEPT
    iptables -A FORWARD -d 172.16.0.2 --protocol tcp --destination-port 21 -j ACCEPT
    #Aggiungo una regola per fare il reject dei paccheti TCP ed una per l'UDP
    iptables -A FORWARD --protocol tcp -j REJECT
    iptables -A FORWARD --protocol udp -j REJECT
    ##Adesso mi occupo della tabella NAT
    ## Eseguo il NAT dalla rete interna verso l'esterno
    iptables -t nat -A POSTROUTING -s 192.168.1.0/255.255.255.0 -o eth0 -j SNAT --to-source 10.0.155.155
    ## Eseguo il NAT dalla DMZ verso l'esterno
    iptables -t nat -A POSTROUTING -s 172.16.0.0/255.255.0.0 -o eth0 -j SNAT --to-source 10.0.155.155
    ## Eseguo il NAT inverso per il server WEB ed FTP
    iptables -t nat -A PREROUTING -d 10.0.155.155 --protocol tcp --destination-port 80 -j DNAT --to-destination 172.16.0.2
    iptables -t nat -A PREROUTING -d 10.0.155.155 --protocol tcp --destination-port 21 -j DNAT --to-destination 172.16.0.2
[any material that should appear in print but not on the slide]