Firewall

Cos’è un firewall

Un aspetto importante delle reti è che tutto ciò che accade passa attraverso lo scambio di pacchetti. Ad esempio, una connessione ad un server HTTP avviene mediante l’incapsulamento di pacchetti TCP in pacchetti IP; i router di Internet comunicano utilizzando specifici pacchetti ed anche gli attacchi da parte di malintenzionati viaggiano su pacchetti (ad eccezione degli attacchi mediante malware installati con altri mezzi, ad esempio, chiavette USB). Questo sottolinea l’importanza di avere un controllo sui pacchetti, al fine di garantire che tutto ciò che entra ed esce dalla rete non sia dannoso e non comporti conseguenze negative.

Definizione

Un firewall è un dispositivo (hardware o software) che monitora il traffico di la rete per garantire che i pacchetti in transito non siano dannosi, eventualmente bloccando il traffico potenzialmente pericoloso.

Come si vede nell’immagine a destra (fonte Wikipedia), il firewall viene posizionato in modo che possa intercettare tutto il traffico che entra ed esce dalla rete locale (LAN). Qualsiasi altro posizionamento non sarebbe efficace in quanto percorsi in grado di aggirare il firewall, rappresenterebbero vulnerabilità della rete, permettendo il transito di traffico non controllato e potenzialmente dannoso.

Dal momento che un firewall deve monitorare tutto il traffico, deve possedere hardware in grado di analizzare enormi quantità di pacchetti in poco tempo per decidere velocemente se bloccare o meno un pacchetto, un dispositivo non adeguatamente dimensionato dal punto di vista hardware introdurrebbe ritardi inaccettabili nelle comunicazioni di rete.

Per gestire questa enorme quantità di lavoro, il firewall viene impostato utilizzando delle regole semplici che siano in accordo con la politica aziendale in termini di sicurezza e di uso della rete.

Tipi di firewall

Esistono diverse tipologie di firewall, che si distinguono in base alle analisi che effettuano sui pacchetti. Le principali sono.

  • Packet filtering agisce sui livelli 3 e 4 dello stack ISO/OSI, il che significa che le regole possono solo analizzare pacchetti IP e TCP/UDP.
  • Stateful firewall agisce sui livelli 3,4 e 5 dello stack ISO/OSI, rispetto al packet filtering permette di gestire le regole considerando anche le connessioni tra host.
  • Application gateway agisce livelli 3, 4, 5 e 7 permette quindi di valutare i pacchetti anche sulla base dei protocolli di livello applicativo (ad esempio HTTP o SMTP).
  • NAT firewall prevede in meccanismo di gestione delle porte TCP e UDP.
  • Next generation firewall: si tratta di un firewall che, oltre a comprendere tutte le funzioni precedenti, include anche funzionalità di sicurezza avanzate quali intrusion prevention and detection, deep packet inspection, …

Le tipologie di regole che possono essere impostate su un firewall dipendono dal tipo di firewall stesso. In altre parole, le politiche di sicurezza che si possono implementare a livello di firewall dipendono dal tipo di firewall in uso.

Regole e politiche

Il firewall decide di bloccare o meno un pacchetto attraverso delle regole che descrivono:

  • la tipologia ed il contenuto del pacchetto,
  • la direzione di attraversamento del pacchetto e
  • l’azione da intraprendere.

L’amministratore di rete imposta le regole di un firewall, ma quali specifiche regole impostare dipende dalla politica dell’organizzazione. Ad esempio, i pacchetti da a verso i social media (es. Facebook e Instagram), possono essere bloccati o permessi, probabilmente sarebbero bloccati in una scuola o in un azienda, a meno che non si tratti di una divisione aziendale che si occupa di social media management.

Le politiche possono essere anche complesse, ad esempio un’azienda potrebbe concedere ai dipendenti di accedere ai social media durante la pausa pranzo, la politica diventa, quindi, “Niente social media, tranne dalle 12:00 alle 14:00”, in questo caso le regole da impostare sul firewall saranno più complesse rispetto alla politica “Blocca tutti i Social Media”.

Esercizio

Immagina di essere il responsabile della gestione della rete in un’azienda di automobili. La rete interna interna è divisa in due grosse sotto-reti: “Rete produzione” e “Rete uffici”, vuoi evitare che i dispositivi connessi alla prima rete ricevano pacchetti da Internet, ma allo stesso tempo devono poter comunicare con un server interno il quale è connesso ad Internet. Descrivi a parole le politiche e le regole che imposteresti sul firewall aziendale.

Funzionamento di un firewall

Il firewall funziona analizzando il traffico di rete in entrata ed uscita e decidendo se bloccarlo o consentirlo sulla base delle regole di sicurezza impostate dall’amministratore di rete.

Regole e ordine di match

Iniziamo dando una definizione formale dei concetti di regola e match.

Definizione: Regole e Match

Una regola è una descrizione delle caratteristiche di un pacchetto, se un pacchetto soddisfa a tale descrizione si dice che la regola è un match per quel pacchetto.

Le caratteristiche menzionate nella definizione sopra, sono principalmente le seguenti:

  • direzione: inbound (in ingresso) e outbound (in uscita);
  • protocolli: individuato dal tipo di pacchetto (TCP, UDP, ICMP, …);
  • porta: secondo quanto presente nell’header TCP o UDP.

Tuttavia, in casi più complessi come nei firewall stateful, la lista di caratteristiche di un pacchetto può essere più complessa (ad esempio, un pacchette può essere caratterizzato dall’appartenenza ad una specifica connessione TCP).

Definizione: Inbound e Outbound

I pacchetti inbound (in ingresso) sono pacchetti di dati che vengono inviati alla rete interna da fuori (ad esempio, da Internet). I pacchetti outbound (in uscita), sono i pacchetti dati che vengono inviati dalla rete interna verso l’esterno.

Esempio

Consideriamo un server HTTP all’interno di una rete locale (LAN) separata da Internet (WAN) mediante un firewall. Consideriamo una richiesta per il server proveniente da Internet.

Il pacchetto di richiesta, che attraversa il firewall WAN -> LAN sarà un pacchetto inbound (in ingresso). La successiva risposta, che attraversa il firewall LAN -> WAN, sarà un pacchetto outbound (in uscita).

Se il server HTTP necessitasse, ad esempio, di contattare un server esterno (ad esempio per scaricare gli aggiornamenti di sistema), genererebbe dei pacchetti outbound le cui risposte sarebbero pacchetti inbound.

In pratica un firewall stateless (ved sotto) si limita a considerare un pacchetto alla volta e confrontarlo con tutte le regole che sono state impostate. Le regole vengono valutate in un ordine specifico, in genere l’ordine in cui sono state inserite. Tuttavia, è importante notare che se una regola blocca il traffico, il firewall non continuerà a controllare le regole successive.

Importante

Quanto detto sopra significa che le regole di più restrittive devono essere posizionate in cima alla lista di regole in modo che vengano valutate prima delle regole meno restrittive. In questo modo, se una regola restrittiva blocca il traffico, non viene eseguito il controllo di altre regole meno restrittive.

Un firewall deve avere sempre una regola di default che definisce cosa fare del traffico di rete (pacchetti) che non corrisponde a nessuna regole configurate. La regola di default, di norma blocca tutto il traffico, di conseguenza è normale che un firewall blocchi tutto il traffico a meno che non sia esplicitamente consentito da una regola.

Codice Python per un firewall

Una versione Python estremamente semplificata di tale operazione è fornita in seguito.

def process_packet(packet):
    for rule in rules:
        if check_rule(packet, rule):
            return True
    return False

Ovviamente la funzione check_rule si occupa di decidere se il pacchetto soddisfa ad una certa regola.

Dal codice sopra, si capisce che questo ipotetico firewall permette il passaggio del pacchetto se esiste una regola tale che check_rule restituisce True, ma lo blocca in caso contrario. Questo comportamento realizza la regola di default per bloccare il traffico così come discusso sopra.

Per completezza, vediamo un esempio di implementazione Python per la funzione check_rule.

def check_rule(packet, rule):
    if packet["type"] != rule["type"]:
        return False
    if packet["protocol"] != rule["protocol"]:
        return False
    if "port" in rule and packet["port"] != rule["port"]:
        return False
    return rule["allowed"]

Da notare che la funzione restituisce False se il pacchetto non soddisfa ad almeno uni dei campi impostati nella regola (type, protocol e port), ma la decisione di accettare il pacchetto o meno, dipende dal valore del campo allowed.

Riassumendo possiamo dire che:

  • il firewall confronta ogni pacchetto con le regole in esso memorizzate,
  • se una regola pertinente viene individuata, la si applica
  • quando nessuna regola viene individuata, il firewall applica una regola di default che, tipicamente, scarta il pacchetto.
Importante

In genere, la regola di default viene impostata per bloccare tutto il traffico di rete che non corrisponde a nessuna delle regole di sicurezza configurate. In questo modo, se un amministratore di rete dimentica di configurare una regola di sicurezza per un particolare tipo di traffico, il traffico viene bloccato dal firewall invece di essere consentito a passare senza controllo.

Firewall stateless e stateful

Come visto sopra, esistono diverse tipologie di firewall le quali si distinguono principalmente per i livelli dello stack ISO/ISO che vengono considerati in fase di analisi del pacchetto. Una distinzione importante riguarda la possibilità o meno di analizzare un pacchetto sulla base di pacchetti visti in precedenza, per rendere possibile questo, il firewall deve mantenere uno stato per permettergli di registrare la “storia” di un pacchetto. La capacità o meno di analizzare i pacchetti in relazione a pacchetti precedenti distingue tra firewall di tipo stateless e stateful.

Definizione

Un firewall stateless analizza ogni pacchetto di dati in modo indipendente, senza tener conto del contesto del pacchetto o della sua relazione con i pacchetti precedenti.

Definizione

Un firewall stateful tiene traccia dello stato delle connessioni di rete ed utilizza questa informazione per prendere decisioni sui pacchetti in transito.

Ad esempio, se un pacchetto fa parte di una connessione attiva ed autorizzata, il firewall stateful consentirà il transito di tale pacchetto. Di contro lo stesso pacchetto potrebbe essere bloccato da un firewall stateless che non è in grado di riconoscerlo come appartenente ad una connessione autorizzata.

Esercizi

Esercizio

Scrivi un programma Java che implementa un firewall per filtrare il traffico HTTP sia inbound che outbound. In particolare, il firewall deve bloccare le richieste che contengono parole chiave come “hacker” o “attacco”. Il programma deve precedere una regola di default che blocchi tutti i pacchetti in ingresso, a meno che non siano autorizzati da una delle regole definite esplicitamente.

Come punto di partenza si usi la seguente classe Rule per memorizzare una regola.

public class Rule {
    private String direction; // inbound, outbound
    private boolean action; // true -> allow, false -> drop
    private String ip;
    private int port;
    // Costruttore/i, getter e setter qui sotto
    // ...
}

Riferimenti

  • Michele Schimd © 2024
  • Ultimo aggiornamento: 17/02/2024
  • Materiale di studio e di esercizio per gli alunni dello Zuccante.

Creative Commons License