Buongiorno a tutti, sono o-zone1978, un sistemista informatico che lavora nel CED di un Ente pubblico toscano. Sono quasi 20 anni che lavoro nel settore informatico ed ho iniziato a programmare in C a 14 anni su un Amiga 600. Mi sono poi indirizzato verso lo sviluppo di applicativi web, in PHP, ed ultimamente ho ripreso a sviluppare in Python per la sua ampia disponibiltià anche su sistemi embedded. Grazie alla disponibilità dei ragazzi di /r/ItalyInformatica, oggi vi presento Nidan, un progetto a cui sto lavorando attivamente ormai da qualche mese. Ma andiamo con ordine…
SCENARIO 1 – Come molti di voi, anche io ho una linea ADSL ed un router wifi che utilizzo per connettermi ad Internet con tutti i miei dispositivi informatici: tablet, smartphone, notebook, smart tv. Per sicurezza, la mia rete WIFi è protetta con protocollo WPA2 ma capita, certe volte, di dare ad amici e parenti che vengono in visita la chiave per connettersi ad Internet. Inoltre, come sapete, il protocollo WPA2 non è immune da attacchi e potrebbe accadere che qualche vicino un po’ troppo smaliziato decida di provare ad entrare nella mia rete casalinga, dove peraltro ho un NAS con l’archivio fotografico di famiglia e molto altro. Se dovesse riuscirci, come potrei scoprirlo ? Si, ok, magari potrei notare traffico anomalo o rallentamenti sospetti. Ma se il vicino è davvero bravo, scoprire che mi ha “bucato” la rete wifi sarebbe davvero dura.
SCENARIO 2 – Sono un sistemista informatico e lavoro nel CED di un grande Ente della mia città. La rete dell’Ente è molto grande e si sviluppa attraverso decine di edifici in tutta la città ed anche fuori. A questa rete sono collegati centinaia di PC, sia fissi che portatili, ed alla relativa WiFi si collegano quotidianamente migliaia di dispositivi. Certo, abbiamo firewall, antivirus e NIDS a protezione della Rete, compreso un database di tutti gli IP forniti (niente DHCP qui !) agli utenti. Tutto questo però non ci ha impedito di avere qualche problema con WannaCry, che si è diffuso attraverso gli host con MS Windows non adeguatamente protetto. Ma, in una rete così grande, come possiamo tenere sotto controllo cosa avviene e quali host sono collegati e relativi servizi ?
Conosciamo tutti, lo spero, Nmap: è lo scanner di Rete per eccellenza, che permette di effettuare scansioni anche approfondite in un certo range di rete, restituendo l’elenco degli host e relativi servizi. Ma Nmap è un tool da far girare da consolle, ricordandosi di farlo e comunque diventa difficile confrontare i risultati con le situazioni precedenti.
Nidan nasce proprio per questo motivo. Prendendo ispirazione dal più noto portale Shodan (shodan.io), mi sono immaginato qualcosa dedicato alle reti private: un sistema che effettua scansioni periodiche sulle reti indicate e confronta i risultati, segnalando eventuali discrepanze.
Da qui, ho iniziato a sviluppare un software composto da una interfaccia web scritta in PHP che, attraverso una interfaccia REST, invia comandi agli agenti di scansione, sviluppati in Python e interfacciati con nmap attraverso python-nmap. Gli agenti effettuano un polling periodico sul controller web, permettendone l’installazione anche all’interno di reti private dietro NAT: un esempio tipico è un agent installato su un Raspberry Pi, connesso alla intranet casalinga, che si collega al controller web installato su una piattaforma di hosting remota. Oppure, nel caso di una rete MAN molto grande, può esserci un agent per ogni segmento di rete, che si interfaccia con un unico web controller da dove avere una panoramica completa di tutti gli host e servizi.
Ricapitolando, Nidan si compone di una interfaccia web sviluppata in PHP con un server REST in attesa delle richieste da parte degli agent.
Attualmente le chiamate implementate sono:
- /agent/start – Agente in linea e pronto – Viene inviata la chiave API necessaria al riconoscimento e l’hostname del sistema dove l’agent è installato
- /agent/stop – Agente interrotto – Viene inviata la motivazione dell’interruzione, come un SIGHUP, SIGKILL o altro
- /job/get – L’agente chiede se ci sono lavori da effettuare – Il web controller risponde con i dettagli del lavoro (scansione rete/scansione host), se presente, e lo segna come “avviato”
- /job/set – L’agente comunica al controller una modifica al lavoro assegnato, come la conclusione o un errore in fase di esecuzione
- /host/add – L’agente, durante la scansione di una rete, comunica al controller l’individuazione di un host ed invia i parametri (IP, MAC, Vendor…)
- /service/add – L’agente, durante la scansione di un host, comunica al controller l’individuazione di un servizio aperto e ne invia i relativi parametri (porta, banner…)
(maggiori dettagli nel codice sorgente, al file /rest/NidanController.php n.d.r.)
Il controller web effettua quindi tutta una serie di confronti ed emette degli “eventi” (come host_add, host_change, service_add, service_change….) con i relativi dettagli, memorizzati sulla tabella EventsLog. Periodicamente lo script cron.php lavora gli eventi a seconda dei triggers utente impostati ed effettua le operazioni indicate (attualmente è implementato solo l’invio di una e-mail).
Questa architettura permette di avere un unico punto di controllo per “N” agenti di scansione, che possono essere, come già detto, installati in diverse parti della nostra rete, definendone le reti da controllare e sapendo se sono in linea o no (funzionalità utile, ad esempio, per sapere se una certa postazione ha un black-out). Permette anche di avere una idea precisa dei tempi di scansione delle varie reti. Inoltre la struttura è concepita per poter implementare, in un prossimo futuro, anche ulteriori funzioni come l’identificazione di nuovi host via ARP (analogamente a arpwatch) oppure di automatizzare la verifica di eventuali vulnerabilità (mi viene in mente WannaCry) e segnalarne al gestore della Rete.
Il progetto, attualmente ancora in fase pre-produzione, è totalmente open-source.
Gran parte delle funzionalità sono già state sviluppate e potete recuperare il codice e le istruzioni di installazione sul sito del progetto
Scritto da /u/o-zone1978