Předně bych rád zdůraznil, že Sagator je snadné používat. Pro většinu běžných nastavení stačí v distribučním konfiguračním souboru povolit příslušné sekce, vše je navíc detailně popsáno v komentářích okolo. Tento díl a díly následující jsou pro ty, kdo chtějí proniknout trochu hlouběji, případně využívat Sagator nějak alespoň trochu nestandardně.
Tak tedy – co je to skener? Skenerem může být cokoliv, co vezme zprávu a něco provede – ať již se zprávou samou, anebo cosi kamsi uloží, někde něco nastaví, zaznamená a tak podobně. Klasické antivirové skenery jsou pouze jedním typem skenerů v terminologii Sagatoru.
Skenery mají také jednu klíčovou vlastnost – můžete je řetězit. Co z jednoho skeneru vypadne, stává se potravou dalšího, a to tak hluboko, jak se vám zachce.. prostě jako v přírodě. U každého skeneru může dojít k chybě při zpracování, čímž je (nečekaně) navozen chybový návratový stav.
Typy skenerů podle zpracovávaných dat
Skener proudu (streamscanner)
Vstupem mu je datový proud, data se předávají v paměti, což je podstatně rychlejší než skenování souborů. Pokud potřebujete aplikovat proudový skener na soubor, pomůže speciální skener file2stream().
Skener souboru (filescanner)
Vezme soubor a ten prozkoumá. Je sice pomalejší, ale v některých případech není vyhnutí – například pokud potřebujete prohánět zprávy nějakým externím nástrojem, který to neumí jinak – typicky antivirem či antispamem. Proud do souboru snadno zhmotníte skenerem stream2file().
Kombinovaný skener
Je, jak asi tušíte, kombinací proudového a souborového skeneru. Například na vstupu přijímá soubor, ale vystupuje z něj proud, nebo naopak, případně podporuje oba typy dat na vstupu a/nebo na výstupu.
Při řetězení skenerů je třeba pamatovat na kompatibilitu předávaných dat – je zřejmé, že nelze napojit skener, který produkuje soubor, na skener, který na vstupu požaduje proud. Proto
parsemail(string_scan(...))
je v pořádku, zatímco
parsemail(decompress(...))
použít nelze. V takových případech přijdou vhod již zmíněné převodní skenery, tedy např. parsemail(file2stream(decompress(…))).
Typy skenerů podle funkce
Skutečný skener (realscanner)
Skenuje zprávu a informuje o výsledku. Kromě vlastní zprávy nastavuje návratovou hodnotu – buďto prázdný řetězec, což lze interpretovat tak, že zpráva je z pohledu skeneru čistá (neškodný ham), nebo název identifikovaného viru či slovo „SPAM“, což se myslím vysvětluje samo.
Skenovací rozhraní (interscanner)
Tvoří rozhraní mezi základním skenovacím strojem a skutečnými skenery. I ta mohou být všemožně řetězena. Příkladem může být skenování s využitím knihovny antiviru ClamAV. Předtím je provedena analýza MIME, převod z proudu do souboru a dekomprimace:
SCANNERS=[ parsemail( stream2file( decompress( libclam() ) ) ) ]
Nebudu opakovat autora Sagatoru tím, že bych uváděl kompletní přehled skenerů – ten najdete na stránkách projektu.
Operátory a řídící skenery
Kromě skenerů zná Sagator také hrst operátorů, kterými můžete skenery ještě důmyslněji kombinovat. Kompletní přehled operátorů (+ – * / & ~ < > = <= >= !=) a jejich význam najdete opět na stránkách projektu v tabulce, někde ve druhé třetině odkazovaného dokumentu. Kromě operátorů můžete použít také speciální řídící skenery. Dva z nich ještě dnes zmíníme.
Alternativní skenery
Dejme tomu, že používáte ClamD démona, se kterým Sagator spolupracuje při detekci virů. Co když ale z nějakého důvodu ClamD zkolabuje? Sagator může v takovém případě volit řádkové skenovací rozhraní stejného antiviru, případně nějaký úplně jiný postup. K definici takových alternativ poslouží alternatives():
SCANNERS=[ alternatives( clamd(['localhost',3310]), stream2mbox(clamscan([ '/usr/bin/clamscan', '--stdout','--infected', '--disable-summary', '-r','--mbox'])) ) ]
Vynucené použití více skenerů
Většinou bude vhodnější zastavit provádění řetězce skenerů na prvním pozitivním výsledku – pokud je zpráva zavirována jednou, je již vcelku jedno, že je zavirována ještě třikrát a že má také některé rysy spamu.. V určitých případech může být užitečné označit zprávu za škodlivou až poté, co se na pozitivní diagnóze shodne skenerů více. Typicky se může takový postup hodit u antispamů, které pracují podstatně více s pouhými pravděpodobnostmi než antiviry. Poslouží vám match_all():
SCANNERS=[ match_all( skener1(...), skener2(...), ... ) ]
Příště
Snad vás dnešní trochu teoretický díl neodradil – příště se již vrhneme na konkrétní konfiguraci. Napíšeme jednoduchou třídu, která se nám bude hodit při práci se spamy, a také zlokalizujeme nějaké to hlášení.