================================================================================ ========================== SNORT - A Lightweight NIDS ========================== ================================================================================
"Un computer sicuro e' un computer spento". - Se siete avvezzi all'ambiente dell'informatica vi sara' sicuramente capitato di sentire questa frase molte volte. Per quanto a prima vista esagerata essa esprime perfettamente l'importanza dell' implementazione di un buon sistema di sicurezza su qualsiasi computer acceso ;) e, per di piu', connesso ad una rete, sottoposto, quindi, ad un numero elevatissimo di potenziali attacchi. Nel panorama di tool che si offrono di dare una mano all'amministratore di sistema in questo senso, emerge SNORT, un leggero e flessibilissimo NIDS (Network Intrusion Detection System - Sistema di Rilevamento Intrusioni di Rete).
Cenni generali ==============
Il lavoro di SNORT consiste nel captare il traffico di rete e di scandagliare i pacchetti che ne fanno parte alla ricerca di quelli di essi che presentano caratteristiche anomale o sospette, nonche' tipiche dei piu' conosciuti attacchi, per metterne al corrente l'amministratore di sistema. Ma la flessibilita' di SNORT fa si' che il suo impiego non si limiti a questo scopo soltanto. Esso, infatti, si dimostra estremamente utile anche in altre molteplici situazioni:
- individuare la presenza di backdoor, trojan e server per attacchi Denial of Service; - rilevare eventuali portscan, che evidenziano un interesse decisamente sospetto nei confronti del nostro sistema o della nostra rete da parte di qualche utente un po' malizioso; - monitorare il traffico generato dalle applicazioni lanciate da utenti della nostra rete, all'eventuale ricerca di quello generato da specifici programmi del cui uso (o abuso... ) si vuole essere messi al corrente; Essenzialmente, le carateristiche che rendono SNORT un tool degno di nota sono le seguenti: - e' in grado di rilevare sia attacchi provenienti dall'esterno, che eventuali attacchi lanciati dall'interno della rete che si controlla; - e' estremamente leggero e performante, la sua compilazione non richeide piu' di pochi minuti e cosi' anche la sua configurazione, facilitata da un linguaggio di scripting molto flessibile e facile da imparare; - proprio grazie al linguaggio di scripting sopra menzionato, usato per redigere i file di configurazione di SNORT contenenti i ruleset che esso usera' per stabilire quali pacchetti considerare "sospetti", e' possibile implementare in pochissimo tempo protezioni contro attacchi di recentissimo annuncio, non ancora coperti da altri IDS, gli upgrade dei quali non sempre sono disponibili con la stessa rapidita'; - i sistemi di logging/alerting che offre sono facilmente configurabili ed offrono un ottimo livello funzionale; - la sua installazione ed il suo impiego non richiedono particolari modifiche ai sitemi sui quali esso dovra' girare; - e' un programma cross-platform; - ultimo, ma non meno importante, e' un prodotto gratuito ed open-source, rilasciato sotto la licenza GNU GPL.
L'architettura di SNORT =======================
Snort fa uso delle librerie LibCap per captare il traffico di rete e si appoggia al Barkeley Packet Filter (BPF) per stabilire quali pacchetti prendere in considerazione (ad esempio per processare solo i pacchetti TCP); la sua struttura operativa e' quindi cosi' riassumibile: _________ /\ | | / \ | SNORT | /____\ |_________| || | | || | LibCap | || |_________| || | | || | BPF | || |_________| || | | || | kernel | || |_________| || | | || | harware | Ethernet, PPP, SLIP, ecc. || |_________|
L'architettura interna di SNORT, invece, e' astraibile come sotto schematizzato: ________________ __________________ ____________________________ _ | |__ | |__ | |_ _> Packet Decoder __> Detection Engine __> Logging/Alerting Subsystem _> |________________| |__________________| |____________________________|
Come si puo' facilmente notare dallo schema, SNORT si compone di 3 sottosistemi: - il Packet Decoder, il cui compito e' quello di captare i pacchetti in transito sulla nostra rete (o da/per il nostro host); - il Detection Engine, che tramite i ruleset sopra menzionati si occupa di stabilire quali pacchetti sono "sospetti", secondo metodi che vedremo piu' approfonditamente nel seguito dell'articolo; - il sottosistema di Logging/Alerting, che, in seguito al rilevamento di un pacchetto "sospetto" da parte del Detection Engine, si occupa di loggare tale evento o di avvertire l'amministratore secondo le modalita' decise in fase di avvio del programma (per mezzo di switch da linea di comando) o tramite particolari impostazioni nei file di configurazione;
Il Detection Engine ===================
Le regole definite nei file di configurazione di SNORT sono conservate in liste likate bidimensionali di Chain Headers e Chain Options. Questo sistema e' stato adottato per rendere il processo di detecting piu' performante: se in un ruleset sono presenti numerose regole che hanno in comune determinate caratteristiche, queste sono conservate come Chain Headers, mentre i caratteri che le distinguono sono conservati come Chain Options. Questo permette al Detection Engine di evitare di valutare numerose espressioni inutilmente. Un esempio chiarira' le idee: si supponga di disporre di un ruleset che contiene qualche decina di regole atte a rilevare eventuali attacchi contro il server ftp della nostra rete; di norma tutte dovrebbero presentare almeno lo stesso indirizzo ip e la stessa porta. Ora, se un pacchetto preso in analisi dal Detection Engine non presenta quelle due caratteristiche contemporaneamente, e' inutile che subisca i test per tutte le decine di regole relative agli attacchi al server ftp. Quindi SNORT conserverebbe l'indirizzo ip e la porta del server ftp come Chain Headers e tutti i caratteri per cui le varie regole prese in considerazione differiscono come Chain Options. Questo schema (preso dalla documentazione di SNORT scaricata dal sito ufficiale e riadattato solo nella forma) dovrebbe chiarire le idee in proposito:
________________________ ________________________ ____________... | Chain Header | | Chain Header | | Chain ... | | | | | | -IP di provenienza | | -IP di provenienza | | -IP di prov... | -IP di destinazione |=>| -IP di provenienza |=>| -IP di prov... | -Porta di provenienza | | -Porta di provenienza | | -Porta di p... | -Porta di destinazione | | -Porta di destinazione | | -Porta di p... |________________________| |________________________| |____________... | | | \'/ \'/ \'/ ________________________ ________________________ | Chain Option | | Chain Option | | | | | | -Contenuto | | Contenuto | | -Flag TCP | : ::::::::: : | -Dimensione payload | . ......... . | -ecc. ecc. | |________________________| | \'/ ________________________ | Chain Option | | | | -Contenuto | | -Flag TCP | | -Dimensione payload | | -ecc. ecc. | : :::: :::: : . .... .... .
Secondo lo schema logico i Chain Header vengono valutati da sinistra verso destra; quando il pacchetto preso in analisi matcha uno di essi vengono valutate le eventuali corrispondenze dei Chain Option. Se il pacchetto non matcha un Chain Header, si passa alla valutazione del successivo.
Il sottosistema di logging/alerting ===================================
SNORT offre al momento 3 opzioni sul logging e 5 sull'alerting, che vengono definite in fase di avvio del programma (tramite switch da linea di comando) o tramite apposite istruzioni da inserire nei file di configurazione (vedi seguito dell'articolo). L'output del sistema di logging puo' essere: - in formato human-readable, che permette un'analisi piu' veloce ma e' poco performante in fase di scrittura dei log su disco; - in formato tcpdump, che presenta caratteristiche opposte; Il logging puo' anche essere disabilitato.
Per quanto riguarda il sistema di alerting, esso puo' effettuare notifiche in vari modi: - via syslog; - registrando tutti gli alert in un apposito file. In questo caso si puo' scegliere tra due tipi di alert logging: - full alerting, che registra nel suddetto file sia i messaggi di alert che l'intera intestazione dei pacchetti "sospetti"; - fast alerting, che registra nel suddetto file solo una parte degli header dei pacchetti "sospetti", metodo che si dimostra, ovviamente, piu' performante del primo in fase di scrittura dei dati su disco. - tramite l'invio di messaggi WinPopup a client Samba; Anche il sistema di alerting, come quello di logging, puo' essere completamente disabilitato.
I ruleset di SNORT ==================
Come accennato in precedenza, uno dei punti di forza di SNORT e' la semplicita' del linguaggio di scripting usato per redigere i ruleset che ne condizionano il funzionamento. Il formato dei ruleset di snort e' abbastanza semplice:
azione protocollo ip_prov porta_prov -> ip_dest porta_dest (opzioni)
dove, ovviamente: - "azione" corrisponde all'azione da eseguire; - "ip_prov" corrisponde all'indirizzo ip di provenienza del pacchetto; - "porta_prov" corrisponde alla porta di provenienza del pacchetto; - "ip_dest" corrisponde all'indirizzo ip di destinazione del pacchetto; - "porta_dest" corrsponde alla porta di destinazione del pacchetto; - "opzioni" corrisponde al campo dedicato alle opzioni della regola descritte in seguito.
L'operatore '->' indica la direzione del traffico ('a -> b' = da 'a' a 'b'). Esso puo' anche essere sostituito con l'operatore '<>', che indica la validita' della regola sia sul traffico in entrata che su quello in uscita ('a <> b' = da 'a' a 'b' e da 'b' ad 'a'). Si noti che le regole di SNORT, dalla versione 1.8 in poi, sono estendibili su piu' righe tramite l'aggiunta di un backslash ('\') alla fine di ognuna di esse.
Il campo "azione" puo' assumere i seguenti valori; - 'alert': fa si' che per i pacchetti che matchano la regola sia generato un alert secondo le impostazioni scelte e successivamente ne venga effettuato il log; - 'log': fa si' che i pacchetti che matchano la regola siano loggati secondo le impostazioni scelte; - 'pass': fa si' che i pacchetti che matchano la regola siano semplicemente ignorati; - 'activate': fa si' che quando un pacchetto matcha la regola sia generato un alert e successivamente sia attivata una regola dinamica (vedi seguito dell' articolo); - 'dymanic': la regola cosi' marcata rimane "inerte" fino a quando non viene attivata da un'altra regola attiva, dopodiche' agisce come una regola di log.
Il campo "protocollo" puo' assumere i seguenti valori, che corrispondono rispettivamente ai nomi dei protocolli che identificano: - tcp; - udp; - icmp; - ip; Altri protocolli dovrebbero essere supportati nelle versioni future di SNORT.
Sia per il campo "ip_prov" che per il campo "ip_dest" il discorso e' leggermente piu' complicato. I valori di questi due campi devono ovviamente corrispondere agli indirizzi rispettivamente di provenienza e di desinazione del pacchetto. Ora, questi due campi possono assumere diversi valori: - un indirizzo ip specifico; - un indirizzo che identifica un'intera subnet (classi A,B,C) - una lista di indirizzi ip; - "any": corrisponde a "qualsiasi indirizzo ip"; E' il caso di fare una precisazione sulla sintassi che SNORT ci permette di usare per definire questi due campi: come noto, esistono subnet di 3 classi: A, B e C; SNORT permette di utilizzare una notazione particolare per esprimere un indirizzo che identifica un'intera subnet:
network_number_identifier/24 (per subnet di classe C - corrisponde al range di indirizzi da x.x.x.0 a x.x.x.255) network_number_identifier/16 (per subnet di classe B - corrisponde al range di indirizzi da x.x.0.0 a x.x.255.255)
Per indicare un host preciso si usa invece la sintassi:
specific_host_ip_address/32
Per specificare una lista di indirizzi ip (tra i quali possono comparire quelli di intere subnet, nella forma sopra specificata), invece, si devono scrivere tra parentesi gli indirizzi che ne fanno parte, separati da virgole e senza alcuno spazio.
I campi "porta_prov" e "porta_dest" possono assumere i seguenti valori: - "any": corrisponde a "qualsiasi porta"; - una porta precisa; - un range di porte; - una lista di porte; Per specificare un range di porte si usa l'operatore ":". Esso puo' essere posto: - tra due porte (identifica le porte da quella a sinistra sino a quella a a destra dell'operatore); - prima di una porta (identifica tutte le porte da 1 a quella specificata) - dopo una porta (identifica tutte le porte da quella specificata alla 65535)
Sui campi "ip_prov", "ip_dest", "porta_prov" e "porta_dest" e' utilizzabile l'operatore di negazione '!' che esprime il concetto opposto a quello specificato dopo di esso. Qualche esempio rendera' meglio l'idea:
Nei campi "porta_prov" e "porta_dest": - '!21' indica tutte le porte eccetto la 21; - '!1:1024' indica tutte le porte eccetto quelle dalla 1 alla 21;
Nei campi "ip_prov" e "ip_dest": - '!192.168.0.1/24' indica tutti gli indirizzi ip al di fuori di quelli della rete locale; - '!62.98.45.183/32' indica tutti gli indirizzi ip al di fuori di 62.98.45.183
Il contenuto del campo "opzioni", che va posto tra parentesi, permette di specificare un elevato numero di opzioni sulla regola, il modo in cui essa agira' nei confronti di un pacchetto che la matcha, ecc. Le opzioni che SNORT permette di utilizzare sono molte, ed alcune di esse sono pensate per un uso avanzato del programma; dal momento che quest'articolo si propone di introdurre il lettore all'uso di SNORT e di chiarirne il funzionamento, e non di essere un vero e proprio manuale, vi rimando alla sua documentazione ufficiale (vedi Riferimenti in fondo all'articolo) per quanto riguarda le opzioni piu' complesse o inusuali. Di seguito sono trattate solo le principali (per completezza e' comunque riportato l'elenco di tutte le opzioni disponibili):
_____________ _________________ __________________ | | | | | Opzioni che | Opzioni che | Opzioni che | | specificano | specificano | modificano il | | azioni da | caratteristiche | comportamento | | compiere | dei pacchetti | di altre opzioni | ______________________|_____________|_________________|__________________| | | | | | | Opzioni descritte | msg | dsize | offset | | in dettaglio: | logto | same_ip | nocase | | | resp | ack | depth | | | | icmp_id | | | | | content | | | | | content-list | | | | | ip_proto | | |______________________|_____________|_________________|__________________| | | | | | | Opzioni non trattate | reference | ttl | Altre opzioni | | in questa sede | tag | tos |__________________| | | react | id | | | | | ipoption | sid | | | | fragbits | rev | | | | flags | classtype | | | | icode | priority | | | | icmp_seq | | | | | session | | | | | rpc | | | | | stateless | | | | | regex | | | | | seq | | | | | itype | | | | | uricontent | | |______________________|_____________|_________________|__________________|
Nota: dopo ogni opzione specificata e' necessario aggiungere il carattere ';'
L'opzione "msg" serve a specificare il messaggio da inviare al sistema di logging o a quello di alerting quando un pacchetto match la regola. La sua sintassi e' la seguente:
msg: "MESSAGGIO";
Le virgolette sono necessarie per evitare che il parser dei ruleset possa andare in confusione.
L'opzione "logto" serve ad indicare a SNORT dove deve loggare i pacchetti che matchano quella specifica regola.
logto: "FILE";
L'opzione "resp" serve a specificare che tipo di reazione attiva SNORT deve mettere in atto quando un pacchetto mathca la regola. Sinatssi:
resp: "PARAMETRO";
Si noti che in caso di parametri multipli questi vanno separati con una virgola. I parametri di quest'opzione sono: - "rst_snd": invia un pacchetto TCP con il flag RST impostato al socket di origine del pacchetto; - "rst_rcv": invia un pacchetto TCP con il flag RST impostato al socket di destinazione del pacchetto; - "rst_all": invia un pacchetto TCP con il flag RST impostato sia al socket di origine che a quello di destinazione del pacchetto; - "icmp_net: invia un pacchetto ICMP del tipo NET UNREACHABLE al mittente; - "icmp_host": invia un pacchetto ICMP del tipo HOST UNREACHABLE al mettente; - "icmp_port": invia un pacchetto ICMP del tipo PORT UNREACHABLE al mittente; - "icmp_all": invia tutti i 3 tipi di pacchetto ICMP al mittente.
E' possibile combinare i vari parametri per ottenere un controllo piu' flessibile sul tipo di azione separandoli con una virgola.
L'opzione "dsize" serve per controllare le dimensioni del payload dei pacchetti; la sua sintassi e' la seguente:
dsize: NUMERO;
Si possono anche specificare range di dimensioni anteponendo a 'NUMERO' i segni '<' e '>' ('minore' e 'maggiore').
L'opzione "content" e' una delle piu' usate. Essa permette di specificare una stringa da cercare nel payload dei pacchetti valutati. Piu' opzioni "content" possono essere specificate nella stessa regola in modo da fornire una maggior precisione nella ricerca di pacchetti sospetti. La sintassi di quest'opzione e' la seguente:
content: "STRINGA";
Si noti che i caratteri '"', ':' e '|' NON possono essere contenuti nella stringa da ricercare in quanto hanno un significato particolare. Nello specifico il carattere '|' e' usato per delimitare una sequenza binaria, espressa tramite un numero esadecimale, all' interno della stringa. E' infatti possibile combinare all'interno della suddetta stringa sia testo che dati in forma binaria, utilizzando la semplice sintassi |HEX_NUMBER| per delimitare i dati in forma binaria. Anche per l'opzione "content" e' possibile utilizzare l'operatore di negazione '!' (che va eventualmente anteposto alla stringa da cercare) per indicare tutti i pacchetti che non presentano al loro interno la stringa specificata. Si noti che il sistema di ricerca della stringa e' CASE-SENSITIVE (vedi seguito dell'articolo per maggiori informazioni). In combinazione con l'opzione "content" ne posso essere usate altre 3: - "offset"; - "depth"; - "nacase";
L'opzione "offset" indica da quale byte del payload deve partire la ricerca della stringa specificata dall'opzione content; la sua sintassi e' la seguente:
offset: NUMERO;
L'opzione "depth" agisce al contrario dell'opzione offset: indica oltre quale byte del payload non e' piu' necessario continuare la ricerca della stringa:
depth: NUMERO;
L'opzione "nocase", come intuibile dal nome, fa si' che la ricerca della stringa specificata nell'opzione "content" non avvenga in maniera CASE-SENSITIVE per la parte testuale di essa (la parte binaria espressa in esadecimale non e' interessata da quest' aspetto).
L'opzione "content-list", invece, permette una ricerca di stringhe multiple. Esse vanno specificate all'interno di un file, una per riga e tra virgolette; la sintassi dell'opzione e':
content-list: "FILE";
dove, ovviamente, FILE e' il file sopra menzionato. Anteponendo l'operatore di negazione a "FILE" si ottiene la ricerca di tutti i messaggi che NON contengono le stringhe specificate in FILE.
L'opzione "ack" fa riferimento all campo ACK dei pacchetti TCP. Come messo in evidenza anche dalla documentazione ufficiale di SNORT, quest'opzione e' particolarmente utile per rilevare attivita' di network-scanning effettuati tramite TCP-PING: uno dei metodi utilizzati per sapere se un determinato host in un rete e' attivo e' quello di inviare a tale host un pacchetto con ACKNOWLEDGEMENT NUMBER settato a '0', in modo tale che, se l'host destintario e' attivo, rispondera' con un pacchetto TCP con il flag RST attivo. Sintassi:
ack: NUMERO;
L'opzione "icmp_id" fa riferimento al campo ID dei pacchetti ICMP. La sua sintassi e' la seguente:
icmp_id: NUMERO;
dove NUMERO puo' assumere diversi valori, tra cui i piu' importanti sono: - "8": richiesta di reinvio dei dati specificati nel datagramma ICMP (Echo); - "0": rispedisce al mittente i dati da esso inviati con richiesta di restituzione (Echo Answer); - "3": destinazione non raggiungibile (il pacchetto non e' potuto arrivare a destinazione); - "4": richiesta di rallentamento nella spedizione di pacchetti; - "5": richiesta di reinstradamento dei pacchetti; - "11": e' scaduto il tempo massimo di vita (TTL) di un pacchetto (Timeout);
L'opzione "ip_proto" serve per effettuare una ricerca mirata all'interno del campo PROTOCOL nell' header dei pacchetti IP. La sintassi e':
ip_proto: NOME;
oppure:
ip_proto: NUMERO;
Anche in questo caso sia a NUMERO che a NOME e' anteponibile l'operatore di negazione. I valori di NOME (con i corrispondenti valori di NUMERO) sono presenti nel file /etc/protocols (sotto OS unix-like). Una breve lista* dei piu' importanti e' riportata qui sotto:
NOME NUMERO DESCRIZIONE
ip 0 # internet protocol icmp 1 # internet control message protocol igmp 2 # internet group management protocol ggp 3 # gateway-gateway protocol ipencap 4 # IP encapsulated in IP (officially ``IP'') tcp 6 # transmission control protocol egp 8 # exterior gateway protocol igp 9 # any private interior gateway (Cisco: for IGRP) nvp 11 # Network Voice Protocol udp 17 # user datagram protocol mux 18 # Multiplexing protocol hmp 20 # host monitoring protocol ipv6 41 # IPv6 ipv6-route 43 # Routing Header for IPv6 ipv6-frag 44 # Fragment Header for IPv6 gre 47 # Generic Routing Encapsulation ipv6-crypt 50 # Encryption Header for IPv6 ipv6-auth 51 # Authentication Header for IPv6 swipe 53 # IP with Encryption ipv6-icmp 58 # ICMP for IPv6 ipv6-nonxt 59 # No Next Header for IPv6 ipv6-opts 60 # Destination Options for IPv6 wb-mon 78 # WIDEBAND Monitoring iso-ip 80 # ISO Internet Protocol eigrp 88 # Enhanced Interior Routing Protocol (Cisco) mtp 92 # Multicast Transport Protocol ipip 94 # Yet Another IP encapsulation micp 95 # Mobile Internetworking Control Pro. etherip 97 # Ethernet-within-IP Encapsulation encap 98 # Yet Another IP encapsulation qnx 106 # QNX ipcomp 108 # IP Payload Compression Protocol ipx-in-ip 111 # IPX in IP smp 121 # Simple Message Protocol sctp 132 # Stream Control Transmission Protocol fc 133 # Fibre Channel
L'opzione "sameip" ha invece lo scopo di verificare se l'indirizzo di destinazione e quello di provenienza coincidono. La sua sintassi e' molto semplice:
sameip;
Ulteriori istruzioni nei file di configurazioen di SNORT ========================================================
Nei file di configurazione di SNORT oltre alle regole sono specificabili ulteriori parametri; vediamo i piu' importanti.
Come vedremo in seguito, alcune opzioni di SNORT vanno impostate tramite switch da linea di comando; tra queste c'e' il file di configurazione contenente le regole che SNORT dovra' utilizzare. Per praticita' e' possibile usare, all'interno di questo file, la direttiva "include", sicuramente familiare a chi programma. Essa serve a comunicare a SNORT in quali altri file trovera' le regole che dovra' utilizzare. Questa direttiva si dimostra particolarmente utile per splittare ruleset di grandi dimensioni. La sintassi e':
include: "FILE"
Sempre all'interno dei file di configurazione di SNORT e' possibile utilizzare delle variabili. La sintassi per dichiararle e' la seguente:
var: NOME VALORE
Per l'uso avanzato delle variabili vi rimando alla documentazione ufficiale di SNORT.
Esempi di rules ===============
Quelli che seguono sono alcuni esempi di rules (tratti dai ruleset scaricati da snort.org) e commentati.
Quella che segue e' una regola atta a segnalare eventuali tentativi di login non andati a buon fine:
alert tcp $EXTERNAL_NET any <- $HOME_NET 23 (msg:"TELNET login incorrect"; \ content:"Login incorrect"; flags: A+; reference:arachnids,127; \ classtype:bad-unknown; sid:718; rev:2;)
Questa rule effettua un ALERT per ogni pacchetto tcp che provenga ('<-') dalla nostra rete ('$HOME_NET') dalla porta 23, nel quale payload sia presente la stringa "Login incorrect", e che abbia il flag ACK settato ('flags: A+'). Si noti che la regola e' valida solo per i pacchetti provenienti dalla nostra rete e diretti verso l'esterno: la stringa cercata sara' infatti inviata dal nostro server telnet al client che fallisce il login.
La seguente regola, invece, genera un alert in caso di un XMAS scan:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"SCAN NMAP XMAS"; / flags:FPU; reference:arachnids,30; classtype:attempted-recon; sid:1228; / rev:1;)
Vengono considerati sospetti i pacchetti tcp provenienti dall'esterno della nostra rete, indipendentemente dalla porta di provenienza e destinazione, che abbiano i flag tcp FIN, PSH e URG settati (l'XMas Tree Scan prevede che tali flag siano attivi, in maniera tale che se il pacchetto spedito e' diretto ad una porta aperta l'host destinatario non rispondera' al pacchetto, se e' diretto ad una porta chiusa l'host destinatario rispondera' con un pacchetto tcp con il flag RST attivo).
Switch da linea di comando ==========================
Al momento dell'avvio di SNORT e' possibile (e talvolta necessario) specificare alcune opzioni da linea di comando. Innanzitutto, la sintassi per il lancio di SNORT e' la seguente:
snort [-switch1 [parametro1 paramtro2 ...]] [-switch2 [parametro1 ...]] ...
Gli switch da linea di comando sono i seguenti: - "-A [fast|full|console|none]": definisce la modalita' di alerting; - "-b": questo switch non accetta parametri ed indica a SNORT di effettuare il logging in formato TCPDUMP (che risulta essere piu' veloce in fase di scritturarispetto dei dati su disco rispetto al formato proposto da SNORT); - "-c [path/file]": a questo switch (strettamente necessario al funzionamento del programma) va fatto seguire il percordo del file primario dei ruleset di SNORT; - "-C": indica a SNORT di omettere dall'output la notazione esadecimale del payload dei pacchetti loggati; - "-D": lancia SNORT in background (daemon mode); - "-h [HOME_NTW_IP]": specifica l'indirizzo della rete locale; - "-i [interface]": l'interfaccia su cui SNORT dovra' mettersi in ascolto; - "-I": indica a SNORT di segnalare negli alert l'interfaccia su cui sono transitati i pacchetti sospetti; - "-l [path/]": indica la directory in cui SNORT piazzera' i log; - "-n [numero]: termina l'esecuzione di SNORT dopo la processazione di 'numero' pacchetti; - "-N": inibisce l'attivita' di logging (quella di alerting continua a funzionare); - "-p": disabilita lo sniffing in promiscuous mode (SNORT processera' solo i pacchetti effettivamente diretti all'host su cui e' in esecuzione); - "-s": invia i messaggi di alert al demone syslogd; - "-V" e "?" mostrano rispettivamente il numero di versione di SNORT e la pagina di help.
Per la lista completa e la descrizione di tutti gli switch fare riferimento alla pagina di help di SNORT.
Un esempio di implementazione =============================
Quella che segue e' la descrizione di come implementare SNORT su una singola macchina connessa ad internet. Ovviamente la situazione proposta e' oltremodo semplice, ma d'altronde il presente articolo intende semplicemente essere un' introduzione al programma e non una guida vera e prorpia. Inoltre, per capire il funzionamento di SNORT e' piu' che sufficiente e puo' permettere alla maggior parte degli utenti di provare questo software anche non disponendo di una rete locale.
Procediamo come sotto indicato: - procuriamoci i pacchetti necessari www.snort.org: - "snort-x.y.z.i386.rpm" (per semplicita' si fara' riferimento al pacchetto RPM e non ai sorgenti, la cui compilazione non e' comunque cosa difficoltosa); - "libnet-x.y.z-snort.i386.rpm" (il pacchetto libnet, da scaricare nel caso non sia gia' installato - e in tal caso da installare prima di SNORT); - procuriamoci (sempre su snort.org) i file di ruleset "preconfezionati"; - supponiamo di aver piazzato i file appena prelevati nella directory temporanea /tmp/snort/; - installiamo le libnet:
[root@hell snort]# rpm -i libnet-x.y.z-snort.i386.rpm
- installiamo il SNORT:
[root@hell snort]# rpm -i snort-x.y.z.i386.rpm
- scompattiamo il tarball dei ruleset:
[root@hell snort]# tar xzvf snortrules.tar.gz
- ora copiamo i file di ruleset (dopo aver scompattato l'archivio in cui si trovano con "tar xzvf snortrules.tar.gz") nella directory che dovra' continuare a contenerli anche in futuro; per l'esempio useremo quella che ho usato sul mio sistema, ovvero /etc/snort/rules.conf;
[root@hell snort]# cp rules/* /etc/snort/rules/
- ora, dal momento che nel nostro caso SNORT deve mettersi in ascolto sull' interfaccia ppp0, che non risulta attiva fino al momento della connessione, e, dal momento che avere SNORT in esecuzione quando non si e' connessi ad internet non risulta affatto utile - nel caso in esame si intende - e, anzi, si traduce uno spreco di risorse, inseriamo la seguente riga nel file /etc/ppp/ip-up:
snort -A fast -c /etc/snort/rules/snort.conf -D -i ppp0
cosi' facendo SNORT verra' automaticamente avviato ad ogni connessione.
Prendiamo ora in esame gli switch: - "-A fast": indica a SNORT di effettuare l'alerting in modalita' 'fast'; - "-c /etc/snort/rules/snort.conf": indica al programma dove si trova il file di configurazione principale; - "-D": serve a lanciare l'IDS in daemon-mode; - "-i ppp0": indica a SNORT su quale interfaccia sniffare i pacchetti.
Non avendo specificato diversamente, i log di SNORT si troveranno nella directory /var/log/snort/.
Ora avete il vostro bel sistema monitorato da un eccellente IDS ;)
Qui si chiude quest'articolo introduttivo a SNORT, nella speranza di aver fatto cosa gradita :)
--------------------------------------------------------------------------------
Riferimenti, disclaimer e informazioni varie
La documentazione integrale di SNORT, che vi consiglio di leggere se volete approfondire le vostre conoscenze sull'argomento, e' reperibile, come anche il programma stesso, i ruleset "preconfezionati", ecc. all'indirizzo del sito ufficiale del progetto:
http://www.snort.org
DISCLAIMER: L'AUTORE DI QUESTO DOCUMENTO NON SI ASSUME ALCUNA RESPONSABILITA' PER L'USO CHE CHICCHESSIA FARA' DELLE INFORMAZIONI IN ESSO CONTENUTE, NE' NE ASSICURA LA CORRETTEZZA E/O LA VERIDICITA'. CHIUNQUE E' LIBERO DI COPIARE, PUBBLICARE E/O DISTRIBUIRE QUESTO DOCUMENTO, PURCHE' RISPETTI LE SEGUENTI CONDIZIONI: - IL PREZZO DI VENDITA DEL SUPPORTO SUL QUALE IL DOCUMENTO VERRA' DISTRIBUITO NON DOVRA' SUPERARE IL COSTO EFFETTIVO DELLA SUA PRODUZIONE; - NEL CASO DI PUBBLICAZIONE IN RETE, NON DOVRA' ESSERE RICHIESTO ALCUN CORRISPETTIVO PER LA CONSULTAZIONE DEL DOCUMENTO STESSO; - IL DOCUMENTO DOVRA' ESSERE MESSO A DISPOSIZIONE NELLA SUA FORMA INTEGRALE E PRIVO DI MODIFICHE; NEI CASI SUDDETTI DI DISTRIBUZIONE AUTORIZZATA PER CORTESIA INVIARE SEGNALAZIONE ALL'INDIRIZZO E-MAIL: scrawlATquipo.it
(Causa motivi legati al mailspamming, e' necessario sostituire con una chiocciola ('@') la particella "AT" dell' indirizzo sopra riportato).
Autore: hylux (#compuita, #spaghettilinux, #redhat, #it - irc server: irc.azzurranet.org).
-------------------------------------------------------------------------------- eof