8. Sicurezza di rete

La sicurezza di rete diventa sempre più importante perché il tempo di connessione ad Internet è sempre maggiore. Compromettere la sicurezza di rete è spesso molto più facile che compromettere la sicurezza fisica o locale ed è anche molto più comune.

C'è una serie di buoni strumenti che aiutano con la sicurezza di rete, e un numero sempre maggiore viene incluso nelle distribuzioni Linux.

8.1. Sniffer di pacchetti

Uno dei modi più comuni con cui gli intrusi ottengono l'accesso a più sistemi della propria rete, è l'uso di uno sniffer di pacchetti su un host già compromesso. Questo "sniffer" semplicemente ascolta sulla porta Ethernet cose come passwd, login e su nel flusso dei pacchetti e quindi registra il traffico successivo. In questo modo chi lo usa ottiene le password di sistemi in cui non ha neppure tentato effrazioni. Le password in chiaro sono molto vulnerabili a questo tipo di attacco.

Esempio: L'host A è stato compromesso. L'attaccante installa uno sniffer. Lo sniffer intercetta l'amministratore mentre fa un login dall'host B al C. Ottiene la password personale dell'amministratore. Poi, l'amministratore usa su per risolvere un problema. Ora si conosce anche la password di root per l'host B. Più tardi l'amministratore lascia che dal suo account qualcuno usi telnet per connettersi all'host Z. Ora l'attaccante ha il login e la password per l'host Z.

Oggi l'attaccante non ha neanche più bisogno di compromettere un sistema per usare questa tecnica: potrebbe semplicemente portare un portatile o un PC nell'edificio e connettersi alla rete.

Usare ssh o altri metodi di crittografia delle password, blocca questo attacco. Anche cose come APOP per gli account POP lo impediscono (i normali login POP sono molto vulnerabili a questo attacco, come ogni cosa che mandi password in chiaro su di una rete).

8.2. Servizi di sistema e tcp_wrappers

Prima di mettere un sistema Linux su QUALSIASI rete la prima cosa da sapere è quali servizi si vogliono offrire. I servizi non desiderati devono essere disabilitati, così da avere una cosa in meno di cui preoccuparsi e un possibile buco in meno per un intruso.

Ci sono molti modi per disabilitare i servizi sotto Linux. Si può leggere il proprio /etc/inetd.conf e vedere quali servizi vengono offerti da inetd. Si possono disabilitare tutti quelli che non servono commentandoli (# all'inizio della linea) e mandando quindi un SIGHUP al processo inetd.

Si potrebbero rimuovere (o commentare) servizi nel proprio /etc/services. Questo ne impedirà l'uso anche da client locali (cioè se si rimuove ftp e si prova a connettersi con ftp ad un host remoto da quella macchina, si otterrà solo un messaggio di "servizio sconosciuto"). In genere il gioco non vale la candela, visto che non dà ulteriori garanzie. Se qualcuno volesse usare ftp anche se l'avete commentato, potrebbe farsi un proprio client che usi la porta FTP e funzionerebbe benone.

Alcuni servizi che dovrebbero essere disponibili sono:

Se si sa che non serve un particolare pacchetto si può anche cancellarlo del tutto. rpm -e nome_pacchetto nella distribuzione RedHat cancella un pacchetto intero. Nella Debian dpkg --remove fa lo stesso.

Inoltre, si dovrebbe davvero evitare che le utilità rsh/rlogin/rcp, inclusi login (usato da rlogin), shell (usato da rcp) ed exec (usato da rsh) siano avviate da /etc/inetd.conf. Questi protocolli sono molto insicuri e sono stati l'origine di exploit in passato.

Si dovrebbe controllare /etc/rc.d/rc[0-9].d (sulla Red Hat; /etc/rc[0-9].d sulla Debian), e vedere se vengono avviati server che non sono necessari. I file in quelle directory sono link simbolici ai file contenuti in /etc/rc.d/init.d (sulla Red Hat; /etc/init.d sulla Debian). Rinominare i file nella directory init.d blocca tutti i link simbolici che puntano a quel file. Se si vuole solo disabilitare un servizio per un particolare run level, si rinomini il giusto link simbolico sostituendo la S maiuscola con una s minuscola, così:


       root#  cd /etc/rc6.d
       root#  mv S45dhcpd s45dhcpd

Se si ha file rc in stile BSD, si controlli in /etc/rc* se ci sono programmi che non servono.

Con molte distribuzioni Linux viene distribuito un tcp_wrappers che "incapsula" tutti i servizi TCP. Un tcp_wrapper (tcpd) viene invocato da inetd al posto del vero server. Quindi tcpd controlla l'host che sta richiedendo il servizio ed esegue il server o nega l'accesso all'host. tcpd permette di bloccare l'accesso ai servizi TCP. Si dovrebbe creare un file /etc/hosts.allow e aggiungervi solo gli host che devono avere accesso ai servizi della macchina.

Se si ha una connessione telefonica casalinga suggeriamo di negarli TUTTI. Inoltre tcpd segna nei log i tentativi di accesso falliti, per avvertire se si è sotto attacco. Se si aggiungono nuovi servizi ci si deve assicurare di configurarli per usare tcp_wrappers se sono TCP. Per esempio, un normale utente telefonico può impedire ad altri di connettersi alla propria macchina, conservando l'accesso alla posta e ad Internet. Per farlo, si potrebbero aggiungere le linee seguenti al proprio /etc/hosts.allow:

ALL: 127.

E ovviamente /etc/hosts.deny dovrà contenere:

ALL: ALL

che bloccherà connessioni esterne alla macchina, ma permetterà la connessione a server su Internet.

Si ricordi che tcp_wrapper protegge solo i servizi eseguiti da inetd e pochi altri. Ci potrebbero benissimo essere altri servizi in esecuzione sulla macchina. Si può usare netstat -ta per avere una lista di tutti i servizi offerti.

8.3. Verificare le proprie informazioni DNS

Tenere aggiornate le informazioni dei DNS su tutti gli host della rete aiuta ad aumentare la sicurezza. Se un host non autorizzato si connette alla rete, lo si può riconoscere dalla sua assenza dal DNS. Molti servizi possono essere configurati per negare l'accesso ad host che non hanno valide voci DNS.

8.4. identd

identd è un piccolo programma che in genere è eseguito dal vostro inetd. Tiene nota di quale utente sta eseguendo quale servizio TCP e quindi fa rapporto a chi lo richiede.

Molte persone fraintendono l'utilità di identd, quindi lo disabilitano o bloccano tutte le richieste provenienti dall'esterno. identd non è al servizio di siti remoti. Non c'è modo di sapere se i dati che si ricevono da un identd remoto siano corretti o no. Non c'è autenticazione nelle richieste identd.

Perché eseguirlo allora? Perché aiuta ed è un'informazione in più quando si indaga. Se il proprio identd è integro, allora si saprà che fornisce ai siti esterni, il nome utente o l'uid di chi sta usando i servizi TCP. Se l'amministratore di una rete remota riporta che un certo utente ha provato ad intromettersi nella sua rete, si potranno facilmente prendere provvedimenti. Se non si sta eseguendo identd, si dovranno leggere righe e righe di log, capire chi era nel sistema alla tal ora e in generale sprecare molto tempo a trovarlo.

L' identd che viene fornito con molte distribuzioni è più configurabile di quanto molti pensino. Lo si può disabilitare per utenti specifici, (possono creare un file .noident) si possono avere i log di tutte le richieste identd (è raccomandato) e si può persino far sì che identd risponda con l'uid di un utente o persino con NO-USER.

8.5. Configurare e rendere sicuro lo MTA Postfix

Il server di posta Postfix è stato scritto da Wietse Venema, autore di Postfix e di alcuni altri prodotti relativi alla sicurezza per Internet, come un "tentativo di fornire un'alternativa all'ampiamente usato Sendmail. Postfix si propone di essere veloce, facile da amministrare e, si spera, sicuro, cercando di essere allo stesso tempo sufficientemente compatibile con Sendmail da non sconvolgere gli utenti."

Si possono trovare ulteriori informazioni su Postfix presso il sito: Postfix e in Configurare e rendere sicuro Postfix.

8.6. SATAN, ISS, e altri scanner di rete

C'è una serie di differenti pacchetti software che fanno scansioni di porte e servizi di macchine o reti intere. SATAN, ISS, SAINT e Nessus sono alcuni dei più conosciuti. Questi software si connettono con la macchina bersaglio (o tutte le macchine bersaglio su di una rete) su tutte le porte possibili e tentano di capire quale servizio è attivo. Basandosi su queste informazioni, si può dire se la macchina è vulnerabile ad un particolare exploit.

SATAN (Security Administrator's Tool for Analyzing Networks) è un port scanner con un'interfaccia web. Può essere configurato per eseguire controlli leggeri, medi o pesanti su di una macchina o una rete. È una buona idea usare SATAN sulla rete e sistemare i problemi che trova. Ci si assicuri di avere la copia di SATAN da metalab http://metalab.unc.edu/pub/packages/security/Satan-for-Linux/ o da un sito FTP o web affidabile. È stata distribuita in rete una copia trojan di SATAN http://www.trouble.org/~zen/satan/satan.html. Si noti che SATAN non è aggiornato da molto tempo ed alcuni degli altri strumenti indicati sotto potrebbero dare risultati migliori.

ISS (Internet Security Scanner) è un altro port scanner. È più veloce di Satan, quindi potrebbe essere migliore per grandi reti. Comunque Satan in genere fornisce più informazioni.

Abacus è una suite di strumenti che fornisce sicurezza agli host e rilevamento delle intrusioni. Si guardi alla sua home page sul web per ulteriori informazioni. http://www.psionic.com/abacus/

SAINT è una versione aggiornata di SATAN. È basata sul web ed ha molti più test aggiornati di SATAN. Se ne può sapere di più presso: http://www.wwdsi.com/~saint

Nessus è uno scanner di sicurezza libero. Ha una interfaccia grafica GTK per semplicità d'uso. Inoltre è basato su una struttura a plug-in per aggiungere nuovi test. Per ulteriori informazioni, si dia un'occhiata a: http://www.nessus.org

8.7. sendmail, qmail e MTA (agenti di trasporto di posta)

Uno dei servizi più importanti che si può offrire è il server di posta. Sfortunatamente, è anche uno dei più vulnerabili agli attacchi, a causa del numero di compiti che esegue e dei privilegi che di solito richiede.

Se si sta usando sendmail è molto importante tenerlo aggiornato. sendmail ha una lunga, lunga storia di exploit di sicurezza. Ci si assicuri di eseguire sempre l'ultima versione da: http://www.sendmail.org.

Si tenga a mente che per spedire la posta non è necessario che sendmail sia in esecuzione. Se si è un utente casalingo, si può disabilitare completamente sendmail e usare il proprio client di posta per spedire. Si potrebbe anche rimuovere l'opzione "-bd" dal file di avvio di sendmail, disabilitando le richieste di posta in arrivo. In altre parole, potete eseguire sendmail dal vostro script di avvio, usando il seguente comando:

		# /usr/lib/sendmail -q15m
In questo modo sendmail svuoterà la coda della posta ogni 15 minuti per ogni messaggio che non è stato consegnato con successo al primo tentativo.

Molti amministratori preferiscono non usare sendmail e scelgono invece uno degli altri MTA. Si potrebbe considerare di passare a qmail. qmail è stato progettato da zero tenendo a mente la sicurezza. È veloce, stabile e sicuro. Si trova presso: http://www.qmail.org

In competizione con qmail si pone "postfix", scritto da Wietse Venema, l'autore di tcp_wrappers e altri strumenti di sicurezza. Precedentemente chiamato vmailer e sponsorizzato da IBM, anche questo è un MTA fatto da zero per la sicurezza. Si possono trovare altre informazioni su postfix presso http://www.postfix.org

8.8. Attacchi Denial of Service

Un "Denial of Service" (DoS) è un attacco con cui un aggressore tenta di rendere una risorsa troppo occupata per rispondere a richieste legittime o di negare a utenti legittimi l'accesso ad una macchina.

Questi attacchi sono molto aumentati negli ultimi anni. Sotto sono elencati alcuni dei più comuni o recenti. Si noti però che ne nascono in continuazione, quindi questi sono solo esempi. Si leggano le liste di sicurezza di Linux e le liste di bugtraq per informazioni aggiornate.

Si può trovare il codice della maggior parte degli exploit e una più approfondita descrizione del loro funzionamento presso http://www.rootshell.com usando il loro motore di ricerca.

8.9. Sicurezza di NFS (Network File System)

NFS è un protocollo di condivisione di file molto diffuso. Permette a server che eseguano nfsd e mountd di esportare interi filesystem verso altre macchine che usano il file system NFS nel loro kernel (o qualche altro client di supporto se non sono macchine Linux). mountd tiene traccia dei filesystem montati in /etc/mtab, e li mostra con showmount.

Molti siti usano NFS per fornire le home directory agli utenti di modo che abbiano i loro file da qualunque macchina si colleghino.

È possibile avere un po' di sicurezza quando si esportano filesystem. Si può far mappare a nfsd l'utente root remoto (uid=0) sull'utente nobody negando l'accesso totale ai file esportati. Comunque, visto che i singoli utenti hanno accesso ai propri file (o almeno a quelli con la stessa uid), l'utente root remoto può fare un login o su con il loro account ed avere accesso totale ai loro file. Questo è solo un piccolo ostacolo per un aggressore che ha i privilegi per montare i filesystem remoti.

Se si deve usare NFS, ci si assicuri di esportare solo verso quelle macchine che lo richiedono. Non si esporti mai la propria intera directory root; si esporti solo il necessario.

Si legga lo NFS HOWTO per ulteriori informazioni su NFS, disponibile presso http://metalab.unc.edu/mdw/HOWTO/NFS-HOWTO.html

8.10. NIS (Network Information Service) (ex YP).

Network Information service (ex YP) è un modo di distribuire informazioni ad un gruppo di macchine. Il master NIS tiene le tabelle di informazioni e le converte in file mappa di NIS. Queste mappe vengono distribuite nella rete, permettendo ai client di ottenere informazioni di login, password, home directory e shell (tutte le informazioni che in genere stanno in un normale file /etc/passwd). Questo permette agli utenti di cambiare la loro password una volta per tutte le macchine nel dominio NIS.

NIS non è affatto sicuro. Non ha mai voluto esserlo. Doveva solo essere comodo ed utile. Chiunque possa indovinare il nome del dominio NIS (ovunque sia nella rete) può ottenere una copia del file delle password ed usare Crack o John the Ripper contro le password degli utenti. Se si deve usare NIS si faccia attenzione ai pericoli cui si va incontro.

Esiste un sostituto molto sicuro di NIS, chiamato NIS+. Si controllate il NIS HOWTO: http://metalab.unc.edu/mdw/HOWTO/NIS-HOWTO.html

8.11. Firewall

I Firewall sono un mezzo per controllare quali informazioni vengono lasciate entrare ed uscire dalla rete locale. Tipicamente l'host firewall è connesso ad Internet e alla LAN locale, ed è l'unico accesso ad Internet dalla LAN; in questo modo controlla cosa entra ed esce.

Ci sono molti tipi di firewall e metodi di impostarli. Le macchine Linux sono ottimi firewall. Il codice del firewall può essere compilato all'interno dei kernel 2.0 e superiori. Gli strumenti utente ipfwadm per i kernel 2.0 e ipchains per i kernel 2.2, permettono di cambiare al volo i tipi di traffico di rete permessi. Si possono anche registrare specifici tipi di traffico di rete.

I firewall sono un'utilissima ed importante tecnica per la sicurezza di rete. Comunque, non pensare mai che solo perché si ha un firewall non sia necessaria la sicurezza delle macchine che copre. Sarebbe un errore fatale. Si veda l'ottimo Firewall-HOWTO presso l'archivio metalab per avere più informazioni sui firewall e Linux. http://metalab.unc.edu/mdw/HOWTO/Firewall-HOWTO.html

Si possono trovare altre informazioni anche nell'IP-Masquerade mini-howto: http://metalab.unc.edu/mdw/HOWTO/mini/IP-Masquerade.html

Altre informazioni su ipfwadm (lo strumento che permette di cambiare le impostazioni del firewall) si trovano presso: http://www.xos.nl/linux/ipfwadm/

Se non si ha esperienza con i firewall e si vuole costruirne per un piano di sicurezza che non sia superficiale, il libro Firewalls di O'Reilly and Associates o qualche altro documento online sui firewall sono letture obbligatorie. Si troveranno altre informazioni su http://www.ora.com Il National Institute of Standards and Technology (Istituto Nazionale degli Standard e della Tecnologia) ha scritto un eccellente documento sui firewall. Anche se datato 1995, è sempre abbastanza buono. Lo si può trovare presso: http://csrc.nist.gov/nistpubs/800-10/main.html. Interessante anche:

8.12. IP Chains - Firewall per Linux kernel 2.2.x

IP Chains è un aggiornamento del codice di firewalling dal kernel 2.0 al 2.2. Ha molte più caratteristiche delle versioni precedenti, inclusi:

Se si sta usando ipfwadm con il kernel 2.0, sono disponibili degli script per convertire il formato di ipfwadm nel formato che usa ipchains.

Ci si assicuri di leggere l'IP Chains HOWTO per altre informazioni. È disponibile presso http://www.adelaide.net.au/~rustcorp/ipfwchains/ipfwchains.html

8.13. Netfilter - Firewall per Linux kernel 2.4.x

Sempre nell'ottica di migliorare il codice di filtraggio dei pacchetti IP, netfilter permette di costruire, mantenere e controllare le regole di firewalling nel nuovo kernel 2.4.

Il sottosistema netfilter è una riscrittura completa dell'implementazione precedente di ipchains e ipfwadm. Mette a disposizione un gran numero di miglioramenti, ed è diventato la soluzione più robusta per la protezione di reti aziendali.


iptables
è l'interfaccia da linea di comando usata per manipolare le tabelle di firewall.

Netfilter fornisce una struttura grezza per manipolare i pacchetti mentre attraversano le varie parti del kernel. Parte di questa include il supporto per il masquerading, il filtraggio standard dei pacchetti e un più completo sistema di traduzione degli indirizzi di rete. Include perfino un supporto migliorato per le richieste di bilanciamento del carico di rete, per uno specifico servizio, all'interno di un gruppo di server dietro il firewall.

Le caratteristiche di controllo dello stato sono particolarmente potenti. Il controllo dello stato permette di rintracciare e controllare il flusso di dati che passa il filtro. La capacità di tenere traccia delle informazioni sullo stato di una sessione, rende le regole più semplici e prova ad interpretare i protocolli di più alto livello.

In più, si possono sviluppare piccoli moduli allo scopo di effettuare funzioni specifiche supplementari, come passare i pacchetti da elaborare ai programmi in spazio utente e poi re-inserirli nel normale flusso di pacchetti. La possibilità di sviluppare questi programmi a livello utente riduce la complessità che precedentemente era associata al dover fare cambiamenti direttamente a livello del kernel.

Altri riferimenti a IP Tables:

8.14. VPN - Virtual Private Network (reti private virtuali)

Le VPN sono un modo per stabilire una rete "virtuale" su una rete esistente. Questa rete virtuale è spesso crittografata e accetta il traffico solo verso e da entità conosciute. Le VPN sono spesso usate per connettere attraverso Internet qualcuno che lavora da casa ad un rete interna di una organizzazione.

Se si esegue un firewall/masquerading con Linux e si devono passare pacchetti di MS PPTP (un prodotto VPN punto-a-punto della Microsoft), c'è una patch per il kernel di Linux fatta apposta. Si veda: ip-masq-vpn.

Esistono diverse soluzioni VPN per Linux:

Si veda anche la sezione su IPSEC per altre bibliografie e informazioni.