SICUREZZA SU RETI
Manuale d’uso
Syslog-NG
MANUALE D’USO
Syslog-NG
Corso di Sicurezza Su Reti
Prof. Alfredo De
Santis
Università degli Studi
di Salerno
Facoltà di Scienze
Matematiche, Fisiche e Naturali
Anno Accademico
2003/2004
Francesco Di Rienzo – fradir@tiscali.it
Gianluca Esposito – giaesp@tiscali.it
Feliciano Nigro – felnig@tiscali.it
N |
egli ultimi anni si è visto un aumento di hackers, crackers e script kiddies dovuto ad alcuni fattori:
• la diffusione di internet;
• l’aumento della velocità di download e upload;
• costi di gestione per la connessione ridotti;
• aumento del livello medio delle conoscenze informatiche.
Quindi chi si occupa della sicurezza di una rete o dell’amministrazione dei server deve tener traccia di :
• tentate intrusioni;
• intrusioni andata a buon fine;
• modifiche fatte dall’attacker al sistema violato.
Il tracciamento dell’attività avviene tramite un analisi approfondita dei log di sistema..
I log (file che contengono informazioni sullo stato della macchina) di sistema contengono molto “rumore” - messaggi di nessuna importanza - ma contengono anche eventi importanti, che non dovrebbero andare persi nella mole dei messaggi.
Quindi bisogna essere sicuri che i log siano validi e non siano stati modificati in alcun modo. In realtà quello che si vuole è una copia che sia sempre valida dei log, anche se venissero modificati localmente, cosa che di solito un attacker fa, in caso di intrusioni andate a buon fine, con lo scopo di rimanere nascosti all’amministratore della macchina.
L’utilizzo di un log server , ovvero una macchina che ha il solo e preciso compito di
raccogliere i log di altre macchine, consente di avere una copia sicuramente valida dei log delle macchine che lo utilizzano.
In tal modo, anche se l’attacker può modificare i log sulla macchina locale, ci sarà una copia non modificabile dei log sulla macchina remota, che non può essere (o meglio, non dovrebbe) essere raggiunta dall’attacker.
Inoltre un sistema sicuro di remote logging, può migliorare e semplificare notevolmente la gestione centralizzata dei log di diverse macchine e anche l’analisi di eventuali intrusioni o tentativi di intrusione.
Avendo un unico centro di raccolta dei log, diventa più semplice:
• analisi real-time dei log
• report periodico delle attività delle macchine
• archiviazione e backup dei log
Un setup di logging sicuro, che ci consente di migliorare la protezione contro attacchi esterni, dovrebbe avere le seguenti caratteristiche:
• Tutte le macchine da monitorare devono inviare i log ad una macchina remota per semplificare l’amministrazione e il controllo delle macchine e rendere vani i tentativi di un attacker di cancellare i log sulla macchina locale.
• Inviare i log in maniera crittografata, poiché, avendo una struttura centralizzata, è necessario evitare che i log possano essere intercettati, perché potrebbero fornire troppe informazioni utili ad un attacker.
• Il log server deve essere molto sicuro, poiché, dovrebbe essere accessibile solo da console e in nessun caso dovrebbe avere servizi aperti verso l’esterno.
• I log sul log server devono essere organizzati. Una buona organizzazione consente di minimizzare il tempo di controllo dei log.
• Non si deve rischiare di perdere messaggi.
• La presenza di un log server remoto dovrebbe non essere visibile ad un attacker in modo tale da poter continuare a monitorarlo fino a decisione contraria.
Per creare un secure remote log server può essere utilizzato Syslog-NG.
Syslog-NG è uno strumento di tracciamento degli eventi di sistema prodotto da Balabit (www.balabit.com). Esso fornisce una gestione centralizzata dei log di tutte le device della rete sulla quale agisce, indipendentemente dalle piattaforme presenti. Inoltre fornisce diversi caratteristiche aggiuntive, inclusi filtri basati sul contenuto dei messaggi di log, gestione personalizzabile della memorizzazione delle informazioni raccolte e diverse capacità di analisi delle stesse.
In ambito UNIX una delle aree
più trascurate è la gestione del tracciamento degli eventi di sistema.
Controllare giornalmente i messaggi di sistema è fondamentale per mantenere
buone le condizioni di sicurezza e di salute del sistema.
Uno dei principi di
progettazione di Syslog-NG è stato quello di rendere il filtraggio dei messaggi
molto più potente e sottile. Syslog-NG è capace di filtrare messaggi sulla base
del loro contenuto, oltre che in base alla coppia opzione/priorità. In tal modo
solo il messaggio che ci interessa veramente giungerà ad una specifica
destinazione. Un altro principio di progettazione è stato quello di rendere più
facile il trasferimento di log tra segmenti di rete protetti da firewall: il
lungo formato del nome dell’host permette di risalire facilmente alla
macchina origine e alla catena di computer che ha trasportato il messaggio,
anche se questo ha attraversato parecchi computer. L’ultimo principio è
stato quello di scegliere un formato per il file di configurazione chiaro e
potente.
Questo manuale è rivolto a
tutti coloro che hanno tentato di reperire informazioni su Syslog-NG e non ci
sono riusciti. Per questo tentiamo di fornire una panoramica che consenta al
lettore di poter sfruttare in maniera efficace le principali funzionalità offerte
da questo prodotto.
Il manuale, suddiviso in quattro capitoli, compresa
l’introduzione, presenta informazioni sull’installazione, sulla
configurazione e sull’utilizzo di Syslog-NG.
Il secondo capitolo copre i
fondamenti dell’installazione di Syslog-NG; nel terzo capitolo si
presenta la configurazione del programma ed un esempio di utilizzo; nel quarto
ed ultimo capitolo si presentano le tipologie di attacco ad una rete, le vulnerabilità di una rete e
la progettazione dell’infrastruttura di rete, calibrandone ogni singolo
componente e, controllandone l’attività con Syslog-NG.
Nel manuale è presente
anche un’appendice contenente informazioni sui principali servizi e loro
livello di vulnerabilità ed informazioni sull’obbligo di manutenzione dei
log.
Installazione e set-up
I passi necessari alla
compilazione, installazione e configurazione di Syslog-NG: entriamo in contatto
con il software attraverso esempi pratici e nozioni teoriche.
Processore
Intel o compatibile (400Mhz)
Memoria
RAM almeno 256 Mb
Sistema
Operativo: Linux con Kernel 2.3.2.
Per effettuare tutti i nostri test, tuttavia, abbiamo deciso di non eseguire Syslog in un ambiente dedicato, bensì emulato. Tale scelta è motivata anche dal fatto che sebbene la procedura di compilazione e d’installazione descritta più avanti sia comune sia all’esecuzione client che server, le risorse necessarie per effettuare tutti i nostri test (vedi capitolo 3) richiedono l’installazione di tale software su almeno quattro personal computer. Tale scelta è troppo onerosa rispetto ad un ambiente totalmente simulato che consente l’esecuzione contemporanea di ben più di quattro sistemi differenti sulla medesima macchina.
Processore AMD Athlon XP 2800+ (2.08 GHz)
RAM 256
Mb
Sistema Operativo:
SuSE Linux 8.1 – Kernel 2.4.19-4GB emulato mediante
Connectix VirtualPC 5.4 (build 418) in ambiente Microsoft Windows XP
Professional[1].
Il primo passo da compiere per installare Syslog-NG è
ovviamente ottenere il pacchetto di installazione: è possibile effettuarne il
download all’indirizzo web http://www.balabit.hu/en/downloads/Syslog-NG/downloads/
Nel nostro caso utilizzeremo la versione 1.4.17 ed il
file sarà Syslog-NG-1.4.17.tar.gz
(sebbene Syslog-NG sia giunto alla versione 1.9, la nostra scelta è ricaduta
sulla versione 1.4.17, ultima dichiarata “stable” dalla casa
produttrice stessa). Estraiamo quindi l’archivio compresso mediante il
comando, ricordando che tutti i comandi descritti devono essere lanciati dall’utente
root[2]:
tar –xzvf syslog-ng-1.4.17.tar.gz
Editiamo il file src/syslog-ng.h con un qualunque editor
di testi (VI, Emacs, etc.) modificando le linee
#define PATH_SYSLOG_NG_CONF
“syslog-ng.conf”
#define PATH_SYSLOG_NG_CONF “/etc/syslog-ng/syslog-ng.conf”
in qualcosa di un poco più nascosto tipo
#define PATH_SYSLOG_NG_CONF
“default.conf”
#define PATH_SYSLOG_NG_CONF “/etc/.conf/default.conf”
Il motivo per il quale modifichiamo da sorgente il file
di configurazione, è quello di renderlo invisibile ad un ps.
Prima di partire con la compilazione di syslog-ng è bene
precisare che tale software necessita delle “libol”, librerie
aggiuntive scaricabili dallo stesso sito dal quale abbiamo prelevato syslog-ng.
Una volta ottenuto l’archivio relativo a tali librerie ripetiamo
l’azione di estrazione, quindi entriamo nella directory in cui abbiamo
estratto le librerie e compiliamo ed installiamo eseguendo
./configure && make && make install
Se l’installazione delle librerie
“libol” termina con successo possiamo passare
all’installazione di syslog-ng. Dalla directory contenente
l’archivio di syslog-ng estratto precedentemente lanciamo dunque il
comando
./configure
Lo script denominato “configure” tenta automaticamente di
impostare i valori corretti per le varie variabili system-dependent usate successivamente
durante la compilazione del programma. Lo stesso script utilizza i medesimi
valori per creare un “Makefile” per ogni diversa configurazione all’interno
del package.
Nota: syslog-ng
richiede la presenza del parser Bison e di Flex e del compilatore GNU gcc
versione 2.7.2. Qualora non fossero installate lo script
“configure” segnalerà tale errore impedendo di proseguire con
l’installazione.
Lo script può anche creare uno o più header file (“.h”) che contengono le
definizioni system-dependent. Alla fine del processo di configurazione, viene
creato uno script denominato “config.status”, il quale può essere eseguito in futuro per
ricreare la configurazione corrente.
Nel file “config.cache” vengono salvati i
risultati dei tests per accelerare la riconfigurazione del programma di
configurazione. Il file “config.log” contiene l’output del compilatore (utile
principalmente per le operazioni di debug dello script “configure”).
Qualora non si abbia la necessità di salvare i risultati
dei tests contenuti nel file “config.cache” è possibile rimuovere tale file o modificarlo in
base alle esigenze.
Il file “configure.in” è utilizzato per creare lo script “configure” da un programma chiamato “autoconf”. Si ha bisogno solamente
di tale file se si vuole cambiare o rigenerare lo script “configure” utilizzando ad esempio
una versione più recente di “autoconf”.
Il modo più semplice per compilare questo package è il
seguente:
1. Digitare il comando “cd” dalla cartella che
contiene il codice sorgente del package e quindi “./configure” al fine di configurare il
package per il sistema di destinazione. Se si sta usando la shell “csh” su una vecchia versione
del sistema “System V”, si potrebbe aver bisogno di inserire la seguente
riga “sh ./configure”. Lanciando lo script “configure” il sistema rimarrà
occupato per un pò di tempo. Durante l’esecuzione il programma visualizza
alcuni messaggi che riportano quali operazioni si stanno effettuando.
2. Digitare “make” per compilare il package.
Se il “make” ha avuto
esito positivo potrete notare la presenza dell’eseguibile
“syslog-ng” all’interno della sottocartella
“src”.
3. Opzionalmente, si digiti “make check” per lanciare alcuni
autotest sul package.
4. Digitare “make install” per installare i
programmi ed alcuni file di dati e la documentazione.
5. Si possono anche rimuovere i file
binari del programma e i file object dalla cartella del codice sorgente
digitando “make clean”. Per rimuovere anche i files creati dallo script “configure” (in modo da poter compilare
il package per un gruppo diverso di computers), digitare “make
distclean”.
Esiste anche il comando “make maintainer-clean”, ma è concepito
principalmente per gli sviluppatori del package. Se lo si usa, si può ottenere
la rigenerazione dei files creati per la distribuzione finale.
6. Provando a lanciare
l’eseguibile syslog-ng possiamo avere conferma dell’avvenuta
installazione. Nel nostro caso lo script di installazione non ha provveduto a
creare la directory ed il file di configurazione, come prontamente segnalato
dal programma stesso:
In questo caso è opportuno creare
manualmente la directory utilizzando il comandi “mkdir”, ed
ovviamente il file di configurazione anche con un semplice “touch”.
Alcuni sistemi richiedono opzioni insolite per la
compilazione o collegamenti che il programma “configure” non prevede. Si può dare
comunque allo script “configure” valori di inizializzazione per particolari
variabili mettendoli nella definizione dell’ambiente di sistema. Usando
una shell Bourne - compatibile, si può fare tutto utilizzando la linea di
comando, ad esempio:
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
Sui sistemi che utilizzano la parola chiave “env”, si può utilizzare la
seguente sintassi:
env CPPFLAGS=-I/usr/local/include
LDFLAGS=-s ./configure
Si può compilare il package per più architetture nel
medesimo tempo, inserendo i files object di ogni architettura nella propria
cartella di compilazione. Per effettuare tale operazione è necessario usare una
versione del programma “make” che supporti le variabili “VPATH”, come ad esempio il “make” della GNU.
Se il “make” utilizzato non supporta “VPATH”, è necessario compilare
il package tante volte quante sono le architetture. Dopo aver compilato il
package per la singola architettura, utilizzare “make
distclean”
prima di rieseguire la compilazione per un’altra architettura.
In maniera predefinita, “make install” installerà i files del
package nelle cartelle “/usr/local/bin”, “/usr/local/man”, etc. Si può specificare
un altro prefisso di installazione in sostituzione di “/usr/local” mediante il parametro
posto all’interno dello script “configure”:
--prefix=PATH
Si possono specificare prefissi di installazione separati
per i files di ogni singola architettura e per i files indipendenti dall’architettura. Se si da allo script “configure” il parametro
--exec-prefix=PATH
il package userà il PATH come il prefisso per installare i
programmi e librerie.
La documentazione e gli altri files dati continueranno
ancora ad utilizzare il prefisso precedentemente impostato.
Ancora, se si usa una configurazione di cartelle insolita
si possono dare opzioni come
--bindir=PATH
per specificare valori diversi per particolari generi di
files. Digitare
configure –help
per un elenco delle cartelle che possono essere impostate
e quali files contengono.
In alcune versioni, si può anche fare in modo che i
programmi vengano installati con un prefisso o suffisso addizionale sui loro
nomi dando a “configure” l’opzione:
--program-prefix=PREFIX
oppure
--program-suffix=SUFFIX
Alcuni package utilizzano l’opzione
--enable-FEATURE
dove FEATURE indica una parte opzionale del package.
Altri le opzioni
--with-PACKAGE
dove PACKAGE è qualcosa come “gnu-as” o “x” (per il sistema X
Window).
Per i package che usano il sistema X Window, “configure” di solito trova la cartella “include” e le librerie per la
compilazione automaticamente, ma se ciò non avviene, si possono impostare in
modo specifico con le seguenti opzioni:
--x-includes=DIR
e
--x-libraries=DIR
Ci possono essere delle caratteristiche dello script “configure” che non possono essere
dedotte automaticamente dal sistema. Ad esempio può essere necessario
determinare il tipo di host. Di solito “configure” riesce ad ottenere
quest’informazione, ma se viene visualizzato un messaggio che riporta che
non è stato possibile determinare il tipo di host allora è necessario impostare
la seguente opzione:
--host=TYPE
TYPE di solito può essere il nome del sistema, come ad
esempio “sun4”, o un nome canonico a tre campi:
CPU-SOCIETA’-SISTEMA
Guardare il file “config.sub” per determinare i possibili valori di ogni
campo. Se “config.sub” non è incluso nel package, non si ha
bisogno di impostare manualmente il nome dell’host.
Se si vuole inserire valori predefiniti per lo script “configure” per la condivisione, si
può creare uno script chiamato “config.site” che contiene i valori di
default per le variabili come ad esempio “CC”, “cache_file”, e “prefix”.
Lo script “configure” utilizza per effettuare
tale operazione i valori contenuti in “PREFIX/share/config.site” se esiste, poi quelli
contenuti in “PREFIX/etc/config.site” se esiste. Si può
effettuare la medesima operazione impostando la variabile d’ambiente “CONFIG_SITE” ove specificare l’ubicazione
degli script.
Attenzione: non tutti gli script “configure” cercano un sito per gli
scripts.
“configure” riconosce le seguenti opzioni per controllare le
operazioni dello stesso.
--cache-file=FILE
Utilizza e salva i risultati delle prove nel FILE invece
di “./config.cache”.
Impostare FILE a “/dev/null” per disabilitare il caching, per il debug di “configure”
--help
Stampa un sommario delle opzioni di “configure”, e esce.
--quiet
--silent
-q
Fanno in modo che non
si stampino messaggi che riportano quali controlli sono stati effettuati. Per eliminare questa opzione, si effettui il “redirect” verso “/dev/null” (saranno mostrati alcuni
messaggi di errore).
--srcdir=DIR
Cerca il codice sorgente del package nella cartella
DIR. Di solito “configure” può determinare
automaticamente tale cartella.
--version
Stampa la versione di “Autoconf” utilizzata per generare
lo script “configure”.
Configurazione ed utilizzo
I pilastri di Syslog-NG:
destinazioni, sorgenti e filtri. Come configurare le singole componenti e
collegarle tra loro per ottenere i
risultati desiderati.
In Syslog-NG
il percorso di un messaggio (message path o message route) consiste di una o
più sorgenti, di una o più regole di filtraggio e di una delle possibili
destinazioni (pozzi). Un messaggio viene inserito in Syslog-NG in una delle sue
sorgenti, e, se tale messaggio è conforme alle regole di filtraggio, viene
trasmesso fuori tramite una delle uscite.
Una sorgente è un
insieme di driver sorgenti, che raccoglie messaggi usando un metodo
predefinito. Ad esempio c’è un driver per i socket di tipo AF_UNIX,
SOCK_STREAM, il quale è utilizzato dalla procedura di sistema syslog() di
Linux.
Piattaforme diverse
utilizzano metodi diversi per mandare messaggi al daemon che si occupa del
logging, e per essere utile a tutti i sistemi operativi, Syslog-NG supporta
tutti i metodi più comuni. È stato provato su Linux, BSD, ed esiste a partire
dalla versione 1.1.22 di Syslog-NG anche un supporto sperimentale per Solaris.
Per dichiarare
una fonte, ci sarà bisogno della dichiarazione di sorgente nel file di
configurazione file con la seguente sintassi:
source <identificatore> { source-driver(parametri); source-driver(parametri); ... };
L’identificatore
deve essere univoco per questa sorgente assegnata e ovviamente non deve essere
una delle parole riservate.
Si può
controllare esattamente quali driver sono usati per raccogliere i messaggi di
log, anche se si dovrà conoscere come il sistema e il suo syslogd nativo
comunicano.
Ogni possibile
meccanismo di comunicazione ha il corrispondente driver sorgente in Syslog-NG.
Ad esempio per aprire un socket Unix SOCK_DGRAM si utilizza il driver unix-dgram.
Analogamente per aprire un socket Unix SOCK_STREAM – utilizzato nei
sistemi Linux – è necessario il driver unix-stream.
Piattaforma |
Metodo |
Linux |
Un socket Unix SOCK_STREAM chiamato /dev/log |
BSD flavours |
Un socket Unix SOCK_DGRAM chiamato /var/run/log |
Solaris (ver. 2.5 o precedenti) |
Un device SVR4 STREAMS chiamato
/dev/log |
Solaris (ver. 2.6 o successive) |
In aggiunta agli STREAMS
device usati nelle versioni precedenti la 2.6, usa un nuovo metodo IPC multithreaded chiamato door. Per default il door
usato da syslogd è /etc/.syslog_door |
Tavola 3-1. Metodi di comunicazione tra syslogd e i suoi
clients
source src { unix-stream(“/dev/log”); internal();
udp(ip(0.0.0.0) port(514)); };
Esempio 3-1. Dichiarazione di sorgente su un sistema Linux-based
Ogni driver
può prendere parametri, alcuni dei quali sono obbligatori, altri opzionali. I
parametri richiesti sono posizionali,
il che significa che essi devono essere specificati in un ordine ben definito.
Un driver unix-stream() ha un singolo argomento richiesto, il nome del socket da
ascoltare, e diversi parametri opzionali, che seguono il nome del socket. Gli
argomenti opzionali possono essere specificati in qualsiasi ordine e devono
avere la forma option(value).
|
Descrizione |
internal |
Messaggi generati
internamente da Syslog-NG |
unix-stream |
Apre gli unix socket
specificati in modalità SOCK_STREAM, e
ascolta i messaggi. |
unix-dgram |
Apre lo unix socket
specificato in modalità SOCK_DGRAM, e ascolta i messaggi. |
file |
Apre i file specificati e
legge messaggi. |
pipe,
fifo |
Apre i named pipe
specificati e legge messaggi. |
udp |
Ascolta sulla porta UDP
specificata. |
tcp |
Ascolta sulla porta TCP
specificata. |
sun-stream, |
Apre gli STREAMS device
specificati su sistemi Solaris, e legge i messaggi. |
Tabella 3-2. Driver sorgenti disponibili in Syslog-NG
I filtri specificano come
Syslog-NG eseguirà l’instradamento dei messaggi al suo interno. Un filtro
è, nella pratica, un’espressione booleana, la quale deve essere valutata
vera se si vuole che il messaggio debba essere trasmesso in uscita.
Anche i filtri hanno un nome univoco,
di modo che ci si possa riferire ai filtri nei propri log statements. E’
possibile dichiarare un filtro utilizzando la seguente sintassi:
filter <identificatore> { espressione; };
Un’espressione potrebbe
contenere parentesi, gli operatori booleani “and”, “or”
e “not”, e ognuna delle funzioni nella Tavola 3-9.
filter f_lybra_deny { host(“lybra”) and match(“deny”);
};
Esempio 3-2. Un filter statement che trova i messaggi
contenenti la parola deny proveniente dall’host “lybra”
Nelle prime versioni di Syslog-NG
c’era uno speciale identificatore di filtro, “DEFAULT”, il
quale faceva in modo che il filtro venisse applicato a tutti i messaggi non
associati ad altri filtri. Questa caratteristica è stata rimossa da Syslog-NG a
partire dalle versioni 1.5.x.
Una destinazione è un luogo
dove si raccolgono i messaggi, ovvero dove viene inviato e memorizzato il log
se le regole di filtraggio vengono soddisfatte. In modo analogo alle sorgenti,
le destinazioni possono includere diversi driver che definiscono come verranno
distribuiti i messaggi.
Ad esempio esiste un driver per
i file, che scrive i messaggi su un determinato file, ma è anche possibile
mandare messaggi su socket di tipo unix, udp e tcp.
Per dichiarare una destinazione
nel file di configurazione, ci sarà bisogno di un comando di destinazione (destination
statement), la cui sintassi è la seguente:
destination <identificatore> { destination-driver(parametri); destination-driver(parametri); ... };
Nome |
Descrizione |
file |
Scrive
i messaggi nel file specificato |
fifo,
pipe |
Scrive
i messaggi al pipe specificato |
unix-stream |
Invia
i messaggi al socket specificato di tipo SOCK_STREAM (Linux) |
unix-dgram |
Invia
i messaggi al socket specificato di tipo SOCK_DGRAM (BSD) |
udp |
Invia
i messaggi all’host e alla porta UDP specificati |
tcp |
Invia
i messaggi all’host e alla porta TCP specificati |
usertty |
Invia
i messaggi all’utente specificato se registrato |
program |
Sblocca
e lancia il programma specificato, e invia i messaggi al suo standard input. |
Tavola 3-3. Destinazioni disponibili in Syslog-NG
Abbiamo visto
sorgenti, destinazioni e filtri. Per collegarli insieme c’è bisogno dei
comandi di log (log statement):
log { source s1; source s2; ...
filter f1; filter f2; ...
destination d1; destination d2; ... };
I messaggi
provenienti dalle sorgenti elencate, e che soddisfano tutti i filtri impostati
vengono inviati alle destinazioni stabilite.
I log statements sono trattati
nell’ordine in cui appaiono nel file di configurazione. Per default tutti
i log statements vengono processati, quindi un singolo messaggio di log potrebbe
essere inviato alla stessa destinazione più volte, nel caso in cui la
destinazione sia elencata in più log statements. Questo comportamento di
default può essere cambiato tramite i parametri flags().
Ci sono diverse opzioni che si
possono specificare le quali modificano il comportamento di Syslog-NG. La sintassi generale è:
options { option1(parametri); option2(parametri); ... };
Ogni opzione può avere dei
parametri, proprio come nella dichiarazione dei driver.
Flag |
Descrizione |
final |
Questa
flag indica che il processo di log termina qui. Si noti che ciò non significa
necessariamente che i messaggi rilevati saranno archiviati una volta, poiché
possono esserci log statements rilevati
processati prima del corrente. |
fallback |
Questa
flag rende un log statement di tipo ‘fallback’. Ciò significa che
solo i messaggi che non corrispondono ad alcun ‘non-fallback’ log
statement saranno inviati. |
catchall |
Questa
flag indica che la fonte del messaggio viene ignorata, e soltanto i filtri
sono presi in considerazione quando i messaggi vengono rilevati. |
Tavola 3-4. I flags dei log statement
I seguenti driver possono
essere usati nel source statement, come descritto nel capitolo precedente.
Tutti i messaggi generati
internamente “provengono” da questa speciale fonte. Se si
desiderano avvertimenti, errori e avvisi da Syslog-NG, bisogna includere questa
fonte in uno dei source statements.
internal()
Syslog-NG genererà un messaggio
di “warning”, se il driver specificato non è stato dichiarato.
source s_local { internal(); };
Esempio
3-2. Usare l’internal() driver
Questi due driver si comportano
similmente: essi aprono il socket AF_UNIX assegnato, e cominciano ad ascoltare
su di esso i messaggi. unix-stream() è usato fondamentalmente su Linux, e
utilizza SOCK_STREAM semantici (connection oriented, nessun messaggio viene
perso), unix-dgram() è usato su sistemi BSD, ed utilizza SOCK_DGRAM semantici (ciò
potrebbe causare la perdita di messaggi locali qualora il sistema sia sovraccaricato).
Per evitare attacchi di tipo
DoS (Denail of Service) quando si utilizzano protocolli connection-oriented, il
numero delle connessioni simultaneamente accettate deve essere limitato. Ciò
può essere fatto usando il parametro max-connections(). Il
valore default di questo parametro è piuttosto ristretto; è necessario
aumentare questo valore nel caso di sistemi notevolmente occupati.
Sia unix-stream che unix-dgram hanno
un singolo argomento richiesto, che specifica il nome del socket da creare, e
diversi parametri opzionali.
unix-stream(filename [options]);
unix-dgram(filename [options]);
Nome |
Tipo |
Descrizione |
Default |
owner() |
Testo |
Imposta
l’uid del socket. |
root |
group() |
Testo |
Imposta
il gid del socket. |
root |
perm() |
Numerico |
Imposta
la permission mask. Per numeri ottali prefissare il numero con ‘0’,
es. usare 0755 per rwxr-xr-x. |
0666 |
keep-alive() |
Si/No |
Seleziona
se mantenere le connessioni aperte quando Syslog-NG è riavviato, può essere
usato solo con unix-stream(). |
yes |
max-connections() |
Numerico |
Limita
il numero di connessioni aperte simultaneamente. Può essere usato solo con
unix-stream(). |
10 |
Tavola 3-5. Opzioni disponibili per unix-stream e
unix-dgram
# Dichiarazione di sorgente in sistemi Linux
source s_stream {
unix-stream(“/dev/log” max-
connections(10)); };
# Dichiarazione di sorgente in sistemi BSD
source s_dgram {
unix-dgram(“/var/run/log”); };
Esempio 3-3. Uso dei driver unix-stream() e unix-dgram()
Questi driver lasciano ricevere
messaggi dal network, e, come il nome dei driver suggerisce, possono usare tanto
UDP quanto TCP come mezzo di trasporto.
UDP è un semplice datagram
oriented protocol, che fornisce il “minor sforzo” per trasferire
messaggi tra host. Potrebbe perdere messaggi, e non viene fatto alcun tentativo
per ritrasmettere tali messaggi.
TCP fornisce un servizio
connection-oriented, il che fondamentalmente significa un messaggio pipeline
flow-controlled. In questo pipeline, ogni messaggio è autorizzato, e la
ritrasmissione viene effettuata per i packets persi. Generalmente è più sicuro
usare TCP, perchè le connessioni perse possono essere rilevate e nessun
messaggio va perso, ma tradizionalmente il protocollo syslog utilizza UDP.
Nessuno dei driver tcp() and
udp() richiede parametri posizionali. Per default essi si legano a 0.0.0.0:514,
il che significa che Syslog-NG ascolterà su tutte le interface disponibili,
port 514. Per limitare le connessioni accettate ad una sola interfaccia, si usi
il parametro localip() come descritto in basso.
NOTA: la porta tcp 514 è riservata all’uso con rshell, quindi
si deve segliere un’altra porta se si intende usare Syslog-NG e rshell
contemporaneamente.
tcp([options]);
udp([options]);
Nome |
Tipo |
Descrizione |
Default |
ip
o localip |
Testo |
L’indirizzo
IP a cui collegarsi. Si noti che non è l’indirizzo dal quale vengono
accettati i messaggi. |
0.0.0.0 |
port
o localport |
Numerico |
Il numero
di porta a cui collegarsi. |
514 |
keep-alive |
Si/No |
Disponibile
solo per tcp(), stabilisce se chiudere le connessioni al ricevimento di un
segnale SIGHUP. |
yes |
max-connections |
Numerico |
Specifica
il numero massimo di connessioni simultanee. |
10 |
Tavola 3-6. Opzioni disponibili per udp e tcp
source s_tcp { tcp(ip(127.0.0.1) port(1999)
max-connections(10)); };
source s_udp { udp(); };
Esempio
3-4. Uso dei driver udp() e tcp()
file(filename);
Di solito il kernel presenta i
suoi messaggi in un file speciale (/dev/kmsg su BSD, /proc/kmsg su Linux),
quindi per leggere tali file speciali, ci sarà bisogno del driver file(). Si
noti che non è possibile usare questo driver per seguire un file come fa la
coda. Per alimentare un logfile crescente in Syslog-NG (HTTP access.log ad
esempio), si usa uno script come questo:
#!/bin/sh tail -f logfile | logger -p local4.info
Esempio 3-5. script di esempio per alimentare un logfile
crescente in Syslog-NG
Il file driver ha un solo
parametro richiesto, che specifica il file da aprire, ed è il seguente:
Nome |
Tipo |
Descrizione |
Default |
log_prefix |
Testo |
La
stringa per prepend log messages. Utile per logging messaggi kernel poiché
non è prefissato da ‘kernel:’ per default |
Stringa vuota |
Tavola 3-7. Opzioni disponibili per file()
source s_file {
file(“/proc/kmsg”); };
Esempio 3-6. Uso del driver file()
Il driver pipe apre un pipe
chiamato con il nome specifico, e ascolta i mesaggi. Il driver pipe ha un solo
parametro richiesto, che specifica il filename del pipe da aprire, e la seguente
opzione:
Nome |
Tipo |
Descrizione |
Default |
pad_size |
Numerico |
Specifica
il padding di input. Alcuni sistemi operativi (come HP-UX) riempiono tutti i
messaggi per bloccare il limite. Questa opzione può essere usata per
specificare la dimensione dei blocchi. (HP-UX usa 2048 bytes) |
0 |
Tavola 3-4. Opzioni disponibili per pipe
pipe(filename);
NOTA: bisognerà creare questo pipe usando mkfifo(1).
source s_pipe { pipe(“/dev/log”);
};
Esempio 3-7. Uso del driver pipe()
Solaris usa il suo STREAMS API
per inviare messaggi al processo syslogd. Si dovrà compilare Syslog-NG con
questo driver.
Le versioni più recenti di
Solaris (2.5.1 e successive), usano un nuovo IPC in aggiunta a STREAMS,
chiamato door per confermare l’invio di un messaggio. Syslog-NG supporta
questo nuovo meccanismo IPC con l’opzione door().
Il driver sun-streams() ha un
solo argomento richiesto, che specifica lo STREAMS device da aprire ed una
singola opzione.
source s_stream { sun-streams(“/dev/log” door(“/etc/.syslog_door”);
};
Esempio 3-8. Uso del driver sun-streams()
Nome |
Tipo |
Descrizione |
Default |
door |
Testo |
Specifica
il nome di una porta da aprire, necessario su Solaris oltre 2.5.1. |
Stringa vuota |
Tavola 3-5. Opzioni disponibili per sun-streams
I driver di destinazione
inviano i messaggi di log verso qualche destinazione esterna a Syslog-NG,
ovvero verso un file o un network socket.
Il driver file è uno dei più importanti driver di destinazione in Syslog-NG.
Esso autorizza ad inviare messaggi al file scelto, oppure come vedremo ad un
gruppo di file.
Il nome della destinazione può
includere macro che vengono espanse quando il messaggio è scritto, così un
semplice file() driver può risultare in diversi file da creare. Le macro
possono essere specificate tramite il prefisso “$” (senza le
virgolette) davanti al nome della macro, proprio come in Perl/PHP.
Se il nome espanso si riferisce
a una directory che non esiste, questa verrà creata automaticamente a seconda
delle impostazioni del create_dirs()
(opzione sia globale che per destinazione).
Attenzione: poichè lo stato di ogni file creato deve essere tracciato
da Syslog-NG, esso consuma memoria per ogni file. Se non viene scritto nessun
nuovo messaggio ad un file entro 60 secondi (controllati dall’opzione
globale time_reap), viene chiuso e il suo stato è “freed”.
Utilizzandolo, un attacco DoS (Denial
of Service) può essere messo in atto contro il sistema nel caso in cui il
numero di file di destinazione possibili sia elevato e la memoria necessaria sia
maggiore di quella di cui il logserver è provvista.
La macro più ambigua, in cui le
variazioni possibili sono piuttosto alte, è $PROGRAM, perciò in un ambiente poco sicuro l’uso di
$PROGRAM dovrebbe essere evitato.
Nome |
Descrizione |
FACILITY |
Il
nome della facility da cui il messaggio è segnato come proveniente |
PRIORITY o LEVEL |
La
priorità del messaggio |
TAG |
La
priorità e la facility codificate come un numero esadecimale a 2 cifre |
DATE |
- |
FULLDATE |
- |
ISODATE |
- |
YEAR |
L’anno
in cui il messaggio è stato inviato. Le macro di espansione Tempo possono
anche usare il tempo specificato nel messaggio di log, ad esempio il tempo in
cui il messaggio di log è stato inviato, o il tempo in cui il messaggio è stato
ricevuto dal log server. Questo è controllato dall’opzione use_time_recvd() |
MONTH |
Il
mese in cui è stato inviato il messaggio |
DAY |
Il
giorno del mese in cui è stato inviato il messaggio |
WEEKDAY |
Le
prime 3 lettere del nome del giorno della settimana in cui è stato inviato il
messaggio es. “Thu” (Thursday), “Mon” (Monday), etc. |
HOUR |
L’ora
del giorno in cui è stato inviato il messaggio. |
MIN |
Il
minuto in cui è stato inviato il messaggio |
SEC |
Il
secondo in cui è stato inviato il messaggio |
TZOFFSET |
La
zona di tempo intesa come scarto di ore da GMT. Ad esempio ‘- |
TZ |
L’ora
locale, il nome o l’abbreviazione. Ad esempio ‘PDT’ |
FULLHOST |
- |
HOST |
Il
nome del host da cui è partito il messaggio. Se il messaggio attraversa
diversi host, e chain_hostnames() è attivo, viene usato il primo. |
PROGRAM |
Il
nome del programma da cui è inviato il messaggio |
MSG o MESSAGE |
Contenuto
del messaggio |
Tavola 3-6. Macro disponibili nell’espansione di
filename
Nome |
Tipo |
Descrizione |
Default |
log_fifo_size() |
Numerico |
Il
numero delle entrate nell’output fifo |
Usa l’impostazione
globale |
fsync() |
Si/No |
Forza
una chiamata fsync() sulla destinazione fd dopo ogni scrittura. Nota: ciò
potrebbe peggiorare seriamente le performance |
|
sync_freq() |
Numerico |
Il
logfile è synced quando questo numero di messaggi viene scritto |
Usa l’impostazione
globale. |
encrypt() |
Si/No |
Cripta
il file risultante. NOTA: ciò non è implementato nella versione 1.3.14. |
Usa l’impostazione
globale |
compress() |
Si/No |
Comprime
il logfile risultante usando zlib. NOTA: ciò non è implementato nella
versione 1.3.14. |
Usa l’impostazione
globale. |
owner() |
Testo |
Assegna
il possessore del file creato a quello specificato |
root |
group() |
Testo |
Assegna
il gruppo di file creati a quello specificato
|
root |
perm() |
Numerico |
La
permission mask del file se è esso è creato da Syslog-NG. |
0600 |
dir_perm() |
Numerico |
La
permission mask delle directory create da Syslog-NG. Le directories di log vengono
create solo se un file dopo la macroespansione si riferisce a una directory
non esistente, e la creazione dir è abilitata usando create_dirs(). |
0600 |
create_dirs() |
Si/No |
Abilita
la creazione di directory non esistente. |
no |
template() |
Testo |
Specifica
un template che specifica il formato del log da usare in questo file. Le
macro possibili sono le stesse dei file di destinazione |
un formato conforme al default
del formato del log |
template_escape() |
Si/No |
Attiva
i caratteri ‘ e “ per il
template. E’ utile per generare dichiarazioni SQL e quotare stringhe
così che quelle parti del messaggio di log non vengano interpretate come
comandi per il server SQL |
si |
remove_if_older() |
Numerico |
Se
impostato ad un valore più alto di 0, prima di scrivere a un file, Syslog-NG
controlla se questo file è più vecchio del tempo specificato (in secondi). Se
sì, esso rimuove il file esistente e la riga da scrivere diventa la prima
riga di un nuovo file con lo stesso nome. In combinazione con ad es. la macro
$WEEKDAY, questo può essere usato per una semplice log rotation, nel caso in
cui non tutta la storia necessiti di essere considerata. |
Non rimuove mai il file
esistente, ma lo sospende ( = 0). |
Tavola 3-7. Opzioni
disponibili per file()
Questo driver invia messaggi a un pipe scelto (ad esempio
/dev/console).
Il driver pipe ha solo un parametro richiesto, che
specifica il nome del pipe da aprire, e nessuna opzione.
pipe(filename);
NOTA: ci sarà bisogno di creare questo pipe usando
mkfifo(1).
destination d_pipe {
pipe(“/dev/xconsole”); };
Esempio
3-8. Uso del driver pipe()
Questo driver invia messaggi ad uno unix socket di tipo SOCK_STREAM
o SOCK_DGRAM.
Entrambi i driver hanno un solo argomento richiesto che
specifica il nome del socket a cui connettersi, e nessun argomento opzionale.
unix-stream(filename [options]);
unix-dgram(filename [options]);
Questo
driver invia messaggi ad un altro host sul locale intranet o internet che usa
sia il protocollo UDP che quello TCP.
Entrambi
i driver hanno un solo argomento richiesto che specifica l’indirizzo dell’host
di destinazione, a cui il messaggio deve essere inviato, e diversi parametri
opzionali. Si noti che questo differisce dai source drivers, in cui l’indirizzo
bind locale è implicito, e non è richiesto nessun parametro.
tcp(host [options]); udp(host
[options]);
Nome |
Tipo |
Descrizione |
Default |
localip |
Testo |
L’indirizzo IP a cui
allacciarsi prima di connettersi al target. |
0.0.0.0 |
localport |
Numerico |
Il numero di port a cui allacciarsi. |
0 |
port o destport |
Numerico |
Il numero di port a cui
connettersi. |
514 |
Tavola 3-8.
Opzioni disponibili per udp e tcp
destination d_tcp { tcp(“10.1.2.3” port(1999);
localport(999)); };
Esempio 3-9. Uso del driver tcp()
Questo driver scrive messaggi al terminale di un utente
attualmente attivo.
Il driver usertty ha un solo argomento richiesto, che
specifica lo username che dovrebbe ricevere una copia dei messaggi accoppiati,
e nessun argomento opzionale.
usertty(username);
Questo driver esegue una “fork” esegue il
programma assegnato con gli argomenti assegnati e invia messaggi allo standard
input dei processi figli.
Il driver program ha un solo parametro richiesto, che
specifica un program name da iniziare, e nessuna opzione. Il programma viene
eseguito con l’aiuto dello shell corrente, quindi il commando potrebbe
includere entrambi i file patterns e I/O redirection, che saranno avviati.
program(commandtorun);
NOTA:
il programma viene eseguito una volta allo startup, e continua ad essere attivo
fino al SIGHUP o all’uscita. Il motivo è prevenire l’avviamento di
un gran numero di programmi per messaggi, che implicherebbero un facile attacco
DoS (Denial of Service).
destination d_prg { program(“/bin/cat > /dev/null”); };
Esempio 3-10.
Uso del destination driver program()
Le seguenti funzioni possono essere usate nel filter
statement, come descritto precedentemente.
Nome |
Sintassi |
Descrizione |
facility() |
facility(facility[,facility]) |
Unisce messaggi che hanno uno
ei facility code elencati. |
level() o priority() |
level(pri[,pri1..pri2[,pri3]]) |
Unisce messaggi basati sulla
priorità. |
program() |
program(regexp) |
Unisce messaggi usando una
regolare espressione contro il program name field dei log messages. |
host() |
host(regexp) |
Unisce messaggi usando una regular
expression per il controllo del campo “hostname” dei log
messages. |
match() |
match(regexp) |
Prova ad unire una regolare
espressione al messaggio stesso. |
filter() |
- |
Chiama un altro filter rule e
valuta il suo valore. |
Tavola 3-9.
Funzioni filtro disponibili
Le seguenti opzioni possono essere specificate nell’options
statement, come descritto precedentemente.
Nome |
Valori accettati |
Descrizione |
time_reopen() |
Numerico |
Il tempo da aspettare prima che
una connessione caduta venga ristabilita. |
time_reap() |
Numerico |
Il tempo da aspettare prima che
un file di destinazione venga chiuso. |
sync() |
Numerico |
Il numero di righe accodate prima
di essere scritte su file. |
mark() |
Numerico |
Il numero di secondi tra due
righe MARK. NOTA: non ancora implementato. |
stats() |
Numerico |
Il numero di secondi tra due
STATS. |
log_fifo_size() |
Numerico |
Il numero di righe della coda
di output |
chain_hostnames() |
Si/No |
Attiva o disattiva il chained hostname format. |
keep_hostname() |
Si/No |
Attiva o disattiva la
riscrittura dell’hostname. |
check_hostname() |
Si/No |
Attiva o disattiva qualora l’hostname
contenga validi caratteri. |
bad_hostname() |
Regular expression |
Un regexp che controlla la
validità dei nomi di host. |
create_dirs() |
Si/No |
Attiva o disattiva la creazione
di directory per file di destinazione. |
owner() |
userid |
- |
group() |
groupid |
- |
perm() |
permission value |
- |
dir_owner() |
userid |
- |
dir_group() |
groupid |
- |
dir_perm() |
permission value |
- |
create_dirs() |
Si/No |
Attiva o disattiva la creazione
di directory per file di destinazione. |
use_time_recvd() |
Si/No |
Usa il tempo in cui un
messaggio è ricevuto invece di quello specificato nel messaggio. |
use_dns() |
Si/No |
Attiva o disattiva l’uso
di DNS. Syslog-NG si blocca sulle DNS queries, così l’attivazione di
DNS può portare a un Denial di Service attack. Per prevenire DoS, è necessario
proteggere il punto finale del network Syslog-NG con firewall rules, ed
assicurarsi che tutti i nomi degli host che possono portare a Syslog-NG siano
risolvibili. |
dns_cache() |
Si/No |
Attiva o disattiva l’uso
di cache DNS. |
dns_cache_size() |
Numerico |
Numero di hostnames nella cache
DNS. |
dns_cache_expire() |
Numerico |
Numero di secondi in cui un
lookup che ha avuto successo viene inserito nella cache. |
dns_cache_expire_failed() |
Numerico |
Numero di secondi in cui un
lookup fallito viene inserito nella cache. |
log_msg_size() |
Numerico |
Lunghezza massima del messaggio
in bytes. |
use_fqdn() |
Si/No |
Aggiunge nomi di dominio completamente
qualificati invece di un breve hostname. |
gc_idle_threshold() |
Numerico |
Imposta il valore di soglia per
il cestino, quando Syslog-NG è idle. La fase GC inizia quando il numero di
oggetti allocati raggiunge questo valore. Default: 100. |
gc_busy_threshold() |
Numerico |
Come precedente, ma usato
quando Syslog-NG è occupato. Default: 3000 |
Tavola
3-10. Lista delle opzioni globali supportate
Ci sono diverse impostazioni disponibili per poter ottimizzare il comportamento di Syslog-NG. Le
impostazioni di default dovrebbero essere adeguate per un singolo server o un’installazione
workstation, ma per un logserver centralizzato ricevente i log da più host tali
impostazioni potrebbero non essere sufficienti.
Syslog-NG utilizza un cestino interno, e, mentre il
cestino è in funzione esso non accetta messaggi. Ciò potrebbe causare problemi
se qualche protocollo non-connection oriented è in uso, come unix-dgram() o
udp(). Ci sono due impostazioni che che controllano la fase di “raccolta
rifiuti”
Con questa opzione si può specificare la soglia del gc
(garbage collector). Se il numero degli oggetti allocati raggiunge questo
numero, e il sistema è idle (nessun messaggio arrivato entro 100msec), inizia
una fase gc. Sin da quando il sistema è idle, presumibilmente nessun messaggio
andrà perduto se il gc è avviato. Dunque questo valore dovrebbe essere basso,
ma più alto di quello minimo di oggetti allocati. Il numero minimo di oggetti
allocarti dipende dalla configurazione, ma si può ottenere un numero esatto
specificando l’opzione -v da riga di comando.
Questa soglia viene usata quando Syslog-NG è occupato ad
accettare messaggi (ciò significa che in 100msec un evento di I/O è occorso). Comunque
per prevenire che Syslog-NG consumi tutta la memoria, gc si dovrebbe avviare.
Si imposti questo valore alto, così che i log bursts (ondate di log) non siano
interrotti da gc.
Syslog-NG legge sempre i suoi canali log in entrata per
prevenire il blocco del daemon in uso. Ciò potrebbe causare la perdita di
messaggi se la coda di output è piena. E’ dunque importante impostare la
dimensione della coda di output (definita in numero di messaggi), il che si può
fare globalmente, o su una base per destinazione:
options { log_fifo_size(1000); };
oppure
destination d_messages { file(“/var/log/messages”);
log_fifo_size(1000); };
Dovreste impostare la dimensione fifo al numero stimato
di messaggi in un message burst (ondata di messaggi).
Il parametro sync non fa esattamente ciò che ci si aspetta. Come visto, i
messaggi da inviare sono inseriti in una coda di output. Il parametro sync
specifica il numero dei messaggi fermi in questo buffer prima che qualcosa
venga scritto. Si noti che esso non scrive tutti i messaggi in un singolo
chunk, ma scrive ogni singolo messaggio con un unico sistema di chiamata write().
### OPZIONI E SORGENTI ###
options { long_hostnames(off); sync(0); };
source src { unix-stream("/dev/log"); internal(); };
source kernsrc { file("/proc/kmsg"); };
### DESTINAZIONI ###
destination authlog { file("/var/log/auth.log"); };
destination syslog { file("/var/log/syslog"); };
destination cron { file("/var/log/cron.log"); };
destination daemon { file("/var/log/daemon.log"); };
destination kern { file("/var/log/kern.log"); };
destination lpr { file("/var/log/lpr.log"); };
destination user { file("/var/log/user.log"); };
destination uucp { file("/var/log/uucp.log"); };
destination ppp { file("/var/log/ppp.log"); };
destination mail { file("/var/log/mail.log"); };
destination mailinfo { file("/var/log/mail.info"); };
destination mailwarn { file("/var/log/mail.warn"); };
destination mailerr { file("/var/log/mail.err"); };
destination local0 { file("/var/log/local0.log"); };
destination local1 { file("/var/log/local1.log"); };
destination all { file("/var/log/all.log"); };
destination newscrit { file("/var/log/news/news.crit"); };
destination newserr { file("/var/log/news/news.err"); };
destination newsnotice { file("/var/log/news/news.notice"); };
destination debug { file("/var/log/debug"); };
destination messages { file("/var/log/messages"); };
destination console { usertty("root"); };
destination console_all { file("/dev/tty12"); };
### FILTRI ###
filter f_auth { facility(auth); };
filter f_authpriv { facility(auth, authpriv); };
filter f_syslog { not facility(authpriv, mail) and not match(ppp.*LCP); };
filter f_cron { facility(cron); };
filter f_daemon { facility(daemon); };
filter f_kern { facility(kern); };
filter f_lpr { facility(lpr); };
filter f_mail { facility(mail) and not match (imapd); };
filter f_user { facility(user); };
filter f_uucp { facility(cron); };
filter f_ppp { program(ppp); };
filter f_news { facility(news); };
filter f_debug { not facility(auth, authpriv, news, mail) and not match(ppp.*LCP); };
filter f_messages { level(info..warn)
and not facility(auth, authpriv, mail, news); };
filter f_emergency { level(emerg); };
filter f_info { level(info); };
filter f_notice { level(notice); };
filter f_warn { level(warn); };
filter f_crit { level(crit); };
filter f_err { level(err); };
### OUTPUT ###
log { source(src); filter(f_authpriv); destination(authlog); };
log { source(src); filter(f_syslog); destination(syslog); };
log { source(src); filter(f_cron); destination(cron); };
log { source(src); filter(f_daemon); destination(daemon); };
log { source(kernsrc); filter(f_kern); destination(kern); };
log { source(src); filter(f_lpr); destination(lpr); };
log { source(src); filter(f_mail); destination(mail); };
log { source(src); filter(f_user); destination(user); };
log { source(src); filter(f_uucp); destination(uucp); };
log { source(src); filter(f_mail); filter(f_info); destination(mailinfo); };
log { source(src); filter(f_mail); filter(f_warn); destination(mailwarn); };
log { source(src); filter(f_mail); filter(f_err); destination(mailerr); };
log { source(src); filter(f_news); filter(f_crit); destination(newscrit); };
log { source(src); filter(f_news); filter(f_err); destination(newserr); };
log { source(src); filter(f_news); filter(f_notice); destination(newsnotice); };
log { source(src); filter(f_debug); destination(debug); };
log { source(src); filter(f_messages); destination(messages); };
log { source(src); filter(f_emergency); destination(console); };
log { source(src); filter(f_ppp); destination(ppp); };
log { source(src); destination(console_all); };
log { source(src); destination(all); };
Conoscere le tipologie di attacco e le vulnerabilità,
progettare l’infrastruttura di rete, calibrarne ogni singolo componente,
controllarne l’attività: Syslog-NG all’interno di una rete.
Domotica, Internet,
e-commerce sono tutti termini ormai entrati nel linguaggio quotidiano e, contrariamente
a quanto accadeva prima, quando solo le nuove generazioni riuscivano ad
adattarsi ai cambiamenti sociologici, ora la rivoluzione tecnologica non ha più
rispetto nemmeno per l’anzianità: essa detta le regole e l’unica
strada è quella di adattarvisi, a meno di non voler essere, pian piano, espulsi
dal mondo (prevalentemente) occidentale.
Qual è ora, quindi, la nuova
merce di scambio che questo assetto sociale richiede? Cosa costituisce il bene
più importante e, come tale, più ricercato e, quindi, degno di essere tutelato?
La risposta è quasi ovvia:
in una società dell’informazione il bene primario sarà costituito dal
dato.
Nella multiformità della
lingua italiana, sono pochi tuttavia i termini che possano godere di tante
svariate definizioni come, invece, accade per la parola “dato”.
Diverse sfere di influenza, da quella matematica, dove probabilmente questa
parola trova il suo luogo di elezione, a quella giuridica, a quella
informatica, passando anche per il linguaggio della Pubblica Amministrazione,
hanno contribuito a far sorgere in ognuno di noi, l’esatta percezione di
cosa sia un dato, senza però darci il privilegio di riuscire a racchiuderlo in
una definizione onnicomprensiva.
La faccenda si complica
ulteriormente quando, alla parola dato, vengono aggiunti degli aggettivi che,
invece di migliorarne la comprensione, riescono soltanto a incanalarlo
correttamente nella disciplina di appartenenza, per cui si avrà il dato
informatico, il dato personale, il dato sensibile, ecc.
Del dato, però, una cosa è
ben chiara: la funzione. Per la fattispecie che maggiormente ci interessa,
ossia il diritto personale, possiamo affermare che la sua funzione è
sintetizzabile nel consentire di instaurare una relazione o, comunque, condurre
ad un determinato soggetto o classe di soggetti con un margine di errore molto
basso o inesistente.
Così come i tratti somatici
e le caratteristiche fisiche di una persona sono racchiuse nella catena
cromosomica, cosi i dati inerenti la personalità, i gusti e le preferenze sono
racchiusi in una catena di dati che, per questa loro natura, prendono il nome,
nell’accezione comune, di dati personali.
Si inserisce
prepotentemente, a questo punto, il problema del processing dei dati personali,
affinché, appunto, riescano a diventare inequivocabilmente la cartina tornasole
di un individuo ben determinato o di una categoria di soggetti accomunabili per
caratteristiche salienti.
Ormai il ricorso al mezzo
informatico per l’elaborazione dei dati è quasi obbligato. La capacità intrinseca
di elaborare dati, funzione primaria dell’informatica, può, infatti,
risultare molto utile sia limitatamente al dato in se e per si, sia, e
soprattutto, nell’ottica di quella attività che sempre più sta prendendo
piede: il data mining, sempre più sfruttato per scopi prevalentemente
commerciali.
Quest’ultima scoperta
delle aziende consente, infatti, mediante apposite correlazioni di dati non
necessariamente personali, di tracciare in maniera fedele le preferenze di un
individuo e di utilizzarle come meglio si crede.
Che il dato personale
rivesta questa funzione, ormai diventata fondamentale nella connected society,
come viene chiamata da Negroponte la società attuale, ci viene segnalato anche
da un altro mondo: il mondo del diritto.
Da quando è stata emanata la
legge di tutela del trattamento dei dati personali, infatti, è stato un
continuo susseguirsi di interventi legislativi volti ad integrare, attualizzare
o modificare in parte la suddetta legge, oltre ad interventi che ne hanno
esteso l’ambito di applicazione in settori dove prima la tutela dei dati
personali non era presa assolutamente in considerazione.
Se vi è stato tanto
movimento in direzione di una tutela dei dati personali da parte di un mondo
storicamente refrattario ad adattarsi tempestivamente ai nuovi stimoli ed alle
nuove problematiche quale è il mondo del diritto, allora vuole dire che il
tanto descritto valore dietro il dato personale c’è eccome.
Inoltre, in seguito a quanto
detto sopra, da una esigenza di tutelare il dato in se e per se, si è passati
ad una esigenza di tutelare anche la modalità di trattazione dei dati stessi, e
di sanzionare determinate correlazioni che possono violare il principio della
privacy.
Si introduce, cosi, un altro
termine decisamente abusato, ma forse non perfettamente compreso da tutti: la
privacy.
Questo è un termine che ha
conosciuto una sua evoluzione, anche e soprattutto nel mondo del diritto.
Formatosi principalmente
nell’ordinamento americano, da una concezione iniziale che si può riassumere
nell’espressione diritto ad essere lasciato solo si è passati, con varie
evoluzioni, ad un diritto a controllare come vengono utilizzate da altri le
informazioni che ci riguardano.
Capita di sentirlo usare nei
modi più svariati: alcuni lo utilizzano come spauracchio, altri preferiscono
dissertare sulle sue implicazioni filosofiche, ma quello che principalmente si
vuole indicare è lo stretto legame che c’e tra la sempre più sentita
esigenza di privacy e la sicurezza.
Vi sono aziende che arrivano
a pagare dei veri e propri “cacciatori di dati”, pirati informatici
che vengono assoldati appositamente per violare database di dati personali
legittimamente detenute da aziende ed è in questo scenario che bisogna
innanzitutto proteggere i dati di cui si è in possesso e, secondariamente, esternare
la propria volontà affinché, quei determinati dati, non vengano innanzitutto
carpiti ed in seguito utilizzati.
Ecco, quindi, affermarsi l’esigenza
di sicurezza, definita da alcuni ormai vera ricerca parossistica e paranoica,
sfruttata da altri come splendido veicolo commerciale di grande successo per
rifilare soluzioni all-in-one che, schiacciando il magico pulsante ON,
teoricamente garantiscono protezione assoluta contro gli utilizzi impropri dei
dati personali. Purtroppo, rischiando di peccare di scarsa originalità, preme
ricordare che la sicurezza è un processo, e non un prodotto acquistabile sugli
scaffali, e, soprattutto, che è un processo asintotico, per cui la sicurezza è
praticamente irraggiungibile, ma con apposite procedure vi si può avvicinare in
maniera determinante.
Per rappresentare nel
miglior modo possibile lo stretto legame tra tutela dei dati personali e
privacy si è, infatti, preferito disegnare uno scenario ipotetico, ma
perfettamente verosimile, conforme alla realtà informatica di diverse aziende e
si è voluto vedere come questo scenario poteva essere sollecitato e quali
strumenti la tecnica ed il diritto ci mettono a disposizione per tutelare al
meglio i dati personali.
Dunque, sicurezza e privacy
abbiamo visto essere due aspetti dello stesso problema, collegate alla gestione
del “dato” informatico. Si rende, quindi, necessaria una gestione
oculata del “dato”, nell’ottica di una prevenzione degli
utilizzi non autorizzati degli stessi, di qualsiasi natura essi siano. Per non
rimanere sulla teoria spicciola, è stato selezionato un caso tra i tanti
possibili che è risultato, in ultima analisi, piuttosto generale e diffuso nel
panorama italiano, specie nella piccola e media impresa: si sta parlando della
gestione delle informazioni in possesso di una azienda che abbia deciso di
creare una “vetrina” su Internet, offrendo ai potenziali clienti un
sistema di e-commerce per l’acquisto di alcuni prodotti. Le problematiche
da affrontare, come si vedrà, saranno diverse, ma avranno tutti un unico
denominatore, la sicurezza degli accessi, che si traduce in una rete –
sia pubblica che privata - sicura. Verranno analizzate, qua di seguito, le
possibilità di prendere all’interno della rete di un eventuale
attaccante, che abbia deciso di sottrarre “informazioni confidenziali”
all’azienda.
Cominciamo introducendo una
struttura di rete di esempio, che fungerà da scenario per i nostri attacchi. L’azienda
virtuale che abbiamo creato per l’occasione si chiama Profumeria RoseNoir
Srl: essa si occupa della produzione e della vendita di profumi e, per
mantenersi al passo con i tempi, ha deciso di aprire un’area di
e-commerce sul proprio sito web http://www.profumi-online.biz allo scopo di permettere
alla propria clientela l’acquisto dei suoi prodotti anche tramite
Internet. Per far ciò ha acquistato uno spazio di indirizzi IP (diciamo
1.1.1.0/29, corrispondente al range di indirizzi 1.1.1.0-7) ed ha deciso in
installare presso la propria struttura tre server Linux destinati alla rete
pubblica:
·
Un server mail+DNS (avente indirizzo l.l.l.2),
che eroga i seguenti servizi: DNS
(Domain Name System) primario per il
dominio profumi-online.biz, SMTP
(Simple Mail Transfer Protocol), POP-3
(Post Office Protocol v3) per la posta, e SSH
(Secure Shcll) per l’amministrazione remota del sistema.
·
Un server web+DNS (con indirizzo 1.1.1.3), che
offre i seguenti servizi: DNS secondario
per il dominio profumi-online.biz, HTTP
ed HTTPS per il sito (front-end)
web, MySQL per il backend, FTP (File Transfer Protocol) per fare
upload delle pagine HTML e, per finire, SSH
per l’amministrazione remota del sistema.
·
Un firewall (con indirizzo pubblico
1.1.1.4 e con indirizzo privato 10.10.10.1), che maschera l’indirizzamento
della classe privata 10.10.10.0/24 e permette ai client la navigazione su
Internet, senza alcuna particolare restrizione: si tratta di un comune Packet
Filter senza funzionalità di Application Proxy.
Figura 1:
la rete della profumeria RoseNoir. L’azienda dispone di 4 indirizzi
pubblici (da 1.1.1.1 a 1.1.1.4), assegnati a tre macchine Linux e ad un router.
E’ presente una LAN privata con alcuni server di lavoro, oltre ad un RAS
server ed un Access Point Wireless in test.
Anche sul firewall e montato
un servizio SSH per l’amministrazione remota del sistema che è, però,
filtrato per connessioni non provenienti dalla classe 1.1.1.0/29. Oltre a
questo, non vi sono altri servizi in ascolto.
All’indirizzo 1.1.1.1 è,
inoltre, raggiungibile l’interfaccia del router Cisco che gestisce la
connettività Internet verso l’ISP (Internet Service Provider)
selezionato. Sulla rete privata (che, come abbiamo gia visto, ha indirizzi
compresi nella classe C 10.10.10.0/24) sono attestate le postazioni di lavoro
dei dipendenti (Windows-based), un server Linux per lo sviluppo del sito di e-commerce,
un altro server Linux (SECRET) contenente informazioni estremamente sensibili
(quali, ad esempio, i progetti dettagliati dei nuovi prodotti), un RAS (Remote Access Server) per l’accesso
degli agenti alla rete privata da numerazione verde 800-XXXXXX ed infine un Access Point wireless IEEE 802.11b,
attualmente configurato senza particolari misure di sicurezza ed in fase di
test per una possibile implementazione futura.
Lo scenario di rete esposto
e riassunto nello schema (vedi Figura 1). Prima di passare ad esporre i
possibili attacchi che interessano tale struttura di rete, forniamo una breve
introduzione teorica agli attacchi informatici, descrivendo le fasi da cui essi
sono tipicamente costituiti.
E’ possibile fornire
una indicazione di massima sulle fasi che costituiscono un tipico attacco. Esse
sono rappresentate all’interno dello schema seguente.
A) HIDING (Mascheramento)
Durante questa prima fase, l’attacker
compie delle operazioni (a volte anche piuttosto complesse) allo scopo di “camuffarsi”,
nascondendo la propria reale ubicazione per scongiurare il pericolo di essere
tracciato ed identificato. Tipicamente ricorre all’utilizzo di sistemi
ponte (detti anche launchpad)
precedentemente violati, al mascheramento della propria utenza telefonica (ad
esempio tramite dialout) o ad altri
simili trucchi.
B) INFORMATION GATHERING (Raccolto di
Informazioni)
Affinché un attacco abbia
esito positivo, è fondamentale che l’attacker raccolga il maggior numero
di informazioni possibili sulla rete scelta come bersaglio. E’ importante
notare che in questa fase non viene eseguita alcuna reale intrusione, ma ci si
limita a raccogliere le informazioni pubbliche reperibili attraverso canali
standard (database del NIC, WHOis record, DNS, traceroute, ping, ecc.).
Le tecniche comunemente
utilizzate allo scopo sono:
Network Surveying:
si tratta di una sorta di combinazione di ricerca dei dati, accolta di
informazioni importanti e controllo delle politiche di sicurezza e di
information disclosure. Al termine di questa sottofase, l’attaccante è
tipicamente in possesso dei nomi di dominio interessati, delle denominazioni e
delle funzioni primarie dei singoli server, degli indirizzi IP di proprietà
dell’azienda bersaglio, di una mappa di rete approssimativa, di indirizzi
e-mail validi (tipicamente info@, sales@, webmaster@, etc.) e di informazioni
specifiche riguardanti l’ISP che fornisce la connettività Internet.
Port Scanning:
con il termine port scanning si intende l’attività di probing invasivo
delle porte di sistema, a livello di trasporto (layer 4 dello standard di
riferimento ISO/OSI). Ogni sistema che implementa il TCP/IP ha 65.536 possibili
porte TCP e altrettante UDP: lo scopo di
questa fase e fornire un elenco dei sistemi attivi nell’intervallo di
indirizzi individuato durante l’attività di Network Surveying ed ottenere
una mappa di rete ad un maggiore livello di
dettaglio.
Service Identification:
si tratta dell’esame attivo delle applicazioni in ascolto sulle porte
individuate nel corso della sottofase precedente. A volte ad un servizio può
essere associata più di una applicazione; ad esempio, nel caso di un server
web, il Perl ed il PHP possono essere considerati componenti dell’applicazione
che ascolta sulla porta 80/TCP (il server web Apache). I risultati ottenuti al
termine di questa analisi consentono all’attaccante di individuare i
possibili punti deboli dell’infrastruttura informatica scelta come
bersaglio.
System Identification:
con questo termine si intende il probing attivo di un sistema, alla ricerca di
risposte che permettano di distinguere la tipologia di sistema operativo, la
sua versione ed altre ulteriori informazioni specifiche. Una tecnica
comunemente utilizzata allo scopo è
quella del TCP/IP fingerprinting, realizzata ad esempio dal noto
programma di port scanning nmap. Così come per quelle raccolte nel corso della
sottofase di Service Identification, anche queste informazioni consentono all’attacker
di ampliare la propria visione sulla rete e sulle sue esposizioni.
C) SYSTEM PENETRATION (Intrusione)
Una volta in possesso delle
informazioni necessarie, è il momento per l’attacker di sferrare l’attacco
vero e proprio. A seconda delle tipologie di reti, sistemi e servizi erogati,
tale attacco può variare sensibilmente dal punto di vista pratico; possiamo
però raggruppare le possibili insicurezze in almeno 4 aree distinte:
System security:
si tratta di vulnerabilità a livello di sistema operativo e nel software di
base. Tipicamente, alcuni servizi e programmi applicativi, datati oppure mal
configurati, si prestano ad essere attaccati allo scopo di ottenere un accesso
non autorizzato al sistema che ne fa uso (vulnerabilità remote) o di realizzare
una scalata di privilegi (vulnerabilità locali). Tipici esempi di attacchi
connessi a questa tipologia di insicurezza sono quelli che sfruttano l’esecuzione
di codice arbitrario da remoto (tramite impiego di exploit specifici), la
mancata gestione delle eccezioni o, infine, la mancata o scorretta
implementazione delle politiche di gestione delle credenziali di accesso
(attacchi di tipo “password guessing” o “brute force”).
Network security:
in questo ambito sono comprese le vulnerabilità che minano il livello di
sicurezza globale della rete. Tipicamente, i fattori che concorrono alla
determinazione di questo genere di esposizioni sono la tipologia di rete e la
conseguente presenza di
punti di accesso (potenzialmente sprotetti o non adeguatamente protetti) alla
rete privata, la tipologia e la configurazione dei sistemi per il routing ed il
firewalling (servizi attivi, ACL, default password e policy del Packet Filler)
e la possibilità di effettuare il monitoraggio passivo del traffico alla
ricerca di informazioni riservate trasmesse in chiaro (Network Sniffing).
Application
security: le
insicurezze si possono manifestare anche (e soprattutto) nel software
applicativo. In particolare, un gran numero di tecnologie e di implementazioni
di applicazioni interne risultano vulnerabili ad attacchi mirati a reperire
informazioni riservate o ad ottenere un accesso non autorizzato ai sistemi che
erogano i servizi pubblici.
Alcuni esempi di vulnerabilità a livello applicativo sono
l’SQL injection, il cross-site scripting, e la possibilità di effettuare
session hijacking (almeno per quanto riguarda le applicazioni web).
Procedural
security:
infine, le stesse procedure volte a migliorare le modalità di gestione della
sicurezza possono cadere vittima di falle strutturali all’interno del
proprio modello di gestione fornendo, ad esempio, a chi attacca, la possibilità
di sfruttare l’esistenza di relazioni di fiducia tra le singole macchine
o in relazione all’elemento umano (tramite attacchi basati su social
engineering ed human deception).
Per ognuna delle quattro macro-categorie di vulnerabilità
descritte, l’attaccante cerca di individuare i punti deboli e colpisce
ove risulta più conveniente per la riuscita dell’intrusione informatica,
utilizzando i mezzi opportuni.
D)
CLEANING (Pulizia)
Una volta portata a termine l’intrusione, è
generalmente necessario per l’attacker procedere con la cancellazione
delle tracce lasciate nei file di log, su altre regioni del file system e, se
possibile, sugli eventuali dispositivi di monitoraggio delle attività di rete
per il rilevamento delle intrusioni (Intrusion Detection Systems).
Fatta una breve panoramica sulla teoria di base degli
attacchi informatici, possiamo ora passare a descrivere l’andamento di un
ipotetico attacco alla rete pubblica (1.1.1.0/29), a partire dalla fase di
Information Gathering.
Siccome l’analisi esaustiva di tutto l’iter
che contraddistingue un attacco ad un sistema informatico non rientra tra gli
scopi di questo documento, abbiamo scelto di tralasciare la descrizione
approfondita delle fasi di Hiding e di Cleaning, per concentrarci
immediatamente sui più interessanti processi di Information Gathering e System
Penetration.
Il nostro attacker, verosimilmente animato dagli
interessi di qualche azienda concorrente, ha deciso di attaccare la rete della
Profumeria RoseNoir Sri, allo scopo di reperire informazioni utili sui clienti
registrati su) sito di e-commerce ed eventualmente di accedere ad altri dati
sensibili, che noi sappiamo essere contenuti sul server Linux SECRET attestato
sulla rete privata. Dopo aver adeguatamente mascherato la propria reale
ubicazione, l’attacker comincia a raccogliere informazioni sull’azienda
e sul suo sito web istituzionale, raggiungibile all’indirizzo http://www.profumi-online.biz
.
Siamo entrati nella fase di Information Gathering.
Network
Surveying: come
prima cosa l’attacker utilizza il proprio client DNS per risolvere l’hostname
www.profumi-online.biz ad esempio tramite il comando:
# host
www.profumi-online.biz
www.profumi-online.biz A 1.1.1.3
Una volta in possesso dell’indirizzo IP 1.1.1.3, l’attacker
prosegue operando una query al Database del RIPE, con un comando di questo
tipo:
# whois -h whois.ripe.net 1.1.1.3
% This is
the RIPE Whois server.
% The
objects are in RPSL format.
%
% Rights
restricted by copyright
% See
http://www.ripe.net/ripencc
% /pub-services/db/copyright.html
inetnum: 1.1.1.0 – 1.1.1.7
netname: ROSENO-NET
descr: Profumeria RoseNoir Srl
country: IT
admin-c: […]
tech-c: […]
status: ASSIGNED PA
mnt-by: ISP-NCC
notify: noc@isp
changed: noc@isp 20020711
source: RIPE
route: 1.1.0.0/19
descr: ISP
origin: […]
remarks: ALLOCATED PA Space do not break up
notify: noc@isp
mnt-by: ISP-NCC
changed: noc@isp 20020711
source: RIPE
person: Giorgio Rossi
address: Profumeria RoseNoir Srl
address: via Roma 00
address: 00000 Milano (MI)
address:
phone: +39 02 XXXXXXX
fax-no: +39 02 XXXXXXX
e-mail: Giorgio@profumi-online.biz
nic-hdl: […]
changed: noc@isp
source: RIPE
person: Giuseppe Rossi
address: Profumeria RoseNoir Srl
address: via Roma 00
address: 00000 Milano (MI)
address:
phone: +39 02 XXXXXXX
fax-no: +39
02 XXXXXXX
e-mail: beppe@profumi-online.biz
nic-hdl: […]
changed: noc@isp
source: RIPE
Come si vede da questo esempio creato ad hoc, l’attacker
è in grado di reperire una grande quantità di informazioni attraverso un
semplice comando per l’interrogazione del Database del RIPE, l’ente
preposto all’assegnazione degli indirizzi IP per l’Europa.
Oltre alla classe di proprietà dell’azienda
bersaglio, sono visibili altri dati importanti, quali la sede della società, i
numeri telefonici e del fax, i nomi dei titolari ed i loro indirizzi e-mail.
Infine, la query al servizio WHOIS restituisce anche delle informazioni
specifiche sull’ISP che fornisce la connettività Internet.
Analogamente, è possibile effettuare una query anche al
WHOIS dell’autorità preposta all’assegnazione dei nomi di dominio:
nel caso del TLD (Top Levei Domain,) .biz occorre rivolgersi direttamente a Network
Solutions, come segue:
# whois -h whois.networksolutions.com profumi-online.biz
[…]
Domain
Name: PROFUMI-ONLINE.BIZ
Domain ID: […]
Sponsoring
Registrar: […]
Domain
Status: ok
Registrant
ID: […]
Registrant
Name: Giorgio Rossi
Registrant
Organization: Profumeria RoseNoir Srl
Registrant
Address1: via Roma 00
Registrant
State/Province: Milano
Registrant
Postal Code: 00000
Registrant
Country:
Registrant
Country Code: IT
Registrant Phone Numerico: +39.02XXXXXXX
Registrant Facsimile Numerico: +39.02XXXXXXX
Registrant Email: g.rossi@libero.it
[…]
Name
Server: DNS.PROFUMI-ONLINE.BIZ
Name
Server: DNS2.PROFUMI-ONLINE.BIZ
Created by registrar: […]
[…]
Anche in questo caso l’attacker ha a sua
disposizione molte informazioni interessanti: in particolare, un nuovo
indirizzo e-mail su libero.it ed i due server DNS registrati come autoritativi
per il dominio in esame. E’ giunto il momento di interrogare i name
server individuati, ad esempio, tramite il seguente comando (l’output
completo è riportato nel riquadro alla pagina successiva):
# host -t
ns profumi-online.biz
Come accade piuttosto frequentemente, i name server
autoritativi per il dominio interessato permettono a chiunque di scaricare i
dati relativi alle zone
# host -t ns profumi-online.biz #name
server
profumi-online.biz NS dns.profumi-online.biz
profumi-online.biz NS dns2.profumi-online.biz
# host –t mx profumi-online.biz # mail exchange
profumi-online.biz MX 20
mail.profumi-online.biz
# host –l profumi-online.biz # zone transfer
profumi-online.biz NS dns.profumi-online.biz
profumi-online.biz NS dns2.profumi-online.biz
profumi-online.biz MX 20
mail.profumi-online.biz
gw.profumi-online.biz A 1.1.1.1
mail.profumi-online.biz A 1.1.1.2
www.profumi-online.biz A 1.1.1.3
dns.profumi-online.biz A 1.1.1.2
dns2profumi-online.biz A 1.1.1.3
fw.profumi-online.biz A 1.1.1.4
di dominio: nel nostro caso, l’attacker è in grado
di visualizzare tutti gli hostname registrati sotto il dominio
profumi-online.biz.
Ciò gli consente di ampliare ulteriormente la sua visione
della rete bersaglio, in particolare per quanto riguarda la funzione degli host
attivi (gateway, web, mail, DNS, firewall). E’ possibile tentare lo
stesso tipo di query anche sulla classe di riverse 1.1.1.in-addre.arpa, allo
scopo di reperire ulteriori informazioni. Infine, a volte capita che sul DNS
esterno siano caricate anche le zone relative alla classe interna (sia record A
che record PTR), senza l’attivazione delle opportune ACL (Access Control
List): questa configurazione consente ad un attacker di ottenere
dall’esterno informazioni precise sull’indirizzamento e sulle
funzioni dei sistemi attestati sulla rete privata (nel nostro caso
10.10.10.0/24).
Altri tool utili per ottenere dati preziosi sulla rete
bersaglio sono traceroute, ping, hping ed un comune browser web da utilizzare per visitare il sito
istituzionale dell’azienda bersaglio.
Per finire l’attacker procede con
l’indentificazione degli host attivi, attraverso un ping sweep:
# nmap –sP 1.1.1.0/29
Starting
nmap V.2.54BETA30 www.insecure.org/nmap)
Host
gw.profumi-online.biz (1.1.1.1) appears to be up
Host dns.profumi-online.biz
(1.1.1.2) appears to be up
Host
dns2.profumi-online.biz (1.1.1.3) appears to be up
Host fw.profumi-online.biz
(1.1.1.4) appears to be up
Una volta identificate le 4 macchine raggiungibili è il
momento di esaminare I servizi da esse erogati.
Port Scanning: per ognuno dei 4 sistemi pubblici
individuati, l’attacker lancia un port scan alla ricerca dei servizi
attivi:
# nmap 1.1.1.1 #
gateway
Starting
nmap V.2.54BETA30 www.insecure.org/nmap)
Interesting
ports on gw.profumi-online.biz (1.1.1.1):
Port State Service
79/tcp open finger
# nmap –sU 1.1.1.1 # gateway
Starting
nmap V.2.54BETA30 www.insecure.org/nmap)
Interesting
ports on gw.profumi-online.biz (1.1.1.1):
Port State Service
161/tcp open snmp
# nmap 1.1.1.2 #
mail + DNS
Starting
nmap V.2.54BETA30 www.insecure.org/nmap)
Interesting
ports on dns.profumi-online.biz (1.1.1.2):
Port State Service
22/tcp open ssh
25/tcp open smtp
53/tcp open domain
110/tcp open pop-3
# nmap 1.1.1.3 #
web + DNS
Starting
nmap V.2.54BETA30 www.insecure.org/nmap)
Interesting
ports on dns2.profumi-online.biz (1.1.1.3):
Port State Service
21/tcp open ftp
22/tcp open ssh
53/tcp open domain
80/tcp open http
443/tcp open https
3306/tcp open mysql
# nmap 1.1.1.4 #
firewall
Starting
nmap V.2.54BETA30 www.insecure.org/nmap)
Interesting
ports on fw.profumi-online.biz (1.1.1.4):
All 1549
scanned ports on fw.profumi-online.biz (1.1.1.4) are: filtered
Come si nota, i due server pubblici (mail+DNS e web+DNS)
offrono un certo numero di servizi pubblici, mentre il router permette solamente
l’utilizzo di FINGER e SNMP. Il firewall, infine, filtra tutte le
connessioni.
Service
Identification: per
ognuna delle porte in ascolto individuate è ora necessario identificare i
servizi corrispondenti e le relative versioni, alla ricerca di un punto di
accesso ai sistemi. Per fare ciò si utilizzano tipicamente dei tool multi-purpose
(telnet, netcat, etc.) o specifici per un determinato servizio (dig, rpcinfo,
etc.). Nel nostro caso, l’attacker è in grado di compilare una mappa dei
servizi attivi, di cui conosce le vulnerabilità e le esposizioni.
Senza entrare nei dettagli implementativi (non ci
interessa trattare le vulnerabilità delle specifiche implementazioni di ogni
singolo protocollo), forniamo una tabella di riferimento sulle principali esposizioni
relative ai servizi individuati nel corso dell’analisi (vedi Appendice).
Infine, come abbiamo già accennato, è possibile
utilizzare il meccanismo di TCP/IP fingerprinting messo a disposizione da mnap,
allo scopo di identificare le versioni di sistema operativo presenti sui server
:
# nmap -O 1.1.1.1 # gateway
[…]
Remote OS
guesses: Cisco IOS 11.3 –
12.0(11)
# nmap -O 1.1.1.2 # mail + dns
Remote
operating system guess: Linux 2.3.x
– 2.4.x
Uptime
25.983 days (since Thu Nov 28 18:21:02 2002)
[…]
# nmap -O 1.1.1.3 # web + dns
Remote
operating system guess: Linux 2.3.x
– 2.4.x
Uptime
25.983 days (since Thu Nov 28 18:21:09 2002)
[…]
# nmap -O 1.1.1.4 # firewall
Remote
operating system guess: Linux 2.3.x
– 2.4.x
Uptime
1.452 days (since Mon Dec 23 1:00:43 2002)
[…]
Come si vede, il router (1.1.1.1) è con ogni probabilità
un Cisco, mentre i 3 server sono dei Linux 2.4: di questi ultimi è addirittura,
possibile risalire all’uptime.
In particolare l’ora di avvio del firewall può far
pensare ad uno scheduling automatizzato del reboot (giornaliero o settimanale,
alle 01:00 del mattino). Anche questa informazione, unitamente a quelle già
raccolte, può risultare di grande utilità ad un attacker smaliziato. Lasciamo
ai più fantasiosi il compito di immaginare il modo di sfruttare questo genere
di configurazione. Terminata la fase di Information Gathering, passiamo ora ad
analizzare le possibilità di intrusione individuate sino a questo momento.
Dopo aver raccolto tutte le informazioni utili del caso,
è giunto il momento per l’attacker di sferrare l’attacco vero e
proprio ai sistemi selezionati come bersaglio. E’ importante notare come
l’attacco a sistemi protetti nella maniera corretta non sia quasi mai
diretto, ma richieda spesso la correlazione di più di una vulnerabilità ai fini
di guadagnare l’accesso alla rete bersaglio: per questo motivo, l’attacker
può decidere di non attaccare direttamente i propri bersagli primari (il
database MySQL e la rete privata), scegliendo, invece, di giungervi attraverso
una via privilegiata (rappresentata, ad esempio, da un altro server attestato
nella rete di proprietà della Profumeria).
A beneficio dei meno esperti, chiariamo che la
compromissione dei privilegi di amministrazione di un server consente l’accesso
illimitato ai dati ivi contenuti, in lettura e scrittura: una volta ottenuto
questo tipo di accesso, un attacker ha la possibilità di consultare, alterare,
cancellare ogni informazione conservata sul server compromesso, con ovvie
implicazioni sulle attività dell’azienda vittima.
Inoltre, è solo tramite i privilegi di amministratore che
è possibile creare pacchetti con indirizzi sorgenti diversi da quelli posseduti
dalla PC compromesso: questo permette l’utilizzo di programmi per
attacchi tipo Man-in-the-Middle e altro: il tutto per cercare di intercettare
la maggior quantità di traffico di rete possibile alla ricerca di ulteriori
credenziali per poter compromettere la rete privata.
A seconda dei risultati ottenuti nel corso della fase di
Information Gathering, l’attacker ha la possibilità di scegliere uno o
più dei seguenti approcci per portare a termine l’attacco ai server in
DMZ (in particolare al database MySQL) e per ottenere l’accesso alla rete
privata della propria vittima.
INFORMATION
LEAK: è
possibile ricavare informazioni utili sulle utenze valide presenti sul router
Cisco (all’indirizzo IP 1.1.1.1) e sul server mail+DNS (1.1.1.2),
sfruttando rispettivamente i servizi di FINGER e SMTP. In questo modo l’attacker
può aumentare le probabilità di riuscita di un attacco di tipo brute farce o
password guessing mirato al router ed al mail server, che rappresentano due
ideali trampolini di lancio per sferrare l’offensiva verso i bersagli
primari (il database e la rete privata).
EXPLOIT: a seconda della tipologia e
della versione dei demoni in ascolto relativi ai servizi FTP, SSH, DNS, HTTP,
HTTPS e MYSQL, l’attacker può essere in possesso di programmi per l’intrusione
remota sui sistemi che ti utilizzano.
Se l’accesso ottenuto non è privilegiato, è inoltre
possibile utilizzare in un secondo tempo exploit locali per ottenere i permessi
di amministrazione (root, su sistemi Unix-like).
BRUTE FORCE: infine, è possibile lanciare
un attacco a forza bruta sul meccanismo di autenticazione dei servizi FTP, SSH,
POP-3 e MYSQL, allo scopo di ottenere credenziali di accesso valide per i
sistemi bersaglio.
Network securìty
SNMP
SPOOFING: SNMP
utilizza UDP come protocollo a layer di trasporto (layer-4 del modello di
riferimento ISO/OSI).
Tale protocollo è suscettibile ad attacchi del tipo
spoofing o hijacking di sessione: in particolare, se si è a conoscenza delle
community SNMP valide con permessi (tw) e degli indirizzi IP accettati dal
servizio a livello di ACL (informazioni in larga parte note per carrier di
grandi dimensioni o ottenibili attraverso Network Sniffing), è possibile
modificare remotamente la configurazione del router ed ottenere così l’accesso
non autorizzato all’apparato di rete, che rappresenta un ottimo launchpad
privilegiato da cui condurre i successivi attacchi.
SNIFFING: alcuni dei protocolli
presenti nella rete bersaglio (FTP, SMTP, HTTP, POP-3, SNMP, MYSQL) non
implementano la cifratura del traffico: qualora l’attacker riuscisse ad
ottenere l’accesso privilegiato ad uno solo dei sistemi attestati sulla
rete, sarebbe in grado di monitorare tutto il traffico, catturando le
credenziali di accesso in transito anche
verso altri sistemi. Tale
situazione sarebbe ulteriormente aggravata nel caso di impiego di hub al posto
di switch.
Tutto ciò va a conferma del celebre detto: “A chain is only as strong as its weakest
link” (ovvero “Basta un
solo sistema vulnerabile per determinare la compromissione di tutta la rete”).
PUNTI
DI ACCESSO: come
si nota subito osservando lo schema della rete bersaglio, vi è un evidente
punto di accesso alla rete privata, rappresentato dal firewall all’indirizzo
1.1.1.4. La compromissione di tale host dual-homed offre la possibilità ad un
attacker esterno di accedere ai sistemi attestati sulla rete privata.
Application security
WEB
APPLICATION: a
seconda della tecnologia utilizzata per implementare l’applicazione di
e-commerce su web (Perl, PHP, servlet Java) è possibile per l’attacker
individuare delle esposizioni e delle vulnerabilità che consentano di ottenere
l’accesso non autorizzato al sistema web (1.1.1.3).
Analogamente, anche la realizzazione del servizio è
importante: degli eventuali bug (a livello progettuale o implementativo)
possono portare alla compromissione dell’applicazione e delle
informazioni sensibili da essa processate (come dati personali, numeri di carte
di credito e così via) e consentire frodi su piccola e vasta scala.
TRUST
RELATIONSHIP: l’attacker
può sfruttare la presenza di relazioni di fiducia tra gli host allo scopo di
ottenere l’accesso su più sistemi.
Nel nostro caso, ad esempio, potrebbe introdursi in uno
dei due server (mail o web) sfruttando una vulnerabilità remota del DNS, per poi accedere alla porta
22/ TCP aperta sul firewall solo per connessioni provenienti dalla
classe 1.1.1.0/29.
In questo modo otterrebbe una posizione privilegiata per
sferrare un attacco al firewall, allo scopo di penetrare nella rete privata.
RICICLO
DI PASSWORD:
troppo spesso gli amministratori di sistema e gli utenti comuni tendono a
riciclare le stesse credenziali di accesso su più sistemi.
Questo comportamento ovviamente consente ad un attacker
di compromettere un maggior numero di macchine con minimo sforzo, attraverso la
tecnica del Password Cracking.
Abbiamo descritto alcune delle possibili strade di
attacco esterne volte a compromettere la sicurezza dei sistemi attestati sulla
rete bersaglio. Non si tratta, ovviamente, di una esposizione esaustiva di
tutte le tipologie di attacco possibili: a seconda delle motivazioni che
muovono l’attacker, le sue
tecniche possono variare sensibilmente.
Nel nostro esempio, abbiamo deciso di descrivere il
comportamento di un cracker avente una certa esperienza, interessato ad un
certo tipo di informazioni riservate riguardanti clienti e prodotti della
Profumeria: questa tipologia di attacker è chiaramente interessata ad
effettuare una intrusione che passi il più possibile inosservata, pertanto essa
non comporterà un danno immediato ai sistemi coinvolti in termini di
disponibilità dei servizi.
Se ci fossimo trovati a descrivere la vendetta personale
di un ex-dipendente, invece, l’attacco avrebbe preso una piega molto
diversa: tipicamente, avremmo dovuto affrontare attacchi di tipo DoS (Denial of
Service, o negazione di servizio); essi sono, infatti, generalmente più
semplici da attuare e mirano a compromettere l’efficienza o la
disponibilità di un servizio, una macchina o una intera rete (senza la
necessità di effettuare una intrusione vera e propria sui sistemi bersaglio).
Passiamo, ora, ad esaminare gli altri punti di accesso alla rete privata, per
poi esporre l’andamento di un ipotetico attacco interno.
Oltre al firewall (1.1.1.4), che abbiamo già esaminato,
vi sono altri punti di accesso alla rete privata che risultano piuttosto
evidenti dal diagramma della struttura di rete. Quello che un ipotetico
attaccante deve fare nell’ottica di un attacco interno è enumerarli (come
parte del processo di Information Gathering), per poi tentare l’intrusione.
Nel nostro caso vi sono altri due punti di accesso alla rete privata:
Il server RAS, che accetta connessioni da rete telefonica
su numerazione verde 800-XXXXXX. Tale servizio, teoricamente riservato agli
agenti ed ai legittimi amministratori di sistema, può essere sfruttato da un
attacker per ottenere un accesso non autorizzato alla rete bersaglio,
direttamente su classe privata 10.10.10.0/24;
L’Access Point 802.11b. La tecnologia wireless è
sempre più diffusa anche nelle aziende italiane: nel nostro caso, non vi è una
vera e propria infrastruttura Wi-Fi, poiché l’Access Point è
temporaneamente in fase di test nell’ottica di una eventuale
implementazione futura. Esso è, però, poco prudentemente collegato alla rete
privata e non è configurato per utilizzare particolari sistemi di protezione
(WEP, accettazione dei soli MAC Address delle schede wireless aziendali ed
altri accorgimenti).
Ognuno di questi punti di accesso può rappresentare la
strada ideale per un attacker esterno motivato, che voglia ottenere l’accesso
diretto alla rete privata.
Inoltre, è molto importante notare che un gran numero di
attacchi documentati sono ad opera di insider, ovvero personale interno all’azienda
con un accesso legittimo alla rete.
Abbiamo deciso di non trattare questo tipo di attacchi,
ma è fondamentale che una infrastruttura di sicurezza si curi anche di questa
particolare tipologia di intrusione con posizione privilegiata.
Non dimentichiamo, infatti, che l’insider,
indipendentemente dalle sue motivazioni, con ogni probabilità conosce bene la
struttura della rete bersaglio, sa che cosa sta cercando, ne conosce il valore
e ha una idea di come utilizzarlo.
Vediamo, ora, brevemente come sia possibile scoprire e
sfruttare i due ulteriori punti di accesso alla rete privata presenti nel
nostro scenario di esempio.
Nel caso del server RAS su numerazione verde, la scoperta
può avvenire casualmente (attraverso War Dialing su 800*) o a seguito di una
operazione mirata (PBX scanning, Social Engineering, consultazione di informazioni
per gli agenti presenti sul sito web istituzionale o sulla Intranet o, ancora,
sniffing di messaggi e-mail in transito o compromissione di singole caselle di
posta elettronica).
Una volta in possesso del numero telefonico del RAS, l’attacker
è comodamente in grado di impersonare un agente, dipendentemente dalla politica
di gestione delle password per l’accesso al dial-in e dalla soluzione
(hardware e software) scelta per l’implementazione di tale servizio. L’attacco
portato attraverso la rete wireless è, invece, tipicamente costituito da una
sessione di War Driving (l’equivalente del War Dialing on the road, di
cui si sente tanto parlare in questi ultimi mesi) e Wireless Leak Test per poi
concludersi con la penetrazione nella rete privata e l’eventuale
installazione di backdoor per il comodo accesso da Internet (nel nostro caso un
ottimo posto per installare una backdoor sarebbe il firewall o, in alternativa,
il server di autenticazione per il dial-in). Una volta ottenuto l’accesso
alla rete privata utilizzando una qualsiasi delle tecniche appena esposte, è
tipicamente molto semplice compromettere i sistemi ivi attestati.
Raramente, infatti, i client ed i server interni ricevono
le cure e le attenzioni che meritano da parte degli amministratori di sistema e
dei Security Manager, che li ritengono (erroneamente) protetti in modo
soddisfacente dal firewall perimetrale.
Come abbiamo visto, a seconda dei casi può essere anche
molto facile aggirare tale tipo di protezione. Le tecniche utilizzate per compromettere
i sistemi su rete privata seguono generalmente gli stessi principi esposti nel
caso dell’attacco alla rete pubblica, con alcune differenze:
·
la fase di Information Gathering è molto più
veloce, proporzionalmente alla dimensione della rete privata;
·
i servizi attivi sono molti di più, così come i
sistemi potenzialmente vulnerabili ad attacchi noti (locali o remoti);
·
gli aggiornamenti del software sono in genere meno
frequenti;
·
anche i dispositivi di rete (hub, switch, etc.)
sono spesso scarsamente protetti;
·
l’analisi passiva del traffico (Network
Sniffing) è generalmente molto più redditizia in un ambiente di rete privato;
·
sono più frequenti le relazioni di fiducia tra
sistemi, rispetto a quanto accade su rete pubblica Internet;
·
i controlli di sicurezza (nella fattispecie IDS ed
altre tecnologie anti-intrusione) sono molto più rilassati.
La descrizione dettagliata delle varie possibilità di
attacco interno esula dagli scopi di questo lavoro: basti sapere che, come già
largamente affermato, in linea generale tale tipologia di intrusione è
decisamente più semplice da portare a compimento rispetto a quella operata su
rete pubblica.
Spesso, discutendo della sicurezza di rete, il mantra più
abusato in assoluto è probabilmente, firewall.
“E’ necessario implementare un firewall”,
“non è consigliabile presentare la propria azienda in Internet senza la
protezione di un firewall”, “se vogliamo migliorare la qualità e la
resa del nostro lavoro di rete abbiamo bisogno di un firewall”.
Ma, in sostanza, cos’è un firewall? Innanzitutto, è
necessario definire subito la palese e razionalmente ovvia mancanza di un unico
strumento di sicurezza che sia in grado di risolvere ogni problema, sia esso
teorico o pratico. Nessun modello implementativo, nessuna policy può garantire
la massima sicurezza di ogni aspetto lavorativo in rete.
Il miglior firewall non eviterà che un dipendente copi
dati riservati a mano e li spedisca via e-mail da casa propria, con comodo.
Digerito questo, il firewall è forse l’elemento cardine, quanto meno in
termini descrittivi, della sicurezza di rete. E’ semplice definire cosa
non sia un firewall.
Un firewall non è solamente un software, non è
semplicemente una black-box hardware, non è, in termini implementativi, nemmeno
un insieme di hardware e software.
Un firewall è un modello, una architettura, una
astrazione. L’implementazione della quale richiede una amalgama di
codice, hardware, policy e decisioni amministrative irrinunciabili. In termini
più semplicistici, un firewall è un componente o un insieme di componenti, che
controlla e restringe le comunicazioni tra una rete interna ed Internet o tra
differenti reti interne (nei diagrammi classici di esempio; in realtà per
estensione funziona come controllo sulla comunicazione tra due peer o entità).
Esistono, nel mondo commerciale e nel mondo OpenSource, molteplici soluzioni
che hanno portato a pensare che un firewall sia un software personale piuttosto
che un singolo componente hardware costoso e complesso.
Spesso, la maggior parte di queste soluzioni introducono
definizioni aggiuntive che fanno parte del modello del firewalling: sistema
bastione, filtro di pacchetti, NAT, proxy, rete perimetrale, VPN.
Ogni definizione presenta concetti e soluzioni a problemi
e richieste inerenti la sicurezza di rete; queste tecnologie non sono
esclusive, ma piuttosto sono combinate in un sistema ridondante e versatile (e,
spesso, inutilmente complesso).
Con questa definizione si intende un sistema che deve
essere altamente rafforzato per risultare il maggiormente sicuro possibile in
quanto è il bersaglio più in vista, sia per attacchi portati dall’esterno
della propria rete, sia dall’interno.
Questo accade in quanto ospita servizi raggiungibili da
Internet e, spesso, è il primo punto di contatto per gli utenti delle reti
interne.
Filtro
di pacchetti (Packet Filter)
II packet filter è un dispositivo in grado di controllare
selettivamente la comunicazione tra due peer o tra Internet e la rete interna e
viceversa, analizzando le caratteristiche dei pacchetti di dati in transito,
prima di operare un instradamento degli stessi. Questa selettività è permessa
da un insieme di regole che definiscono il comportamento in base a parametri
specifici dei datagrammi quali, ad esempio, gli indirizzi IP e le porte.
NAT
(Network Address Translation)
NAT è l’acronimo di Network Address Translation (Traduzione
di Indirizzi di Rete) indica una procedura che permette di modificare gli
indirizzi contenuti nei datagrammi di rete, permettendo così di associare
sistemi interni sprovvisti di indirizzi IP pubblici ad un unico indirizzo
pubblico o ad un set limitato di indirizzi ed, al contempo, di nascondere
i reali indirizzi IP da un lato della
rete che sfrutti tale procedura. Non è propriamente una metodica di sicurezza,
ma aumenta le difficoltà per un attaccante, limitando i bersagli possibili e
offuscando la topologia reale di rete. Un uso possibile di questa tecnologia è
la configurazione di un proxy trasparente.
Questo è un dispositivo in grado di dialogare con server
esterni per conto di client interni della propria rete. I client comunicano con
il proxy che trasmette richieste valide ai server per proprio conto, per poi
replicare le risposte verso i client.
Rete
perimetrale (De-Militarized Zone)
Spesso definita anche DMZ, acronimo di De-Militarized
Zone, Zona Smilitarizzata, è una rete inserita tra un ulteriore segmento
protetto, interno, ed un’altra rete esterna, come livello ridondante di
sicurezza, aumentando il processo di enumerazione e attacco degli attaccanti,
al contempo riducendo i rischi per la rete interna in caso di compromissione
dei punti di accesso a Internet.
Acronimo di Virtual Private Network, Rete Privata
Virtuale, identifica una rete in cui i datagrammi di competenza di sistemi
interni, passano attraverso reti esterne, pubbliche, senza che questo sia ovvio
o visibile ai sistemi interni.
Le comunicazioni in transito attraverso reti esterne sono
crittate, per evitare analisi passive e manipolazioni. Le VPN offrono una
interessante opportunità, in termini economici, per collegare differenti reti -
geograficamente disperse - attraverso Internet, garantendo autorizzazione,
accesso e accounting, senza utilizzare costosi collegamenti dedicati.
Vediamo, ora, nel dettaglio le tecnologie più comuni
presenti nel kernel Linux che permettono di configurare e gestire due
componenti essenziali di un firewall: il filtro di pacchetti e la tecnologia
NAT.
Bastion
host
Vantaggi:
• un singolo filtro può garantire la sicurezza di
una intera rete interna;
• il filtro è un sistema molto efficiente, se
confrontato, in termini computazionali e di latenza di rete, con il proxy;
• è una tecnologia ampiamente disponibile per ogni
piattaforma e architettura.
Svantaggi:
• il sistema di regole di filtro è spesso difficile
da ideare e testare;
• spesso il filtro penalizza le performance di un
router in maniera evidente;
• i parametri associati ai processi decisionali non
sono granulari: un indirizzo IP sorgente non può essere univocamente associato
ad un utente specifico.
PROXY
Vantaggi:
• buona capacità di log, specifica per ogni
applicazione;
• possibilità di caching dei dati;
• migliori capacità di controllo sul tipo di dato
trasmesso, rispetto ad un normale filtro di pacchetti (HTTP Content-Type,
virii...);
• migliori possibilità di accounting e
autenticazione granulare a livello utente rispetto al normale filtro di
pacchetti;
• protezione per client con implementazioni TCP/IP
errate o non stabili.
Svantaggi:
• non sono sempre disponibili proxy per una
applicazione specifica: è possibile usare proxy a livello di circuito, come
SOCKS, perdendo alcuni dei vantaggi più importanti di un sistema proxy;
• i servizi di proxy potrebbero richiedere l’uso
di più di un server da configurare e amministrare;
• l’uso dei proxy richiede, spesso, la
modifica di client, applicazioni e procedure.
VPN
Vantaggi:
• migliore segretezza per le comunicazioni,
rispetto all’uso della crittografia a livello applicativo: in una VPN il
traffico è interamente crittato, rendendo impossibile, a livello teorico,
risalire a quali sistemi interni stiano dialogando e a cosa stiano
trasmettendo;
• l’uso delle VPN permette di fornire strati
di sicurezza a protocolli non facilmente utilizzabili mediante filtri di
pacchetti o proxy: l’esempio più comune è quello dei protocolli Microsoft
basati su SMB, che, mediante le stesse porte e connessioni, identifica svariati
tipi di servizi con
differenti necessità in termini di sicurezza.
Svantaggi:
•
• le VPN estendono quindi la rete da controllare e
proteggere: potrebbe essere necessario escludere
NAT
Vantaggi:
• aumenta il controllo su connessioni dalla rete
interna verso l’esterno, in quanto i sistemi interni non dispongono di
indirizzi validi al di fuori del loro segmento interno;
• permette di ridurre il traffico verso sistemi
intemi, se non è presente una
associazione statica degli indirizzi IP, riducendo la finestra a disposizione
dell’attaccante in termini di tempo e di traffico;
• offusca la configurazione della rete interna.
Svantaggi:
• la traduzione richiede informazioni sullo stato
delle connessioni che non sono sempre disponibili (datagrammi UDP, ad esempio);
• le funzioni di NAT operano sulle intestazioni dei
pacchetti, ma alcuni protocolli inseriscono tali indirizzi anche nei payload,
rendendo difficile e “personalizzato” il lavoro di NAT (ad es. FTP
e DCC);
• non funziona con protocolli che combinino
indirizzi contenuti nei payload e sistemi di protezione dell’integrità
dei dati, in quanto il payload deve essere modificato per garantire il NAT;
• la correlazione dei log richiede una notevole
sincronizzazione temporale e amministrativa (gli indirizzi nei log cambiano a
monte e a valle del dispositivo di NAT).
Possedere la corretta dotazione di software e hardware
non è sufficiente. Fondamentale, durante la corretta messa a punto di un
firewall, è senza ombra di dubbio la scelta di una architettura che ben si
amalgami con la rete esistente.
Esistono sostanzialmente almeno tre diverse architetture
possibili per l’allestimento di un firewall: a router di controllo, a
sistema controllato, a sottorete controllata.
L’architettura a router di controllo prevede un
singolo punto di accesso e controllo che separa la rete interna dal resto di
Internet. Spesso, questa macchina è un router dotato di funzioni di filtro di
pacchetti ma, in alcuni casi, è possibile siano presenti funzionalità di proxy
a livello applicativo.
Questa architettura è poco flessibile per chiunque
preveda di fornire servizi pubblici con accesso diretto da Internet, in quanto
i server sono in diretto contatto con il segmento interno.
E’, d’altra parte, la scelta più comune per
singole utenze e piccole società che forniscono i loro servizi attraverso
macchine in housing fuori sede.
L’architettura a sistema controllato prevede la
presenza di un singolo sistema, opportunamente predisposto, a fare da bastion
host; questo è collegato alla rete interna, non esiste una reale rete
perimetrale ed il router di ingresso opera un filtro di pacchetti affinché l’unico
sistema raggiungibile direttamente da Internet sia il sistema bastione.
Si provvede, poi, alla comunicazione con gli altri host
della rete interna. Il precedente scenario di esempio non rappresenta questa
architettura.
L’approccio a sottorete controllata, invece, introduce
il concetto di rete perimetrale con due router, uno esterno ed uno interno, con
la presenza di uno o più sistemi bastione raggiungibili da Internet per poter
offrire servizi pubblici.
Nello scenario di esempio, abbiamo una rete perimetrale,
due sistemi bastione e un terzo sistema ibrido tra un bastion host ed un
router.
Manca un elemento fondamentale: un router interno vero
e proprio. Questo è sostituito dal
sistema ibrido con IP 1.1.1.4 associato all’interfaccia esterna che
traduce, mediante NAT, gli indirizzi dei sistemi del segmento da proteggere.
Questo può essere un azzardo che avvicina il nostro
scenario, concettualmente parlando, all’architettura a host controllato.
Infatti, la rete interna non prevede divisioni tra sistemi di amministrazione,
sviluppo, gestione e macchine dei dipendenti; esiste un notevole traffico tra
il segmento interno e la rete perimetrale, in quanto i server DNS e di posta
sono situati nei sistemi bastione direttamente raggiungibili da Internet.
Se la rete perimetrale fosse separata da un ulteriore
router interno, la compromissione della macchina con IP 1.1.1.4 non porterebbe
un attaccante all’analisi del traffico del segmento interno, ne tanto
meno alla sua sovversione.
Come già notato in precedenza, quello è il bersaglio più
interessante, offrendo servizi remoti ed essendo collegato alla rete interna.
Vediamo, dunque, una differente architettura di firewalling applicata allo
scenario in esame: l’obiettivo e quello di ottenere una migliore
efficienza in termini prestazionali cercando, al tempo stesso, di separare
maggiormente il traffico interno e privilegiato, da quello esterno e pubblico.
Una limitazione autoimposta è la mancanza di differenti
router esterni provenienti da differenti fornitori per dividere totalmente il
traffico amministrativo, quello interno degli impiegati e quello pubblico e dei
clienti.
Utilizzeremo, pertanto, un solo router di ingresso, senza
affrontare questioni come ridondanza default-tolerance; per motivi di
semplicità imporremo alcune restrizioni alle possibilità di collegamento
interno, cercando di separare, per quanto possibile, le macchine di
amministrazione da quelle di ricerca e sviluppo e da quelle dei dipendenti
senza modificare le configurazioni dei singoli host e senza incidere eccessivamente
in termini di costi di allestimento e gestione. In questa presentazione non
terremo conto di altre scelte altrettanto importanti. L’uso di entrambi i
server DNS nella rete perimetrale non ha molto senso, dal momento che è
facilmente configurabile un unico server su di un sistema bastione,
autoritativo per il dominio ma, in realtà, in possesso delle sole informazioni
sui sistemi perimetrali, mentre le informazioni relative ai sistemi interni
possono essere comodamente gestite su di un server interno, maggiormente
protetto, in grado di operare forwarding delle query verso il DNS perimetrale.
In questo modo è possibile nascondere utili informazioni
agli attaccanti, mantenendo il controllo e la protezione del server più
importante all’intemo del segmento di rete protetto.
Analogo discorso per i server di posta. Per il protocollo
SMTP è utile configurare il sistema perimetrale come MTA in uscita per i client
interni ed, utilizzando record MX appositi per la posta, in ingresso verso il
sistema perimetrale, che processerà, nel caso, la posta verso un server
interno, rifiutando, invece, ogni forma di relay.
Figura 2:
la rete della profumeria RoseNoir. Sono stati posati dei firewall basati su
iptables a protezione delle reti relative ai vari uffici (amministrazione,
ricerca e sviluppo) e dell’Access Point. Inoltre, come si può vedere, è
stato inserito un secondo router tra la rete pubblica e quella privata.
Per il protocollo POP-3 (o suoi eventuali analoghi)
potrebbe essere il caso impedire il trasferimento da server esterni in Intemet;
potrebbe essere utile un sistema di proxy interno per permettere un più
granulare controllo in fase di log; sarebbe indispensabile non utilizzare
autenticazioni in chiaro. Un discorso a parte meritano il server RAS e l’Access
Point (AP) per reti wireless 802.11.
Differente è il posizionamento del server RAS a seconda
delle esigenze di utilizzo: per agenti in viaggio che abbiano bisogno di
aggiornare database interni dalle sedi dei clienti, piuttosto che per
dipendenti catalogabili come telelavoratori o lavoratori spesso fuori sede.
L’AP va considerato come surrogato wireless del
segmento delle macchine dei dipendenti o come sistema di collegamento con
operazioni di stoccaggio e magazzino? Il segnale dell’area ESSID è
monitorabile dall’esterno della sede? Da personale non autorizzato in
visita? In ogni caso potrebbe essere necessario schermare il sistema di
bridging o di NAT dal resto del segmento interno mediante layer superiori di
autenticazione ed autorizzazione.
Questi esempi sono utili per capire come tutte queste
considerazioni richiedano trattazioni separate rispetto a questa analisi; l’importante
è capire come questi particolari siano parte integrante del disegno e gestione
di un fìrewall e non, come spesso capita, operazioni seguenti all’installazione
di un filtro di pacchetti.
La nuova architettura di rete prevede alcune differenze
dallo scenario originale:
• separazione del traffico pubblico e privato
mediante due reti perimetrali senza forwarding di traffico;
• un unico punto di NAT tra le due reti perimetrali
per le macchine dei dipendenti;
• separazione mediante filtri di pacchetti tra il
segmento interno e la seconda rete perimetrale;
• ACL per controllare il traffico dei dipendenti
verso la rete perimetrale;
• separazione mediante firewall interni con router
di controllo tra i segmenti di management, ricerca e sviluppo e dei dipendenti.
E’ possibile utilizzare hardware generico con
sistema operativo Linux per i firewall interni e per il generico NAT dei
dipendenti in rete perimetrale.
Un’altra scelta in termini di costi, e gestione va
fatta per il router intemo tra la seconda rete perimetrale ed il segmento
interno: una buona scelta consiste in uno o più router Cisco, con i quali
scegliere tra segmenti interni tisicamente separati (mediante interfacce
multiple su singolo router o router interni differenti su segmenti separati) o
un singolo segmento interno suddiviso in sezioni separate mediante filtri di
pacchetti (schema di figura 2).
Non tratteremo gli usuali accorgimenti (sostituzione di
ftp con scp, layer crittografico per lo scaricamento della posta, uso di token,
OneTimePassword o altri strumenti di autenticazione); ovviamente sono tutti
validi ed importanti, ma esulano dall’analisi corrente. Vediamo ora come
sfruttare le robuste capacità del kernel Linux per operare all’interno di
questa nuova architettura di rete.
Packet
Filtering
Questo sistema permette l’instradamento di
pacchetti tra sistemi intemi ed esterni, dopo un esame selettivo dell’intestazione
dei datagrammi; versioni evolute del filtro di pacchetti permettono di
mantenere una conoscenza delle informazioni sullo stato della connessione:
questo sistema, noto come stateful
inspection o state tracking
permette di rendere dinamico il processo decisionale del filtro.
Ad esempio, è possibile accettare datagrammi UDP solo se
contengono risposte a precedenti datagrammi UDP usciti dalla rete interna
oppure segmenti TCP che facciano parte solo di connessioni in stato
ESTABLISHED. Un altro uso avanzato del filtro di pacchetti è il cosiddetto protocol checking che permette di
operare dedsioni su datagrammi in base al contenuto dei payload, ad esempio,
permettere datagrammi di risposta dal server SMTP solo se contengono messaggi
validi e legali secondo lo standard SMTP.
Il kernel Linux, nella sua versione 2.4.x, contiene il
supporto per una avanzata tecnologia di filtro, analisi e modifica dei
pacchetti: Netfilter.
Questo sottosistema di rete permette di operare sia un
filtro di tipo stateful, sia il NAT in ingresso e uscita con supporto per il
protocol checking.
Il router esterno sarà, con molta probabilità, un
dispositivo Cisco, mentre quello interno potrebbe essere una macchina generica
con sistema Linux.
La scelta in ogni caso sarà dettata più che altro da
questioni di costi e gestione. Quali saranno le regole dei dispositivi di
filtering?
Molto probabilmente, data la tipologia della rete, le
esigenze saranno differenti a seconda dei segmenti da filtrare e controllare:
il traffico dovrebbe essere, dopo aver configurato il routing, differente per
ogni segmento, così come saranno differenti i servizi offerti e richiesti.
Probabilmente, le ACL del filtro a protezione della rete di amministrazione
saranno più restrittive e, al tempo stesso, più semplici rispetto a quelle del
router estemo.
Fatto spesso dimenticato, un sistema di proxy generico o
un filtro di pacchetti non sono in grado, nella maggior parte
dei casi, di proteggere da problemi a livello
applicativo: se una regola prevede il passaggio di traffico verso il web
server, non sarà in grado di proteggere da richieste HTTP malformate o
particolari, in grado di utilizzare un errore implementativo di Apache o di uno
script CGI non testato a sufficienza. Il semplice posizionamento e la seguente
gestione di un firewall non possono ne dovrebbero mai sostituire una corretta
impalcatura applicativa.
Se il demone sshd non è stato aggiornato dopo l’uscita
di un exploit pubblico, un firewall, per quanto ben strutturato, non potrà
proteggere la nostra rete, se permette traffico da e per il server sshd.
Vediamo le possibili regole per il router esterno,
considerando la possibilità di permettere traffico DNS, SMTP, SSH verso i due
server pubblici, HTTP e HTTPS.
Disabiliteremo, rispetto al diagramma originale, il traffico
FTP, utilizzando ssh per il trasferimento di file dall’esterno della
rete.
Una migliore soluzione potrebbe essere quella di
amministrare i bastion host dalla sola LAN amministrativa, impedendo ogni forma
di traffico dall’esterno della rete.
Per semplicità, non sarà duplicata la regola in senso
opposto: per esempio, il traffico HTTP richiede che in ingresso siano permessi
datagrammi da porte effimere verso la porta 80 e in uscita dalla porta 80 del
server verso qualunque client con porta effimera.
Le regole sono esposte mediante dicitura logica poiché la
sintassi specifica varia a seconda del modello di router scelto.
Router
Esterno
• BLOCCARE datagrammi in ingresso con indirizzi IP
delle reti perimetrali e interne: data la normale configurazione della rete non
c’è motivo per cui pacchetti con indirizzi interni arrivino all’interfaccia
esterna del router;
• BLOCCARE datagrammi in uscita con indirizzi IP
esterni per impedire l’invio di pacchetti con indirizzi spoofati dalla
nostra rete;
• PERMETTERE datagrammi in ingresso per la porta
80/TCP e 443/TCP verso il solo web server;
• PERMETTERE datagrammi in ingresso per la porta
25/TCP verso il solo mail server;
• PERMETTERE datagrammi in uscita per la porta
25/TCP dal solo mai] server;
• PERMETTERE datagrammi UDP e TCP per la porta 53
al solo DNS
server perimetrale;
• PERMETTERE datagrammi in ingresso per la porta
22/TCP ai soli server pubblici perimetrali;
• BLOCCARE ogni altro tipo di traffico.
Questa configurazione dovrebbe permettere solamente il
traffico in ingresso e uscita per i soli server pubblici. Il ruolo del router
esterno è quello di proteggere le reti perimetrali ed interna, filtrando tutto
il traffico non voluto.
Vedremo successivamente come implementare il traffico dei
dipendenti verso Intemet, qualora fosse permesso.
Il router interno, invece, deve essere in grado di
filtrare il traffico verso i segmenti interni: al di fuori del traffico SMTP e
DNS, non deve esserci alcun traffico in ingresso dal perimetro verso l’interno,
ad eccezione del traffico di risposta per i client interni.
Router
Interno
• BLOCCARE datagrammi in ingresso con indirizzi IP
della rete interna;
• BLOCCARE datagrammi in uscita con indirizzi IP
estemi;
• PERMETTERE datagrammi in uscita per la 80/TCP e
443/TCP verso il web server perimetrale;
• PERMETTERE datagrammi in uscita per la 25/TCP
verso il mail server aziendale;
• PERMETTERE traffico UDP e TCP per la porta 53 dal
DNS interno a quello perimetrale;
• PERMETTERE traffico in uscita per la 22/TCP verso
i server perimetrali al solo IP 10.10.20.2 affinchè solo i client
amministrativi possano raggiungere i demoni ssh;
• PERMETTERE traffico in uscita per la 110/TCP
verso il solo server di posta alla sola classe 10.10.20.0/24;
• BLOCCARE ogni altro tipo di traffico.
Anche in questo caso, la configurazione minimale deve
costringere il traffico alle sole comunicazioni permesse e preventivate. Come
prima, tratteremo dopo il traffico dei dipendenti in uscita verso Internet.
Internamente, lungo il backbone 10.10.20.0/24 abbiamo almeno tre macchine Linux
configurate come filtri e gateway di tre ulteriori segmenti interni:
•
• ethO è l’interfaccia estema, mentre ethl
quella interna.
Gateway
Amministrativo
Punto di accesso alla rete amministrativa, deve poter
controllare ogni forma di accesso. Nessun flusso di dati deve essere permesso
dall’esterno del segmento amministrativo, se non le legali risposte alle
richieste interne. Ma deve permettere accesso verso l’esterno senza
limitazioni verso ogni altro segmento della rete aziendale. Questo è l’unico
nodo di accesso per il traffico normale, escludendo, quindi, eventuale traffico
di management dei sensori o dei router.
Wireless
Gateway
II discorso del gateway wireless è differente: quale sarà
il ruolo dell’AP? Quale tipo di servizio si intende offrire ai dipendenti
o agli agenti in sede? Immaginiamo che sia solo un ambiente di test, come
prospettato nello scenario originale: è necessario cautelarsi dalla possibilità
che un uso non autorizzato dell’AP possa provocare danni ad altre
macchine sensibili.
R&D
Gateway
II segmento di ricerca e sviluppo deve essere accessibile
solo ad alcuni client e agli amministratori. Come permettere il traffico dei
dipendenti, nel caso questo fosse contemplato? I dipendenti potrebbero volere
accesso dai loro client Windows posti nel segmento interno, nella classe
10.10.20.0/24; la stessa esigenza potrebbero averla anche gli amministratori
del segmento di management, anche se permettere traffico in uscita verso
Internet da questo segmento è opinabile.
Non è, ovviamente, possibile instradare datagrammi con
indirizzi privati oltre il router esterno: questa eventualità non porterebbe,
comunque, ad alcuna risposta da parte di server esterni. Dal momento che l’azienda
non ha acquistato indirizzi IP pubblici per ogni macchina della rete è
necessario avvalersi del gateway 1.1.1.4.
Questo può operare mediante NAT, oppure contenere una
serie di proxy per ogni servizio necessario.
In questa configurazione, l’azienda ha deciso di
permettere ogni tipo di traffico TCP ai dipendenti ed ha optato per l’uso
del NAT. Dovremo, quindi, aggiungere alcune regole ai router interno ed
esterno.
Router
Interno
• PERMETTERE traffico TCP dai client Windows a JP
esterni;
• PERMETTERE traffico TCP da 10.10.20.2 a IP
esterni;
• BLOCCARE traffico da 10.10.20.4 a 1.1.1.4 e IP
esterni per impedire l’uso degli insicuri client wireless, senza una
ulteriore forma di autorizzazione.
Router
Esterno
• PERMETTERE traffico in uscita dall’IP
1.1.1.4.
Come implementare, però, il traffico in usata dalle LAN
di management Wireless, dei dipendenti e da 1.1.1.4 verso Internet senza avere
a disposizione IP instradabili?
Questo è un compito che il kernel Linux può svolgere
mediante NAT.
Network
Address Translation
Questa procedura permette di modificare gli indirizzi IP
contenuti nei datagrammi in modo da mascherare, modificare, dirottare le
connessioni di rete.
Gli usi per questo tipo di tecnologia sono molteplici: ad
esempio, permettere la connessione ad Internet a molteplici client in presenza
di un singolo indirizzo IP pubblico; oppure utilizzare più server che
rispondano ad un unico indirizzo IP, sia per limitazione logistica o per
processi di load-sharing; o ancora, implementare proxy trasparenti.
Nella tecnologia NAT di netfilter esistono due tipi di
NAT: Source NAT e Destination NAT. Nel primo caso, il sottosistema altera l’indirizzo
IP sorgente, modificando l’origine del datagramma.
Questo avviene dopo le procedure decisionali di
instradamento. Un caso particolare di Source NAT è rappresentato dal
Masquerading del kernel Linux.
Nel secondo caso, invece, il sottosistema altera l’indirizzo
di destinazione, modificando così il punto di arrivo del datagramma, prima di
ogni processo di instradamento; esempi sono il port forwarding, load-sharing e
transparent proxy.
Come già ricordato, il supporto NAT di Netfilter si
avvale anche del protocol-checking. Alcuni protocolli, infatti, inseriscono indirizzi IP relativi al flusso
dei dati all’intemo del payload dei pacchetti.
Come è intuibile, il modo di inserimento varia da
protocollo a protocollo e affinchè il NAT sia efficace, è necessario che Netfilter
conosca il funzionamento e la sintassi di questi scambi di dati, per poter
modificare al volo il payload e, quindi, gli indirizzi utilizzati.
Insieme al mantenimento dello stato della connessione
sarà possibile per client interni usufruire di protocolli complessi dal punto
di vista della tecnologia NAT. Il kernel Linux contiene, come esempio nella
distribuzione di Netfilter, il supporto per il protocollo FTP e per il pieno
utilizzo del protocollo IRC DCC.
Le esigenze dei gw amministrativo e wireless sono
analoghe: convertire indirizzi del segmento più interno in indirizzi del
backbone. Questo è facilmente risolvibile mediante Source NAT. Non vi è
particolare interesse, vista la semplice architettura, nel Destination NAT.
Gateway Amministrativo
-N logdrop
-A logdrop
-s 10.10.20.1/24 -j LOG --log-level 4 --log-prefix “INVALID INNER INBOUND
PKT”
-A logdrop
-s 10.10.10.1/24 -j LOG --log-level 4 --log-prefix “INVALID PERIMETER
INBOUND PKT”
-A logdrop
-j LOG --log-level 4 --log-prefix “INVALID INBOUND PKT “
-A logdrop
-j DROP
-A INPUT -p
tcp —dport 113 -j REJECT —reject-with tcp-reset
-A INPUT -i
ethO -(n state —state NEW, INVALID -j logdrop
-A INPUT -i
ethO -m state —state RELATED, ESTABLISHED -j ACCEPT
Gateway Wireless
-P INPUT
DROP
-A INPUT -i
ethl -d $IP CLIENT WINDOWS -j ACCEPT
-A INPUT -i
ethl -d 1.1.1.3 -p tcp —dport 25 -j ACCEPT
-A INPUT -i
ethl -d 1.1.1.2 -p tcp -m multiport —dports 80,443 -j ACCEPT
-A INPUT -i
ethO -m state —state RELATED, _ESTABLISHED -j ACCEPT
-A OUTPUT
-o ethO -d 10.10.20.2 -j DROP
-A OUTPUT
-o ethO -d 10.10.20.3 -j DBOP
-A OUTPUT
-o ethO -d 10.10.20.5 -j DBOP
Gateway R/D
-P INPUT DROP
-P OUTPUT
DROP
-A INPUT
–i ethO –s 10.10.20.2 –j ACCEPT
-A INPUT
–I eth0 –s $IP_CLIENT_AUTORIZZATO –p tcp –j ACCEPT
-A OUTPUT
-o ethO -m state —state RELATED, ESTABLISHED -j ACCEPT
-A OUTPUT
-o ethO -m state --state NEW, INVALID -j LOG --log-level 4 --log-prefix
“INVALID OUTBOUND PKT”
Le regole
di alcuni gateway (iptables)
Management Gateway
-t nat -A POSTROUTING -o ethO -j SNAT —to 10.10.20.2
Wireless Gateway
-t nat -A POSTROUTING -o ethO -j SNAT —to 10.10.20.4
R&D
Gateway
-t nat -A PREROUTING -i ethO -d 10.10.20.202 -p tcp -j DNAT --to
192.168.3.2
-t nat -A PREROUTING -i ethO -d 10.10.20.203 -p tcp -j DNAT --to
192.168.3.2
FW/NAT
1.1.1.4
II compito della macchina 1.1.1.4 , in caso si opti per
il NAT invece di un sistema di proxy, è convertire i datagrammi di client e
amministratori affinchè possano essere instradati dal router esterno verso
Internet.
Ovviamente, i client Windows dovranno usare 10.10.10.4
come gateway predefinito e le tabelle di instradamento dei vari dispositivi
dovranno contemplare questo IP come gateway per il traffico proveniente dai
client del segmento interno.
-P INPUT
DROP
-A INPUT -i
ethl -s 10.10.10.2 -j ACCEPT
-A INPUT -i
ethl -S $IP_CLIENT_WINDOWS -p tcp -d ! 10.10.10.4 -j ACCEPT
-t nat -A
POSTROUTING -o ethO -s 10.10.20.2 -j SNAT --to l.JL.1.4
-t nat -A
POSTROUTING -o ethO -s $IP_CLIENT_WINDOWS -p tcp -j SNAT --to_ 1.1.1.4
I moderni IDS sono strumenti che rilevano impronte
digitali di attacchi ed eventi inusuali, noti come signature; questi sono
schemi specifici che indicano solitamente attività malevole o sospette.
Esistono essenzialmente tré forme differenti di IDS:
Network, Host e Stack IDS. Il primo controlla passivamente il traffico in un
segmento di rete, utilizzando pacchetti di dati come fonte di informazioni. Il
secondo tipo, invece, può analizzare o i log di sistema quasi in tempo reale,
oppure analizzare il traffico di rete ricevuto dal sistema su cui è installato.
Il terzo modello di IDS, invece, si basa sul controllo a
basso livello del traffico di rete, a livello dello stack TCP/IP, decidendo
quali azioni permettere o portare avanti prima che il sistema operativo o le
applicazioni abbiano accesso ai dati contenuti nei datagrammi controllati:
questo tipo di IDS rappresenta, in effetti, una via di mezzo con i filtri di
pacchetto che mantengono informazioni di stato.
La soluzione OpenSource più famosa, sia per ubiquità di
utilizzo che per effettiva capacità e resa di utilizzo, è rappresentata dal
software Snort, liberamente prelevabile all’URL http://www.snort.org/.
Questo IDS è di tipo Network ed è, nelle parole degli
autori, in grado di controllare il traffico di rete e loggare pacchetti dati in
tempo reale in un ambiente basato su protocollo IR Può operare analisi del
protocollo e indagini di pattern matching per individuare attacchi ed eventi di
rete di varia natura. Snort utilizza un flessibile linguaggio di regole per
descrivere il traffico.
A livello concettuale, la maggior parte dei Network IDS
presenta elementi funzionali comuni:
• l’interfaccia di rete del sistema è posta
in modalità promiscua, per catturare tutto il traffico lungo il segmento
analizzato;
• possono essere utilizzati filtri specifici per
modificare la tipologia e la quantità di traffico da sottoporre all’attenzione
del motore di ricerca degli attacchi; questo ultimo è essenzialmente di tre
tipi: a ricerca di modelli, frequenza o anomalie.
Il sistema, o dispositivo, sul quale viene fatto girare
un IDS viene comunemente definito sensore. Questo è anche il termine che
useremo in questa trattazione.
Snort può essere utilizzato come semplice sniffer, come
legger di pacchetti di rete, oppure come vero e proprio IDS.
La maggiore complessità e, contemporaneamente, il
maggiore punto debole di un IDS risiedono nel database di segnature
disponibili. Se questo non è aggiornato, ogni attacco teorizzato posteriormente
all’ultimo aggiornamento non sarà rilevato dal motore di ricerca.
Da questo punto di vista Snort è certamente un ottimo
prodotto, allineato ai migliori prodotti commerciali e, in alcuni casi, ha
mostrato migliori performance e minore incidenza di falsi negativi in risposta
a specifiche tecniche di evasione dagli IDS. La rete utilizzata come scenario
presenta un interessante caratteristica dal punto di vista degli IDS: la loro
assenza. Dunque, il primo passo è valutare la necessità di sensori IDS all’interno
della rete e, in caso affermativo, decidere la loro posizione.
Perché dotarsi di sensori IDS all’interno della
propria rete? Spesso molti amministratori sono soliti aprire svariate sessioni
di terminale contenenti molteplici istanze di strumenti di analisi del traffico
di rete: tcpdump, arpwatch, sniff ed
altri meno noti, ma altrettanto utili cugini, imperversano sugli schermi con il
loro costante output.
E’ vero che un lato distintivo di ogni
amministratore si aforse la lettura in tempo reale dell’output di
tcpdump, ma è altrettanto sicuro che di pari passo con il crescere di un
segmento di rete, cresca anche la necessità di strumenti automatizzati ed
indipendenti, per poi valutare correlazioni ed analisi di logi. E’
oltretutto scarsa la percentuale di reti amministrate 24 ore al giorno. Come
poter valutare, quindi, la presenza di attacchi o attività anomale nella rete?
Da questo punto di vista, nonostante la possibilità mai
azzerabile di falsi negativi e positivi, i sistemi di Intrusion Detection sono
insostituibili.
E la distribuzione ufficiale di Snort contiene tutto il necessario
per un pronto utilizzo, compresi tool di supporto per la collezione e analisi
dei log.
Torniamo allo scenario dell’azienda produttrice di
profumi. Qual è la necessità imperante? Sicuramente essere a conoscenza di
traffico non autorizzato proveniente dall’esterno nelle reti perimetrali
e, ancora più importante, nella rete interna.
Una seconda necessità potrebbe essere quella di
accorgersi di eventuali tentativi di attacco contro i nostri server pubblici,
oppure direttamente contro i nostri nodi di difesa. Il lusso della ridondanza e
della granularità suggerirebbero di controllare anche il traffico non
autorizzato tra le reti amministrativa, di ricerca e dei dipendenti. E’
ovvio, come questi requisiti non possano essere soddisfatti da un unico sensore.
Un sensore potrebbe essere posto nel tragitto tra il
router esterno e la prima rete perimetrale per valutare il traffico diretto ai
server pubblici; un secondo sensore lungo la rete perimetrale interna per
osservare e analizzare il traffico diretto al router interno, sia dai server
sui sistemi bastione verso il segmento interno sia traffico illegale per errate
configurazioni di instradamento o ACL; un ulteriore sensore dovrebbe essere
posto nel segmento interno, per valutare eventuali attacchi contro le macchine
dei dipendenti o i filtri che proteggono la rete di amministrazione, quella di
ricerca e sviluppo e, non ultimo, l’Access Point 802.11.
Ulteriori sensori potrebbero essere posti nella rete di
amministrazione: non dovrebbe, infatti, essere presente alcun tipo di traffico
che non sia correlabile alle attività dei legittimi amministratori.
L’uso di questi sensori, sia ben chiaro, non
sostituisce, in alcun modo, adeguate procedure di logging di ogni applicazione
o dispositivo di rete presente nei vari segmenti.
Sarà oltre modo importante, poi, sincronizzare gli
orologi di ogni dispositivo e sistema, per poter operare una adeguata
correlazione temporale di ogni log della rete: dove gli indirizzi sono
modificati, come accade per esempio in caso di NAT, la correlazione cronologica
è aiuto insostituibile all’intuito e capacità del sistemista.
Non è nostra intenzione scendere nel dettaglio delle
metodiche di interfacciamento dei sensori al resto della rete, ma alcune
considerazioni sono necessarie: una macchina o dispositivo che faccia da IDS
deve poter soddisfare almeno due requisiti. Primo, deve poter essere in grado
di visualizzare tutto il traffico del segmento esaminato. Secondo, dovrebbe
essere irraggiungibile, per quanto possibile, ad eventuali tentativi dell’attaccante
di manipolarlo.
Esistono fin troppe tecniche di manipolazione del
traffico applicativo per sfuggire ai sensori per poter ritenere che un IDS non
sarebbe un bersaglio.
Come poter quindi monitorare segmenti switchati (non sarà
presa in esame la possibilità che siano utilizzati semplici hub di rete in
quanto, sebbene pratica possibile ed utilizzata, presenta fin troppi problemi
di sicurezza ed efficienza per valutarli tutti in questa sede)? Il sensore sarà
collegato o alle Spanning Port degli switch, oppure a dispositivi noti come
Ethernet TAF. La porta SPAN, acronimo di Switch Port ANalyzer, è una porta in
grado di replicare il traffico TX, RX, o TX/RX di un’altra porta dello
switch.
Ad esempio, il primo sensore, tra router estemo e prima
rete perimetrale, potrebbe essere posto su di una porta SPAN su cui duplicare
quella cui è collegato il router.
Per ovviare alla raggiungibilità dell’IDS da parte
di un attaccante, potrebbe essere possibile dotare il sensore di due interfacce
di rete: quella di monitoraggio non sarà dotata di alcun protocollo di rete in
binding; la seconda sarà utilizzata dagli amministratori direttamente dal
segmento di management.
Altra possibilità è quella di amministrare e configurare
il sensore da console.
In alcuni casi, però, l’uso della porta di Spanning
presenta uno svantaggio non indifferente: è in grado di monitorare una singola
porta dello switch e non tutto il traffico in transito per lo switch.
Non potrebbe essere usata efficacemente per l’analisi
delle reti perimetrali o di qualunque altro segmento in toto.
Certo è possibile, se lo switch lo permette, duplicare
più porte o tutto il segmento sulla porta di Spanning. Ma questo potrebbe
saturare facilmente, in reti ad elevato carico, la possibilità di traffico
della porta stessa.
Oltretutto, la necessità di inserire più sensori per un
singolo segmento sarebbe problematico in termini di disegno dell’infrastruttura
di rete.
Per ovviare a questi problemi è possibile usare i TAF,
dispositivi costosi ma di sicura efficacia per alcune caratteristiche: possono,
a seconda dei modelli, monitorare agevolmente più porte senza impatti sull’efficienza;
non alterano in alcun modo la configurazione della rete nel caso di
sostituzione di dispositivi o sensori; non permettono agli attaccanti di
raggiungere direttamente i sensori.
Questi dispositivi possono essere collegati a switch
esterni rispetto ai segmenti da monitorare. A questi switch saranno collegati i
sensori IDS.
La figura 3 mostra la disposizione dei sensori senza la
descrizione delle interfacce degli stessi, per motivi di semplicità. Ora
sappiamo che desideriamo sensori IDS e abbiamo una approssimativa idea di dove
posizionarli.
Un concetto spesso usato parlando di reti e sicurezza è
quello della ridondanza. In questo caso è inutile che tutti i sensori prestino
attenzione allo stesso tipo di attività e possibili problemi.
Su hardware generico potrebbe essere complesso gestire l’analisi
del traffico in un segmento a lOOMbit/s saturato.
Invece, potremmo decidere di suddividere il compito tra i
differenti sensori oppure aggiungere più sensori con differenti compiti in
ognuna delle locazioni scelte. Quale che sia la nostra scelta, Snort è
estremamente flessibile: una rapida occhiata al file di configurazione snort.conf
e all’elenco di regole presenti nella distribuzione di default nella
directory rules/ permettono di suddividere i compiti agevolmente.
Ogni set di regole può inoltre essere accomodato a
seconda delle esigenze: se siamo sicuri di non avere server web installati nel
segmento di ricerca e sviluppo è forse inutile la ricerca di messaggi HTTP di
ritorno contenenti la stringa “Bad
communication of filename” (ma, d’altra parte, questi messaggi
potrebbero portare alla scoperta i server installati senza autorizzazione); il
controllo dei messaggi di notifica di backdoor come Netbus o BackOrifice è
sicuramente importante nel segmento di rete dei dipendenti, vista la presenza
di macchine Windows, ma è forse superfluo in quella di amministrazione, dove
sono presenti solo macchine Linux; se non siamo interessati ai semplici
tentativi di attacco, ma solo a quelli mirati, la ricerca di exploit contro IIS
è inutile, se il nostro web server è Apache su piattaforma Linux; d’altra
parte l’analisi dell’invio di shellcode, impronta palese di
tentativi di exploit mediante buffer overflow, ad esempio, o il controllo sugli
agenti di DDoS noti è importante in tutta la rete.
Questa è una decisione all’apparenza semplice, ma
dipende da varie considerazioni: economiche, di efficienza, di eventuale
privacy dei dipendenti, di policy aziendale e, non meno importanti, personali
dell’amministratore della rete. Spesso differenti segmenti fanno capo a
differenti amministrazioni, con differenti metodiche e approcci alla sicurezza.
Alcune semplici linee guida su cosa non tralasciare, sono
le seguenti:
• regole icmp-info, icmp, experimental nei segmenti
di accesso ai router;
• regole
attack-responses, DNS, exploit, MySQL, POP3, smtp, snmp, TFTP, virus nelle reti
perimetrali;
• regole bad-traffic,
DoS, DDoS, mise, info, scan, shellcode in ogni segmento;
• regole backdoor,
exploit, netbios, FTP, virus, xll nel segmento interno;
• regole chat, multimedia, p2p, porn se contemplati
dalla policy per i dipendenti;
• regole web-* per il segmento che contiene web
server.
Figura 3:
lo schema della rete della profumeria RoseNoir dopo la posa dei sensori IDS.
I set di regole di Snort contengono comunque istruzioni
per ogni piattaforma all’interno di ognuna di queste categorie. E’
quindi necessario controllare i set prima di decidere quali regole utilizzare
nei file di configurazione dei sensori.
La distribuzione contiene anche il manuale utente che
illustra la metodica di creazione di regole personali. Un semplice quanto
banale metodo per creare un sottoinsieme di regole specifiche per sistemi Linux
è il seguente:
adinin@sensor:~/snort-l.9.0/rules$
for f in ‘ls|grep -v Makefile’; do grep -i linux $f >>
linux.rules ; done
Come per ogni IDS, è necessario aggiornare periodicamente
il database delle regole prelevando gli aggiornamenti dall’indirizzo http://www.snort.org/ per essere sicuri che i
sensori rilevino attività, tentativi e attacchi teorizzati o
testati dopo l’ultimo aggiornamento.
Il
passo successivo
Tutti questi passi sono incompleti, però, nel momento in
cui ci si dimenticasse di politiche di hardening di ogni host e server: abbiamo
tralasciato diversi punti indispensabili per la messa a punto di una rete
sicura. Ad esempio, esistono molti strumenti di attacco per ambienti di rete
switched che dipendenti potrebbero usare per cercare di aggirare le ACL imposte
dall’amministrazione.
Questo non è compito del firewall in sé, quanto della
corretta configurazione degli ambienti di lavoro condivisi, delle workstation
personali e delle policy aziendali. La mancata menzione di un sistema di
antivirus sui server di posta o sui file server non è una dimenticanza, quanto
una scelta precisa per questa breve analisi. Oltretutto, la stesura corretta di
un firewall dovrebbe essere studiata ad hoc e non generalizzata in esempi;
pensiamo comunque che questo esempio possa fornire una idea di base del
processo di gestione di una rete più complessa delle normali LAN casalinghe.
La corretta collezione e gestione dei vari log è un processo
indispensabile sia per mantenere un occhio vigile e conscio sulle attività
della propria rete, sia per il critico e delicato compito di analisi forense.
L’eventualità che la rete non regga il colpo non va
mai scartata o dimenticata, quanto piuttosto messa in cantiere come possibilità
reale e, per asintoto, prima o poi certezza inevitabile, sia essa per attacchi
provenienti dall’esterno o dall’interno del nostro ambiente di
lavoro. Vediamo dunque come procedere.
Tutti i vari device presenti sulla rete (siano essi
firewall, IDS, router o lo stesso sistema operativo) producono, in risposta a
determinati eventi, una serie di informazioni che prendono genericamente il
nome di log.
La gestione e l’organizzazione di tali informazioni
all’interno della rete rivestirà, come vedremo, una notevole importanza,
sicuramente maggiore di quello che si potrebbe erroneamente pensare.
Tradizionalmente i log sono memorizzati sui vari dischi
fissi nel caso di normali computer, in specifici ambienti di raccolta nel caso
di dispositivi proprietari, utilizzando svariate tecnologie, tra le quali le
più diffuse syslog e trap SNMP.
Questo tipo di organizzazione delle informazioni ha però
un notevole svantaggio, la frammentazione, in quanto i log sono scritti in “contenitori”
diversi a seconda del device che li produce; il processo di consultazione,
quindi, diventa lento e estremamente difficoltoso, dovendo attingere e
correlare dati disposti in luoghi diversi ed disomogenei.
In realtà, esiste un sistema sensibilmente più efficiente
per la gestione delle informazioni, che prevede una raccolta centralizzata e
una organizzazione “intelligente” delle stesse. Entriamo in questo
modo nella definizione di Analisi Forense, un processo grazie al quale diviene
possibile estrarre dati significativi da enormi database contenenti
informazioni apparentemente eterogenee.
Un processo, si è detto. Il termine utilizzato lascia
presupporre - come realmente è (o dovrebbe essere) - un comportamento “attivo”
della rete; non ci si limita, quindi, ad analizzare dati di eventi accaduti,
per i quali sono state lasciate tracce (per esempio analisi post-mortem di un
attacco, dopo il defacement del sistema), ma si ricercano continuamente
anomalie sul traffico della rete da difendere, con lo scopo di intervenire sul
problema, in modo da evitarlo o, quando questo non e passibile, almeno
arginarlo.
Gli elementi che caratterizzano un sistema di analisi
forense sono diversi: esso si basa prima di tutto sulla raccolta centralizzata
dei dati, che permette di gestire le informazioni da un unico ambiente di
lavoro in modo estremamente più comodo; la raccolta dei dati da diverse
tecnologie permette di sfruttare le informazioni di firewall, IDS, sistemi
operativi, router ed apparati di rete in genere, in modo tale da avere una
visione orizzontale di ciò che accade, non vincolata agli eventi di un unico
tipo di device, offrendo la passibilità di fare una ricerca delle informazioni
per severità di allarme o per tipo di evento.
Vi è un ulteriore problema inerente alla centralizzazione
dei log: ogni singola tecnologia ha una sua scala di allarmi e severità
differenti; per poter essere correttamente inseriti nel database, tali alert
dovranno essere “normalizzati”, in modo da adattarli ad una scala
comune. Questa pratica ne faciliterà di gran lunga la ricerca all’interno
del database, offrendo informazioni viziate da un “rumore” minore.
La correlazione dei dati è un altro elemento fondamentale
dell’analisi forense: mettere in corrispondenza informazioni raccolte da
diversi device, in tempi diversi, offrendo una vista logica omogenea sugli
stessi permette una interpretazione dei log estremamente raffinata,
focalizzando l’attenzione su eventi che, diversamente, sarebbero passati
inosservati. A dimostrazione del1’importanza di questa fase prendiamo un
esempio banale, ma estremamente rappresentativo: un attacker effettua uno scan
di porte di un server sotto la nostra amministrazione spendendo un pacchetto
ogni settimana; per un operatore che dovrà analizzare i log manualmente,
sarebbe estremamente complicato, per non dire pressoché impossibile, riuscire
ad immaginare che quel singolo pacchetto possa far parte di una sequenza volta
al reperimento di informazione per un tentativo di intrusione.
Quando i dati sono tra loro correlati, invece, è
possibile impostare una regola tale per cui, ad esempio, si può ricevere una
notifica quando, se dallo stesso IP sorgente vedi un tentativo di connect a
porte “strane” sempre diverse tra loro, distribuito su un lasso di
tempo di un mese.
La fase di data mining è alla base di una buona
infrastruttura di Information Management quale quella da noi prospettata: con
questo processo si intende l’estrazione di informazioni aggregate da
banche dati di grandi dimensioni tramite applicazioni che individuano le
associazioni nascoste tra le informazioni e le rendono “esplicite”.
La qualità, la leggibilità e la possibilità di
manipolazione, attraverso dei drill down, dei dati di un report è estremamente
importante. II drill down ci consente, partendo dai dati aggregati, di entrare
nel dettaglio passo per passo, mostrando ogni volta i dati che sono stati
riassunti nella voce evidenziata.
Un esempio pratico permetterà di comprendere cosa
permetta di fare il “drill down”: l’operatore genera un report
che evidenzia gli allarmi più frequenti all’interno del database nelle
ultime due settimane; chiedendo un dettaglio maggiore su tali allarmi, vengono
mostrati gli IP sorgenti che hanno prodotto il maggior numero di questi
allarmi. Grazie a questa nuova informazione, è possibile cercare altre
correlazioni all’interno del database, questa volta ricercando alcuni IP
specifici. Come si capisce, un analisi di questo tipo, specialmente quando
questa sia automatizzata da specifici tool, diventa estremamente efficace per
la sorveglianza di una rete.
Abbiamo precedentemente evidenziato come l’analisi
forense sia un processo attivo, che reagisce ad eventuali sollecitazioni dall’esterno.
Quando un comportamento viene riconosciuto come “ostile” (può
essere un solo evento, oppure un insieme correlato di eventi), viene attivato
un sistema di notifica che, a seconda delle impostazioni dello stesso, emette
un trap snmp, spedisce un SMS o una email che, di solito, attivano contromisure
automatiche o manuali. Ovviamente, la possibilità di avere una real time
console aiuta sicuramente a ridurre il gap che intercorre tra il momento in cui
avviene la compromissione del server e il momento in cui l’infrastruttura
torna completamente operativa.
Abbiamo così iniziato a delineare un profilo per un
modello di infrastruttura che viene definita, secondo la terminologia corrente, Security Information Management (SIM).
Si cercherà, adesso, di presentare un potenziale modello
di SIM applicabile alla topologia di rete della profumeria RoseNoir. Per una
implementazione che veda il solo utilizzo di prodotti OpenSource, si prenderà
in considerazione solo alcuni firewall e IDS, per i quali sono gia stati
scritti appositi tool per la centralizzazione e 1’analisi dei log. Ci
riferiamo in particolar modo ad ACID,
acronimo di Analysis Console for
Intrusion Database e a logsnorter,
un tool in grado di inserire nel database MySQL di Snort i log generati da
Netfilter.
Per semplificare il discorso, senza perdere però di
generalità, consideriamo, tra tutti i dispositivi posati sulla rete, solo i
seguenti device:
§
IDS
esterno;
§
1.1.1.4
firewall/NAT;
§
IDS
interno;
§
10.10.20.5 packet filter a difesa di secret/devel.
I log di questi device verranno raccolti e inseriti in un
database centralizzato: questo dovrà avvenire utilizzando dei canali “sicuri”
o creando dei tunnel “cifrati” laddove il traffico attraversi
router e eventuali altri dispositivi che potrebbero essere soggetti ad attacco
(e, quindi, a compromissione).
Figura 4:
lo schema di raccolta dei log: gli IDS scrivono direttamente sui MySQL passando
tramite la rete di management, mentre i firewall passano tramite un tunnel SSL
sulla porta 5140 creato con tunnel: in ascolto nel pc di raccolta c’è Syslog-NG.
Tramite logsnorter i log di syslog vengono memorizzati nell’unico
ambiente di raccolta, il database snort di MySQL.
Per quanto riguarda gli IDS, Snort è in grado di loggare
direttamente su database MySQL, purché lo si compili con le opzioni specifiche:
si collegherà, quindi, direttamente al database centrale e invierà direttamente
le informazioni raccolte. La spedizione dei log avverrà su un canale dedicato:
in questi casi, infatti, conviene aggiungere agli IDS una nuova scheda di rete
che si affaccerà ad un segmento di rete riservato al logging e alla gestione dell’IDS stesso.
In caso di compromissione del sensore, vedremo che i
diritti concessi sul database centralizzato non saranno sufficienti, in ogni
caso, per cancellare dati, ma solo per inserirne di nuovi.
I sistemi operativi dei firewall utilizzano la classica
tecnologia syslog per registrare informazioni: i log saranno ridiretti verso un
syslogd centralizzato per la raccolta e l’inserimento nello stesso
database MySQL (oltre, eventualmente, ad essere scritti sul filesystem locale,
anche se un sensore potrebbe, addirittura, essere sprovvisto di disco fisso).
syslogd ha un suo protocollo per il trasferimento dei log
basato su una connessione UDP non cifrata, assolutamente insicura in questi
contesti: ecco che si rende necessario, quindi, la creazione di un tunnel
cifrato verso la destinazione, all’interno del quale far viaggiare i
dati. Verrà, quindi, preferito a syslogd classica la sua variante syslogd-ng,
in grado di effettuare connessioni TCV, che potranno viaggiare all’interno
del tunnel cifrato. Si utilizzerà, quindi, stunnel per la creazione del tunnel
SSL, Syslog-NG per l’invio dei log nel tunnel ed infine il passaggio
attraverso logsnorter per la memorizzazione all’interno del database,
prelevando le informazioni da syslog.
Qualcuno potrà chiedersi come mai agli IDS sia stata
aggiunta una scheda di rete affacciata
su una rete trusted mentre per i firewall è stato preferito effettuare il
tunneling cifrato: la domanda sarebbe effettivamente lecita... Aggiungere una
nuova Ethernet ai firewall significherebbe complicare ulteriormente la
configurazione degli stessi, in quanto andrebbero analizzati l’eventuale
traffico tra tale interfaccia e quelle preesistenti, oltre ad un generale
incremento del TOC (Total Cost of Ownership) del dispositivo stesso: ecco
perché si preferisce, parlando di firewall, di gestire le Ethernet presenti e
utilizzare un tunnel cifrato.
Uno schema del percorso seguito dai log verso il device
che la console di management è mostrato in figura 5, mentre in figura 6
possiamo vedere una rappresentazione della rete e dei sensori.
Senza perderci troppo nella teoria, vediamo la
configurazione relativa ai tool che abbiamo citato in precedenza.
Come detto, per permettere a snort di scrivere direttamente
nel database remoto i log, andrà ricompilato con il supporto per MySQL.
Successivamente, sarà necessario inserire nel file snort.conf la seguente
direttiva:
output database: log, mysql, user=snort
password=snort dbname=snort
host=192.168.192.1
dove log rappresenta il tipo facility (log o alert);
user, password, sono username, password del database cui ci si collega; dbname,
host, il nume del database e l’host che ospita il server db.
Inoltre, sarà necessario preparare il MySQL server
presente su 192.168.192.1 per ricevere tali dati, creando le opportune tabelle
che dovranno contenere i log.
Per fare questo, sarà necessario utilizzare il file
presente nella distribuzione di snort create_mysql nel seguente modo:
Enter password:
[password di root di MySQL]
mysql> CREATE
DATABASE SNORT
mysql> GRANT
INSERT, SELECT ON SNORT.* TO SNORT@localhost; (per logsnorter)
mysql>
GRANT INSERT, SELECT ON SNORT.* TO SNORT@192.168.192.2; (interfaccia mgmnt IDS
esterno)
mysql> GRANT
INSERT, SELECT ON SNORT.* TO SNORT@192.168.192.3; (interfaccia mgmnt IDS
interno)
mysql>
FLUSH PRIVILEGES;
mysql>
QUIT
# mysql –u root –p snort <
CREATE _MYSQL
# Enter password: [password di root di MySQL]
A questo punto, la parte di configurazione relativa al
logging di Snort è completata; passiamo quindi alla configurazione dei Syslog-NG,
rispettivamente quelli remoti e quello centrale.
Per quanto riguarda i packet filter abbiamo visto sopra
che nelle regole è presente una chain per il logging che, nello specifico,
abbiamo chiamato logdrop.
Avremo, quindi, nel file di log di syslog diverse
informazioni provenienti dal firewall. Anche in questo, cambieremo rispetto al
syslog-ng.conf.sample di default aggiungendo le direttive di configurazione come
segue:
source src
{ unix-stream(“/dev/log”);
internal();
pipe(“/proc/kmsg”);
};
filter
f_firewall{match(“IN=“) and match(“OUT=“);};
destination
firewall {tcp(“127.0.0.1” port(5140));};
log{source(src);
filter(f_firewall);
destination(firewall);};
Con la prima direttiva impostiamo un filtro tale per cui
vengono individuati tutti i messaggi contenenti le stringhe “IN” ed
“OUT”, tipiche di netfilter; la seconda direttiva imposta una
politica di destination log, tale per cui il risultato della direttiva di
filtro “firewall” (quella appena definita) sia mandato all’host
in questione (127.0.0.1:5140); infine, l’ultima direttiva fa in modo di
rendere effettive le politiche sopra citate, ovvero applica filter e
dastination insieme.
Le informazioni vengono redirezionate su 127.0.0.1:5140
perché in ascolto su quella porta ci sarà una istanza di stunnel che
incapsulerà il traffico per mandarlo al Syslog-NG centralizzato. stunnel sarà
lanciato sulle macchine che mandano i log con:
# stunnel –c –d 5140 –r 192.168.192.1:5140
Vediamo, quindi, il significato dei flag del comando
sopra riportato:
§
-c significa clientmode;
§
-a significa IP: porta locale su
cui mettersi in ascolto (di default IP e 127.0.0.1);
§
-r significaIP: porta remota cui mandare i messaggi.
Sull’host
remoto invece stunnel dovrà essere lanciato nel seguente modo:
# stunnel –p stunnel.pem –d 5140 –r 192.168.192.1:514
II significato dei flag, del resto abbastanza intuitivo,
è il seguente
§
-p è il flag per specificare il
file .pem contenente il certificato per il secure layer, appunto in formato pem;
§
-d significa IP:Porta locale su
cui mettersi in ascolto (di default IP è 127.0.0.1);
§
-r significa IP: porta remota cui
mandare i messaggi (in ascolto c’è il Syslog-NG locale della macchina
ricevente, come vedremo tra un attimo).
Figura 5:
lo schema della rete della
profumeria RoseNoir: in evidenza la rete di management.
A questo punto l’istanza stunnel descritta poco
sopra riceverà le informazioni dai Syslog-NG remoti redirezionandole al Syslog-NG
locale, la cui configurazione rispetto al Syslog-NG.sample distribuito con i
sorgenti cambia per la direttiva source src che diventa:
source src
{
unix-stream(“/dev/log”);
pipe(“/proc/kmsg”);
tcp(ip(“127.0.0.1”) port(514));
tcp();
internal();
};
filter
f_firewall{match(“IN=“) and match(“OUT=“);};
destination
firewall {file(“/var/log/firewall.log” OWNER(“root”)
GROUP(“adm”)
log{source(src);
filter(f_firewall);
destination(firewall);};
In sostanza, abbiamo aggiunto l’ascolto sulla porta
TCP ed un filtro per gestire tutte le informazioni dei firewall su un unico
file.
Manca ancora la configurazione di logsnorter, piuttosto
semplice, basta una sola riga di comando:
# logsnorter –u snort –p snort –s 127.0.0.1 –d
snort
–T/var/log/firewall.log –L 8 -t
Vediamo il significato dei flag:
§
-u, -p, -s, -d rappresentano il DB al quale
connettersi e le relative credenziali;
§
-T/var/log/firewall.log significa che i dati vengono
importati in modalità “tailing” (tail -f) dal file Firewall .log;
§
-L 8 specifica la natura dei log,
in questo caso prodotti da iptables (logsnorter può gestire i messaggi anche di
altre tecnologie);
§
-t significa che utilizza i
timestamp dei messaggi di syslog piuttosto che il corrent time.
Finalmente, abbiamo tutte le informazioni necessarie all’interno
di un unico database pronte per essere utilizzate tramite opportune
applicazioni; sempre rimanendo in ambito OpenSource, il front-end verso questi
dati che andremo ad utilizzare è ACID.
ACID è un motore di analisi, basato su PHP, studiato per
analizzare eventi security-related provenienti da diverse tecnologie. E’
scaricabile dal sito http://www.certorg/kb/acid/
L’ installazione del programma necessita dell’installazione
di alcuni pacchetti, quali ADODB, PHPlot, JPGraph, GD... nella distribuzione
sono riportate tutte le informazioni e i requisiti. Una volta installato, ACID
è di semplice configurazione: la prima cosa da fare è modificare le ACL sul
database per l’utente snort (che gira, questa volta, da localhost):
# mysql –u root –p
# Enter
password: [password di root di MySQL]
mysql> GRANT SELECT INSERT, UPDATE, UPDATE ON SNORT.* TO SNORT@localhost IDENTIFIED BY
‘SNORT’;
mysql> QUIT
In seguito passiamo alla modifica del file di
configurazione acid_conf.php, eccone un esempio:
<?php
$ACID_VERSION
= “0.9.6b22”;
$DBtype =
“MySQL”;
$alert_dbname
= “SNORT”;
$alert_host
= “localhost”;
$alert_port
= “”;
$alert_user
= “SNORT”;
$password = “SNORT”;
[snip]
Adesso puntando il browser su http://192.168.192.1/acid/acid_main.php riceverete un messaggio dove
si dice che la tabella acid_ag (alert group) non è presente. Seguendo le istruzioni
sulla pagina e seguendo, quindi, il link alla setup page sarà possibile
installare via web le tabelle mancanti. A questo punto, saremo pronti a
sfogliare il database delle informazioni in modo efficiente.
ACID oltre a presentarci statistiche specifiche per IP
sorgente, IP destinazione, protocollo, porta sorgente, porta destinazione e
allarme è anche in grado di produrre report grafici, oltre che ad avere un
complesso sistema di query sul database che permette un data mining del tipo a
drill down estremamente funzionale ed
efficace.
L’applicazione prevede quattro tipologie di criteri
di ricerca:
§
§
IP: qualsiasi header IP
§
Layer-4: qualsiasi header TCP /UDP/ ICMP
§
Payload: qualsiasi payload di layer-4
Possono essere fatte query composte tra i vari criteri di
ricerca, inoltre in ogni criterio esistono delle chiavi di ricerca, correlate
da loro operatori logici. E’ anche possibile generare grafici degli
allarmi partendo da query.
Verrà proposto adesso un modello di schema del database e
di un “agente” software (una applicazione preposta all’analisi
dei log, mediante i quali sarà possibile implementare alcune delle
caratteristiche che mancano ad ACID per essere una infrastruttura di SIM a
tutti gli effetti. Supponiamo di voler aggiungere un device per cui ACID non è
stato pensato: si vuole analizzare e centralizzare, ad esempio, il syslog di
una applicazione quale potrebbe essere il webserver Apache. Vediamo un possibile
esempio di log prodotto:
192.168.1.55 - - [15/jan/2003:19:09:18 + 0100] “GET /index.html http/1.0” 200 14025 “http://1.1.1.2/index.html”\
“lynx
/2.8.5dev.7 libwww-FM/2.1.4 ssl –mm/1.4.1openSSL/0.9.6b”
Si valutano come significative alcune informazioni
estratte dalla riga di log, che quindi si vogliono inserire nel data-base. In
particolare si vuole tener traccia dell’ip sorgente della richiesta http,
del timestamp e dell’URL richiesto.
Come si può vedere, allo stato attuale queste
informazioni non sono inseribili nel database per la struttura delle tabelle;
sarà quindi necessario apportare alcune modifiche allo schema.
Il core e rappresentato dalla tabella “event”,
che è corrispondenza con la tabella delle signature, un insieme di tabelle che
rappresentano i dati reali dell’evento (iphdr, icmphdr, udphdr, tcphdr,
data) e la tabella relativa ai sensori. In questo modo un evento completo viene
costruito relazionando tra loro diverse tabelle del database. Per memorizzare
le informazioni relative al webserver Apache scnza stravolgere l’attuale
applicazione, ogni elemento sopra indicato verrà aggiunto nel modo seguente:
ip src à tabella iphdr
timestamp à tabella event
URL richiesto à tabella event
Per comodità, sarebbe opportuno utilizzare la stessa
scala di allarmi che usa Snort, normalizzando cosi le informazioni di Apache
rispetto a quelle degli altri device: sara dunque necessario, prima di inserire
il log nel database, fare una valutazione sulle informazioni da inserire.
Questo compito è assegnato all’agente software, che
analizza i file di log di Apache e decide se e dove devono essere inseriti nel
database.
Le difficoltà, a questo punto, potrebbero essere diverse
a seconda dell’approccio seguito per la scrittura dell’agente:
questo, ad esempio, potrebbe essere un piccolo demone in Perl che esamina in
tailing i log di Apache o, ancora meglio, riceve i log direttamente da Apache
attraverso un pipe (ad esempio, utilizzando la direttiva di configurazione di
Apache: TransferLog “|agente”). Per poter mantenere una omogeneità
tra gli allarmi dei vari device, inotre, potrebbe essere conveniente utilizzare
la stessa scala di Snort, utilizzando quindi le stesse regole presenti in
quelle che seguono web-attacks.rules, web-cgi.rules, web-client.rules,
web-coldfusion.rules, web-frontpage.rules, web-iis.rules, web-misc.rules,
web-php.rules.
Prendiamo, ad esempio, la prima regola della prima serie
web-attacks.rules:
alert tcp
$EXTERNAL_NET eni -> $HTTP_SERVERS $HTTP_PORTS\
(msg:
“WEB-ATTACKS PS COMMAND ATTEMPT”;
flow: TO
_SERVER, ESTABLISHED;
uricontent:
“/bin/ps”;\
nocase;
sid: 1328;
classtype:
web-application-attack;
rev: 4;)
Questa regola scatena un alert di severità 4 quando,
analizzando pacchetti HTTP, trova il pattern “/bin/ps”: tale
allarme è considerato un allarme del tipo web-attack.
Per uniformare a tale comportamento l’agente
software, quindi, potrà utilizzare una espressione regolare che cercherà nelle
informazioni ricevute il pattern /bin/ps, trovato il quale provvederà inserire
tutte le informazioni nelle relative tabelle come abbiamo visto poco fa.
Sarà sufficiente una regex specifica per ogni regola di
Snort e si saranno normalizzati gli allarmi. A questo punto manca l’ultima
rifinitura: la possibilità di impostare degli allarmi che mettano in relazione,
in maniera automatica, le varie tabelle del database degli allarmi. Un esempio
teorico di regola, alla quale l’applicazione dovrà offrire una adeguata
interfaccia, potrebbe essere la seguente:
Produci
un allarme se entro 5 minuti, da qualsiasi dei device presenti, arrivano almeno
20 “denied connection” dallo stesso ip sorgente;
Produci
un allrrnne se entro 5 minuti, da qualsiasi dei device presenti, arrivano
almeno 10 signature del tipo web-attack dallo stesso ip sorgente.
Con il nuovo design, l’applicazione potrebbe necessitare di una modifica anche
sostanziale, a tutto vantaggio di una infrastruttura più modulare e operativa.
Ultimo punto, ma non certo per importanza, è la politica da seguire per
conservazione dei log.
Che il database tenda, con il passare del tempo, a
crescere di dimensione è ovvio. Serve, quindi, una politica di backup per
quanto riguarda i dati storici, che devono comunque essere disponibili per
eventuali richieste delle autorità giudiziarie (oltre che per verifiche
tecniche).
livello operativo, si potrebbe impostare una politica di
backup che effettui un tape, ad esempio, dei dati più vecchi di un mese, in
modo da mantenere il db in dimensioni accettabili e sempre con i soli dati necessari
alle query sul db (se non vi sono regole di correlazione che vadano oltre il
mese, ovviamente).
Principali servizi
e loro livello di vulnerabilità
FTP
(21/TCP)
[ Livello di vulnerabilità: ALTO ]
• Il protocollo FTP non implementa la cifratura del
traffico. Per questo motivo, un attacker è in grado di intercettare le sessioni,
comprese le credenziali di accesso di sistema (nella forma login/password).
• Molte implementazioni del protocollo FTP hanno
sofferto in passato di gravi
problemi di sicurezza, alcuni dei quali consentono ad un
attacker l’acquisizione
remota dei privilegi di amministrazione.
• FTP consente una forma di amministrazione remota
dei file: se le policy di firewalling permettono l’accesso dall’esterno
a tale servizio, viene a crearsi una esposizione, dipendentemente dalla
politica di gestione delle credenziali di accesso al sistema.
DNS
(53/TCP/UDP)
[ Livello di vulnerabilità: ALTO ]
• Molte implementazioni del protocollo DNS hanno
sofferto in passato di gravi problemi di sicurezza, alcuni dei quali consentono
ad un attacker l’acquisizione remota dei privilegi di amministrazione.
• Se configurato in maniera errata, DNS consente ad
un attacker di ottenere informazioni utili sui sistemi attestati su di una rete
e sulla loro funzione (DNS AXFR).
SSH
(22/TCP)
[Livello di vulnerabilità: MEDIO]
• Molte implementazioni dei protocolli SSH1 ed SSH2
(SSH, OpenSSH) hanno sofferto in passato di gravi problemi di sicurezza, alcuni
dei quali consentono ad un attacker l’acquisizione remota dei privilegi
di amministrazione.
• SSH consente l’amministrazione remota dei
sistemi Unix: se le policy di firewalling permettono l’accesso dall’esterno
a tale servizio, viene a crearsi una esposizione, dipendentemente dalla
politica di gestione delle credenziali di accesso al sistema.
SMTP
(25/TCP)
[Livello di vulnerabilità: MEDIO]
• Il protocollo SMTP non implementa la cifratura
del traffico. Per questo motivo, un attacker è in grado di intercettare le .iasioni,
quali messaggi e-mail ed eventuali allegati, potenzialmente contenenti dati
sensibili.
• Se configurato in maniera errata, SMTP consente
ad un attacker di individuare i nomi delle utenze valide sul sistema (attraverso
i comandi VRFY ed EXPN).
• Se configurato in maniera errata, SMTP consente
ad un attacker esterno l’invio anonimo di e-mail (open relay).
FINGER
(79/TCP)
[ Livello di vulnerabilità: BASSO ]
• Il servizio FINGER consente ad un attacker di
individuare i nomi delle utenze valide presenti sul sistema, allo scopo di
lanciare un attacco mirato di tipo “brute force”.
HTTP
(80/TCP)
[Livello di vulnerabilità: ALTO]
• Il protocollo HTTP non implementa la cifratura
del traffico. Per questo motivo un attacker è in grado di intercettare le
sessioni, compresi eventuali dati
sensibili in transito.
• Molte implementazioni del protocollo HTTP
(Microsoft IIS, Apache) hanno
sofferto in passato di gravi problemi di sicurezza,
alcuni dei quali consentono ad un attacker di acquisire da remoto i privilegi
di amministrazione.
• Le vulnerabilità dei programmi CGI e degli script
presenti sul server http possono portare un attacker all’esecuzione di
comandi arbitrar; ed all’acquisizione dei privilegi del server web.
POP-3 (110/TCP)
[ Livello di vulnerabilità: MEDIO ]
• Il protocollo POP-3 non prevede la cifratura del
traffico. Per questo motivo,
un attacker è in grado di intercettare le sessioni,
comprese le credenziali di accesso al sistema (nella forma login/password).
SNMP
(61/UDP)
[Livello di vulnerabilità: ALTO]
• il protocollo SNMP non implementa la cifratura
del traffico. Per questo motivo, un attacker è in grado di intercettare le sessioni,
comprese le credenziali di accesso al sistema (community SNMP).
• Il protocollo a layer di trasporto utilizzato da
SNMP è UDP. Esso è soggetto ad attacchi del tipo spoofing o hijacking di
sessione, che consentono ad un attacker di manipolare il traffico con relativa
semplicità.
• Alcune implementazioni del protocollo SNMP hanno
sofferto in passato di gravi problemi di sicurezza, alcuni dei quali consentono
ad un attacker l’acquisizione remota dei privilegi di amministrazione.
• SNMP consente una forma di amministrazione remota
dei sistemi: se le policy di firewalling permettono l’accesso dall’esterno
a tale servizio, viene a crearsi una esposizione, dipendentemente dalla politica
di gestione delle credenziali di accesso al sistema (communitv SNMP).
HTTPS(443/TCP)
[ Livello di vulnerabilità: MEDIO ]
• Molte implementazioni del protocollo HTTPS
(Microsoft IIS, Apache-SSL) hanno sofferto in passato di gravi problemi di sicurezza,
alcuni dei quali consentono ad un attacker l’acquisizione remota dei privilegi
di amministrazione.
• Le vulnerabilità dei programmi CGI e degli script
presenti sul server HTTPS
possono portare un attacker all’esecuzione di comandi
arbitrari e all’acquisizione dei privilegi del server web.
MYSQL
(3306/TCP)
[ Livello di vulnerabilità: MEDIO]
• I DBMS SQL non implementano generalmente la
cifratura del traffico. Per
questo motivo, un attacker è in grado di intercettare le
sessioni, comprese le
credenziali di accesso al sistema (nella forma
login/password).
• Molte implementazioni di database relazionale SQL
hanno sofferto in passato di gravi problemi di sicurezza, alcuni dei quali
consentono ad un attacker l’acquisizione remota dei privilegi di amministrazione
del database (o, in alcuni casi, dell’intero sistema).
• System Identification.
I file di log e la legge: l’obbligo di
manutenzione dei log
Una delle querelle giuridiche
più accese è quella che riguarda l’obbligo o meno della manutenzione dei
file di log, ma è bene precisare che il termine log nel mondo del diritto
potrebbe far sorridere un amministratore di sistema.
Infatti per quest’ultimo
i log sono solo una categoria generale, divisibile in svariate sottocategorie (per
cui avremo log del web server, log del mail server, log della macchina, ecc.),
per i giuristi i log sono generalmente i file contenenti le tracce necessarie a
ricostruire come è avvenuto un determinato reato commesso con il mezzo
informatico.
I provvedimenti legislativi o
regolamentari che parlano con un minimo di cognizione di causa dei file di log
sono rarità e vanno sicuramente annoverate le circolari AIPA in tema, ad
esempio, di redazione di piano di sicurezza per gli apparati della Pubblica
Amministrazione.
Quando si parla di obbligo di
manutenzione dei log si potrà stilare una classifica di quali log si devono
assolutamente conservare e quali, invece, possono essere cestinati. Tale
classifica terrà conto dei reati più comunemente commessi e della categoria
professionale alla quale si appartiene. Nel caso si tratti di un ISP, infatti,
è sicuramente consigliabile conservare i log di tutte le connessioni effettuate
dai propri clienti. Nel caso di un webmaster, sarà bene invece conservare tutte
le transazioni da e verso la pagina web che si amministra, così come è bene in
generali conservare anche i log dei mail server.
Scendendo più
nell’utenza domestica, non sono da sottovalutare i log della propria
macchina, visto che spesso sono l’unica traccia utile per ricostruire se
determinati file hanno subito delle modifiche “ad arte” o se il
sistema stesso è stato infettato da qualche virus.
Non esiste comunque allo stato
una norma ben specifica, visto che, anche a seguito dell’emanazione del
d.lgs. 28 dicembre 2001 n° 467, che modifica la legge 675/96 sulla tutela dei
dati personali, purtroppo, nessun accenno è stato fatto in relazione ai file di
log ed alla manutenzione degli stessi.
Immediatamente dopo
l’emanazione del d.lgs. menzionato,
Il problema della manutenzione
dei file di log è comunque ben più sottile, dato il contrasto che potrebbe
verificarsi tra l’eventuale obbligo di manutenzione e le esigenze di
privacy del cittadino: tale contrasto è già sulla scrivania dei Garanti della
privact dei vari paesi europei ed era già emerso durante la “Conferenza
di Primavera” tenutasi ad Atene nel maggio del 2001.
In quella sede si sono
ribadite le posizione espresse nella Conferenza dell’anno prima tenutasi
a Stoccolma, per cui la conservazione prolungata di file atti a ricostruire
fedelmente l’attività compiuta in rete da un determinato soggetto viola
senza alcuna ombra di dubbio il diritto di ogni persona all’intimità
della propria sfera privata e, sempre nella stessa sede, si è esortato a
regolamentare con norme ad hoc le esigenze di manutenzione prolungata dei file
su menzionati che si potrebbero venire a verificare.
In Italia il quadro normativo
è confuso. Il testo di partenza è costituito dal d.lgs. 13 maggio 1998 n° 171,
che all’art. 4 consente di tenere traccia dei dati di fatturazione del
traffico, con conseguente identificazione del chiamante, almeno finché la
fattura può essere legalmente contestata.
Esiste poi un
“decalogo” per la sicurezza ad opera dell’AIPA, che esorta
all’individuazione di ogni singolo soggetto operante nella rete mediante
appositi “activity log file”, e che l’integrità di questi
file di log è garantita per un periodo da concordare.
Inoltre, i provider iscritti
all’AIIP garantiscono la conservazione del log file per un periodo di
almeno 5 anni, pur se detto obbligo non è previsto dalla legge.
Infine la delibera
467/2000/CONS dell’AGCOM (Autorità Garante per le Comunicazioni) prevede
la manutenzione dei file di log per verificare il rispetto delle misure minime
di sicurezza ex DPR 318/99, previa identificazione dell’ISP nel titolare
del trattamento dei dati e, quindi, soggetto alle norme previste dal DPR su
menzionato, e la piena collaborazione ai fini delle indagini con le Autorità
Giudiziarie.
In aggiunta a ciò e per meglio
rispettare la privacy dell’utente, il file di log dovrebbe essere firmato
digitalmente, disposto in maniere tale da consentire l’accesso alle
informazioni relative alla sicurezza e non a quello relative alla privacy
dell’utente e, infine, prevede la creazione di un protocollo per
l’invio delle mail che cifri automaticamente il contenuto, così da non
poterle rendere visibili ai fornitori di accesso.
·
“Speciale Sicurezza”
di Matteo Falsetti, Marco Ivaldi, Pierluigi
Perri, Daniele Verzelloni. Pubblicato sulla rivista mensile “Linux
& C.”, anno 5 numero 30
http://www.oltrelinux.com
·
Syslog-NG Reference Manual
http://www.balabit.com/products/syslog_ng/reference/book1.html
·
“Syslog-NG”
di Balazs Scheidler (traduzione di F. Lamonica)
Pubblicato sulla rivista Linux Gazette n. 43 – luglio 1999
http://linux.cassino.edu/lgei/lgei9904/lgei9904_07.html
·
File di
log: sicurezza ed analisi
di Yvette ‘vodka’ Agostini e Valerio ‘Hypo’ Verde
http://www.sikurezza.org/webbit02/Log_analysis_1.ppt
http://www.sikurezza.org/webbit02/Log_analysis_2.ppt
·
SysLog-ng Official WebSite (Inglese)
http://www.balabit.com/products/syslog_ng/
·
SysLog-ng FAQ (Inglese)
http://www.campin.net/syslog-ng/faq.html
·
SysLog-ng + MySQL + PHP (Inglese)
http://vermeer.org/syslog/
http://www.vermeer.org/projects/php-syslog-ng/
·
Esempi
sulla configurazione di SysLog-ng (Inglese)
http://linux.cudeso.be/linuxdoc/syslog-ng.php
·
SysLog-ng + PostGreSQL (Inglese)
https://lists.balabit.hu/pipermail/syslog-ng/2002-April/003249.html
·
Central Loghost Mini-HOWTO (Inglese)
(Hacker Check/MySQL Support/Swatch/Stunnel)
http://www.campin.net/newlogcheck.html
·
Secure Remote Logging with syslog-ng and
stunnel HOWTO (Inglese)
http://venus.ece.ndsu.nodak.edu/~jezerr/linux/secure-remote-logging.html
·
Guida alla Sicurezza by Gentoo (Italiano)
http://www.gentoo.org/doc/it/gentoo-security.xml
Access
Point Wireless
Punto d'accesso per le reti
wireless, ovvero, estensione radio della LAN.
All-In-One
Termine che sta ad indicare
soluzioni multiple integrate nella medesima soluzione. Letteralmente tutto in
uno.
Attacker
Solitamente colui che tenta di
apportare un attacco ad un sistema.
Brute
force
In crittografia e in altri
campi matematici, un programma che fa eseguire al computer una funzione
semplice, ma ripetuta un'infinità di volte nella speranza di trovare la
soluzione a furia di tentativi. Questo sistema viene ad esempio utilizzato per
scoprire la password di accesso ad un sistema.
Connection-oriented
network
Una rete in cui, prima di
iniziare qualsiasi trasmissione, ci si assicura che il desinatario sia pronto a
ricevere, scambiando con esso una sequenza di messaggi di servizio che servono
a creare una sessione di collegamento tra mittente e destinatario. Tale
sessione rimarrà attiva fino al termine del trasferimento dati.
Daemon
In UNIX un programma che
funziona costantemente in background sul server, pronto ad entrare in azione
all'occorrenza su richiesta di altri orogrammi.
DNS
(Domain Name System)
Sistema di denominazione del
dominio. Un database distribuito utilizzato in ambiente TCP/IP per creare una
corrispondenza tra indirizzo numerico e nome mnemonico assegnato alla macchina.
E' distribuito perchè nessun computer collegato a Internet ha una situazione
completa dell'intera rete, ma deve usare il particolare protocollo previsto dal
DNS per comunicare con gli altri sistemi e procurarsi le informazioni.
DoS
(Denail of Service)
Attacco mirato non al
controllo, da parte di malintenzionati, del sistema, ma all'interruzione di
sevizi.
Download
Copiare dati (di solito
un'intero file elettronico) sul proprio computer, prelevandoli da una fonte
primaria.
Firewall
Un meccanismo hardware e/o
software che permette d'impostare restrizioni sull'accesso a uno o più computer
collegati a internet, normalmente per motivi di sicurezza.
FTP
(File Transfer Protocol)
Un insieme di regole per
abilitare il colloquio bidirezionale tra due computer durante il trasferimento
di un file. Il nome si riferisce sia al protocollo di trasmissione sia al
programma che ne fa uso. Il protocollo viene usato quando si scarica un file
sul proprio computer prelevandolo da un sito internet e racchiude in sè i
comandi TCP/IP per eseguire login sulla rete, visuallizare l'elenco dei files
esistenti e copiarli sulla stazione locale.
HTTP
(HyperText Transfer Protocol)
Protocollo di trasferimento per
ipertesti. Il protocollo di trasferimento usato per convogliare su Intenet le
pagine del World Wide Web e concepito espressamente per consentire la creazione
di collegamenti ipertestuali tra i documenti. Le quattro operazioni svolte in
sequenza dal protoccollo sono
connessione col server che contiene il documento, richiesta del documento,
recupero della pagina interessata attraverso la risposta del server e chiusura
della connessione. Questo ciclo viene ripetuto per ciascuna pagina richiesta.
ISP
(Internet Service Provider)
Una socieyà che fornisce
accesso a internet ad aziende e a clienti privati. Offre servizi di vario tipo,
tra cui la posta elettronica, e dispone di una connessione diretta con le linee
di accesso internazionali.
LAN
(Local Area Network)
Una rete d'interconnessione tra
diversi computer entro un'area delimitata dai muri dell'edificio o dal
perimetro dello stabilimento in cui viene installata, oppure dal raggio di
pochi chilometri nel caso in cui non esistano confini di riferimento precisi.
Consente lo scambio diretto di dati in formato elettronico tra due o più
computer.
Password
Cracking
Tecnica mediante la quale è
possibile recuperare parzialmente o integralmente la password di un sistema.
Performance
tuning
Termine utilizzato per indicare
le tecniche di ottimizzazione delle prestazioni del sistema.
POP-3 (Post Office Protocol v3)
Nasce per recuperare posta dal
server senza eccessiva complessità ed è dedicato a quelle macchine che non sono
constantemente collegate a Internet e hanno bisogno di uno strumento per
recuperare di tanto in tanto tutti i nuovi messaggi arrivati nella casella
postale.
Proxy
server
Una macchina che intercetta le
richieste che arrivano dai vari client a cui è abbinata, procura dai vari siti
le pagine HTML corrispondenti e le replica in locale così che siano
consultabili da più persone senza richiederle continuamente a internet. Può
essere utilizzato anche come sistema per abbinare una intranet locale a
internet. Il proxy in questo caso, oltre a fungere da cache, agisce ache da
filtro del traffico.
RAS
(Remote Access Service)
Una funzione software fornita
con Windows per Workgroup e Windows su
tecnologia NT per accedere in remoto a un server e, attraverso di questo, alle
risorse condivise sulla rete.
Real-time
Si riferisce a una modalità
operativa di alcuni computer in cui le informazioni ricevute vengono elaborate
immediatamente, fornendo risultati quasi istantanei.
S-HTTP (Secure-HyperText Transport Protocol)
Un'estensione del protocollo
HTTP che permette la trasmissione di pagine web cifrate, consentendo quindi lo
scambio su Internet di informazioni protette.
Socket Interfacca di comunicazione UNIX sviluppata dall'Università di
Berkley per consentire l'agevole comunicazione tra processi e applicazioni
attraverso la rete.
SSL
(Secure Sockets Layer)
Un protocollo e un metodo di
crittografia proposto da Netscape per proteggere le informazioni che circolano
su internet. Definisce i meccanismi di trasporto delle informazioni tra un
browser e un server web al fine di eseguire transazioni sicure su internet.
TCP
(Trasmission Control Protocol)
Un protocollo di trasporto
realizzato su specifiche richieste del Dipartimento della Difesa americano come
componente della rete ARPAnet al fine di consentire l'interconnessione di
sistemi tra loro differenti. E' uno standard di fatto nel mondo UNIX e
costituisce l'ossatura portante di internet.
UDP
(User Datagram Protocol)
Un protocollo utilizzato per lo
scambio di messaggi tra applicazioni. E' di tipo connection-less perciò non
grantisce la consegna del messaggio nè la corretta sequenza di pacchetti che
eventualmente lo compongono nè l'unicità del pacchetto, però, è veloce. Lavora
a livello di trasporto (livello 4 nel modello ISO/OSI)
VPN
(Virtual Private Network)
Un servizio offerto dai gestori
pubblici di telecomunicazioni che garantisce le stesse prerogative tipiche di
una rete privata condizionamento
della lnea (per una migliore qualità del segnale sulla lunga distanza),
verifica del livello di errore, altà velocità, trasmissione full duplex.
Worm
Può essere sinonimo di robot, ma tecnicamente il termine indica un programma replicante che si propaga sulla rete, a differenza di un robot che invece non si muove dalla sua sede e si limita a recuperare documenti attraverso la rete.
[1] Data la mancanza di una macchina Linux con cui testare Syslog-NG si è scelto di utilizzare un emulatore. Per creare un log server è bene eseguire un’installazione “tradizionale”.
[2] L’utente “Root” su sistemi Unix like è l’amministratore del sistema, ovvero, colui che ha la facoltà di poter modificare le impostazioni di sistema.