Wiki Ubuntu-it

Indice
Partecipa
FAQ
Wiki Blog
------------------
Ubuntu-it.org
Forum
Chiedi
Chat
Cerca
Planet
  • Pagina non alterabile
  • Informazioni
  • Allegati
  • Differenze per "Sicurezza/Iptables"
Differenze tra le versioni 16 e 17
Versione 16 del 14/03/2011 12.50.35
Dimensione: 8194
Autore: localhost
Commento: converted to 1.6 markup
Versione 17 del 30/05/2011 15.53.43
Dimensione: 21064
Commento: revisione importata da MarcoBuono/Prove4
Le cancellazioni sono segnalate in questo modo. Le aggiunte sono segnalate in questo modo.
Linea 1: Linea 1:
## page was renamed from GuidaWiki/DocumentazioneModello
Linea 5: Linea 6:
<<Informazioni(forum="http://forum.ubuntu-it.org/index.php/topic,184837.0.html")>>

<<BR>><<BR>><<BR>><<BR>><<BR>><<BR>>
Linea 8: Linea 11:
'''Iptables''' è il firewall, da linea di comando, installato in modo predefinito su Ubuntu. Questo howto mostrerà brevemente come avere un firewall minimale ma robusto.

= I concetti di base =

Un computer connesso ad internet scambia continuamente dati col resto del mondo.

I dati che dal mondo esterno entrano nel nostro computer possono essere di tipo "buono", come ad esempio una pagina di un sito che abbiamo richiesto, un amico che ci contatta in chat o un file che stiamo scaricando con un programma di filesharing, e di tipo "cattivo", come ad esempio un ''cracker'' che ci contatta in vari modi e a nostra insaputa per cercare di entrare nel nostro computer.

Il compito del firewall è riconoscere il traffico buono da quello cattivo, e bloccare il traffico cattivo. Per farlo, ha bisogno che siamo noi a dirgli cosa è buono e cosa no, mediante delle regole per fare i controlli sul traffico di dati.

'''Iptables''' raggruppa tutti i controlli che può fare sul traffico in entrata, nella cosiddetta ''Chain INPUT'', catena di input. I controlli sul traffico in uscita sono invece raggruppati nella ''Chain OUTPUT''. La ''Chain FORWARD'' serve per esempio quando il traffico di dati non è indirizzato a noi ma passa comunque per il nostro computer.

Ognuna di queste catene ha una ''policy'', una politica, cioè un'azione predefinita da eseguire quando tutti gli altri controlli della catena hanno fallito nel riconoscere se il dato era buono o meno.

== Come impostare un firewall in modo semplice e veloce ==

Seguite la guida per [[http://wiki.ubuntu-it.org/Sicurezza/Firestarter|Firestarter]]

== Cosa serve per impostare iptables ==

Il firewall è incluso in Ubuntu ed è attivo all'avvio del sistema senza richiedere alcuna azione da parte dell'utente. Anche '''iptables''' è incluso in Ubuntu, e bisogna usarlo da [[AmministrazioneSistema/RigaDiComando|riga di comando]] per configurare il firewall.

Per usare iptables sono necessari i [[AmministrazioneSistema/Sudo|privilegi di amministrazione]].
 
== Limitazione di questa guida ==

Dal momento che i comandi che trovate in questa guida servono a modificare la configurazione del firewall "a caldo", senza scrivere niente in file di configurazione, ma caricando direttamente le impostazioni in memoria, al successivo avvio del computer la configurazione fatta non sarà più disponibile.

Per ovviare a questo problema si possono inserire i comandi in uno script da lanciare all'avvio del computer.
'''Iptables''' è un firewall, da linea di comando, installato in modo predefinito su '''Ubuntu'''. Quando si installa Ubuntu, anche iptables viene installato con le impostazioni di default che autorizzano tutto il traffico.

A partire da '''Ubuntu 8.04''' anche [[http://wiki.ubuntu-it.org/Sicurezza/Ufw|Ufw]] viene installato di default. Si tratta di un applicazione che consente di semplificare la configurazione di iptables.
Linea 40: Linea 17:
Per avere sott'occhio in ogni momento la configurazione del firewall, è sufficiente digitare in un terminale:{{{  * Per visualizzare la configurazione del firewall, è sufficiente digitare il seguente comando in una finestra di terminale:{{{
Linea 43: Linea 20:

Per esempio, con Ubuntu appena installato, il firewall è sì attivo, ma non ha ancora una vera configurazione, perciò l'output dovrebbe essere: {{{
 * Per esempio, con Ubuntu appena installato, il firewall è sì attivo, ma non ha ancora una vera configurazione, perciò l'output dovrebbe essere: {{{
Linea 58: Linea 34:
In modo predefinito il firewall lascia passare tutto, come indicano le scritte "''policy ACCEPT''" e l'assenza di altre regole.

A volte le informazioni mostrate non sono sufficienti; in questi casi basta aggiungere '''-v''' oppure '''-vv''' al precedente comando. Per esempio: {{{
In modo predefinito il firewall lascia passare tutto, come indicano le scritte "''policy ACCEPT''" e l'assenza di altre regole. A volte le informazioni mostrate non sono sufficienti; in questi casi basta aggiungere '''-v''' oppure '''-vv''' al precedente comando. Per esempio: {{{
Linea 64: Linea 38:
= Impostare le policy di base =

Per iniziare, possiamo bloccare tutto il traffico proveniente dal mondo esterno (per poi in seguito consentire solo il traffico che riteniamo buono), impostando una ''policy'' che faccia scomparire nel nulla tutti i pacchetti in entrata: {{{
sudo iptables -P INPUT DROP
}}}

In questo momento non possiamo navigare nel web, e più in generale il nostro PC non si accorgerà di qualsiasi dato ci venga spedito da chicchessia. Niente paura, fra qualche riga vedremo come istruire '''iptables''' a lasciare passare il traffico a cui siamo interessati.

Un'altra buona ''policy'' da impostare è: {{{
sudo iptables -P FORWARD DROP
}}}

Per quanto riguarda il traffico che dal nostro PC esce verso il mondo esterno, possiamo benissimo permetterlo senza preoccuparci troppo; infatti, se MS Windows è succube di programmini malefici che una volta insediatisi in un PC tentano di comunicare (dati sensibili, attacchi informatici, eccetera) col mondo esterno, ciò in GNU/Linux non avviene, o meglio la probabilità che avvenga è del tutto risibile.

== Le prime regole utili ==

Innanzitutto dobbiamo consentire tutto il traffico interno al nostro computer, che passa per l'interfaccia di ''loopback'' "'''lo'''". Quindi da terminale digitiamo: {{{
sudo iptables -A INPUT -i lo -j ACCEPT
}}}

La seconda cosa che potremmo voler fare è navigare nel web e più in generale lasciare entrare tutto il traffico che è stato da noi richiesto: {{{
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
}}}

== Consentire l'ingresso su porte specifiche ==

Ci sono situazioni in cui vogliamo permettere a un utente esterno di contattare il nostro PC e di inviarci dati, per esempio se abbiamo installato un [[InternetRete/ConfigurazioneRete/OpenSsh|server SSH]], un [[Server/Web|server web]] o un programma che per svolgere il suo compito deve fungere anche da server, ad esempio un programma di filesharing come [[InternetRete/Condivisione/Amule|aMule]].

Il nostro server SSH usa la porta 22 (a meno che non lo abbiamo configurato diversamente), quindi dobbiamo dire a '''iptables''' di lasciare entrare il traffico ''tcp'' sulla porta 22 (il relativo traffico di risposta lo abbiamo già permesso prima), quindi: {{{
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
}}}

In ogni momento possiamo controllare come abbiamo configurato il firewall, come spiegato precedentemente.

Il server web usa la porta 80 (anche qui, a meno di configurazioni personalizzate), quindi consentiamo tutto il traffico che dall'esterno chiede di entrare attraverso la nostra porta 80: {{{
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
}}}

Il programma di filesharing aMule deve accettare connessioni in entrata per poter funzionare al meglio. Per impostazione predefinita usa le porte 4662(con protocollo tcp) e 4672(con protocollo udp), quindi le seguenti regole indicano al firewall di accettare il traffico in ingresso su quelle due porte: {{{
sudo iptables -A INPUT -p tcp --dport 4662 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 4672 -j ACCEPT
}}}

Insomma, il meccanismo dovrebbe essere chiaro.

== Risultato finale ==

Abbiamo così ottenuto un piccolo firewall che lascia uscire tutti i dati dal nostro computer verso l'esterno, e lascia entrare tutti i dati che abbiamo richiesto: {{{
sudo iptables -vv -L
}}}

{{{
Chain INPUT (policy DROP)
= Opzioni di base =

Di seguito, verranno riportate alcune delle opzioni di iptables per meglio comprendere la sintassi riportata successivamente.

 * A - '''Append''' Appende (allega) questa regola alla lista delle regole. Le liste di regole valide per ciò che stiamo facendo sono INPUT, FORWARD and OUTPUT, ma in questo tutorial si tratterà l'INPUT che regolerà solo il traffico in entrata.
 * -L - '''List''' elencherà in una lista le attuali regole di filtraggio.
 * -m conntrack - Permette di filtrare le regole per abbinarle in base allo stato di connessione. Consente l'uso dell'opzione - ctstate.
 * --ctstate - Definisce l'elenco degli stati per la regola da soddisfare. Gli stati validi sono:
  * NEW - La connessione non è stata ancora visualizzata.
  * RELATED - La connessione è nuova, Ma è in relazione con un'altra attualmente permessa.
  * ESTABLISHED - La connessione è tuttora stabilita.
  * INVALID - Il traffico non può essere identificato per qualche ragione.
 * -m limit - Richiede quale regola deve essere soddisfatta solo un numero limitato di volte. Permette l'uso dell'opzione --limit. Utile per limitare le regole di registrazione.
  * --limit - Il tasso massimo di corrispondenza, dato come un numero seguito da "/second", "/minute", "/hour", or "/day" in base a quanto si desidera che la regola sia soddisfatta. Se questa opzione non viene utilizzata mentre si usa "-m limit", il valore di default è "3/hour".
 * -p - Il protocollo utilizzato per la connessione.
 * --dport - La porta di destinazione richiesta per questa regola. Può essere indicata una porta singola oppure un intervallo di porte come "portastart:portaend", che prenderà in considerazione tutte le porte da 'portastart' a 'portaend' comprese.
 * j - Salta al target specificato. Per default, iptables permette quattro target:
  * ACCEPT - Accetta il pacchetto e blocca le regole in questa lista.
  * REJECT - Rigetta il pacchetto e notifica a chi sta inviando i dati che si è proceduto al blocco, nonchè blocca le regole in vigore in questa lista.
  * DROP - Ignora silenziosamente il pacchetto e blocca le regole in vigore in questa lista.
  * LOG - Logga il pacchetto, e continua a processare più regole nella lista. Permette l'uso delle opzioni --log-prefix e --log-level.
 * --log-prefix - Durante il log, inserire questo testo prima del messaggio di log. Usare il 'double quotes' sul testo da usare.
 * --log-level - Loggarsi usando il livello 'syslog' specificato. 7 è una buona scelta finchè non si avrà specificatamente bisogno di qualcos'altro.
 * -i - Soddisfatta solo se un pacchetto sta entrando verso la periferica specificata.
 * -I - Inserisce una regola. Desidera solo due opzioni, la lista dove inserirla e il numero che la regola avrà nella lista.
  * -I INPUT 5 dovrebbe inserire la regola all'interno della lista di regole INPUT nella quinta posizione.
 * -v - Visualizza più informazioni nel rapporto. Utile per visualizzare se si hanno regole che appaiono molto simili senza l'uso dell'opzione in questione.
 * -s --source - indirizzo[/mask] 'specifica sorgente'
 * -d --destination - indirizzo[/mask] 'specifica destinazione'
 * -o --out-interface - output name[+] interfaccia di rete name ([+] per carattere jolly)

= Consentire sessioni già stabilite =

 * Si possono autorizzare connessioni già stabilite a ricevere traffico: {{{
# iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
}}}
 * La regola qui sopra non ha spazi su entrambi i lati della virgola tra ESTABLISHED,RELATED

 * Se la linea qui sopra non funziona, si potrebbe essere su un VPS che usa OpenVZ oppure non si hanno installate alcune estensioni del kernel. In quel caso, provare questo comando: {{{
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
}}}

= Autorizzare il traffico in entrata su porte specifiche =

Si potrebbe iniziare bloccando il traffico, ma si potrebbe aver bisogno di lavorare su SSH, e quindi si potrebbe aver bisogno di consentire il SSH prima di bloccare tutto il resto.

 * Per consentire il traffico in ingresso sulla porta di default SSH (22), si potrebbe comunicare a iptables di consentire tutto il traffico TCP in ingresso su quella porta: {{{
   iptables -A INPUT -p tcp --dport ssh -j ACCEPT
}}}

Facendo riferimento alla lista qui sopra, si può notare che il comando dice a iptables:
 * aggiungi questa regola alla catena input (-A INPUT) in modo da guardare il traffico in entrata
 * controlla per verificare se è di tipo TCP (-p tcp).
 * in caso affermativo, verificare se l'input punta alla porta SSH (- dport ssh).
 * in caso affermativo, accettare l'input (-j ACCEPT).

Si controllino allora le regole: (Qui sotto vengono mostrate solo le prime righe, ma il report mostrerà di più) {{{
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
}}}

Ora, si autorizzi il traffico in entrata nella rete {{{
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
}}}

Controllando le regole, si avrà {{{
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:www
}}}

Abbiamo specificatamente consentito il traffico TCP verso le porte ssh e web, ma poiché non abbiamo bloccato niente, tutto il traffico può ancora entrare

= Bloccare il traffico =

Una volta che si è deciso di accettare un pacchetto, le regole non incidono più su di esso. Visto che le regole che consentono il traffico ssh e web sono inserite prima di altre, e dato che la regola per bloccare tutto il traffico viene dopo di loro, si può ancora accettare il traffico che si vuole. Tutto quello che dobbiamo fare è inserire la regola per bloccare tutto il traffico alla fine.

{{{
# iptables -A INPUT -j DROP
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:www
DROP all -- anywhere anywhere
}}}

Visto che non si è specificato un'interfaccia o un protocollo, qualsiasi tipo di traffico per ogni porta su qualsiasi interfaccia è bloccata, tranne che per il web e ssh.

= Modificare iptables =

L'unico problema del setup appena implementato è che anche la porta di loopback è bloccata. Abbiamo potuto scrivere la regola 'drop' solo per eth0 specificando '-i eth0', ma potremmo anche aggiungere una regola per il loopback. Se vogliamo aggiungere questa regola sarà ormai troppo tardi perchè tutto il traffico è stato 'droppato'. Si deve quindi inserire prima questa regola. Visto che questo è una grossa quantità di traffico, si inserirà questa come prima regola affinchè venga processata per prima. {{{
# iptables -I INPUT 1 -i lo -j ACCEPT
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:www
DROP all -- anywhere anywhere
}}}

Le prime linee e le ultime si assomigliano, quindi dovremo vedere la lista di iptables con maggiore dettaglio. {{{
# iptables -L -v
}}}

{{{
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
Linea 118: Linea 155:
    0 0 ACCEPT all -- lo any anywhere anywhere
    0 0 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
    0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh
    0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:www

Chain FORWARD (policy DROP)
 pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT)
 pkts bytes target prot opt in out source destination
}}}
    0 0 ACCEPT all -- lo any anywhere anywhere
    0 0 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
    0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh
    0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:www
    0 0 DROP all -- any any anywhere anywhere
}}}

Ora è possibile vedere molte più informazioni. Questa regola è in realtà molto importante, dal momento che molti programmi utilizzano l'interfaccia di loopback per comunicare tra loro. Se non si consente loro di parlare, si potrebbe interrompere quei programmi!

= Registrazione =

Nessuno degli esempi di traffico riportati sopra verrà registrato. Se si desidera registrare i pacchetti 'droppati' su syslog, questo è il modo più rapido:

{{{
# iptables -I INPUT 5 -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
}}}

Si veda la sezione Suggerimenti per maggiori consigli sulla registrazione.

= Salvataggio di IPTables =

Se si dovesse riavviare la macchina in questo momento, la configurazione di iptables sparirebbe. Invece, se si vuole che ad ogni riavvio si mantengano queste configurazioni, si dovrà salvare la configurazione. Per salvarla, è possibile utilizzare 'iptables-save' e 'iptables-restore'.

== Configurazione all'avvio ==

{{{
ATTENZIONE: Iptables e NetworkManager potrebbero essere in conflitto. Se siete preoccupati abbastanza per la sicurezza per installare un firewall, potreste non vuole fidarsi NetworkManager per la gestione di esso ancora. Si noti inoltre NetworkManager e iptables hanno obiettivi opposti. Iptables mira a conservare qualsiasi dubbio il traffico di rete. NetworkManager mira ad essere sempre connessi in ogni momento. Pertanto, se si vuole la sicurezza per tutto il tempo, eseguire iptables al boot. Se si desidera che la sicurezza parte del tempo poi NetworkManager potrebbe essere la scelta giusta.
}}}

{{{
ATTENZIONE: Se si utilizza NetworkManager (installato di default su Feisty e versioni successive) questi passaggi vi lascerà in grado di utilizzare NetworkManager per le interfacce si modificano. Si prega di attenersi alla procedura descritta nella sezione successiva, invece.
}}}

{{{
NOTA: Sembra in Hardy, NetworkManager ha un problema con correttamente sul salvataggio e il ripristino delle regole iptable quando si utilizza il metodo nella sezione successiva. L'utilizzo di questo primo metodo sembra funzionare. Se trovate in caso contrario, si prega di aggiornare questa nota.
}}}


Salvare le regole del firewall in un file
{{{
# sudo bash -c "iptables-save > /etc/iptables.rules"
}}}

Ora si hanno molte opzioni. Si possono fare modifiche a '/etc/network/interfaces' o aggiungere uno script a '/etc/network/if-pre-up.d/' e '/etc/network/if-post-down.d/' per ottenere risultati simili. La soluzione dello script permette una flessibilità leggermente maggiore.

== Soluzione #1 - /etc/network/interfaces ==


(NB: si sono seguite le istruzioni in questa sezione e questo ha disabilitato la maggior parte (o tutti) degli script in '/etc/rc2.d /: Polipo, dnsmasq, bluetooth, ecc; Consiglia di utilizzare ufw/gufw.)

Modificare il file di configurazione di interfacce '/etc/network/' per applicare le regole automaticamente. È necessario conoscere l'interfaccia che si sta utilizzando, al fine di applicare le regole - se non la si conosce, probabilmente si sta utilizzando l'interfaccia eth0, anche se si dovrebbe verificare con il seguente comando per vedere se ci sono delle schede wireless:
{{{
  iwconfig
}}}

Se si ottiene un output simile al seguente, allora non avete schede wireless e molto probabilmente state usanto eth0.

{{{
$ iwconfig

lo no wireless extensions.

eth0 no wireless extensions.

$
}}}

Quando si conosce l'interfaccia che si sta utilizzando, aprire il file '/etc/network/interfaces' e a seconda della distribuzione o dell'editor in uso si dovràc digitare:

{{{
# nano /etc/network/interfaces
}}}

Per Ubuntu e Xubuntu, premere alt+F2, e successivamente nella finestra che appare, scrivere:
{{{
gksudo gedit /etc/network/interfaces
}}}
e premere Enter.

Per Kubuntu: premere Alt+F2, successivamente nella finestra che compare scrivere:

{{{
kdesu kate /etc/network/interfaces
}}}
poi premere Enter.

Una volta all'interno del file, ricercare l'interfaccia che si è trovata, e alla fine delle righe relative alla rete per l'interfaccia, aggiungere la riga:
{{{
pre-up iptables-restore < /etc/iptables.rules
}}}

È anche possibile preparare una serie di regole secondarie, salvarli in secondo file '/etc/iptables.downrules' e si applicheranno automaticamente utilizzando la procedura di cui sopra:
{{{
post-down iptables-restore < /etc/iptables.downrules
}}}

Un esempio completo e funzionante utilizzando entrambe le soluzioni sopra:


{{{
auto eth0
iface eth0 inet dhcp
  pre-up iptables-restore < /etc/iptables.rules
  post-down iptables-restore < /etc/iptables.downrules
}}}

Si consiglia inoltre di conservare le informazioni provenienti dai contatori di byte e pacchetti.

{{{
iptables-save -c > /etc/iptables.rules
}}}

Il comando sopra salverà l'intero set di regole in un file chiamato '/etc/iptables.rules' con i contatori byte e dei pacchetti ancora intatta.

== Soluzione #2 /etc/network/if-pre-up.d and ../if-post-down.d ==

NOTA: Questa soluzione utilizza 'iptables-save -c' per salvare i contatori. Basta togliere l'opzione '-c' per salvare solo le regole.

In alternativa si potrebbe aggiungere 'iptables-restore' e 'iptables-save' per le directory 'if-pre-up.d' e 'if-post-down.d' nella directory '/etc/network' invece di modificare direttamente la '/etc/network/interface'.

Lo script '/etc/network/if-pre-up.d/iptablesload' conterrà:

{{{
#!/bin/sh
iptables-restore < /etc/iptables.rules
exit 0
}}}

e '/etc/network/if-post-down.d/iptablessave' conterrà:

{{{
#!/bin/sh
iptables-save -c > /etc/iptables.rules
if [ -f /etc/iptables.downrules ]; then
   iptables-restore < /etc/iptables.downrules
fi
exit 0
}}}

Assicurarsi di dare ad entrambi gli script i permessi di esecuzione:

{{{
# chmod +x /etc/network/if-post-down.d/iptablessave
# chmod +x /etc/network/if-pre-up.d/iptablesload
}}}


== Configurazione all'avvio di NetworkManager ==

[[http://wiki.ubuntu-it.org/InternetRete/ConfigurazioneRete/NetworkManager|NetworkManager]] include la possibilità di eseguire script quando si attiva o disattiva un'interfaccia. Per salvare le regole iptables allo spegnimento del computer e per ripristinarle all'avvio si dovrà creare uno script di questo tipo.
Per iniziare, premete Alt + F2 e digitare il seguente comando:

Per Ubuntu:
{{{
$ gksudo gedit /etc/NetworkManager/dispatcher.d/01firewall
}}}

Per Kubuntu:
{{{
kdesu kate /etc/NetworkManager/dispatcher.d/01firewall
}}}

Quindi incollare questo script nel vostro editor, salvare e uscire dall'editor.

{{{
if [ -x /usr/bin/logger ]; then
        LOGGER="/usr/bin/logger -s -p daemon.info -t FirewallHandler"
else
        LOGGER=echo
fi

case "$2" in
        up)
                if [ ! -r /etc/iptables.rules ]; then
                        ${LOGGER} "No iptables rules exist to restore."
                        return
                fi
                if [ ! -x /sbin/iptables-restore ]; then
                        ${LOGGER} "No program exists to restore iptables rules."
                        return
                fi
                ${LOGGER} "Restoring iptables rules"
                /sbin/iptables-restore -c < /etc/iptables.rules
                ;;
        down)
                if [ ! -x /sbin/iptables-save ]; then
                        ${LOGGER} "No program exists to save iptables rules."
                        return
                fi
                ${LOGGER} "Saving iptables rules."
                /sbin/iptables-save -c > /etc/iptables.rules
                ;;
        *)
                ;;
esac
}}}

Infine, bisogna assicurarsi che NetworkManager sia in grado di eseguire questo script.
In una finestra di terminale, digitare il seguente comando:

{{{
# chmod +x /etc/NetworkManager/dispatcher.d/01firewall
}}}

= Consigli =

== Modifica manuale di iptables con regole di base ==

I passaggi sopra descritti vanno oltre la configurazione di regole del firewall che probabilmente saranno relativamente statiche.
Ma se si fa un sacco di lavoro di sviluppo, è possibile che si abbia bisogno di salvare le regole di iptables ad ogni riavvio.
Si potrebbe aggiungere una linea simile a questa in '/etc/network/interfaces':

{{{
  pre-up iptables-restore < /etc/iptables.rules
  post-down iptables-save > /etc/iptables.rules
}}}

La linea "post-down iptables-save> /etc/iptables.rules" salverà le regole da utilizzare per il prossimo avvio.


== Utilizzare iptables-save/restore per testare le regole ==

Se si modifica iptables al di là di questa esercitazione è possibile utilizzare la caratteristica 'iptables-save' e 'iptables-restore' per modificare e testare le regole.
Per fare questo aprire il file di regole nel vostro editor di testo preferito (in questo esempio gedit).

{{{
$ sudo iptables-save > /etc/iptables.rules
$ gksudo gedit /etc/iptables.rules
}}}

Si avrà un file simile a:

{{{
# Generated by iptables-save v1.3.1 on Sun Apr 23 06:19:53 2006
*filter
:INPUT ACCEPT [368:102354]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [92952:20764374]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j DROP
COMMIT
# Completed on Sun Apr 23 06:19:53 2006
}}}

Notare che questi sono i comandi di iptables senza il comando 'iptable'. Ci si sentaliberi di modificarlo nel file e salvarlo. Poi per eseguire i test:

{{{
# iptables-restore < /etc/iptables.rules
}}}

NOTA: Con iptables 1.4.1.1-1 e successivi, uno script consente di testare le nuove regole senza rischiare nulla sul server remoto. Se si applicano le regole su un server remoto, è necessario considerare i test con:

{{{
# iptables-apply /etc/iptables.rules
}}}

Dopo la prova, se non si è aggiunto il comando 'iptables-save' nel file '/etc/network/interfaces' ricordarsi di non perdere le modifiche:

{{{
# iptables-save > /etc/iptables.rules
}}}
Linea 131: Linea 423:

 * [[http://iptables-tutorial.frozentux.net/iptables-tutorial.html|Guida a Iptables]]
 * [[https://help.ubuntu.com/community/IptablesHowTo|Documento originale]]
 * [[http://wiki.ubuntu-it.org/Sicurezza/Ufw|Ufw]]
 * [[http://wiki.ubuntu-it.org/Sicurezza/Gufw|Gufw]]
 * [[http://wiki.ubuntu-it.org/Sicurezza/Firestarter|Firestarter]]
 * [[http://www.frozentux.net/documents/iptables-tutorial/|Guida a Iptables]]
Linea 135: Linea 430:
 * [[http://www.ubuntulinux.org/wiki/IptablesHowTo|Versione originale]]

Traduzione di BeniaminoCaputo

## RevisioneStilistica
Linea 141: Linea 432:
CategorySicurezza CategoryDaRevisionare CategorySicurezza


Problemi in questa pagina? Segnalali in questa discussione







Introduzione

Iptables è un firewall, da linea di comando, installato in modo predefinito su Ubuntu. Quando si installa Ubuntu, anche iptables viene installato con le impostazioni di default che autorizzano tutto il traffico.

A partire da Ubuntu 8.04 anche Ufw viene installato di default. Si tratta di un applicazione che consente di semplificare la configurazione di iptables.

Mostrare la configurazione attuale

  • Per visualizzare la configurazione del firewall, è sufficiente digitare il seguente comando in una finestra di terminale:

    sudo iptables -L
  • Per esempio, con Ubuntu appena installato, il firewall è sì attivo, ma non ha ancora una vera configurazione, perciò l'output dovrebbe essere:

    Chain INPUT (policy ACCEPT)
    
    target     prot opt source               destination         
    
    Chain FORWARD (policy ACCEPT)
    
    target     prot opt source               destination         
    
    Chain OUTPUT (policy ACCEPT)
    
    target     prot opt source               destination

In modo predefinito il firewall lascia passare tutto, come indicano le scritte "policy ACCEPT" e l'assenza di altre regole. A volte le informazioni mostrate non sono sufficienti; in questi casi basta aggiungere -v oppure -vv al precedente comando. Per esempio:

sudo iptables -vv -L

Opzioni di base

Di seguito, verranno riportate alcune delle opzioni di iptables per meglio comprendere la sintassi riportata successivamente.

  • A - Append Appende (allega) questa regola alla lista delle regole. Le liste di regole valide per ciò che stiamo facendo sono INPUT, FORWARD and OUTPUT, ma in questo tutorial si tratterà l'INPUT che regolerà solo il traffico in entrata.

  • -L - List elencherà in una lista le attuali regole di filtraggio.

  • -m conntrack - Permette di filtrare le regole per abbinarle in base allo stato di connessione. Consente l'uso dell'opzione - ctstate.
  • --ctstate - Definisce l'elenco degli stati per la regola da soddisfare. Gli stati validi sono:
    • NEW - La connessione non è stata ancora visualizzata.
    • RELATED - La connessione è nuova, Ma è in relazione con un'altra attualmente permessa.
    • ESTABLISHED - La connessione è tuttora stabilita.
    • INVALID - Il traffico non può essere identificato per qualche ragione.
  • -m limit - Richiede quale regola deve essere soddisfatta solo un numero limitato di volte. Permette l'uso dell'opzione --limit. Utile per limitare le regole di registrazione.
    • --limit - Il tasso massimo di corrispondenza, dato come un numero seguito da "/second", "/minute", "/hour", or "/day" in base a quanto si desidera che la regola sia soddisfatta. Se questa opzione non viene utilizzata mentre si usa "-m limit", il valore di default è "3/hour".
  • -p - Il protocollo utilizzato per la connessione.
  • --dport - La porta di destinazione richiesta per questa regola. Può essere indicata una porta singola oppure un intervallo di porte come "portastart:portaend", che prenderà in considerazione tutte le porte da 'portastart' a 'portaend' comprese.
  • j - Salta al target specificato. Per default, iptables permette quattro target:
    • ACCEPT - Accetta il pacchetto e blocca le regole in questa lista.
    • REJECT - Rigetta il pacchetto e notifica a chi sta inviando i dati che si è proceduto al blocco, nonchè blocca le regole in vigore in questa lista.
    • DROP - Ignora silenziosamente il pacchetto e blocca le regole in vigore in questa lista.
    • LOG - Logga il pacchetto, e continua a processare più regole nella lista. Permette l'uso delle opzioni --log-prefix e --log-level.
  • --log-prefix - Durante il log, inserire questo testo prima del messaggio di log. Usare il 'double quotes' sul testo da usare.
  • --log-level - Loggarsi usando il livello 'syslog' specificato. 7 è una buona scelta finchè non si avrà specificatamente bisogno di qualcos'altro.
  • -i - Soddisfatta solo se un pacchetto sta entrando verso la periferica specificata.
  • -I - Inserisce una regola. Desidera solo due opzioni, la lista dove inserirla e il numero che la regola avrà nella lista.
    • -I INPUT 5 dovrebbe inserire la regola all'interno della lista di regole INPUT nella quinta posizione.
  • -v - Visualizza più informazioni nel rapporto. Utile per visualizzare se si hanno regole che appaiono molto simili senza l'uso dell'opzione in questione.
  • -s --source - indirizzo[/mask] 'specifica sorgente'
  • -d --destination - indirizzo[/mask] 'specifica destinazione'
  • -o --out-interface - output name[+] interfaccia di rete name ([+] per carattere jolly)

Consentire sessioni già stabilite

  • Si possono autorizzare connessioni già stabilite a ricevere traffico:

    # iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  • La regola qui sopra non ha spazi su entrambi i lati della virgola tra ESTABLISHED,RELATED
  • Se la linea qui sopra non funziona, si potrebbe essere su un VPS che usa OpenVZ oppure non si hanno installate alcune estensioni del kernel. In quel caso, provare questo comando:

    # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Autorizzare il traffico in entrata su porte specifiche

Si potrebbe iniziare bloccando il traffico, ma si potrebbe aver bisogno di lavorare su SSH, e quindi si potrebbe aver bisogno di consentire il SSH prima di bloccare tutto il resto.

  • Per consentire il traffico in ingresso sulla porta di default SSH (22), si potrebbe comunicare a iptables di consentire tutto il traffico TCP in ingresso su quella porta:

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

Facendo riferimento alla lista qui sopra, si può notare che il comando dice a iptables:

  • aggiungi questa regola alla catena input (-A INPUT) in modo da guardare il traffico in entrata
  • controlla per verificare se è di tipo TCP (-p tcp).
  • in caso affermativo, verificare se l'input punta alla porta SSH (- dport ssh).
  • in caso affermativo, accettare l'input (-j ACCEPT).

Si controllino allora le regole: (Qui sotto vengono mostrate solo le prime righe, ma il report mostrerà di più)

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh

Ora, si autorizzi il traffico in entrata nella rete

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

Controllando le regole, si avrà

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www

Abbiamo specificatamente consentito il traffico TCP verso le porte ssh e web, ma poiché non abbiamo bloccato niente, tutto il traffico può ancora entrare

Bloccare il traffico

Una volta che si è deciso di accettare un pacchetto, le regole non incidono più su di esso. Visto che le regole che consentono il traffico ssh e web sono inserite prima di altre, e dato che la regola per bloccare tutto il traffico viene dopo di loro, si può ancora accettare il traffico che si vuole. Tutto quello che dobbiamo fare è inserire la regola per bloccare tutto il traffico alla fine.

# iptables -A INPUT -j DROP
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www
DROP       all  --  anywhere             anywhere

Visto che non si è specificato un'interfaccia o un protocollo, qualsiasi tipo di traffico per ogni porta su qualsiasi interfaccia è bloccata, tranne che per il web e ssh.

Modificare iptables

L'unico problema del setup appena implementato è che anche la porta di loopback è bloccata. Abbiamo potuto scrivere la regola 'drop' solo per eth0 specificando '-i eth0', ma potremmo anche aggiungere una regola per il loopback. Se vogliamo aggiungere questa regola sarà ormai troppo tardi perchè tutto il traffico è stato 'droppato'. Si deve quindi inserire prima questa regola. Visto che questo è una grossa quantità di traffico, si inserirà questa come prima regola affinchè venga processata per prima.

# iptables -I INPUT 1 -i lo -j ACCEPT
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www
DROP       all  --  anywhere             anywhere

Le prime linee e le ultime si assomigliano, quindi dovremo vedere la lista di iptables con maggiore dettaglio.

# iptables -L -v

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
    0     0 ACCEPT     all  --  any    any     anywhere             anywhere            state RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:ssh
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:www
    0     0 DROP       all  --  any    any     anywhere             anywhere

Ora è possibile vedere molte più informazioni. Questa regola è in realtà molto importante, dal momento che molti programmi utilizzano l'interfaccia di loopback per comunicare tra loro. Se non si consente loro di parlare, si potrebbe interrompere quei programmi!

Registrazione

Nessuno degli esempi di traffico riportati sopra verrà registrato. Se si desidera registrare i pacchetti 'droppati' su syslog, questo è il modo più rapido:

# iptables -I INPUT 5 -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

Si veda la sezione Suggerimenti per maggiori consigli sulla registrazione.

Salvataggio di IPTables

Se si dovesse riavviare la macchina in questo momento, la configurazione di iptables sparirebbe. Invece, se si vuole che ad ogni riavvio si mantengano queste configurazioni, si dovrà salvare la configurazione. Per salvarla, è possibile utilizzare 'iptables-save' e 'iptables-restore'.

Configurazione all'avvio

ATTENZIONE: Iptables e NetworkManager potrebbero essere in conflitto. Se siete preoccupati abbastanza per la sicurezza per installare un firewall, potreste non vuole fidarsi NetworkManager per la gestione di esso ancora. Si noti inoltre NetworkManager e iptables hanno obiettivi opposti. Iptables mira a conservare qualsiasi dubbio il traffico di rete. NetworkManager mira ad essere sempre connessi in ogni momento. Pertanto, se si vuole la sicurezza per tutto il tempo, eseguire iptables al boot. Se si desidera che la sicurezza parte del tempo poi NetworkManager potrebbe essere la scelta giusta.

ATTENZIONE: Se si utilizza NetworkManager (installato di default su Feisty e versioni successive) questi passaggi vi lascerà in grado di utilizzare NetworkManager per le interfacce si modificano. Si prega di attenersi alla procedura descritta nella sezione successiva, invece.

NOTA: Sembra in Hardy, NetworkManager ha un problema con correttamente sul salvataggio e il ripristino delle regole iptable quando si utilizza il metodo nella sezione successiva. L'utilizzo di questo primo metodo sembra funzionare. Se trovate in caso contrario, si prega di aggiornare questa nota.

Salvare le regole del firewall in un file

# sudo bash -c "iptables-save > /etc/iptables.rules"

Ora si hanno molte opzioni. Si possono fare modifiche a '/etc/network/interfaces' o aggiungere uno script a '/etc/network/if-pre-up.d/' e '/etc/network/if-post-down.d/' per ottenere risultati simili. La soluzione dello script permette una flessibilità leggermente maggiore.

Soluzione #1 - /etc/network/interfaces

(NB: si sono seguite le istruzioni in questa sezione e questo ha disabilitato la maggior parte (o tutti) degli script in '/etc/rc2.d /: Polipo, dnsmasq, bluetooth, ecc; Consiglia di utilizzare ufw/gufw.)

Modificare il file di configurazione di interfacce '/etc/network/' per applicare le regole automaticamente. È necessario conoscere l'interfaccia che si sta utilizzando, al fine di applicare le regole - se non la si conosce, probabilmente si sta utilizzando l'interfaccia eth0, anche se si dovrebbe verificare con il seguente comando per vedere se ci sono delle schede wireless:

  iwconfig

Se si ottiene un output simile al seguente, allora non avete schede wireless e molto probabilmente state usanto eth0.

$ iwconfig

lo        no wireless extensions.

eth0      no wireless extensions.

$

Quando si conosce l'interfaccia che si sta utilizzando, aprire il file '/etc/network/interfaces' e a seconda della distribuzione o dell'editor in uso si dovràc digitare:

# nano /etc/network/interfaces

Per Ubuntu e Xubuntu, premere alt+F2, e successivamente nella finestra che appare, scrivere:

gksudo gedit /etc/network/interfaces

e premere Enter.

Per Kubuntu: premere Alt+F2, successivamente nella finestra che compare scrivere:

kdesu kate /etc/network/interfaces

poi premere Enter.

Una volta all'interno del file, ricercare l'interfaccia che si è trovata, e alla fine delle righe relative alla rete per l'interfaccia, aggiungere la riga:

pre-up iptables-restore < /etc/iptables.rules

È anche possibile preparare una serie di regole secondarie, salvarli in secondo file '/etc/iptables.downrules' e si applicheranno automaticamente utilizzando la procedura di cui sopra:

post-down iptables-restore < /etc/iptables.downrules

Un esempio completo e funzionante utilizzando entrambe le soluzioni sopra:

auto eth0
iface eth0 inet dhcp
  pre-up iptables-restore < /etc/iptables.rules
  post-down iptables-restore < /etc/iptables.downrules

Si consiglia inoltre di conservare le informazioni provenienti dai contatori di byte e pacchetti.

iptables-save -c > /etc/iptables.rules 

Il comando sopra salverà l'intero set di regole in un file chiamato '/etc/iptables.rules' con i contatori byte e dei pacchetti ancora intatta.

Soluzione #2 /etc/network/if-pre-up.d and ../if-post-down.d

NOTA: Questa soluzione utilizza 'iptables-save -c' per salvare i contatori. Basta togliere l'opzione '-c' per salvare solo le regole.

In alternativa si potrebbe aggiungere 'iptables-restore' e 'iptables-save' per le directory 'if-pre-up.d' e 'if-post-down.d' nella directory '/etc/network' invece di modificare direttamente la '/etc/network/interface'.

Lo script '/etc/network/if-pre-up.d/iptablesload' conterrà:

iptables-restore < /etc/iptables.rules
exit 0

e '/etc/network/if-post-down.d/iptablessave' conterrà:

iptables-save -c > /etc/iptables.rules
if [ -f /etc/iptables.downrules ]; then
   iptables-restore < /etc/iptables.downrules
fi
exit 0

Assicurarsi di dare ad entrambi gli script i permessi di esecuzione:

# chmod +x /etc/network/if-post-down.d/iptablessave
# chmod +x /etc/network/if-pre-up.d/iptablesload

Configurazione all'avvio di NetworkManager

NetworkManager include la possibilità di eseguire script quando si attiva o disattiva un'interfaccia. Per salvare le regole iptables allo spegnimento del computer e per ripristinarle all'avvio si dovrà creare uno script di questo tipo. Per iniziare, premete Alt + F2 e digitare il seguente comando:

Per Ubuntu:

$ gksudo gedit /etc/NetworkManager/dispatcher.d/01firewall

Per Kubuntu:

kdesu kate /etc/NetworkManager/dispatcher.d/01firewall

Quindi incollare questo script nel vostro editor, salvare e uscire dall'editor.

if [ -x /usr/bin/logger ]; then
        LOGGER="/usr/bin/logger -s -p daemon.info -t FirewallHandler"
else
        LOGGER=echo
fi

case "$2" in
        up)
                if [ ! -r /etc/iptables.rules ]; then
                        ${LOGGER} "No iptables rules exist to restore."
                        return
                fi
                if [ ! -x /sbin/iptables-restore ]; then
                        ${LOGGER} "No program exists to restore iptables rules."
                        return
                fi
                ${LOGGER} "Restoring iptables rules"
                /sbin/iptables-restore -c < /etc/iptables.rules
                ;;
        down)
                if [ ! -x /sbin/iptables-save ]; then
                        ${LOGGER} "No program exists to save iptables rules."
                        return
                fi
                ${LOGGER} "Saving iptables rules."
                /sbin/iptables-save -c > /etc/iptables.rules
                ;;
        *)
                ;;
esac

Infine, bisogna assicurarsi che NetworkManager sia in grado di eseguire questo script. In una finestra di terminale, digitare il seguente comando:

# chmod +x /etc/NetworkManager/dispatcher.d/01firewall

Consigli

Modifica manuale di iptables con regole di base

I passaggi sopra descritti vanno oltre la configurazione di regole del firewall che probabilmente saranno relativamente statiche. Ma se si fa un sacco di lavoro di sviluppo, è possibile che si abbia bisogno di salvare le regole di iptables ad ogni riavvio. Si potrebbe aggiungere una linea simile a questa in '/etc/network/interfaces':

  pre-up iptables-restore < /etc/iptables.rules
  post-down iptables-save > /etc/iptables.rules

La linea "post-down iptables-save> /etc/iptables.rules" salverà le regole da utilizzare per il prossimo avvio.

Utilizzare iptables-save/restore per testare le regole

Se si modifica iptables al di là di questa esercitazione è possibile utilizzare la caratteristica 'iptables-save' e 'iptables-restore' per modificare e testare le regole. Per fare questo aprire il file di regole nel vostro editor di testo preferito (in questo esempio gedit).

$ sudo iptables-save > /etc/iptables.rules
$ gksudo gedit /etc/iptables.rules

Si avrà un file simile a:

# Generated by iptables-save v1.3.1 on Sun Apr 23 06:19:53 2006
*filter
:INPUT ACCEPT [368:102354]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [92952:20764374]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j DROP
COMMIT
# Completed on Sun Apr 23 06:19:53 2006

Notare che questi sono i comandi di iptables senza il comando 'iptable'. Ci si sentaliberi di modificarlo nel file e salvarlo. Poi per eseguire i test:

# iptables-restore < /etc/iptables.rules

NOTA: Con iptables 1.4.1.1-1 e successivi, uno script consente di testare le nuove regole senza rischiare nulla sul server remoto. Se si applicano le regole su un server remoto, è necessario considerare i test con:

# iptables-apply /etc/iptables.rules

Dopo la prova, se non si è aggiunto il comando 'iptables-save' nel file '/etc/network/interfaces' ricordarsi di non perdere le modifiche:

# iptables-save > /etc/iptables.rules

Ulteriori risorse


CategorySicurezza