Hlavní navigace

Sagator (5): Skenery prakticky

29. 4. 2005
Doba čtení: 4 minuty

Sdílet

Minule jsme začali konfigurovat Sagator – vytvořili jsme vlastní jednoduchou třídu pro manipulaci s předmětem zpráv a lokalizovali jsme hlášení o nedoručení nebezpečné zprávy. Dnes rychle přeběhneme několik systémových nastavení a zaměříme se především na sekci SCANNERS[].

Systémová nastavení

Sagator zaznamenává zajímavé dění do logu – viz níže. Co všechno považujete za zajímavé vy, můžete systému stanovit proměnnou DEBUG_LEVEL. Jak je zvykem, vyšší číslo zahrnuje rovněž všechny zprávy patřící do kategorie s číslem nižším. Pokud chcete logovat jenom naprosté minimum, zvolte 0 – dozvíte se jenom závažné chyby. Pro běžné použití je optimální hodnota 3. Pokud budete hledat nebo hlásit potíže či dokonce bugy v programu, zkuste volbu vyšší, například něco mezi 4 a 7. Čísla vyšší než 9 raději nepoužívejte vůbec – desítka je vhodná pouze pro testování při vývoji a například po sobě ani nemaže soubory vytvořené v /tmp.

DEBUG_LEVEL=3 

Pak je tady trocha klec, jméno a skupina pro běh systému, port a adresa, na které běží SMTP server…myslím, že význam je jasný, navíc jsme to již řešili v druhém dílu v rámci instalace…

CHROOT='/var/spool/vscan'
LOGFILE=CHROOT+'/var/log/sagator/sagator.log'
USER,GROUP='vscan','vscan'
SMTP_SERVER=('127.0.0.1',26) 

Tak tady mám nadefinované kategorie zpráv podle detekované infekce. Sice je až na jednu výjimku nepoužívám, mám je tady ale tak nějak pro všechny případy – člověk nikdy neví, k čemu se mohou hodit..

DROP_INFECTED='.'
# DROP_SELECTED='(worm|@mm|Sobig|Klez|Bugbear|Gibe|Swen|Mimail|Sober|Bagle|Mydoom|Novarg|Lirva)'
# DROP_NOTHING='dasfadsffad'
# DROP_EVERYTHING='' 

Antivirové skenery

Konečně se dostáváme k jádru věci, ano, tady je to místo, kde jednotlivé zprávy obdrží své rozsudky..

SCANNERS=[
log(3,log.FORMAT, 

Nejprve si poradíme s viry..

status("Virus", 

Raději vše, co následně zlikvidujeme, schováme do karantény..

quarantine('/tmp/quarantine/%Y%m','', 

Nějakou dobu jsem používal omezení velikosti zpráv, nakonec jsem ale raději nastavil message_size_limit přímo v Postfixu. Proto je tato sekce zakomentářovaná. Můžete si všimnout také použití operátoru &.

# max_file_size(7*1024*1024,'FileSizeOverrun (Priloha vetsi nez 7MB)') & 

Zprávy se spustitelnými soubory (exe,com,scr..) v přílohách nezaslouží nic jiného než likvidaci:

parsemail(file_type({'exe': 'Executable (Spusitelny soubor)'})),
), 

O tom, že jim do schránky směřovala nebezpečná zpráva a že byla zlikvidována, informuji uživatele. Možná soudíte, že tím uživatele zbytečně otravuji a něco na takovém názoru asi skutečně je. Na druhou stranu někteří naši uživatelé takové oznamování vyžadovali, aby měli jistotu, že jim nějaká důležitá příloha neunikne.

Asi se shodneme na tom, že opravdovou hanebností je obesílání odesílatelů informacemi o tom, že z jejich počítače byl vyslán virus a že jsou pravděpodobně zavirováni – jak je známo, drtivá většina virů falšuje adresy odesílatele, a tak varování stejně dostane někdo nevinný. Takové zprávy spíše zavánějí reklamními snahami tvůrců antivirových systémů. Myslím ale, že morálka se v tomto směru trochu zlepšuje..

Autor Sagatoru SAL se zmínil, že pracuje na webovém rozhraní, přes které si bude moci sám uživatel obsluhovat svou karanténu, a také na možnosti shrnout všechna podobná hlášení do jednoho velkého digestu, který by se rozesílal v pravidelných intervalech (třeba denně)… Obě vylepšení působí zajímavě a jistě to bude lepší řešení než to moje stávající – už se těším, jak budu moci tuto část konfigurace zlikvidovat.

Dále si můžete všimnout, že pro hledání virů používám libclam, což je prý podstatně lepší než řešení s démonem clamd – spolehlivější a podstatně rychlejší.

report_recipients(REPORT_MSG,
  quarantine('/tmp/quarantine/%Y%m','',
    drop(DROP_INFECTED,
      stream2mbox(libclam()),
)))), 

To by bylo k virům z mé strany vše. Další kapitolou je spam, nuže vrhněme se na něj. Jak jsem naznačil v úvodu minulého dílu, moje požadavky byly trochu atypické. Princip řešení, které mi umožnilo jich dosáhnout, je následující:

Antispamové skenery

Připomínám, že požadavkem je dvoustupňové nakládání s odhalenými spamy – jisté likvidujeme, pravděpodobné označujeme. Jak na to? Nejprve zprávu proženeme SpamAssassinem, výsledek uložíme do pomocné proměnné skenerem store(), přejmenujeme název viru na '' a spamlevel na 0. Tím vlastně říkáme, že v této fázi se zprávou nebudeme nic provádět, ať už obsahuje třeba celou lékárnu ;-)

status("Spam",
  rename('',
    store('t',
      spamassassind(['127.0.0.1',783])) * const(0.0)
), 

Až teď je vhodná doba na vlastní soud. Zprávy se Sagator spam levelem nižším než 1 jsou prohlášeny za nevinné, a tak název viru ponecháme prázdný. Všechny těžké hříšnice, tedy ty, co dostaly Sagator spam level vyšší než 1,75 (a tedy SpamAssassin spam hits vyšší než 1,75 násobek REQUIRED_HITSu), bez milosti dropneme. Pro vytažení dříve uložené hodnoty spam levelu poslouží restore().

drop('.',
  rename('$STARS',
    restore('t')>=const(1.75)
)), 

Kde si nejsme úplně jistí (tedy u levelů mezi 1.0 a 1.75), nastavíme název viru podle spam hits SpamAssassinu, vyjádřených hvězdičkami. V předmětu zpráv se tedy objeví něco jako „SPAM *****“. Následně vynutíme doručení takto ocejchovaných zpráv.

deliver(
  modify_subject('[%V]',
    rewrite_name('$VNAME $STARS',
      restore('t')
)))))] 

A to je zhruba vše podstatné. Konfigurák obsahuje ještě druhou sekci, kde je třeba specifikovat jednotlivé servery Sagatoru. Jak vidíte, zde jsem si vystačil s docela úsporným tvarem – kromě vlastního skenovacího serveru mi běží už jen sběrač údajů pro statistiky MRTG.

skoleni

SRV=[
  collector('127.0.0.1',28),
  smtpd(SCANNERS,'127.0.0.1',27)
] 

Kompletní konfigurační soubor, který jsem zde popisoval, je součástí sbírky dalších atypických konfigurací vystavených na webu Sagatoru.

Příště

Zmíníme se o tom, jak lze provádět kontrolu naplněných poštovních schránek, jak lze vracet z karantény, a o pár dalších drobnostech…