Avanti Indietro Indice

6. Preparare il sistema Linux

Si installi il sistema Linux nel modo più compatto possibile. La mia installazione presentava una configurazione di tipo server quindi ho provveduto a disabilitare i servizi non necessari nel file /etc/inetd.conf. Per una maggior sicurezza si dovrebbero disinstallare i servizi inutili.

Siccome la maggior parte delle distribuzioni non fornisce in genere un kernel efficiente per le proprie esigenze, sarà necessario compilarne uno proprio. Questa operazione sarebbe meglio effettuarla su un computer diverso dal firewall. Se si installa sul firewall un compilatore C e le utilità, ci si ricordi di rimuoverle dopo aver completato la configurazione del kernel.

6.1 Compilazione del Kernel

Si parta con un'installazione minima della propria distribuzione Linux. Meno software si installa e meno buchi, backdoor e/o bug ci saranno ad introdurre problemi di sicurezza nel proprio server.

Si prenda un kernel stabile. Io sto utilizzando, per il mio sistema, la 2.2.13. Quindi questa documentazione è basata sulle sue impostazioni.

È necessario ricompilare il kernel di Linux con le opzioni appropriate. Se non si è mai ricompilato il proprio kernel prima d'ora, si dovrebbe leggere il Kernel HOWTO, l'Ethernet HOWTO e il NET-2 HOWTO.

Qui ci sono le impostazioni di rete che so per certo come funzionanti. Ne ho marcate alcune con un ?. Se si è intenzionati ad utilizzarle, le si abilitino pure. Per modificare le impostazioni del mio kernel utilizzo "make menuconfig".

    <*> Packet socket
    [ ] Kernel/User netlink socket
    [*] Network firewalls
    [ ] Socket Filtering
    <*> Unix domain sockets
    [*] TCP/IP networking
    [ ] IP: multicasting
    [*] IP: advanced router
    [ ] IP: kernel level autoconfiguration
    [*] IP: firewalling
    [?] IP: always defragment (required for masquerading)
    [?] IP: transparent proxy support
    [?] IP: masquerading
    --- Protocol-specific masquerading support will be built as modules.
    [?] IP: ICMP masquerading
    --- Protocol-specific masquerading support will be built as modules.
    [ ] IP: masquerading special modules support
    [*] IP: optimize as router not host
    < > IP: tunneling
    < > IP: GRE tunnels over IP
    [?] IP: aliasing support
    [*] IP: TCP syncookie support (not enabled per default)
    --- (it is safe to leave these untouched)
    < > IP: Reverse ARP
    [*] IP: Allow large windows (not recommended if <16Mb of memory)
    < > The IPv6 protocol (EXPERIMENTAL)
    ---
    < > The IPX protocol
    < > Appletalk DDP
    < > CCITT X.25 Packet Layer (EXPERIMENTAL)
    < > LAPB Data Link Driver (EXPERIMENTAL)
    [ ] Bridging (EXPERIMENTAL)
    [ ] 802.2 LLC (EXPERIMENTAL)
    < > Acorn Econet/AUN protocols (EXPERIMENTAL)
    < > WAN router
    [ ] Fast switching (read help!)
    [ ] Forwarding between high speed interfaces
    [ ] PU is too slow to handle full bandwidth
    QoS and/or fair queueing  ---> 

Dopo aver completato tutte le impostazioni sarà necessario ricompilare, reinstallare il kernel e riavviare. Io utilizzo il comando:

make dep;make clean;make bzlilo;make modules;make modules_install;init 6 per fare tutto in un colpo solo.

6.2 Configurazione di due schede di rete

Se il proprio computer possiede due schede di rete, molto probabilmente sarà necessario inserire un'istruzione "append" nel proprio file /etc/lilo.conf, per specificare l'IRQ e l'indirizzo di entrambe le schede. L'istruzione presente nel mio lilo è la seguente:

append="ether=12,0x300,eth0 ether=15,0x340,eth1" 

6.3 Configurazione degli indirizzi di rete

Siamo arrivati finalmente alla parte più divertente dell'impostazione. Non sto per addentrarmi ad approfondire come impostare una LAN, per risolvere eventuali problemi si legga il Networking-HOWTO.

L'obiettivo è di fornire il sistema firewall di due connessioni di rete, una diretta verso Internet (versante non sicuro) e una verso la LAN (versante sicuro).

Ad ogni modo, ci sono un paio di decisioni da prendere.

  1. Si vogliono utilizzare per la propria rete locale indirizzi IP reali o qualcosa di differente ?
  2. L'indirizzo IP è statico oppure è assegnato dall'ISP ?

Dal momento che non si desidera che Internet abbia accesso ad alcuna parte della rete privata, non è necessario utilizzare degli "indirizzi reali". Si potrebbero prendere degli indirizzi qualsiasi per la propria rete LAN, ma ciò non è raccomandato. Se i dati dovessero essere instradati fuori dalla LAN, potrebbero giungere ad una porta di un altro sistema.

Esistono comunque molti intervalli di indirizzi internet riservati appositamente per le reti private.

Tra questi c'è 192.168.1.xxx che utilizzeremo nei nostri esempi.

Sarà inoltre necessario utilizzare l'IP masquerading. Con questo procedimento il firewall farà proseguire i pacchetti e, per farli viaggiare in Internet, li modificherà utilizzando un indirizzo IP "REALE".

Utilizzando questi indirizzi IP non-instradabili la propria rete sarà più sicura. I router internet non invieranno pacchetti con questi indirizzi.

A questo punto potrebbe essere utile leggere l'IP Masquerading HOWTO.

            24.94.1.123  __________    192.168.1.1
      _/\__/\_        \ |          | /           _______________
     |        |        \| Sistema  |/           |               |
    / Internet \--------| Firewall |------------| Workstation/s |
    \_  _  _  _/        |__________|            |_______________|
      \/ \/ \/  

E' necessario possedere un indirizzo IP "reale" da assegnare alla scheda di rete corrispondente ad Internet. Questo indirizzo può essere assegnato in modo permanente (indirizzo IP statico) oppure al momento della connessione alla rete attraverso il processo PPP.

Si dovranno quindi assegnare gli indirizzi IP alla rete locale, ad esempio, 192.168.1.1 alla scheda di rete corrispondente alla LAN. Questo sarà il gateway di default. A tutte le altre macchine nella rete protetta (LAN) si potrà assegnare un numero appartenente all'intervallo 192.168.1.xxx (da 192.168.1.2 a 192.168.1.254).

Io utilizzo la RedHat Linux. Per configurare la rete al momento del boot ho aggiunto un file ifcfg-eth1 nella directory /etc/sysconfig/network-scripts. Sempre in questa directory si potrebbero trovare anche ifcfg-ppp0 o ifcfg-tr0. Questi file 'ifcfg-' sono utilizzati dalla RedHat per configurare e abilitare i dispositivi di rete al boot. Il nome è assegnato in base al tipo di connessione.

Segue, come esempio, ifcfg-eth1 (seconda scheda ethernet):

    DEVICE=eth1
    IPADDR=192.168.1.1
    NETMASK=255.255.255.0
    NETWORK=192.168.1.0
    BROADCAST=192.168.1.255
    GATEWAY=24.94.1.123
    ONBOOT=yes

Se si sta per utilizzare una connessione dialup si dia un'occhiata ai file ifcfg-ppp0 e chat-ppp0. Questi file controllano la connessione PPP.

Questo file ifcfg potrebbe essere simile a:

    DEVICE="ppp0"           
    ONBOOT="yes"
    USERCTL="no"
    MODEMPORT="/dev/modem"      
    LINESPEED="115200"          
    PERSIST="yes"   
    DEFABORT="yes"  
    DEBUG="yes"     
    INITSTRING="ATZ"
    DEFROUTE="yes"  
    HARDFLOWCTL="yes"           
    ESCAPECHARS="no"
    PPPOPTIONS=""   
    PAPNAME="LoginID"           
    REMIP=""        
    NETMASK=""      
    IPADDR=""       
    MRU=""          
    MTU=""          
    DISCONNECTTIMEOUT=""        
    RETRYTIMEOUT="5"
    BOOTPROTO="none"

6.4 Verifica del funzionamento della rete

Si cominci impartendo i comandi ifconfig e route. Se si possiedono due schede di rete l'output di ifconfig dovrebbe essere simile al seguente:

  #ifconfig
  lo        Link encap:Local Loopback
            inet addr:127.0.0.1  Mask:255.0.0.0
            UP LOOPBACK RUNNING  MTU:3924  Metric:1
            RX packets:1620 errors:0 dropped:0 overruns:0
            TX packets:1620 errors:0 dropped:0 overruns:0
            collisions:0 txqueuelan:0

  eth0      Link encap:10Mbps Ethernet  HWaddr 00:00:09:85:AC:55
            inet addr:24.94.1.123 Bcast:24.94.1.255  Mask:255.255.255.0
            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
            RX packets:1000 errors:0 dropped:0 overruns:0
            TX packets:1100 errors:0 dropped:0 overruns:0
            collisions:0 txqueuelan:0
            Interrupt:12 Base address:0x310

  eth1      Link encap:10Mbps Ethernet  HWaddr 00:00:09:80:1E:D7
            inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
            RX packets:1110 errors:0 dropped:0 overruns:0
            TX packets:1111 errors:0 dropped:0 overruns:0
            collisions:0 txqueuelan:0
            Interrupt:15 Base address:0x350

mentre la propria tabella di instradamento dovrebbe essere:

  #route -n
  Kernel routing table
  Destination     Gateway         Genmask         Flags MSS    Window Use Iface
  24.94.1.0       *               255.255.255.0   U     1500   0       15 eth0
  192.168.1.0     *               255.255.255.0   U     1500   0        0 eth1
  127.0.0.0       *               255.0.0.0       U     3584   0        2 lo
  default         24.94.1.123     *               UG    1500   0       72 eth0

Nota: 24.94.1.0 è il lato Internet di questo firewall e 192.168.1.0 è il lato privato.

Ora è necessario assicurarsi che ogni computer della propria LAN sia in grado di effettuare dei ping verso l'indirizzo interno del sistema firewall (192.168.1.1 in questo caso). Se non è possibile, si passi nuovamente al NET-2 HOWTO e si lavori ancora un po' sulla rete.

Dopodiché, dal firewall, si provi ad effettuare un ping ad un sistema presente in Internet. Per i miei test utilizzo www.internic.net. Se non funziona, provare con un server del proprio ISP. Se ancora non funziona allora parte della propria connessione ad Internet è errata. Si dovrebbe essere in grado di connettersi ovunque in Internet dal proprio firewall. Si dia un'occhiata all'impostazione del proprio gateway di default. Se si sta utilizzando una connessione dialup si faccia un doppio controllo della user ID e della password. Quindi si rilegga il net-2 HOWTO, e si riprovi.

Ora si provi ad effettuare un ping verso l'indirizzo esterno del firewall (24.94.1.123) utilizzando un computer della propria LAN. Non dovrebbe funzionare. Se funziona allora il masquerading o l'IP Forwarding sono abilitati, oppure si ha già qualche filtro di pacchetti impostato. Li si disabilitino e si riprovi. E' necessario assicurarsi che il filtraggio sia a posto.

Per i kernel più recenti della 2.1.102 si può impartire il comando:

    echo "0" > /proc/sys/net/ipv4/ip_forward

Se si sta utilizzando un vecchio kernel (PERCHÉ ?) sarà necessario ricompilare il kernel con il forwarding disabilitato (meglio passare ad un kernel più recente).

Si provi ad effettuare di nuovo un ping verso l'indirizzo esterno del firewall (24.94.1.123), non dovrebbe funzionare.

Ora si abiliti l'IP forwarding e/o il masquerading, si dovrebbe essere in grado, da qualsiasi sistema della LAN, di effettuare dei ping ovunque in Internet:

    echo "1" > /proc/sys/net/ipv4/ip_forward

NOTA IMPORTANTE: Se si utilizzano indirizzi IP "REALI" per la propria LAN (non 192.168.1.*) e non si riescono ad effettuare i ping verso internet, ma solo verso il lato internet del firewall, allora ci si assicuri che il proprio ISP instradi i pacchetti per gli indirizzi della propria rete privata.

Un test di questo problema può essere effettuato se si ha qualcuno in Internet (diciamo un amico che utilizza un provider locale) attraverso l'utilizzo del traceroute verso la propria rete. Se il tracciamento si blocca con il router del proprio provider allora significa che il router non inoltra il proprio traffico.

Funziona ? Splendido. La fase più ardua è compiuta. :-)

6.5 Sicurezza del Firewall

Un firewall non è di nessuna utilità se lasciato aperto agli attacchi. Un "malintenzionato" potrebbe ottenere l'accesso ad un servizio non del firewall e modificarlo secondo le proprie esigenze.

Date un'occhiata al file /etc/inetd.conf, utilizzato per configurare inetd, noto anche come "super server". Esso controlla parecchi demoni che attiva nel momento in cui sono richiesti da pacchetti che arrivano diretti verso porte "note" ("well known port").

Si possono disabilitare echo, discard, daytime, chargen, ftp, gopher, shell, login, exec, talk, ntalk, pop-2, pop-3, netstat, systat, tftp, bootp, finger, cfinger, time, swat e linuxconfig se presente.

Per disabilitare un servizio, si aggiunga un # come primo carattere della linea corrispondente al servizio. Una volta concluso, si invii un SIG-HUP al processo impartendo "kill -HUP <pid>", dove <pid> è il numero del processo di inetd. Questo comando obbliga inetd a rileggere il suo file di configurazione (inetd.conf) e a riavviarsi senza dover spegnere il sistema.

Si faccia un test effettuando un telnet alla porta 15 (netstat) del firewall, se si ottiene dell'output allora non si è disabilitato questo servizio.

telnet localhost 19

Si può inoltre creare il file /etc/nologin. Si inserisca qualche linea di testo tipo (FILA VIA!). Quando questo file esiste, login non consentirà agli utenti di connettersi. Essi vedranno il contenuto di questo file ed il loro login sarà rifiutato. Solo root potrà accedere.

Se l'utente è root allora il login deve avvenire su una delle tty elencate in /etc/securetty. Fallimenti saranno registrati con l'apposita funzione del syslog. Con presenti entrambi questi controlli l'unico modo per accedere al firewall è attraverso la console e solo come root.

MAI e poi MAI effettuare un telnet verso un sistema e accedere come ROOT. Se è necessario accedere in remoto come root utilizzare SSH (Secure Shell). Si potrebbe perfino disabilitare il telnet.

Se si è davvero paranoici allora si dovrebbe utilizzare lids (Linux Intrusion Detect System), una patch di scoperta delle intrusioni per il kernel Linux; può proteggere file importanti evitando che siano modificati. Quando è presente, nessuno (incluso root) può cambiare i file, le directory o sotto-directory protette. Per modificare i file protetti è necessario riavviare il sistema con l'impostazione security=1 nel LILO (riavvio in single user mode).


Avanti Indietro Indice