
Logger DNS passivo basato su rete che cattura e registra le query DNS dal traffico live o da file pcap, producendo output JSON per l'integrazione con piattaforme SIEM e di threat intelligence.
Registrazione DNS basata su rete in Go
Un logger DNS basato su cattura di rete, ispirato da https://github.com/gamelinux/passivedns. Utilizza gopacket per gestire libpcap e l'elaborazione dei pacchetti. Produce log in formato JSON. È progettato per gestire la cattura di query ad alto volume in ambienti con da uno a centinaia di resolver DNS.
È una buona scelta. Ho costruito questo perché credo che compiti come l'elaborazione di grandi quantità di dati non affidabili con molti casi limite scarsamente documentati dovrebbero essere gestiti da un runtime gestito per prevenire attacchi di corruzione della memoria. Ho implementato PassiveDNS in diverse organizzazioni, e ho costruito gopassivedns per risolvere alcuni specifici punti critici che ho osservato: avevo bisogno di strumentare molte postazioni, avevo bisogno di scalare il livello di archiviazione per gestire MOLTE ricerche e volevo una suite di test con buona copertura su tutti i casi limite DNS.
Anche una buona scelta. Sistemi come Bro sono generalmente implementati sulle uscite di rete, il che ha la conseguenza di mascherare la vera fonte della ricerca dietro i vostri resolver ricorsivi. Questo significa che generalmente dovete implementare Bro e fare logging delle query dei resolver (supponendo che possiate), e integrare i log di entrambi in un sistema di logging centrale per tracciare una ricerca fino a un client. gopassivedns è stato progettato per essere implementato sui vostri resolver senza modifiche alla configurazione del resolver e/o sulle vostre uscite di rete, registrare centralmente tramite un protocollo affidabile e analizzare semplicemente in qualsiasi sistema di log.
Il supporto dei resolver per il logging delle query, inclusi sia la domanda che la risposta, è al massimo incostante. Uno dei server DNS più diffusi, BIND, non lo supporta affatto. Altri, come Windows DNS, hanno formati di log davvero orribili. Inoltre, il logging basato su rete catturerà le query inviate direttamente a server remoti (es. Google DNS) dai vostri client.
Le opzioni di configurazione possono essere specificate come variabili d'ambiente, in un file .env o da riga di comando. La priorità è: flag da riga di comando, file .env e infine variabili già definite nell'ambiente. Le opzioni di configurazione sono le seguenti:
Devi fornire -dev o -pcap.
Ci sono problemi noti con le goroutine e il normale processo di daemonizzazione (https://github.com/golang/go/issues/227), quindi raccomando vivamente di utilizzare uno dei metodi descritti qui: http://stackoverflow.com/questions/10067295/how-to-start-a-go-program-as-a-daemon-in-ubuntu per eseguire questo processo come demone usando strumenti di sistema.
Se scegli di utilizzare il logging syslog, utilizziamo "log/syslog" di Go che richiede che un socket Unix usato per comunicare con syslog si trovi in uno di /dev/log, /var/run/log o /var/run/syslog.
Hai 3 scelte: implementarlo sul/i tuo/i resolver o implementarlo sul/i tuo/i gateway o entrambi. Implementarlo sui tuoi resolver è buono perché otterrai l'indirizzo IP del client che ha inviato la richiesta originale. Puoi anche vedere la tratta upstream della richiesta (dal resolver al prossimo resolver nella catena), a meno che non si regoli il filtro BPF per ignorare quella tratta. Implementarlo sui tuoi gateway significa che non vedi la tratta client -> resolver interno, quindi può essere difficile ricondurre una richiesta a un client specifico. D'altro canto, vedrai le richieste che bypassano i tuoi resolver interni. Vedrai anche, ovviamente, le query provenienti dal resolver verso il resolver upstream che utilizza. In un mondo ideale, implementerei questo strumento su ciascuno dei miei resolver interni e su un tap sui miei gateway. I resolver interni avrebbero un filtro BPF tale da ignorare la tratta upstream della query, mentre il gateway non ignorerebbe nulla.
Al momento, consiglierei di usare logstash per spedire i log a un cluster elasticsearch. Tutti i log sono in JSON, quindi dovrebbe essere abbastanza facile. Suggerirei anche di usare qualcosa come HDFS per l'archiviazione a lungo termine e l'analisi di massa. Le query DNS sono una fonte incredibile di dati interni!