Firewall

Introduzione

Il kernel Linux include il sottosistema Netfilter usato per manipolare o decidere la sorte del traffico di rete diretto all'interno o attraverso un server. Tutte le moderne soluzioni firewall per Linux si basano su questo sistema di filtraggio dei pacchetti.

Il sistema di filtraggio dei pacchetti del kernel non è di grande utilità per gli amministratori senza un'interfaccia nello spazio utente per gestirlo. Questo è il compito di iptables. Quando un pacchetto raggiunge il proprio server, esso è gestito affidato al sottosistema Netfilter per l'accettazione, la manipolazione oppure il rifiuto secondo quanto stabilito da regole fornite al sottosistema dallo spazio utente attraverso iptables. Quindi, iptables è tutto ciò che è necessario per gestire il proprio firewall, a patto che si abbia la dimestichezza necessaria; sono comunque disponibili molte altre applicazioni per semplificare tale attività.

ufw - Firewall non complicato

L'applicazione predefinita in Ubuntu per la configurazione di un firewall è ufw. Sviluppato per semplificare la configurazione di iptables, ufw offre un modo semplice per creare un firewall basato su protocolli IPv4 e IPv6.

ufw, in modo predefinito, è inizialmente disabilitato. Dal manuale di ufw si legge:

«ufw is not intended to provide complete firewall functionality via its command interface, but instead provides an easy way to add or remove simple rules. It is currently mainly used for host-based firewalls (ufw non ha lo scopo di implementare tutte le funzionalità di un firewall tramite la sua interfaccia di comandi, ma invece cerca di facilitare l'aggiunta o la rimozione di semplici regole. È usato principalmente per dei firewall host-based)»

Seguono degli esempi sull'uso di ufw:

  • Per prima cosa, è necessario abilitare ufw. In un terminale digitare:

    sudo ufw enable
    
  • Per aprire una porta (in questo caso la porta di SSH):

    sudo ufw allow 22
    
  • Le regole possono anche essere aggiunte usando un formato a numeri:

    sudo ufw insert 1 allow 80
    
  • Analogamente, per chiudere una porta aperta:

    sudo ufw deny 22
    
  • Per eliminare una regola, usare «delete» seguito dalla regola:

    sudo ufw delete deny 22
    
  • È anche possibile consentire l'accesso da host o da reti specifici a una porta. Il seguente esempio consente accesso SSH dall'host 192.168.0.2 a qualsiasi indirizzo IP su questo host:

    sudo ufw allow proto tcp from 192.168.0.2 to any port 22
    

    Sostituire 192.168.0.2 con 192.168.0.0/24 per consentire accesso SSH da tutta la sotto-rete.

  • Aggiungendo l'opzione --dry-run a un comando ufw è possibile visualizzare il risultato delle regole, ma senza applicarle. Per esempio, questo è quello che verrebbe applicato nel caso venisse aperta la porta HTTP:

    sudo ufw --dry-run allow http
    
    *filter
    :ufw-user-input - [0:0]
    :ufw-user-output - [0:0]
    :ufw-user-forward - [0:0]
    :ufw-user-limit - [0:0]
    :ufw-user-limit-accept - [0:0]
    ### RULES ###
    
    ### tuple ### allow tcp 80 0.0.0.0/0 any 0.0.0.0/0
    -A ufw-user-input -p tcp --dport 80 -j ACCEPT
    
    ### END RULES ###
    -A ufw-user-input -j RETURN
    -A ufw-user-output -j RETURN
    -A ufw-user-forward -j RETURN
    -A ufw-user-limit -m limit --limit 3/minute -j LOG --log-prefix "[UFW LIMIT]: "
    -A ufw-user-limit -j REJECT
    -A ufw-user-limit-accept -j ACCEPT
    COMMIT
    Rules updated
    
  • È possibile disabilitare ufw con il comando:

    sudo ufw disable
    
  • Per visualizzare lo stato del firewall usare:

    sudo ufw status
    
  • Per informazioni più dettagliate usare:

    sudo ufw status verbose
    
  • Per visualizzare il formato a numeri:

    sudo ufw status numbered
    
[Nota]

Se la porta che si vuole aprire o chiudere è definita in /etc/services, è possibile usare il nome della porta al posto del numero. In questo esempio si sostituisce 22 con ssh.

Questa è una breve introduzione all'utilizzo di ufw. Per maggiori informazioni, consultare le pagine man di ufw.

Integrazione delle applicazioni con ufw

Le applicazioni che aprono delle porte possono includere un profilo ufw in cui vengono descritte le porte necessarie all'applicazione per funzionare correttamente. I profili vengono salvati in /etc/ufw/applications.d e possono essere modificati se le porte predefinite sono cambiate.

  • Per visualizzare quali applicazioni hanno un profilo installato, in un terminale digitare:

    sudo ufw app list
    
  • Usare un profilo di un'applicazione è simile al consentire il traffico attraverso una porta:

    sudo ufw allow Samba
    
  • È disponibile anche una sintassi più estesa:

    ufw allow from 192.168.0.0/24 to any app Samba
    

    Sostituire Samba e 192.168.0.0/24 con il profilo dell'applicazione da usare e l'intervallo di indirizzi della propria rete.

    [Nota]

    Non è necessario specificare il protocollo per l'applicazione, dato che queste informazioni sono contenute nel profilo. Notare che il nome dell'applicazione sostituisce il numero della porta.

  • Per visualizzare i dettagli riguardo quali porte, protocolli, ecc... sono definiti per un'applicazione, digitare:

    sudo ufw app info Samba
    

Non tutte le applicazioni che richiedono l'apertura di una porta hanno un profilo ufw, ma se è stato creato un profilo per un'applicazione e lo si vuole includere nel pacchetto, segnalare un bug su Launchpad.

IP masquerading

Il compito dell'IP masquerading è di consentire a quei computer della rete forniti di indirizzi IP privati e non instradabili, di accedere a Internet tramite il computer che opera il masquerading. Il traffico che va dalla rete privata verso Internet deve essere manipolato per ottenere risposte che siano re-instradabili al computer che ne ha fatto richiesta. Per ottenere questo risultato, il kernel deve modificare l'indirizzo IP sorgente di ciascun pacchetto affinché tali risposte vengano re-instradate a esso invece che all'indirizzo IP privato che ha fatto la richiesta, procedura impossibile da eseguire su Internet. Linux fa uso del tracciamento della connessione (conntrack) per tenere traccia di quale connessione appartenga a quale computer e di conseguenza per re-instradare ciascun pacchetto di risposta. Il traffico in uscita dalla rete privata viene quindi "mascherato" per simulare l'uscita dalla macchina gateway Ubuntu. Nella documentazione Microsoft questo processo è indicato come condivisione delle connessioni internet (Internet Connection Sharing).

Masquerading con ufw

L'IP masquerading può essere ottenuto utilizzando regole ufw personalizzate. Questo è possibile dato che il backend attuale per ufw è iptables-restore con i file delle regole posizionati in /etc/ufw/*.rules. Questi file possono essere usati per aggiungere vecchie regole di iptables usate senza ufw e regole maggiormente legate al gateway o al bridge.

Le regole sono divise in due file diversi, regole da eseguire prima delle regole a riga di comando di ufw e regole da eseguire dopo ufw.

  • Per prima cosa, è necessario abilitare l'inoltro dei pacchetti modificando due file di configurazione. In /etc/default/ufw modificare DEFAULT_FORWARD_POLICY in «ACCEPT»:

    DEFAULT_FORWARD_POLICY="ACCEPT"
    

    Quindi modificare il file /etc/ufw/sysctl.conf de-commentando:

    net.ipv4.ip_forward=1
    

    Similmente, per abilitare l'inoltro con IPv6 de-commentare:

    net.ipv6.conf.default.forwarding=1
    
  • Ora verranno aggiunte delle regole al file /etc/ufw/before.rules. Le regole predefinite configurano solamente la tabella filter e per abilitare il masquerading è necessario configurare la tabella nat. Aggiungere all'inizio del file, subito dopo i commenti dell'intestazione, quanto segue:

    # regole tabella nat
    *nat
    :POSTROUTING ACCEPT [0:0]
    
    # Inoltro traffico da eth1 attraverso eth0
    -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
    
    # non cancellare la riga 'COMMIT' o queste tabelle di regole non saranno elaborate
    COMMIT
    

    I commenti non sono necessari, ma è buona pratica documentare le proprie configurazioni. Inoltre, quando si modificano i file rules in /etc/ufw, assicurarsi che queste righe siano sempre le ultime in ogni tabella modificata:

    # non eliminare la riga 'COMMIT' o queste tabelle di regole non saranno elaborate
    COMMIT
    

    Per ogni tabella è necessario un COMMIT. In questi esempi sono mostrate solamente le tabelle nat e filter, ma è possibile aggiungere regole per le tabelle raw e mangle.

    [Nota]

    Nell'esempio precedente, sostituire eth0, eth1 e 192.168.0.0/24 con le interfacce appropriate e con l'intervallo di indirizzi corretto.

  • Infine, disattivare e riattivare ufw per applicare le modifiche:

    sudo ufw disable && sudo ufw enable
    

L'IP masquerading ora dovrebbe essere abilitato. È possibile aggiungere regole FORWARD aggiuntive al file /etc/ufw/before.rules. È utile che queste regole addizionali vengano aggiunte alla catena ufw-before-forward.

Masquerading con iptables

È possibile anche utilizzare iptables per abilitare il masquerading.

  • Similmente a ufw, il primo passo per abilitare l'inoltro di pacchetti con IPv4 è quello di modificare il file /etc/sysctl.conf e de-commentare la seguente riga:

    net.ipv4.ip_forward=1
    

    Per abilitare l'inoltro con IPv6, de-commetare:

    net.ipv6.conf.default.forwarding=1
    
  • Quindi, eseguire il comando sysctl per abilitare le nuove impostazioni nel file di configurazione:

    sudo sysctl -p
    
  • L'IP masquerading può essere ottenuto con una sola regola di iptables, che può cambiare leggermente in base alla configurazione della propria rete:

    sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o ppp0 -j MASQUERADE
    

    Il comando precedente assume che lo spazio di indirizzi privato sia 192.168.0.0/16 e che il dispositivo collegato a Internet sia ppp0. La sintassi del comando è la seguente:

    • -t nat: regola viene inserita nella tabella nat

    • -A POSTROUTING: la regola viene accodata (-A) alla catena POSTROUTING

    • -s 192.168.0.0/16: la regola si applica al traffico originato dallo spazio di indirizzi specificato

    • -o ppp0: la regola si applica al traffico instradato attraverso l'interfaccia di rete specificata

    • -j MASQUERADE: il traffico che soddisfa questa regola viene "saltato" (-j sta per jump) alla destinazione MASQUERADE per essere manipolato come descritto in precedenza

  • Inoltre, ogni catena nella tabella "filter" (la tabella predefinita e dove avvengono la maggior parte dei filtri sui pacchetti) ha una politica predefinita di ACCEPT, ma se si sta creando un firewall in aggiunta a un dispositivo gateway, è possibile aver impostato le politiche DROP e REJECT, nel cui caso il traffico "masqueraded" deve essere consentito attraverso la catena FORWARD affinché la regola precedente possa funzionare:

    sudo iptables -A FORWARD -s 192.168.0.0/16 -o ppp0 -j ACCEPT
    sudo iptables -A FORWARD -d 192.168.0.0/16 -m state --state ESTABLISHED,RELATED -i ppp0 -j ACCEPT
    

    I precedenti comandi consentiranno a tutte le connessioni della propria rete locale accesso a Internet e a tutto il traffico relativo a queste connessioni di ritornare ai computer che lo hanno originato.

  • Per fare in modo che il masquerading sia abilitato al riavvio, modificare il file /etc/rc.local e aggiungere qualsiasi dei comandi utilizzati precedentemente. Per esempio, aggiungere il primo comando senza filtro:

    iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o ppp0 -j MASQUERADE
    

Registri

I registri del firewall sono molto utili per riconoscere gli attacchi, migliorare le regole del firewall e per verificare attività inusuali nella propria rete. È necessario includere regole di registrazione per fare in modo che vengano eseguite le registrazioni e queste devono essere inserite prima di qualsiasi regola terminante applicabile (un regola con un obiettivo che decide il destino di un pacchetto, come ACCEPT, DROP o REJECT).

Se si sta usando ufw è possibile attivare la registrazione con il seguente comando:

sudo ufw logging on

Per disabilitare la registrazione in ufw, sostituire, nel comando precedente, on con off.

Se è in uso iptables al posto di ufw, digitare:

sudo iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j LOG --log-prefix "NEW_HTTP_CONN: "

Una richiesta sulla porta 80 dal computer locale, genererebbe, in dmesg, una traccia simile:

[4304885.870000] NUOV_CONN_HTTP: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=58288 DF PROTO=TCP SPT=53981 DPT=80 WINDOW=32767 RES=0x00 SYN URGP=0

Il registro precedente appare anche nei file /var/log/messages, /var/log/syslog e /var/log/kern.log. Questo comportamento può essere cambiato, modificando in modo appropriato il file /etc/syslog.conf oppure installando e configurando ulogd e facendo uso della destinazione ULOG al posto di LOG. Il demone ulogd è un server nello spazio utente in ascolto per le istruzioni di registro del kernel specifiche dei firewall; è possibile salvare i registri su qualsiasi file o perfino in un database come PostgreSQL o MySQL. Per dare un significato ai registri del firewall è possibile utilizzare delle applicazioni di analisi dei reigistri come fwanalog, fwlogwatch o lire.

Altri strumenti

Esistono diversi strumenti per "costruire" un firewall completo senza alcuna conoscenza di iptables. Per chi preferisce un'interfaccia grafica:

  • Firestarter è molto usato e facile da utilizzare.

  • fwbuilder è molto potente e ha un aspetto che può risultare familiare agli amministratori che hanno utilizzato un firewall commerciale come Checkpoint FireWall-1.

Per chi preferisce uno strumento a riga di comando con file di configurazione in semplice testo:

  • Shorewall è una soluzione molto potente per configurare un firewall di livello avanzato per qualsiasi rete.

  • ipkungfu dovrebbe fornire un firewall funzionante "out of the box", senza alcuna configurazione e consente di configurare firewall avanzati modificando semplici file di configurazione ben documentati.

  • fireflier è progettato per essere un'applicazione firewall per il desktop. È costituito da un server (fireflier-server), da un client grafico (GTK o QT) e si comporta come diverse applicazioni firewall interattive per Windows.

Riferimenti

  • La pagina wiki relativa a Ubuntu Firewall contiene informazioni sullo sviluppo di ufw.

  • Inoltre, la pagina di manuale di ufw contiene molte informazioni utili: man ufw.

  • Per maggiori informazioni sull'uso di iptables, consultare packet-filtering-HOWTO.

  • Il nat-HOWTO contiene ulteriori dettagli sul masquerading.