Premier Training & Business Partner Red Hat

Sicurezza Firewall: Basi e Progettazione di Iptables Prima Parte

Michele Milaneschi
Ti piacerebbe diventare anche tu uno di noi e
pubblicare i tuoi articoli nel blog degli RHCE italiani?

Iptables è uno dei componenti principali per quanto riguarda la sicurezza in un sistema Linux, si tratta di un firewall implementato a livello kernel che ci permette tramite la creazione di regole di avere una protezione per il filtraggio del traffico.

Durante l’installazione di una distribuzione Linux come ad esempio CentOS si può già fare una piccola configurazione come ad esempio permettere l’accesso remoto tramite SSH piuttosto che altri servizi oppure ci potremmo già trovare con un insieme di regole già precaricate dal sistema ma che possiamo sempre eliminarle e iniziare la configurazione da zero. Iniziamo a parlare meglio di iptables: Iptables si basa su un meccanismo di regole, regole che determinano il lasciapassare o meno di pacchetti.

Le regole che creiamo devono essere inserite in un contesto ben preciso che prende il nome di Catena, cioè ogni regola inserita deve far parte di una catena. Esistono 5 tipi di catene: INPUT, OUTPUT, FORWARD, PREROUTING e POSTROUTING:

    • INPUT: Si lavora sui pacchetti in entrata nel sistema
    • OTPUT: Si lavora sui pacchetti in uscita dal sistema
    • FORWARD: Si lavora sui pacchetti che sono diretti ad un altro host della rete ma che per poterci arrivare devono passare dal nostro sistema: in pratica il sistema agisce come un router
  • PREROUTING: Si lavora sui pacchetti in entrata ma a questi pacchetti vengono già applicate delle regole ben definite prima di essere instradate nel sistema.
  • POSTROUTING: Si lavora sui pacchetti in uscita dal sistema ma solamente dopo che è stato deciso il loro instradamento

Ogni catena fa parte di una tabella anche se non sempre deve essere inserita nelle regole: Le catene INPUT, OUTPUT e FORWARD fanno parte della tabella filter Le catene OUTPUT, PREROUTING E POSTROUTING fanno parte della tabella nat Infine c’è la tabella mangle che viene usata quando le opzioni dei pacchetti devono essere modificate.

Si possono creare anche nuove tabelle ma nei nostri articoli non analizzeremo questo aspetto. Fatta questa breve panoramica andiamo a interagire con iptables e qualche comando di base; Per visualizzare le regole della tabella filter usiamo il seguente comando:

iptables -L

ipt1 Per visualizzare le regole della tabella nat ( PREROUTING e POSTROUTING ):

iptables -t nat -L

ipt2 Come vediamo sotto ad ogni catena vengono visualizzate le regole che vengono inserite. Nel caso in cui ci interessasse le regole solamente della catena INPUT daremo il seguente comando:

iptables -L INPUT

ipt3 Tutte le regole che inseriamo se non vengono salvate al riavvio della macchina vengono perse, e il file di iptables si trova in /etc/sysconfig e si chiama proprio iptables. Una volta inserite le regole per salvare la configurazione digitiamo il seguente comando:

iptables-save > /etc/sysconfig/iptables

E al riavvio le regole contenute in quel file verranno automaticamente caricate. Come abbiamo visto precedentemente accanto ad ogni catena visualizziamo ACCEPT o DROP. Stiamo parlando di Policy della catena, ossia la possibilità di configurare il firewall secondo 2 criteri diversi: Impostando ACCEPT ad esempio nella catena INPUT lascio passare tutto e decido successivamente nelle regole cosa non far passare.

Lascio passare tutto di default, eccetto ciò che decido io, approccio non troppo consigliato. Impostando DROP ad esempio nella catena INPUT blocco tutti e successivamente nelle regole decido io cosa deve passare. Blocco tutto di default, e faccio passare solamente ciò che voglio io e che mi serve, approccio consigliato. Ovviamente possiamo cambiare la Policy di ogni catena, Se volessimo impostare la Policy di DROP sulla catena INPUT daremo il seguente comando:

iptables -P INPUT DROP

Ogni regola inserita ha un numero, che parte da 1 e via di seguito, ciò torna utile nel caso dovessimo eliminare una determinata regola. Per iniziare la configurazione del firewall è bene eliminare tutte le regole e iniziare a crearne di nostre per capire meglio come funziona, eliminando anche eventuali catene personalizzate.

iptables -F
iptables -X
iptables -t nat -F

Il primo comando elimina tutte le regole Il secondo elimina tutte le catene personalizzate Il terzo elimina le regole nella tabella nat ( PREROUTING e POSTROUTING ) ipt4

PROGETTIAMO IL FIREWALL:

Andiamo adesso a vedere come inserire le regole all’interno delle tabelle e come esse sono strutturate e interpretate. Partiamo dal presupposto che in INPUT blocchiamo tutto e decidiamo noi cosa deve passare.

Iniziando con questo tipo di approccio dobbiamo introdurre gli stati delle connessioni: Nella configurazione di un firewall viene focalizzata l’attenzione sui pacchetti cioè capire se un determinato pacchetto rispetta certe regole e applicare di conseguenza delle regole su di esso. Certe volte per migliorare la configurazione potremmo aver bosogno di inserire nel firewall gli stati delle connessioni.

Cosa intendiamo?? Prima di analizzare un pacchetto dobbiamo capire che tipologia di connessione ha fatto arrivare quel pacchetto e decidere già da questo momento cosa fare cioè se accettarla o meno. Gli stati delle connessioni possono essere 3: NEW, ESTABLISHED, RELATED

  • NEW: Si riferisce al pacchetto che arriva da una nuova connessione
  • ESTABLISHED: Si riferisce ad un pacchetto che arriva da una connessione già prestabilita
  • RELATED: Si riferisce ad un pacchetto che stabilisce una nuova connessione ma che è associato ad una connessione già esistente. Come per esempio la connessione FTP che stabilisce 2 canali: uno per le informazioni di controllo e uno per i dati veri e propri.

Potremmo quindi seguire il concetto che le connessioni ESTABLISHED e RELATED in ingresso sono accettate perché possono far parte di connessioni avviate dalla macchina stessa come ad esempio la risposta ICMP di un ping.

Non accettiamo connessioni nuove dall’esterno di cui quindi non conosciamo l’esistenza di chi le abbia avviate eccetto alcuni servizi come ad esempio SSH al quale altrimenti non potremmo connetterci da remoto piuttosto che la porta 80. Per fare ciò ci avvaliamo dell’opzione:

-m state –state:

iptables -I INPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT

Una delle prime regole che dobbiamo inserire su iptables potrebbe essere appunto quella di garantire l’accesso remoto tramite SSH per poter gestire cosi il server anche da un altra macchina connessa in rete. Vediamo di scrivere queste regole: Prima di mettere la policy in DROP dobbiamo garantire l’accesso:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT

Ora mettiamo la policy a DROP:

iptables -P INPUT DROP

ipt5 Analizziamo la regola: La regola inizia con iptables

  • -A Significa Append ossia se sono presenti altre regole questa regola di adesso inseriscila alla fine, cioè dopo le altre.
  • INPUT E’ la catena a cui la regola fa riferimento
  • -p Indica il protocollo a cui far riferimento
  • –dport Indica la porta di destinazione usata dal servizio
  • -m state –state NEW Indica di accettare connessioni esterne in ingresso
  • -j Indica il target ossia cosa fare quando si rileva un pacchetto con queste caratteristiche, quindi se Accettarlo o Rifiutarlo

Affiniamo le regole: Potrebbe essere necessario specificare di accettare la connessione solamente da uno specifico host quindi da uno specifico indirizzo ip piuttosto che specificare l’interfaccia e ciò lo facciamo attraverso altre 2 opzioni:

  • -i eth0 Indica l’interfaccia eth0
  • -s Indica l‘ip sorgente

Quindi se volessimo accettare la connessione SSH dall’indirizzo IP 192.168.0.2 scriveremo:

iptables -A INPUT -p tcp -s 192.168.0.2 --dport 22 -j ACCEPT

Se proviamo a connettersi con un IP diverso avremo un messaggio di errore. Se invece avessimo più interfacce potremmo specificare sia l’interfaccia sia l’ip sorgente o solamente l’interfaccia e dire che su quella interfaccia possiamo avere un accesso SSH indipendentemente dall’ip che si connetterà come nel seguente esempio:

iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT

Detto ciò vediamo la disposizione delle regole e come esse vengono interpretate. Nei nostri esempi abbiamo usato spesso l’opzione -A che come abbiamo detto inserisce la regola in fondo alle regole precedenti se ce ne sono, ma non sempre è corretto fare ciò perchè l’ordine nella quale vengono inserite le regole è molto importante.

Potremmo infatti aver bisogno di inserire una regola all’inizio o a metà tra le regole o piuttosto inserirla come prima regola e questo lo facciamo tramite l’opzione -I seguita dal numero della posizione nella quale vogliamo inserire la regola:

 iptables -I INPUT 2 -p tcp . . . .

Indica di inserire la regola alla seconda posizione. Questo perché è importante?

Perchè quando arriva un pacchetto, iptables inizia a scandagliare le regole una ad una, e nel momento che trova la regola che rispetta i requisiti del pacchetto in arrivo la esegue senza preoccuparsi di ciò che c’è dopo. Facciamo un esempio pratico: Inseriamo la Policy in INPUT a DROP Garantiamo l’accesso alla porta 80 E successivamente neghiamo l’accesso sempre alla porta 80

iptables -P INPUT DROP
 
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

E fin qui tutto funziona ipt6 Adesso neghiamo l’accesso alla porta 80:

iptables -A INPUT -p tcp --dport 80 -j DROP

Come vediamo però l’accesso non viene negato, analizzando la catena INPUT:

iptables -L INPUT

ipt7 La regola di negazione si trova dopo quella di accettazione quindi iptables quando riceve un pacchetto conforme alla regola sulla porta 80 esegue la regola dell’accettazione senza preoccuparsi di ciò che viene dopo. Per eliminare questa regola che si trova nella catena INPUT in posizione 4 facciamo uso dell’opzione -D.

iptables -D INPUT 4

ipt8 Con ciò abbiamo che iptables accetta tutte le connessioni sulla porta 80.
Ma se volessimo bloccare la richiesta da uno specifico indirizzo IP?? Facciamo uso dell’opzione -I seguita dalla posizione della regola. Ovviamente va inserita prima della seguente regola:

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Altrimenti il traffico verso la porta 80 da uno specifico host non viene bloccato. Facciamo un esempio: Abbiamo la seguente struttura di regole ipt9 Vogliamo bloccare l’accesso alla porta 80 dall’indirizzo IP 192.168.0.2: Andremo a inserire alla seconda posizione la regola del blocco sull’ip 192.168.0.2 :

iptables -I INPUT 2 -p tcp -s 192.168.0.2 --dport 80 -j DROP

ipt10 E vedremo dall’host con IP 192.168.0.2 che non sarà possibile visualizzare la pagina web. ipt11 Non dimentichiamoci di salvare le regole se avete finito di progettare il vostro firewall altrimenti al riavvio tutto ciò andrà perso:

iptables-save > /etc/sysconfig/iptables

Abbiamo visto che l’opzione -m state –state è stata inserita solamente nella regola SSH mentre nella regola sulla porta 80 non c’è. Non è obbligatorio metterlo, se non lo si inserisce è sottinteso che stiamo parlando di connessioni con stato NEW ma se vogliamo essere più precisi possiamo inserirlo.

➡️  Approfondisci subito questi temi conoscendo intimamente Linux e le sue caratteristiche, come la gestione della sicurezza, con il corso base gratuito iscrivendoti su www.rh024.it 

Info about author

Michele Milaneschi

RHCE Consultant