Suricata je open source Intrusion Detection System (IDS), a když se to správně nastaví, tak i Intrusion Prevention System (IPS). Co to znamená a jak to funguje?
Zjednodušeně by se možná dalo říct, že je to takový “síťový antivir”. Vezmeme všechny data, které jdou po síti a zkoumame je. V případě, že tam najdeme něco podezřelého, tak to hlásíme nebo přímo provoz zakážeme (to už je IPS).
Na switchi nebo na routeru se nastaví tzv. span port neboli port mirroring (například OpenWRT), takže se veškerý provoz protékající routerem přesměruje do počítače, kde je nainstalované IDS. Tento počítač má nastavenou síťovou kartu v promiskuitním režimu, tzn.
příjmá i provoz, který není určený přímo pro něj a může jej dále zpracovávat.
Suricata je podobná snortu nebo wiresharku. Ze vstupních dat se nejdříve poskládá původní komunikace. Síťové protokoly posílají data v blocích a potvrzují si jejich přijetí. Tyto data je potřeba poskládat dohromady a “naparsovat” t.j. identifikovat jednotlivé části protokolu. V takto připravených datech se následně hledají podezřelé věci. Suricata a snort vytvářejí pracovní pozice desítkám lidí, kteří píší tzv. pravidla, které mají za úkol odhalit. Pravidlo vypadá například takto:
drop tls $HOME_NET any -> $EXTERNAL_NET any ( msg:”Hazard detected”; tls_sni; content:”uctenkovka.cz”; sid:11234; rev:1; )
(Michal Hrušecký na twitteru)
V tomto případě se podívá do SNI (Server Name Identification) a pokud je tam slvo uctenkovka.cz, tak hlásí událost hazard.
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:”ET MALWARE 2020search/PowerSearch Toolbar Adware/Spyware – GET”; flow:established,to_server; content:”GET”; nocase; http_method; content:”IpAddr=”; nocase; http_uri; content:”&OS=”; nocase; http_uri; content:”&RegistryChanged=”; nocase; http_uri; content:”&RegistryUpdate=”; nocase; http_uri; content:”&NewInstallation=”; nocase; http_uri; content:”&utilMissing=”; nocase; http_uri; content:”&Basedir=”; nocase; http_uri; content:”&BundleID=”; nocase; http_uri; content:”&InitInstalled=”; nocase; http_uri; content:”&Interval=”; nocase; http_uri; content:”&LastInitRun=”; nocase; http_uri; content:”&LastInitVer=”; nocase; http_uri; content:”&LastSrngRun=”; nocase; http_uri; content:”&LastUtilRun=”; nocase; http_uri; content:”&SrngInstalled=”; nocase; http_uri; content:”&SrngVer=”; nocase; http_uri; content:”&UtilInstalled=”; nocase; http_uri; content:”&UtilVer=”; nocase; http_uri; content:”&PCID”; nocase; http_uri; reference:url,vil.nai.com/vil/content/v_103738.htm; reference:url,www.sunbeltsecurity.com/ThreatDisplay.aspx?tid=13811&cs=1437A28B7A90C4C502B683CE6DE23C4E; reference:url,www.symantec.com/security_response/writeup.jsp?docid=2004-111918-0210-99; reference:url,doc.emergingthreats.net/2009807; classtype:trojan-activity; sid:2009807; rev:5; metadata:created_at 2010_07_30, updated_at 2010_07_30;
(Emerging threats open source rules)
Když se v datech potom najde něco podezřelého, tak se to zapíše jako json do logu. Když se to celé napojí na logstash, elastic search a kibanu, tak se v tom dá vyhledávat. K tomu se přidá ještě oinkmaster pro aktualizaci pravidel a je z toho linuxová distribuce SELKS.
V http provozu se dá vyhledávat poměrně dobře, problém je samozřejmě šifrovaný provoz. Můžeme extrahovat i soubory nebo dělat zkoumat soubory antivirem. Jednoduše vezmeme databázi “otisků prstů” md5 z ClamAV a kontrolujeme soubory jdoucí po síti stejně jako na lokálním počítači. Trošku chybí podpora dalších protokolů jako je například samba (sdílení souborů) nebo nfs, takže sledování lokální sítě nemá v tuto chvíli úplně smysl. Bohužel nejde jednoduše vzít implementaci z wiresharku právě kvůli tomu paralelnímu zpracování.
K čemu to vlastně je? Velký bratr samozřejmě. Původně jsem chtěl napsat bezpečnost, ale nějak jsem to slovo nedostal přes klávesnici (-; Bezpečnost na úkor soukromí nebo soukromí na úkor bezpečnosti už je ale jiná debata..