6.19. I firewall

6.19.1. Cos'è un firewall

Questa domanda avrebbe avuto poco senso qualche anno fa (prima del 1997) ma sembra essere molto importante oggi, quando molte cose collegate al computer sono state semplificate e nascoste dietro interfacce grafiche, e i bambini buttano via il loro tempo allenando delle abilità che utilizzano poco o niente nella loro vita reale[1].

Ad ogni modo andiamo al punto. Far girare una macchina Unix implica una grande quantità di responsabilità, specialmente oggi che la gente possiede nelle proprie case connessioni Internet ad alta velocità; i sistemi Unix sostanzialmente non fanno una differenza tra utenti fisicamente locali e remoti. Chiunque ottenga accesso alla propria macchina (specialmente ad account privilegiati) può usarli per compromettere il proprio e altri host sulla propria rete o attaccare altri siti Intenet e nascondere le proprie tracce. A seconda del tipo e successo dell'attacco, qualche volta, la sola consolazione che si ha è l'accesso fisico alla macchina e la possibilità di reinstallare (lasciando stare i backup che non sono stati fatti).

Quindi vi introdurremo al software firewall:

Un firewall è un insieme di programmi collegati, collocati su un server gateway di rete o sulla macchina dell'utente, che protegge le risorse private da [ab]usi non autorizzati. Fondamentalmente, un firewall esamina ciascun pacchetto di rete per determinare se esso vada inoltrato verso la sua destinazione o meno. Un firewall è spesso installato in un computer specificamente dedicato separato dal resto della rete così che nessuna richiesta in ingresso possa giungere direttamente alle risorse di rete private.

Questo significa che useremo un firewall per controllare l'accesso alla nostra macchina, tenendo a mente che distingueremo le connessioni iniziate da noi e quelle iniziate dalla parte remota.

AttenzioneAttenzione
 

Installare e (mal)configurare un firewall non è per nulla sufficiente a imporre la politica di utilizzo locale o a fornire un soddisfacente livello di sicurezza, ma fa una grande differenza rispetto ad un sistema "vanilla" (pulito, come installato); avere una automobile, non ci rende dei piloti, ma soddisfa un prerequisito indispensabile.

6.19.2. Impostazione del firewall in Debian GNU/Linux

I software per firewall liberi si sono evoluti. I vecchi kernel Linux della serie 2.0 utilizzavano ipfwadm, il 2.2 aveva ipchains e la attuale branca stabile 2.4 sfoggia lo splendente netfilter, che ha simpatizzanti anche tra coloro che hanno sempre preferito i sistemi BSD per quella parte del lavoro.

La parte in spazio utente (per netfilter) è ricoperta dal pacchetto iptables che è un'interfaccia piuttosto di basso livello alle funzioni di firewall così alcune persone (sì, anche noi) hanno la tendenza ad utilizzare delle interfacce; io ho trovato che ferm è La Interfaccia. ferm è un "analizzatore di regole firewall per linux progettato per mantenere e impostare complicate regole firewall". Abbastanza onesto.

# apt-get install ferm

Vedremo adesso come appare l'impostazione di un generico firewall casalingo. La politica che seguiremo è: rifiuta ogni cosa, permetti solo la porta 113, gli IP specificati manualmente e il traffico iniziato dalla nostra parte. Si dovrebbe leggere la pagina di manuale di ferm e gli esempi in /usr/share/doc/ferm/examples/, ma ecco i miei suggerimenti per iniziare:

# /etc/security/ferm.rules
# Ci si senta liberi di ricollocare questo file da qualche altra parte.

# Opzioni
option automod
option iptables
option clearall
option createchains

# Politiche predefinite. Rifiutare tutti i pacchetti.
chain input policy drop;
chain output policy drop;
chain forward policy drop;

# Accettare ogni cosa in uscita e tutti i messaggi ICMP in entrata.
# TODO: aggiornarlo.
chain output accept;
chain input proto icmp accept;

# Sulle interfacce lo e eth0, accettare ogni cosa che corrisponde allo
# intervallo di indirizzi. Registrare e rifiutare i pacchetti che non
# corrispondono.
# TODO: make this look properly
chain input if ( eth0 lo ) {
(1)	saddr 192.168.7.110/24 accept;
	saddr 127.0.0.1 accept;
        drop log;
}

# Collegamento Internet
# Accettare tutto da 129.70.28.189 e 161.53.41.91
# Accettare tutto quello che arriva sulla porta identd (113).
# Accettare tutto quello che appartiene a connessioni gia' stabilite o a
  connessioni relative.
# Registra e butta via tutto il resto.
(2)chain input if ppp0 {
        saddr 129.70.28.189 ACCEPT;
        saddr 161.53.41.91 ACCEPT;

        proto tcp dport 113 ACCEPT;

        state (established,related) ACCEPT;

        drop log;
}

(1)
L'esempio presuppone che la propria macchina abbia l'indirizzo IP locale 192.168.7.110 e netmask 255.255.255.0. Correggere l'IP dell'host (la netmask probabilmente è a posto).
(2)
L'esempio presuppone che il proprio collegamento Internet sia una connessione dial-up ppp0. Aggiustare in accordo alla propria impostazione.

SuggerimentoSuggerimento
 

Se si usano le opzioni dport o sport nelle proprie regole, si devono includere anche le specifiche proto tcp o udp.

Per rendere attive le regole:

# ferm /etc/security/ferm.rules

Si potrebbe anche aggiungere questo comando allo script /etc/ppp/ip-up, per avviarlo automaticamente ogni volta che il collegamento dial-up viene aperto.

6.19.3. Maggiore protezione

A meno che non si stiano usando giochi sotto Wine o WineX, si potrebbe essere interessati all'applicazione delle patch grsecurity al proprio kernel (si veda apt-cache search grsec).

Si potrebbe anche installare il Prelude Hybrid IDS (Intrusion Detection System - sistema di rilevamento delle intrusioni) sulle proprie macchine.

Note

[1]

I videogiochi on-line (N.d.T.)