Email Server - Extended Spam filtering

From berki WIKI
(Redirected from Spam szűrés)
Jump to: navigation, search

Contents

Eszközök

Spamassassin tanítása

Bayes DB

A felhasználók által bekategorizált SPAM és HAM levelek segítségével lehet tanítani a spamassassin-t a sa-learn program segítségével. A spam és ham levelekből egy lokális adatbázis fog készíteni, amit fel fog használni az új levelek ellenőrzése közben a spamassassin.

A kézi tanításon kívül, a spamassassin képes maga is hozzáadni leveleket a ham ill. a spam adatbázisokhoz ha meghaladnak egy bizonyos pontszámot.

AWL

AutoWhiltList
A spamassassin képes egy saját statisztikát készíteni a küldőkről a from mező és az IP cím alapján. Egy átlag spam pontszámot tart nyilván minden küldőre, amit beleszámol a spam eredménybe. Az átlagot folyamatosan karbantartja, frissíti.

Az adatbázis lehet a felhasználó ~/.spamassassin mappájában vagy sql adatbázisban.

DNS alapú biztonság

Az itt felsorolt eszközök mögött ugyan az az alapötlet húzódik. A kiküldött emaileket lássuk el egy olyan biztonsági mechanizmussal, amik már egy mindenki által használt, biztonságos, megbízható és nem utolsó sorban szabványos infrastruktúrán alapszanak, ami a DNS (Domain Name Service). Ezen felül fontos, hogy ha az emailt fogadó kliens nem támogatja ezen biztonsági kiegészítéseket ne okozzon fennakadást az email feldolgozásában. Két teljesen eltérő megközelítést fogunk látni.

SPF

(Sender Policy Framework) http://www.openspf.org/SPF_Record_Syntax

Elsőként nézzük az SPF-et, mivel az alapelv nagyon egyszerű. A szabvány lényege, hogy az email domain-ünk DNS kiszolgálójától le lehet kérdezni, hogy milyen email szerver (IP cím) jogosult állításunk szerint kiküldeni a domain-hez tartozó email címeket. A megengedett szerverek listája mellett egy ajánlást is csatol a DNS szerver, hogy mit tegyen a kliens ha nem megfelelő szervertől kapta a mi domain-ünket tartalmazó levelet. Több szervert is fel lehet sorolni, ha relay hoszok is részt vesznek a küldésben.

Tehát semmilyen plusz mezőt nem kell elhelyezni az email fejlécében, pusztán egy rövid TXT típusú DNS rekordot kell beállítani a damonnevünkhöz a DNS szerveren.

Ha a fogadó email rendszerben van SPF ellenőrzés, akkor minden egyes email-ből kiolvassa a FROM mezőt (pl: adam@berki2.org), majd egy DNS kéréssel lekéri a domain-hez tartozó TXT rekordot (berki2.org). Ha nem talál ilyet, akkor semlegesen folytatódik az email feldolgozása. Ha viszont talál, akkor a válasz tartalmazza azon szerverek listáját, akik kiküldhetnek olyan leveleket ahol a domain berki.org. Ekkor megnézi hogy a levelet közvetlenül milyen hoszt küldte (ezt nem lehet hamisítani, hálózati szintű adat), és megnézi, hogy benne van e a megengedett szerverek listájában. Az már a spam szűrő belügye, hogy a negatív és a pozitív esetekre mennyi pontot ad. Általában elmondható, hogy mindkét esetben nagyon minimális jutalom vagy büntető pontokat szoktak adni (tipikusan a jutalom pont -0.001 szokott lenne)

ImportantIcon.png

Note
A spam szűrő rendszerek a dinamikus IP cím használatáért valamennyi büntető pontot kiosztanak, de nem túl nagy ez a szám, általában ez nem elég ahhoz hogy spam-nek tekintsék a levelünket. Viszont ha nincs SPF-ünk, akkor fekete listára kerülhet a domain nevünk, ha a nevünkben leveleket küldenek


DKIM

DKIM (DomainKeys Identified Mail): http://www.dkim.org/

Áttekintés

A DKIM egy sokkal bonyolultabb rendszert használ. Egyrészt épít speciális DNS rekorodkra, másrészt az email-ben is extra mezőket helyez el a fejlécben. A rendszer lényege, hogy a küldő email szerver a levél egyes elemeit egy titkos kulccsal aláírja. (tipikusan: From, To, subject..) Az email domain DNS kiszolgálójától egy speciális TXT rekordból lekérdezhető a publikus kulcs, amivel bárki ellenőrizheti az aláírást. A fogadó DIKM modulja a FROM mezőben lévő domain névhez tartozó DNS szervertől lekérdezi a publikus kulcsot, majd megnézni, hogy tényleg azok az értékek lettek aláírva, amit az email fejléce, törzse, borítékja..stb (beállítás kérdése, hogy mit írjunk alá) tartalmaz. Alap esetben itt is a spam szűrőre van bízva, hogy mit tegyen pozitív és negatív eredmény esetén. Itt sem szokás túl nagy büntető vagy jutalom pontokat osztogatni.

Tehát a DIKIM nem biztosítja, hogy nem küldenek leveleket a nevünkben (erre a SPF szolgál), ellenben a ténylegesen általunk küldött levelekre garantálja, hogy tőlünk jött és azon nem módosítottak.

DNS lekérdezés

A DKIM titkos kulcsot <selector>_domainkey.<domain név> formájú DNS rekordokba kell elmenteni. A selector értéke bármi lehet, ezt az email is tartalmazni fogja. Ez lehetővé teszi, hogy egy domain-hez több kulcsot is elhelyezzünk, és kiküldéskor szabályozhassuk hogy melyike takarjuk használni. Nálunk csak egy lesz. Pl: default._domainkey.berki2.org. A mi példánk alapján a kiküldött email DKIM s mezőjében el lesz helyezve a default szelektor. A feldolgozó fél ez alapján össze tudja állítani a default._domainkey.berki2.org lekérdezést, hogy megkapja a publikus kulcsot.

A DNS szerverben a <selector>_domainkey.<domain név> rekordhoz minimum az alábbi szöveg füzért kell elhelyezni:

v=DKIM1; p=MIGfMA....

Ahol a v=<verzió, jelenleg mindig DKIM1>, a p=<publikus kulcs>


DNS fejléc az emailben

A DKIM -el aláírt levelek fejlécében megjelenik a DKIM-Signature mező, ami minden szükséges információt tartalmaz az sikeres ellenőrzéshez:

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=berki2.org; h=
	subject:subject:from:from:x-mailer:message-id:content-type
	:content-type:date:date:mime-version:received:received; s=
	default; i=adam@berki2.org; t=1475268891; x=1477083292; bh=kDQCL
	6pC8eJS1CqCgI+9s/sBS5gypRoDxojgpdCITD8=; b=1GCR9TjLAvXBbqN3ft+5f
	1GDZIVVtsE88MKzNDigWip9hQlhG6HsBvdPSxSe0ZdbQq6jEik///V9VmDjmv0Zy
	M/EIaeRZR5GGOFRX5FIi6A4nE/FpHpMrgfLdj6j2cBw6I35g8F3PzU2j447h9hES
	crBvasqiCPibe64lRZoCWc=

A DKIM mező DKIM header mezőkből épül fel: v=, a=, c=.... Ezen mezők részletes leírását a DKIM RFC-ben olvashatjuk el: https://tools.ietf.org/html/rfc4871#section-3.5
Ezen DKIM header mezőket az amavisd.conf fájlban hangolhatjuk, lásd: amavisd.conf
A fontosabb mezők a következők:

  • c: Azt mondja meg a fogadónak, hogy milyen szigorúsággal hasonlítsa össze a kiküldött aláírást külön választva <fejléc szigorúság>/<törzs szigorúság>. A "relaxed/simple" az általános érték.
  • d: Ebben állítjuk hogy mi kik vagyunk, ezt kell majd összevetni részben az aláírásban található domain névvel.
  • h: Azt mutatja meg, hogy az eredeti email-ben melyik header mezőket írtuk alá. A DKIM aláírás ezeket pont ebben a sorrendben kell tartalmazza. Látható, hogy az email tárgyát, küldőjét, címzettjét is aláírjuk, de a törzset nem.
  • s: Ez a DNS rekrod szerlektor mező, ezzel kell lekérdezni a publikus kulcsot: <selector>_domainkey.<domain név>
  • b: Ez a mező hordozza az aláírást, amit a publikus kulccsal verifikálni akarunk.

ADSP kiegészítés

Az ADSP (Author Domain Signature) az eredeti DKIM szabvány kiegészítése ami nagyon hasonlít a SPF-ben látott megoldáshoz. Egy külön TXT rekordban extra információt helyezünk el, ami azt mondja meg, hogy a DKIM aláírásnak tartalmaznia kell e a feladót is (FROM mező, és a feladó domaon nevét, ami a DKIM aláírás i vagy b mezője), valamint ha nem találja az aláírást, akkor mit ajánlunk, a fogadó mit csináljon az emaillel. A _adsp._domainkey.<domain név> TXT típusú rekordban a dkim=<ADSP típus> szöveget kell elhelyezni. A következő típusok közül választhatunk:

  • unknown, which is the same as not defining any record, says the domain might sign some, most, or all email,
  • all says all mail from the domain is signed with an Author Domain Signature,
  • discardable says all mail from the domain is signed with an Author Domain Signature; furthermore, if such signature is missing or invalid, the domain owners want the receiving server to drop the message; that is, silently throw it away.[2]

Lényegében az ADSP kiegészítés az mondja meg, hogy ha rossz DKIM aláírást talál, vagy ha nem talál DKIM aláírást akkor mit tanácsos tenni az emaillel. A discardable beállítás esetén azt tanácsoljuk, hogy haladéktalanul dobja el a fogadó az emialt ha nem talál aláírást, vagy az hibás.

ImportantIcon.png

Note
A valóságban a rendszerek nagy része nagyon megengedő a DKIM hibákkal kapcsolatban. A gmail nem is veszi figyelembe az ADSP kiegészítést, hiányzó aláírás esetén semmilyen büntető pontont nem ad. Ha valaki bünteti is az ADSP hibát akkor is alacsony pontszámmal.


Ennek az az oka, hogy sokszor a feladónak nincs ráhatása az összes emailre, vagy idegen rendszerek útközben jóindulatúan módosítják az email egyes elemeit, amitől az aláírás érvényét vesztheti. Ezért nem tanácsos az egész emailt aláírni csak a fejléc legfontosabb mezőit: tárgy, from, to, date

TipIcon.png

Tip
A no-ip.com dinamikus DNS szolgáltató is támogatja a DKIM használatát


Hash adatbázis alapú megoldások

A következő három módszerben az a közös, hogy valamilyen algoritmus alapján elkészítik az üzenet hash lenyomatát, amit összevetnek egy központi adatbázissal.

Pyzor

http://pyzor.readthedocs.io/en/release-1-0-0/introduction.html

A Pyzor egy közösségi spam adatbázis, kliens - szerver architektúra. A beérkező levélből a Pyzor kliens készít egy lenyomatot, egy hash-t, amit elküld a Pyzor szervernek. A válaszban a szerver visszaküldi, hogy az adott hash már jelentették e. Ha igen, akkor fehér vagy fekete listán van, és hányszor jelentették. Ezt az információt a Pyzor átadja a szkennelő szoftvernek, ami eldönti, hogy mit kezdjen az adott email-el.

Lehetőség van saját Pyzor szerver működtetésére, azonban tanácsos a hivatalos szervert használni, amit csak úgynevezett "spam" szakértők taníthatnak, átlagos felhasználók csak lekérdezéseket futtathatnak rajta.

ClipCapIt-160921-001126.PNG

Vipul's Razor

https://en.wikipedia.org/wiki/Vipul%27s_Razor
A Razor a Pyzor-hoz nagyon hasonló eszköz, a kliens szintén egy hash-t készít a levélből, amit összevet a szerveren lévő adatbázissal. Egy mutálódó spam tartalomól ugyan az a hash előállhat így hiába variálja a támadó a tartalmat, a razor mindig észre fogja venni. A razor rendszere valamivel hatékonyabb mint a pyzor, nagyon a mögötte lévő közösség.

Több email kliens közvetlenül is támogatja a razor használatát kliens oldali spam szűrésre.

DCC

Distributed Checksum Clearinghouses
https://www.dcc-servers.net/dcc/
A DCC alapelve nagyon egyszerű. A DCC kliens mikor átmegy rajta egy email készít belőle egy megadott algoritmussal egy hash kódot, amit elküld a DCC szervernek. A DCC szerver nem csinál mást mint számlája, hogy egy adott hash-böl hány van. Mikor elküld a mi DCC kliensünk egy hash-t a szervernek, akkor ha még egyszer sem szerepelt a szerveren, akkor a szerver elmenti, ha már szerepelt, akkor megnöveli eggyel számlálóját. Tehát nem azt mondja meg hogy az adott emailt már jelentették e spam-nek (ahogy azt a pyzor vagy razor teszik), hanem csak annyit, hogy hány volt eddig ebből a vagy spam vagy ham levélből). Minél több van egy hash-böl, annál biztosabb hogy spam. Vigyázni kell, hogy a levelező listákon ne végezzünk

Mivel a DCC nem nyílt forráskódú, ezért nem lehet hivatalos RPM csomagból telepíteni. (mondjuk ettől még adhatnának RPM-et de nem adnak)


ClipCapIt-161007-231457.PNG
ClipCapIt-161007-231519.PNG

A DCC ingyenesen használható minden olyan szervezetnek, aki nem foglalkozik email szűrő szoftverek gyártásával, értékesítésével.

mailspike

http://mailspike.net/usage.html A Mailspke egy IP cím adatbázis. Az IP címeket 10 kategória valamelyikébe sorolják be. L1 -> L5 a rossz hírnév kategóriák, H0 -> H5 a jó hírnév kategóriák. A spamassassin a küldő IP címére egy DNS lekérdezést indít a mailspike szerverére. A DNS lekérdezés válaszában szereplő IP cím kódolja a kategóriát:

ClipCapIt-161009-130539.PNG

A mailspike ingyenesen használható azon email rendszerek számára, akik nem forgalmaznak több mint 100,000 levelet naponta.

Pyzor

Telepítés

A Pyzor az epel repository-ban van. Ha még nem rendelkezünk ezzel a repo-val, akkor hozzá kell adni a yum-hoz. Két lehetőségünk van, vagy yum-al telepítjük föl vagy rpm-böl.

# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
VAGY
# yum install epel-release

Majd telepítsük föl a pyzor-t:

# yum install pyzor

A SELinux tartalmaz egy modult a pyzor-hoz, így a SELinux-al nem lesz gondunk:
/etc/selinux/targeted/modules/active/modules/pyzor.pp

Az alábbi mappák jöttek létre:

  • /usr/bin/pyzor
  • /usr/bin/pyzord
  • /usr/lib/python2.6/site-packages/pyzor
  • /usr/share/doc/pyzor-0.5.0

Tűzfal beállítások

A pyzor a 24441 UDP porton kommunikál a szerverrel, ezt kéne kifelé engedélyezni. Azonban VOIP miatt a teljes UDP tartomány nyitva van.

Ezt kéne felvenni:

$IPTABLES -A OUTPUT -m state --state NEW -p udp -m udp --dport 24441 -j ACCEPT

Saját szerver használata

Ha nagyon sok egyedi spam-ünk van, akkor érdemes lehet egy saját pyzor szervert telepíteni, ahova be tudjuk tölteni az összes általunk spam-nek gondolt mintát. Mi nem tervezzük saját szerver telepítését, egyenlőre a publikus szervert fogjuk használni az üzenetek ellenőrzésére.


Spamassassin integráció

A pyzor modul betöltését már tartalmazza az alap konfiguráció: /etc/mail/spamassassin/v310.pre

...
loadplugin Mail::SpamAssassin::Plugin::Pyzor
...

Az alapértelmezett telepítésben a pyzor be van kapcsolva. Az alábbi paraméterekkel finomhangolhatjuk a local.cf-ben:

  • score PYZOR_CHECK <int>: mennyi büntető pontot érjen, ha eléri a minimum pyzor jelentés számot. Alapértelmezett: 2
  • use_pyzor 0|1: ki-be kapcsolja a pyzort. Alapértelmezés szerint be van kapcsolva.
  • pyzor_max <int>: Hány jelentés fölött tekintsük spam-nek. Alapértelmezés szerint 5.

Pyzor tesztelése a parancssorból

http://pyzor.readthedocs.io/en/release-1-0-0/client.html


TipIcon.png

Tip
A pyzor-t a spamassassin fogja futtatni. A spamassassin-t pedig az amavis az amavis user nevében. Ezért célszerű már a parancssori kísérletezést is az amaivis felhasználó nevében végezni.


Szerver kapcsolat tesztelése

# sudo -u amavis pyzor ping
downloading servers from http://pyzor.sourceforge.net/cgi-bin/inform-servers-0-3-x
public.pyzor.org:24441	(200, 'OK')

Ez a parancs első használatkor le fogja tölteni a publikus szerverek listáját a fent látható URL-röl, és elfogja helyezni a ~/.pyzor mappán belül a servers fájlban:

# sudo -u amavis cat /var/spool/amavisd/.pyzor/servers 
public.pyzor.org:24441

Természetesen itt tetszőleges szervereket felsorolhatunk. Mivel a spamassassin-t az amavis felhasználó futtatja, így a .pyzor mappának majd a /var/spool/amavisd amavis home mappán belül kell majd létrejönnie.


Teszteljük le egy mail-el, ami biztos hogy spam. Ilyet könnyű találni a saját email fiókunkban.
Email ellenőrzése:

# sudo -u amavis pyzor check < Need_to_See_Ya.mbox 
public.pyzor.org:24441	(200, 'OK')	1	0

vagy:

# sudo -u amavis pyzor info < Need_to_See_Ya.mbox 
public.pyzor.org:24441	(200, 'OK')
	Count: 1
	Entered: Tue Sep 20 23:42:57 2016
	Updated: Tue Sep 20 23:42:57 2016
	WL-Entered: Thu Jan  1 01:00:00 1970
	WL-Updated: Thu Jan  1 01:00:00 1970


Most etessünk meg a spamassassin-el egy biztosan sapm levelet. A spamassassin-t az amavis felhasználó nevében kell futtatni. A -t kapcsoló után kell megadni a spam email elérését.

# sudo -u amavis spamassassin -D -t spam1.eml
...
Oct  3 22:06:49.303 [4101] dbg: pyzor: got response: public.pyzor.org:24441 (200, 'OK') 6514 0
...
ontent analysis details:   (23.2 points, 5.0 required)

 pts rule name              description
---- ---------------------- --------------------------------------------------
....
 2.0 PYZOR_CHECK            Listed in Pyzor (http://pyzor.sf.net/)
....

Látható, hogy a pyzor ellenőrzés lefutott. Az vizsgált emailt már 6514-szer jelentették spam-nek. Ez két büntető pontot ért.

SPAM jelentés

Email spam jelentése:

# sudo -u amavis pyzor report < Need_to_See_Ya.mbox 
public.pyzor.org:24441	(200, 'OK')

Ha olyat reportálunk ami még nem volt korában, akkor ha újra futtatjuk rá a pyzor check-et akkor látni kell, hogy a számláló egyel megnőtt a válaszban.


Whitelist jelentés: Ez funkció nem elérhető a public.pyzor.org:24441 publikus szervern. Van egy webes felület, ahol a tévesen jelentett email-eket lehet visszavonni: http://public.pyzor.org/whitelist/.
Azonban ha van egy saját szerverünk,akkor így lehet belőle törölni egy mintát:

# sudo -u amavis pyzor whitelist < spam.eml

Razor

Telepítés

# yum install perl-Razor-Agent

Miden egyes felhasználónak saját razor konfigurációja van, ami a <home mappa>/.razor mappában jön létre a razor első használatakor.

A parancssorban az alábbi parancsok állnak a rendelkezésünkre:

  • razor-admin : ezzel lehet regisztrálni a razor szerveren, felhasználó név + jelszó párost generál
  • razor-check : ellenőriz egy emailt
  • razor-client
  • razor-report  : spam-nek jelent egy emailt
  • razor-revoke  : visszavonja a spam-nek jelentett emailt


TipIcon.png

Tip
A razor-t a spamassassin fogja futtatni. A spamassassin-t pedig az amavis az amavis user nevében. Ezért célszerű már a parancssori kísérletezést is az amaivis felhasználó nevében végezni.


Kliens konfiguráció

Hozzuk létre a <home>/.razor mappát és benne a szerverek listáját:

# sudo -u amavis razor-admin -discover

Ezzel létrejött a serverek listája a .razor mappában (server.*.lst)

# ls -al /var/spool/amavisd/.razor/
...
-rw-r--r--. 1 amavis amavis  899 Sep 22 23:13 server.n002.cloudmark.com.conf
-rw-r--r--. 1 amavis amavis  839 Sep 22 23:04 server.n003.cloudmark.com.conf
-rw-r--r--. 1 amavis amavis   57 Sep 22 23:13 servers.catalogue.lst
-rw-r--r--. 1 amavis amavis   30 Sep 22 23:06 servers.discovery.lst
-rw-r--r--. 1 amavis amavis   76 Sep 22 23:13 servers.nomination.lst

Hozzuk létre a <home>/.razor/razor-agent.conf alap konfigurációs fájlt:

# sudo -u amavis razor-admin -create

Tartalom:

debuglevel             = 3
identity               = identity
ignorelist             = 0
listfile_catalogue     = servers.catalogue.lst
listfile_discovery     = servers.discovery.lst
listfile_nomination    = servers.nomination.lst
logfile                = razor-agent.log
logic_method           = 4
min_cf                 = ac
razordiscovery         = discovery.razor.cloudmark.com
rediscovery_wait       = 172800
report_headers         = 1
turn_off_discovery     = 0
use_engines            = 4,8
whitelist              = razor-whitelist

Regisztráljuk magunkat a razor szerveren hogy tudjunk spam lenyomatokat beküldeni. A razor-admin -register paranccsal generálhatunk magunknak felhasználó név - jelszó párost. Ezt egy identitiy fájlba helyezi el a reazor-admin a .razor mappában. Minél több olyan levél lenyomatot küldünk be ezzel, amit más is spam-nak jelentett, úgy fog nőni a felhasználónk megbízhatósága.

# sudo -u amavis razor-admin -register
Register successful.  Identity stored in /var/spool/amavisd/.razor/identity-ruJ7zcDpwL

Az új identity fájltartalma:

# cat identity-ruJ7zcDpwL
pass                   = XXXXXXXXXXXXXXXXXXXXXX
user                   = YYYYYYYY

Ezen felül létrehozott egy szimbolikus linket, identity névvel, ami rámutat az újonnan generált identity-ruJ7zcDpwL fájlra:

# ls -al /var/spool/amavisd/.razor/
...
lrwxrwxrwx. 1 amavis amavis   19 Sep 22 23:13 identity -> identity-ruJ7zcDpwL
-rw-------. 1 amavis amavis   90 Sep 22 23:13 identity-ruJ7zcDpwL
...

Spamassassin beállítások

A razor modul betöltését már tartalmazza az alap konfiguráció: /etc/mail/spamassassin/v310.pre

...
loadplugin Mail::SpamAssassin::Plugin::Razor2
...

Az alapértelmezett telepítésben a pazor be van kapcsolva. Az alábbi paraméterekkel finomhangolhatjuk a local.cf-ben:

  • score RAZOR2_CF_RANGE_E8_51_100: A razor 8 pontos biztonsággal állítja, hogy a spam valószínűség 51 és 100% között van. Alapértelmezett pontszám: 2.4
  • score RAZOR2_CF_RANGE_51_100: A spam valószínűség (magabiztossági szint nélkül) 51 és 100% között van. Alapértelmezett érték: 0.4
  • score RAZOR2_CHECK: Szerepel a razor listás. Alapértelmezés érték 1.7.
  • use_razor2 (0|1): ki-be kapcsolja a razort. Default = 1

Tűzfal

A razor kliens a 2703-as TCP porton kapcsolódik a szerverekhez.

$IPTABLES -A OUTPUT -m state --state NEW -p tcp -m tcp --dport 2703 -j ACCEPT

Email ellenőrzése

# sudo -u amavis razor-check -d spam1.eml
...
Sep 22 22:35:45.367735 check[1959]: [ 3] mail 1 is not known spam.
....

Ha nem írjuk bele a -d (debug) kapcsolót, akkor nem ír ki semmit a kimenetre. Látható, hogy a beadott email-t spam-nek gondolja.

ImportantIcon.png

Note
Mostanában nagyon sok egy kaptafára menő email érkezik minden nap, amit az alap spamassassin nem tud megfogni. Egy ilyen emailt küldtem be a pyzor-nak majd a razor-nak, de egyik sem gondolta spam-nek sajnos


Ettessük meg közvetlen a spamassassin-t egy biztosan spam levéllel. A spamassassin-t az amavis felhasználó nevében kell futtatni. A -t kapcsolóval adhatjuk meg az email fájlt:

# sudo -u amavis spamassassin -D -t spam1.eml
...
Oct  3 22:06:49.186 [4101] dbg: razor2: part=0 noresponse
Oct  3 22:06:49.186 [4101] dbg: razor2: part=1 engine=8 contested=0 confidence=100
Oct  3 22:06:49.188 [4101] dbg: razor2: results: spam? 1
Oct  3 22:06:49.188 [4101] dbg: razor2: results: engine 8, highest cf score: 100
Oct  3 22:06:49.188 [4101] dbg: razor2: results: engine 4, highest cf score: 0
Oct  3 22:06:49.190 [4101] dbg: rules: ran eval rule RAZOR2_CF_RANGE_E8_51_100 ======> got hit (1)
Oct  3 22:06:49.193 [4101] dbg: rules: ran eval rule RAZOR2_CF_RANGE_51_100 ======> got hit (1)
Oct  3 22:06:49.194 [4101] dbg: rules: ran eval rule RAZOR2_CHECK ======> got hit (1)
....

 pts rule name              description
---- ---------------------- --------------------------------------------------
....
 2.4 RAZOR2_CF_RANGE_E8_51_100 Razor2 gives engine 8 confidence level
                            above 50%
                            [cf: 100]
 0.4 RAZOR2_CF_RANGE_51_100 Razor2 gives confidence level above 50%
                            [cf: 100]
 1.7 RAZOR2_CHECK           Listed in Razor2 (http://razor.sf.net/)
...

Email-ek jelentése

Spam jelentést csak bejelentkezett felhasználó tehet. Ehhez az adott linux user .razor mappájában ott kell legyen a identity fájl. Ha egy emailt-t spam-nek mondtunk, vagyis a felhasználó a Junk könyvtárába tette, akkor azon minden esete végigmehetünk, és spam-nek jelenthetjük:

#  sudo -u amavis razor-report -d /var/spool/amavisd/tmp/Need_to_See_Ya.mbox
...
Sep 22 23:26:23.724615 report[2269]: [ 8] razor-report finished successfully.

Spam jelentés visszavonása:

#  sudo -u amavis razor-revoke -d /var/spool/amavisd/tmp/Need_to_See_Ya.mbox

DKIM

A DKIM használható spamassassin és amavis nélkül is, ebben az esetben szükség van egy DKIM implementációra: openDkim. Mi az amavis-böl fogjuk használni, de az OpenDkim-et is fel fogjuk rakni tesztelés céljából.

DKIM aláírás használata

Elsőként azt fogjuk megnézni, hogyan tudunk DKIM aláírást elhelyezni a kimenő leveleinkben. Ennek a lépései a következőek lesznek:

A DKIM rendszer felállítása a következő lépésekből fog állni:

  1. Az amavisd genrsa programmal legeneráljuk a titkos kulcsot
  2. Elhelyezzük a konfigurációt az amaivisd.conf-ban
  3. Az amavisd showkeys ezután a konfiguráció alapján elkészíti a DNS rekorodot, amit be kell írni a DNS szerverünkbe.
TipIcon.png

Tip
Nagyon sok DKIM - DNS rekord generáló weboldal létezik, így felesleges elmélyedni a DKIM szintaktikájába ha tuningolni szeretnénk a DKIM beállításokat (https://www.dnswatch.info/dkim/create-dns-record)


Az alábbi perl kiegészítésre van szükségünk:

# yum install perl-Mail-DKIM

Két célunk van, Egyrészről, hogy a mi kimenő email-jeinkben elhelyezésre kerüljön a DKIM aláírás, másrészt, hogy finomhangoljuk, bekapcsoljuk a nekünk küldött levelekben a DKIM ellenőrzést.


Kulcsok generálása

Hozzunk létre egy új mappát a DKIM titkos kulcs számára az amavisd home könyvtárában. Azért kell ide rakni, hogy az amavisd elérje.

# mkdir /var/spool/amavisd/dkim/

Az amavisd program a genrsa kapcsolóval legenerálja a kulcsot. Adjuk meg a kulcs hosszát.

ImportantIcon.png

Note
A NoIP csak a 1024 bites kulcsokat támogatja

# amavisd genrsa /var/spool/amavisd/dkim/berki.org 1024
Private RSA key successfully written to file "/var/spool/amavisd/dkim/berki.org" (1024 bits, PEM format) 

# chown amavis.amavis -R /var/spool/amavisd/dkim/
TipIcon.png

Tip
A kulcsot az openssl programmal is legenerálhatjuk (openssl genrsa -out private.key 1024)


Látható hogy létrejött a titkos kulcs a dkim mappában:

# ls -l /var/spool/amavisd/dkim/
total 4
-rw-------. 1 amavis amavis 887 Sep 23 20:14 berki.org

amavisd.conf

Aláírás bekapcsolása

Az /etc/amavisd/amaivisd.conf-ba módosítsuk a konfigurációt:

1. $enable_dkim_signing = 1;    # load DKIM signing code, keys defined by dkim_key

2. dkim_key('berki2.org', 'default', '/var/spool/amavisd/dkim/berki2.org');
3. @dkim_signature_options_bysender_maps = (
    { '.' => { ttl => 21*24*3600, c => 'relaxed/simple' } } );

(A sorszámozás nem része a konfigurációnak, csak hivatkozásra szolgál)

  1. Bekapcsoljuk a DKIM aláírás használatát
  2. Minden egyes domain-hez amit alá akarunk írni meg kell adni, hogy melyik selcectort és melyik titkos kulcsot szeretnénk használni: dkim_key(<domain név>, <selector>, <titkos kulcs>, <aláírás tag-ek>. Minden egyes domain-hez aminek a kimenő leveleit alá szeretnénk írni, fel kell venni egy dkim_key sort amibe belerakjuk a titkos kulcsát.
  3. Majd a dkim_signature_options_bysender_maps map-ben minden egyes domanhez be kell állítani, hogy milyen DKIM header mezőket szeretnénk használni. (Részletesen a DKIM header mezőkről az RFC-ben olvashatunk: https://tools.ietf.org/html/rfc4871#section-3.40). Vannak kötelező mezők,ezeket az amavis magától be fogja rakni az aláírásba. Ezen felül nekünk legalább a ttl és a c mezőket be kell állítani. A map-ben domain-enként adhatunk meg beállításokat. Minden egyes domain-re egy ilyen sort kell hozzáadni:

{ '<domain név>' => { ttl => 21*24*3600, c => 'relaxed/simple', <további DKIM header mezők az RFC 4871 alapján> } }

A '.' az összes domain-re fog vonatkozni. Mi is ezt fogjuk használni. Ha pl az i DKIM header mezőt is szeretnénk használni a example.com domain-hez, akkor egy külön sort fel kéne venni ehhez. Fentről lefele keres illeszkedő domain nevet az amavis, így az example.com-ra érvényre jutna egy egyedi sor, a többire pedig a . illeszkedni.

A fenti beállítás az alábbi DKMI aláírást fogja eredményezni:

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=berki2.org; h=
	subject:subject:from:from:x-mailer:message-id:content-type
	:content-type:date:date:mime-version:received:received; s=
	default; t=1475268891; x=1477083292; bh=kDQCL
	6pC8eJS1CqCgI+9s/sBS5gypRoDxojgpdCITD8=; b=1GCR9TjLAvXBbqN3ft+5f
	1GDZIVVtsE88MKzNDigWip9hQlhG6HsBvdPSxSe0ZdbQq6jEik///V9VmDjmv0Zy
	M/EIaeRZR5GGOFRX5FIi6A4nE/FpHpMrgfLdj6j2cBw6I35g8F3PzU2j447h9hES
	crBvasqiCPibe64lRZoCWc=

Ugyan a v,a,d,h,s,t,x,bh,b mezökről nem mondtunk semmit, azokat még is elhelyezte az amavis az aláírásban mint kötelező mezőket.

Azt is láthatjuk, hogy alapértelmezetten az amavis az aláírásba ezeket a header mezőket veszi bele:

subject:subject:from:from:x-mailer:message-id:content-type:content-type:date:date:mime-version:received:received

Ami az esetek többségében megfelelő. Ha bizonyos header mezőket ki akarunk venni, vagy hozzá akarunk rakni, akkor ezt az amavisd.conf-ban az alábbi paraméterrel tehetjük meg: $signed_header_fields{'<header mező neve kisbetűkkel>'} = 1 vagy 0; (1=be, 0=ki)

Pl. a from mező kikapcsolása (nehogy kikapcsoljuk)

$signed_header_fields{'from'} = 0; 


http://ietf.org/rfc/rfc4871.txt
https://opensource.apple.com/source/amavisd/amavisd-140/amavisd/amavisd-new-2.7.0/amavisd-signer


Az amaivid aláíró moduljában az alábbi kommenetet láthatjuk a DKIM header map-röl:

# Load all available private keys and supply their public key RR constraints.
# Arguments are a domain, a selector, a key (a file name of a private key in
# PEM format), followed by optional attributes/constraints (tags, represented
# here as Perl hash key/value pairs) which are allowed by RFC 4871 in a public
# key resource record (v, g, h, k, n, s, t), of which only g, h, k, s and t
# are considered to be constraints limiting the choice of a signing key.
#
#         signing domain   selector     private key              options
#          -------------   --------     ----------------------   ----------
# dkim_key('example.org', 'abc',       '/var/db/dkim/a.key.pem');
# dkim_key('example.org', 'yyy',       '/var/db/dkim/b.key.pem', t=>'s');
# dkim_key('example.org', 'zzz',       '/var/db/dkim/b.key.pem', h=>'sha256');
# dkim_key('example.com', 'sel-2008',  '/var/db/dkim/sel-example-com.key.pem',
#          t=>'s:y', g=>'*', k=>'rsa', h=>'sha256:sha1', s=>'email',
#          n=>'testing; 1, 2');
# dkim_key('guest.example.com', 'g',    '/var/db/dkim/g-guest-ex-com.key.pem');
# dkim_key('mail.example.com', 'notif', '/var/db/dkim/notif-mail.key.pem');

# @dkim_signature_options_bysender_maps maps author/sender addresses or
# domains to signature tags/requirements; possible signature tags according
# to RFC 4871 are: (v), a, (b), (bh), c, d, (h), i, l, q, s, (t), x, z;
# of which the following are determined implicitly: v, b, bh, h, t
# (tag h is controlled by %signed_header_fields);  currently ignored tags
# are l and z;  instead of an absolute expiration time (tag x) one may use
# a pseudo tag 'ttl' to specify a relative expiration time in seconds, which
# is converted to an absolute expiration time prior to signing: x = t + ttl;
# a built-in default is provided for each tag if no better match is found
#
# @dkim_signature_options_bysender_maps = ( {
#   'postmaster@mail.example.com' => { a => 'rsa-sha1', ttl =>  7*24*3600 },
#   'spam-reporter@example.com'   => { a => 'rsa-sha1', ttl =>  7*24*3600 },
#   'mail.example.com'            => { a => 'rsa-sha1', ttl => 10*24*3600 },
#   # explicit 'd' forces a third-party signature on foreign (hosted) domains
#   'guest.example'               => { d => 'guest.example.com' },
#   '.example.com'                => { d => 'example.com' },
#   # catchall defaults
#   '.' => { a => 'rsa-sha256', c => 'relaxed/simple', ttl => 30*24*3600 },
#   # 'd' defaults to a domain of an author/sender address,
#   # 's' defaults to whatever selector is offered by a matching key
# } );

Origination beállítások

WarningIcon.png

Warning
Az Amavis csak azokat a leveleket fogja aláírni, amikről úgy gondolja, hogy a saját felhasználók küldte


Az amavis akkor tekint egy levelet saját felhasználó által küldöttnek, ha az ORIGNATING váltóz értéke 1 bármit is jelentsen. Két külön úgynevezett plolicy_bank -ban is be kell ezt állítsuk.

  • $policy_bank{'MYNETS'}: Ez a lokális hálózatról küldött levelek beállításait tartalmazza
  • $interface_policy{'10024'} = 'ORIGINATING' : A postfix a 10024-es porton adja át a leveleket az amavisd-nek. Létre fogunk hozni egy ORIGINATING szabálygyűjteményt (policy_bank), amit hozzá fogunk rendelni a 10024-es porthoz. Tehát a postfix-töl érkező levelekre a ORIGINATING policy bank-ban lévő szabályok vonatkoznak. A lokális hálózatról küldött levelek is az 10024-es porton kerülnek átadásra az amavisd-nek, azonban valamiért rájuk a MYNETS bolicy_bank fog illeszkedni.

A policy_bank-ban a originating => 1 szabállyal állítjuk be, hogy ezen policy_bank-ba eső leveleket saját felhasználónak tekintjük:

#mails from local network
$policy_bank{'MYNETS'} = {   # mail originating from @mynetworks
  originating => 1,  # is true in MYNETS by default, but let's make it explicit
  ....
};
...
...
#mails from external clients (e.g. mobil phones)

$interface_policy{'10024'} = 'ORIGINATING'; # with this all my mails are "originating from inside".

$policy_bank{'ORIGINATING'} = {  # mail supposedly originating from our users
  originating => 1,  # declare that mail was submitted by our smtp client
  ...
  virus_admin_maps => ["system\@$mydomain"],    # ahova a víruskról értesítést küld
  spam_admin_maps  => ["system\@$mydomain"],    # ahova a spam-ekröl értsítést küld
  ...
  forward_method => 'smtp:[127.0.0.1]:10025',
 ....
};

Fontos, hogy az ORIGINATING policy_bank-ba beállítsuk azt a portot is, ahol az amavisd visszaküldi a leveleket átvizsgálás után a postfix-nek (forward_method => 'smtp:[127.0.0.1]:10025').

A spam_admin_maps és virus_admin_maps-ekbe rakjunk valódi értéket, különben a spam levelek vissza fognak pattanni.

SELinux

ImportantIcon.png

Note
Ez a SELinux változtatás nem biztos hogy kell

A SELInux nem engedi meg, hogy a /usr/bin/perl hozzáférjen a 10025-ös TCP socket-hez, ahol az amavisd visszaküldi a leveleket a postfix-nek. Érdekes módon ez csak akkor probléma, ha a DKIM be van kapcsolva. Meg kell változtatni a 10025-s port típusát a SELinux-ban, hogy ne sértse a rendszabást.

# semanage port -a -t amavisd_send_port_t -p tcp 10025


Disclaimer

WarningIcon.png

Warning
Nagyon fontos, hogy a HTML disclaimer-ben ne legyen új sor, különben nem lesz megfelelő a DKIM aláírás


https://sourceforge.net/p/amavis/mailman/message/19582470/ Az altermime program a HTML disclaimer-ben minden új sor jelet (CR LF) dupla CR-re cserél (CR CR LF). A DKIM erre a body tartalomra készít el az aláírást. Azonban a postfix a dupla CR-eket felszámolja a levél kiküldése előtt. És így a DKIM body aláírása nem lesz valid. Tehát az egész /var/spool/amavisd/disclaimer.html tartalma egy sor legyen, és ne legyen a végén se új sor jel.

@altermime_args_disclaimer =
  qw(--verbose  --disclaimer=/var/spool/amavisd/disclaimer.txt \
     --disclaimer-html=/var/spool/amavisd/disclaimer.html);

DNS módosítások

Indítsuk újra az amavisd-t:

# service amavisd restart

Indulás közben látnunk kell a /var/log/maillog-ban hogy az amavis betölti a DKIM modulokat:

...
Sep 24 21:24:55 centostest amavis[5897]: Module Mail::DKIM::Signer  0.37
Sep 24 21:24:55 centostest amavis[5897]: Module Mail::DKIM::Verifier 0.37
...

Az amavisd showkeys paranccsal írassuk ki a DNS rekordot. Fontos, hogy megadjuk a konfigurációs fájl helyét, mert alapértelmezés szerint a /etc/amavisd.conf helyen keresi.

# amavisd -c /etc/amavisd/amavisd.conf showkeys
; key#1, domain berki2.org, /var/spool/amavisd/dkim/berki.org
default._domainkey.berki2.org.	3600 TXT (
  "v=DKIM1; p="
  "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDn8jgJekpfZIx2k/GIIrFToWbJ"
  "KaqQ2HCmP3x0dtFHkcOz9ZxXEc8y1p/IRh3F3skzTm3mIO/M1srCNRX+09g3pDgW"
  "W1fgJxbSq54S+uO+1SWph7na/ZFxd+nJOOcThibQ/s7ADC/OtG7mG6XOW6bh/b1o"
  "/DJnbXs3N8A+ycnVCQIDAQAB")

NoIP.com

Hozzuk ilyen alakra az amavisd showkeys által kiadott konfigurációt:

v=DKIM1; p=
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDn8jgJekpfZIx2k/GIIrFToWbJ
KaqQ2HCmP3x0dtFHkcOz9ZxXEc8y1p/IRh3F3skzTm3mIO/M1srCNRX+09g3pDgW
W1fgJxbSq54S+uO+1SWph7na/ZFxd+nJOOcThibQ/s7ADC/OtG7mG6XOW6bh/b1o
/DJnbXs3N8A+ycnVCQIDAQAB

Majd nyissuk meg a fő domain-ünk no-ip.org beállításait, ahol kattintsunk a DKIM linkre:

ClipCapIt-160924-150608.PNG

Legyen a selector értéke default, és a Record helyére másoljuk be a fenti értékét, majd mentsük el.

ClipCapIt-160924-150232.PNG


Ezután állítsuk be az ADSP mező értékét. Ezzel azt fogjuk kijelentetni, hogy minden levelet alá fogunk írni, és az aláírásban szereplő domain név meg fog egyezni miden esetben a @ jobb oldalán lévő névvel.

  • DomainKey Policy: o=-
  • ADSP: dkim=discardable
ClipCapIt-161009-171522.PNG

BIND beállítások

Nálunk a szerveren a lokális kéréseket saját DNS szerver szolgálja ki, ezért a DKIM DNS rekordokat a bind db.berki.org fájlba is fel kell venni:

/var/named/data/db.berki.org (a fájl végére)

...
default._domainkey.berki.org.	IN	TXT ("v=DKIM1;"
    "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7/rJmEEdrkvPLm63k+hNVyqVX"
    "bEm9/qRuv2ic3d1I+1rwuXS7aJvMPSrLf4+XRtTyisKxOZWIMXe0B36R6970EhLo"
    "/rNPo9ALZN/fjY4dJziIUKxAdsojAEczFXICQhVXoPvpSxV2qVoEpyx2Ci3wSFbi"
    "n7kUzmIq+id7LYS8pQIDAQAB")

_domainkey.berki.org.	IN	TXT ("o=-")

_adsp._domainkey.berki.org.	IN	TXT ("dkim=discardable")

DNS rekord tesztelése

(olyan gépen is futtassuk, amit nem a szerver DNS-e szolgál ki, hogy a NoIP-t is letesztelhessük) Telepítsük a bind-utils.

# yum install bind-utils

A dns TXT rekordot a host paranccsal fogjuk lekérni. (kb 20 perc mire a noip frissíti az értékét). A DIKM szabvány szerint a @ jobb oldalán lévő domain nevet kell ellátni a _domainkey prefixel, ami elé még egy ponttal a selector-t is hozzá kell fűzni. Így kérik le a DKIM validátorok is DKIM DNS rekorodt. Minekünk is így kell ellenőrizni:

# host -t txt default._domainkey.berki2.org
default._domainkey.berki2.org descriptive text "v=DKIM1\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDn8jgJekpfZIx2k/GIIrFToWbJKaqQ2HCmP3x0dtFHkcOz9ZxXEc8y1p/IRh3F3skzTm3mIO/M1srCNRX+09g3pDgWW1fgJxbSq54S+uO+1SWph7na/ZFxd+nJOOcThibQ/s7ADC/OtG7mG6XOW6bh/b1o/DJnbXs3N8A+ycnVCQIDAQAB"

Domian key plicy:

# host -t txt _domainkey.berki2.org
_domainkey.berki2.org descriptive text "o=-"

ADSP:

# host -t txt _adsp._domainkey.berki2.org
_adsp._domainkey.berki2.org descriptive text "dkim=discardable"

DKIM aláírás tesztelés

Ha a DNS szerver már sikeresen visszaadja a DKIN kulcsot, akkor az amavisd testkey paranccsal ellenőrizhetjük le a beállításokat:

# amavisd -c /etc/amavisd/amavisd.conf testkeys
TESTING#1: default._domainkey.berki2.org     => pass

Tesztelés Gmail-ben

Küldjünk egy emailt a webes kliensből (lokális hálózat) és egy távoli kliensről egy külső email címre, tehát egy független harmadik félnek (pl. gmail), majd nézzük meg az email fejlécét:

Delivered-To: lalilali96@gmail.com
....
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=berki2.org; h=
        content-type:content-type:mime-version:from:from:message-id
        :subject:subject:date:date:received:received; s=default; t=
        1474745124; x=1476559525; bh=kZB3kPyTqm/w2p6UryOcj2tyzuSjxMIB3xA
        EjFFhOyk=; b=aYEDrJwsXZS/AHwlI6FBtnpIXYWfDJz8HEiKl0HNUKAKLtiRK7J
        4GkbRcDkl5AO75B2VxGgt00+2Q47fUf22saMIxYbey/E2jGRETLyBMiMhQTZv8wa
        xTE0aaGCHG4HXc5dEwsMAFoBYOIQDyVCD4l87wSfOgqtsxsCG2ZyzolQ=
X-Amavis-Modified: Mail body modified (using disclaimer) - berki2.org
X-Virus-Scanned: amavisd-new at berki2.org

Meg kell jelennie a DKIM-Signature fejlécben a domain nevünkkel (d) és a selector-al (s). Ezen felül látszania kell hogy a google.com (a harmadik fél) elfogadta a DKIM aláírásunkat:

Authentication-Results: mx.google.com;
       dkim=pass header.i=@berki2.org;

Ha a gmail-ben megnyitjuk az eredeti üzenetet (a kis nyílra kell kattintani, majd "Eredeti üzenet megnyitása", akkor láthatjuk a DKIM eredményét:

ClipCapIt-160925-103629.PNG

Kattintsunk a bal felső sarokban, a küldő alatti kis nyílra. Ekkor a megnyíló ablakban látunk kell, hogy a hitelesítő a berki.org, vagyis elfogadta az aláírást a google.

ClipCapIt-161009-193819.PNG

file:///home/adam/Downloads/dkim_2.png

Ellenőrzés a parancssorból

Telepítsük föl az opendkim-et amivel a parancssorban tudjuk ellenőrizni a leveleket:

# yum install opendkim

Hozzuk létre a default.private fájlt és adjunk rá megfelelő jogot. Ha ez a fájl nem létezik, az opendkim nem futtatható:

# touch /etc/opendkim/keys/default.private
# chmod 600 /etc/opendkim/keys/default.private

Mentsük le a levelet egy eml fájlban, majd futtassuk le a tesztet:

# opendkim -v -t /root/install/dkim/message3.eml 
opendkim: /root/install/dkim/message3.eml: mlfi_eom() returned SMFIS_ACCEPT
opendkim: /root/install/dkim/message3.eml: verification (s=default, d=berki2.org, 1024-bit key) succeeded

Két kimenetele lehet: succeeded vagy signature verification failed Sajnos ennél részletesebben nem mondja meg, hogy melyik résszel volt a baj (küldő, tárgy vagy body)

Online validátor használata

A gmail-böl töltsük le az eredeti levelet (ne másoljuk, hanem: Eredeti üzenet letöltése), és töltsük föl ide.

Valami hasonlót kell visszakapni:

================================================================
DKIM result: pass
================================================================
Signed by: adam@berki2.org
...
WarningIcon.png

Warning
Ezt a tesztoldalt "http://dkimvalidator.com/" ne használjuk, mert úgy gondolja, hogy nem az aláírt domain-ből jött a levél, valószínűleg módosul a header feldolgozás közben



DKIM ellenőrzés bekapcsolása

https://dokuwiki.nausch.org/doku.php/centos:mail_c7:spam_6

Az amavis jelenlegi verziója sajnos nem támogatja a DKIM ADSP kiegészítését. Ezért a DKIM ellenőrzést a Spamassassin-ban fogjuk végezni. Ennek az a nagy hátránya, hogy az amavis nem indig adja át a leveleket a spamassassin-nak ellenőrzésre (pl: ha a levél túl nagy).

Elsőként kapcsoljuk ki a DKIM ellenőrzést az amavis-ben /etc/amavis/amaivisd.conf-ban

$enable_dkim_verification = 0;  # enable DKIM signatures verification


A SAPM pontok finomhangolását a /etc/mail/spamassassin/local.cf fájlban kell beállítani:
https://apache.googlesource.com/spamassassin/+/sa-update_3.4.0_20131121085108/rules/60_adsp_override_dkim.cf

A DKIM modult a /etc/mail/spamassassin/v312.pre fájlt tölti be:

...
loadplugin Mail::SpamAssassin::Plugin::DKIM
...

Ahhoz hogy ez működjön, a perl-Mail-DKIM csomag fel kell legyen telepítve.

A következő paraméterekkel finomhangolhatjuk a local.cf-ben:

  • DKIM_ADSP_DISCARD: büntető pontok, ha a DNS-ben a feladó DISCARDED -et hirdet magáról (tehát hogy mindig aláírja). Ha egy hoszt azt mondja magáról hogy mindig aláírja, és a levél még sem valid, akkor olyan magas pontszámot fog kapni, hogy eldobjuk .
  • DKIM_ADSP_ALL: Ha a feladó ADSP rekordjában ALL szerepel, de még sem írta alá, akkor egy olyan pontszámmal fogjuk ellátni, ami már megüti a spam küszöböt, de azért még kézbesítve lesz.
  • adsp_override <domain név> [discardable|all|unknown]: felülírhatjuk az egyes hosztokra a DNS-ben hirdetett ADSP rekordot. Ha nem adunk meg értéket, akkor az alapértelmezett discardable.
  • USER_IN_DKIM_WHITELIST: extra pontok azokra a hosztokra, akik a white list-en szerepelnek
  • whitelist_from_dkim *@<domain név>
ImportantIcon.png

Note
Akár csak a SPF -nél itt sem érdemes magas jutalom pontokat adni azért mert egy levél átmegy a DKIM vizsgálaton. Egy samppalő domain ugyan úgy rendelkezhet szabályos DKIM aláírással. Ellentétben, ha egy magát DIESCARED-nak hirdető DKIM megbukik, akkor azt súlyosan érdemes lepontozni


WarningIcon.png

Warning
Valamiért a spamassassin nem képes megfelelően validálni a internal -> internal levelezésben a DKIM aláírást, és hibás ADSP -nek veszi, ezért a saját domain-ünkre felül fogjuk írni az ADSP értékét


A local.cf-be az alábbiakat helyezzük el:

score DKIM_ADSP_ALL          8
score DKIM_ADSP_DISCARD     25

#Ha vand dekodólható aláírás 
score DKIM_VERIFIED -0.1

#Ha a ADSP is helyes
score DKIM_VALID_AU -0.3

#ha a dns nem lekérdezhető
score DKIM_ADSP_NXDOMAIN     8 


adsp_override gmail.com

adsp_override berki2.org unknown

whitelist_from_dkim berki2.org

DKIM szűrés ellenőrzése

Futtassunk egy kézi spam ellenőrzést egy biztosan spam email-re a spamassassin parancssori meghívásával:

# sudo -u amavis spamassassin -D -t spam2.eml 

Látnunk kell a log-ban hogy elsőként a dkim ellenőrzést lefuttatta a spamassassin, majd lekérdezte az adsp DNS rekordot is:

...
Oct  8 11:34:31.461 [1592] dbg: dkim: using Mail::DKIM version 0.37
Oct  8 11:34:31.462 [1592] dbg: dkim: performing public key lookup and signature verification
Oct  8 11:34:31.462 [1592] dbg: dkim: signature verification result: none
Oct  8 11:34:31.462 [1592] dbg: dkim: adsp: performing lookup on _adsp._domainkey.geekatwork.net
Oct  8 11:34:31.483 [1592] dbg: dkim: adsp result: U/unknown (dns: unknown), author domain 'geekatwork.net'
...

SPF

Sender Policy Framework

Saját SPF rekord készítése

http://www.spfwizard.net/

Fontos, hogy ne relay hoszton keresztül küldjük ki az email-eket. Hiszen mi azt állítjuk a DNS rekordban, hogy olyan levelet, aminek a @ jobb oldalán berki2.org-ban vagy a mail.berki2.org domain név IP címéről lehet kiküldeni. Nem baj hogy dinamikus az email cím, nem kötelező email címet írni az SPF erkordba.

Az SPF rekordot a noip.com-on a berki2.org TXT rekordjának kell beállítani (tehát nem lesz belőle aldomain mint a DKIM esetében). A rekord három elemből áll össze.

  • v: verzió -> spf1-et kell használni
  • saját domain(ek) -> ide lehet IP címet vagy host nevet írni. Vagy az mx rövidítést használni, ami behelyettesíti az adott domain névnek az MX rekordját.
  • használati utasítás: az utolsó elem azt mondja meg, hogy mit csináljon egy szerver, ha olyan levelet kap, akinek van SPF-e a dns-ben de nem az küldte, aki ott meg volt határozva.
    • ~all: Kezelje fentartással a levelet (bár lehet hogy mi küldtük)
    • -all: Dobja el a levelet, nem mi küldtük
ClipCapIt-160925-133418.PNG

Nálunk a szerveren a lokális kéréseket saját DNS szerver szolgálja ki, ezért a SPF DNS rekordokat a bind db.berki.org fájlba is fel kell venni:

/var/named/data/db.berki.org

....
berki.org.	IN	TXT ("v=spf1 mx -all")[root@server data]# 


A NoIP teszteléséhez várjunk 10 percet, hogy életre lépjen, majd kérdezzük le követlen a berki2.org txt rekordját (olyan gépen futtassuk, amit nem a szerver DNS-e szolgál ki):

$ host -t txt berki2.org
berki2.org descriptive text "v=spf1 mx -all"

DNS rekord tesztelése

Küldjünk egy levelet a gmail-es címünkre, és nézzük meg az eredetit üzenetet (Jobb oldali nyíl -> Eredeti megtekintése). Itt látnunk kell, hogy a SPF ellenőrzés sikeres volt:

ClipCapIt-161009-193607.PNG

Kattintsunk a küldő neve mellette kis nyílra a baloldalon. A felugró ablakban látnunk kell, hogy a küldő az a berki.org:

ClipCapIt-161009-193654.PNG

SPF szűré

# yum install perl-Mail-SPF

Installálás után a spamassassin init.pre config fájljába be kellett kerüljön az SPF modul betöltése:
/etc/mail/spamassassin/init.pre

# SPF - perform SPF verification.
#
loadplugin Mail::SpamAssassin::Plugin::SPF

Ellenőrizzük,hogy a spamassassin betölti e az SPF modult:

# spamassassin --lint -D
...
Sep 30 00:13:03.815 [3999] dbg: plugin: loading Mail::SpamAssassin::Plugin::SPF from @INC
...
Sep 30 00:13:03.817 [3999] dbg: plugin: loading Mail::SpamAssassin::Plugin::Pyzor from @INC
Sep 30 00:13:03.820 [3999] dbg: pyzor: local tests only, disabling Pyzor
...
Sep 30 00:13:03.820 [3999] dbg: plugin: loading Mail::SpamAssassin::Plugin::Razor2 from @INC
...
Sep 30 00:13:03.829 [3999] dbg: plugin: loading Mail::SpamAssassin::Plugin::DKIM from @INC
...

Az alapértelmezett büntető pont az elbukott SPF teszt esetén 1 körül van. Ezt meg tudjuk változtatni a local.cf-ben:
/etc/mail/spamassassin/local.cf

score SPF_FAIL 5.00
ImportantIcon.png

Note
Sose jutalmazzuk túl nagy negatív számmal, ha egy levél átmegy az SPF teszten, ugyanis az esetek többségében pont a spammerek állítják be megfelelően az SPF-t és a valódi email szervereknél találunk hibás beállításokat. A helyes SPF-re adott pontokat a score SPF_PASS spamassassin paraméterrel szabhatjuk egyedire.


Tesztelés a parancssorból

A spamassassin parancssori tesztelő eszközét fogjuk meghívni. Küldtem magamnak kívülről egy szabályos üzenetet. Majd azt letöltöttem, és a küldőt átírtam a saját egyik email címemre. Ekkor az SPF validálás érvénytelen lett.

# sudo -u amavis spamassassin -D -t SPF_DKIM_teszt.eml

...
Oct  8 11:40:02.235 [1601] dbg: spf: checking to see if the message has a Received-SPF header that we can use
...
Sep 30 00:24:05.091 [4041] dbg: spf: query for /62.179.121.38/berki2.org: result: fail, comment: Please see http://www.openspf.net/Why?s=helo;id=berki2.org;ip=62.179.121.38;r=centostest, text: Mechanism '-all' matched
.....

Content analysis details:   (-2.6 points, 5.0 required)

 pts rule name              description
---- ---------------------- --------------------------------------------------
-0.0 RCVD_IN_DNSWL_NONE     RBL: Sender listed at http://www.dnswl.org/, no
                            trust
                            [62.179.121.38 listed in list.dnswl.org]
 0.5 RCVD_IN_SORBS_SPAM     RBL: SORBS: sender is a spam source
                            [62.179.121.38 listed in dnsbl.sorbs.net]
-3.1 RP_MATCHES_RCVD        Envelope sender domain matches handover relay domain
 0.0 SPF_HELO_FAIL          SPF: HELO does not match SPF record (fail)
[SPF failed: Please see http://www.openspf.net/Why?s=helo;id=berki2.org;ip=62.179.121.38;r=centostest]

Ezen felül láthatjuk még a további pontokat, amit az üzenet kapott.

Tesztelés kívülről

Rengeteg hamis online email küldő oldal létezik, pl: https://emkei.cz/ Itt állítsuk be küldőnek az egyik email címünket, a címzett pedig legyen egy másik email címünk. Ez fenn kell akadjon a SPF ellenőrzésen, hiszen nem a mi domainünkből küldtük. Az eamil header valami ilyesmi lesz. (láthatjuk, hogy 5-re büntette az elbukott SPF tesztet, ez az az érték, amit megadtunk a local.cf fájlban)

X-Virus-Scanned: amavisd-new at berki2.org
X-Spam-Flag: YES
X-Spam-Score: 6.644
X-Spam-Level: ******
X-Spam-Status: Yes, score=6.644 tagged_above=-999 required=6.2
	tests=[RCVD_IN_BRBL_LASTEXT=1.644, SPF_FAIL=5, SPF_HELO_PASS=-0.001,
	TO_EQ_FM_DOM_SPF_FAIL=0.001] autolearn=no

DCC

http://www.iredmail.org/forum/topic481-iredmail-support-install-pyzor-razor2-and-dcc-on-your-centosrhel-iredmail-server.html
Mi az ingyenes, publikus DCC szerereket fogjuk használni, saját szervert nem fogunk telepíteni. A kliens-hez kell kapcsolódjon az általunk használt email szűrő rendszer, esetünkben a spamassassin. A DCC kliens futhat daemon-ként is (ez a leghatékonyabb), vagy meghívható parancsként is, mi is ezt fogjuk használni.

Telepítés

A DCC-t nagyon egyszerű forrásból feltelepíteni. A lépések az alábbiak:

# mkdir /var/lib/dcc
# cd /var/lib/dcc
# wget http://www.dcc-servers.net/dcc/source/dcc-dccproc.tar.Z
# tar xzvf dcc-dccproc.tar.Z
# cd dcc-dccproc-1.3.103
# ./configure --with-uid=amavis
# make
# make install
# chown -R amavis:amavis /var/dcc
# ln -s /var/dcc/libexec/dccifd /usr/local/bin/dccifd


Teszteljük le, hogy a ddc kliens eléri e a publikus dcc szervereket. A szerverek listája a /var/dcc/map bináris fájlban vannak tárolva, ami a /var/dcc/map.txt fájl alapján készült. Ebben a fájlban láthatjuk a publikus szerverek listáját. A kliens le tudja tesztelni a szerverek elérhetőségét a cdcc info paranccsal:

# cdcc info

# 10/08/16 12:04:02 CEST  /var/dcc/map
# Re-resolve names after 13:26:57  Check RTTs after 12:19:02
# 1236.00 ms threshold, 1234.53 ms average    12 total, 11 working servers
IPv6 on   version=3

dcc1.dcc-servers.net,-      RTT+1000 ms  anon
#  38.124.232.176,-                                                  ID 1102
#     100% of  4 requests ok  239.82+1000 ms RTT       100 ms queue wait
#  69.12.221.230,-                                         sonic.net ID 1117
#     100% of  4 requests ok  312.94+1000 ms RTT       100 ms queue wait
#  192.135.10.194,-                                           debian ID 1169
#     100% of  4 requests ok  186.25+1000 ms RTT       100 ms queue wait

dcc2.dcc-servers.net,-      RTT+1000 ms  anon
#  136.199.199.160,-                                             URT ID 1060
#     100% of  8 requests ok  156.93+1000 ms RTT       100 ms queue wait
#  192.84.137.21,-                                           INFN-TO ID 1233
#     100% of  4 requests ok  136.00+1000 ms RTT       100 ms queue wait
#  208.82.128.50,-                                                   ID 1282
#     100% of  4 requests ok  219.29+1000 ms RTT       100 ms queue wait

dcc3.dcc-servers.net,-      RTT+1000 ms  anon
#  209.169.14.27,-                                     x.dcc-servers ID 104
#     100% of  4 requests ok  279.25+1000 ms RTT       100 ms queue wait
#  209.169.14.29,-                                     x.dcc-servers ID 104
#     100% of  4 requests ok  278.12+1000 ms RTT       100 ms queue wait

dcc4.dcc-servers.net,-      RTT+1000 ms  anon
#  209.169.14.30,-                                     x.dcc-servers ID 104
#     100% of  4 requests ok  277.35+1000 ms RTT       100 ms queue wait

dcc5.dcc-servers.net,-      RTT+1000 ms  anon
#  69.12.208.70,-                                          sonic.net ID 1156
#     100% of  4 requests ok  314.59+1000 ms RTT       100 ms queue wait
# *195.20.8.232,-                                          EATSERVER ID 1166
#     100% of  8 requests ok  133.99+1000 ms RTT       100 ms queue wait

@,-                         RTT-1000 ms  32768 secret11130400226y930
#  127.0.0.1,-                                     
#      not answering

################
# 10/08/16 12:04:02 CEST  greylist /var/dcc/map
# Re-resolve names after 14:04:02  
# 1 total, 0 working servers
# continue not asking greylist server 32 seconds after 1 failures

@,-                         Greylist 32768 secret11130400226y930
# *127.0.0.1,6276                                  
#      not answering

Tűzfal

Kifelé ki kell engedni a 6277-es UDP portot és be kell engedni az erre jövő válaszokat.

Konfiguráció

A DCC konfigurációs fájlja itt található: /var/dcc/dcc_conf. Itt semmilyen módosítás nem szükséges, a gyári beállítások használhatók.

Fontos, hogy ha van SPAM gyűjtő email fiókunk, ahova az összes SPAM levelet továbbítjuk, ezen fiókra kikapcsoljuk a DCC használatát (meg az összes rendszer email fiókra)
/var/dcc/whiteclnt

...
ok	env_to	system
ok	env_to	root
ok	env_to	system@berki2.org
ok	env_to	root@berki2.org
...

A spamassassin-ban be kell kapcsolni a DCC plugin használatát.
/etc/mail/spamassassin/v310.pre

...
loadplugin Mail::SpamAssassin::Plugin::DCC
...

Majd a local.cf-ben helyezzük el az alábbi DCC specifikus beállításokat.
/etc/mail/spamassassin/local.cf

# dcc
use_dcc 1  #dcc bekapcsolása
dcc_home /var/dcc   
dcc_path /usr/local/bin/dccproc
dcc_timeout     10
add_header all  DCC _DCCB_: _DCCR_

Az utolsó sorral beállítjuk, hogy mindig helyezze el az email fejlécében a DCC lekérdezés eredményét.

A DCC három féle hash-t készít az email-böl. Ezek a body, a fuz1 és a fuz2. Mindegyiket külön számlálja, és adja vissza a válaszban a darabszámot.

Spamassassin paraméterek:

  • dcc_body_max <number>
  • dcc_fuz1_max <number>
  • dcc_fuz2_max <number> --> ennyi bejelentett email után fogja span-nak tekinteni a spamassassin az emailt.
  • add_header all DCC _DCCB_: _DCCR_ --> ennek hatására el fogja helyezni a X-Spam-DCC header-t az email-ben.
    • _DCCB_: ez tartalmazza a reportáló szervert
    • _DCCR_: ez tartalmazza az eredményt
  • DCC_CHECK <num>: Ennyivel fogja büntetni a spamassassin a levelet ha elérte a dcc_<body>|<fuz1>|<fuz2> értékek valamelyikét.
ImportantIcon.png

Note
A dcc_.._max értékek alapértelmezetten 9999-re vannak állítva. Szerintem ettől állíthatjuk sokkal alacsonyabbra egy kis forgalmú email szerveren, pláne Magyarországon


SELinux

Ahhoz hogy a /usr/local/bin/dccproc tudjon írni a /var/dcc/map mappába át kell címkézni a /var/dcc/map mappát:

# semanage fcontext -a -t antivirus_tmp_t '/var/dcc/map'
# restorecon -v '/var/dcc/map'
restorecon reset /var/dcc/map context unconfined_u:object_r:var_t:s0->unconfined_u:object_r:antivirus_tmp_t:s0

Ellenőrizzük az új kontextust:

# ls -Z /var/dcc/map
-rw-------. amavis amavis unconfined_u:object_r:antivirus_tmp_t:s0 /var/dcc/map


Tesztelés

Első lépésként állítsuk a spamassassin local.cf-ben 1-re azt a szintet, ami fölött a spamassassin spam-nek tekint egy levelet:

...
dcc_body_max 1
dcc_fuz1_max 1
dcc_fuz2_max 1
..

Keressünk pár garantáltan spam levelet. Majd a spamassassin parancssori meghívásával végezzünk egy spam ellenőrzést.

# sudo -u amavis spamassassin -D -t Need_to_See_Ya.mbox

...
Oct  8 18:21:22.822 [2314] dbg: dcc: dccifd is not available: no r/w dccifd socket found
Oct  8 18:21:22.822 [2314] dbg: dcc: dccproc is available: /usr/local/bin/dccproc
Oct  8 18:21:22.823 [2314] dbg: dcc: opening pipe: /usr/local/bin/dccproc -H -x 0 -a 167.114.21.150 < /tmp/.spamassassin2314ikG0qstmp
Oct  8 18:21:22.976 [2314] dbg: dcc: got response: X-DCC-EATSERVER-Metrics: centostest 1166; Body=2 Fuz1=2 Fuz2=2
...
 pts rule name              description
---- ---------------------- --------------------------------------------------
 1.1 DCC_CHECK              Detected as bulk mail by DCC (dcc-servers.net)

A fenti példában láthatjuk, hogy mind három hash már kétszer szerepelt a DCC adatbázisban (body, fuz1 és fuz2)


Ezen felül az email fejlécében elhelyezésre került az alábbi:

X-Spam-DCC: EATSERVER: centostest 1166; Body=2 Fuz1=2 Fuz2=2

Mailspike

A mailspike beállítása nagyon egyszerű. A spamassassin DNS lekérdezéseket fog indítani hogy ellenőrizze hogy a küldő szerepel e a mailspike fekete vagy fehér listáinak egyikén.

Beállítások

A használatához szükség van a DNSEval spmamassassin plugin-re.

/etc/mail/spamassassin/v320.pre

...
loadplugin Mail::SpamAssassin::Plugin::DNSEval
...

A local.cf-be kell beilleszteni a http://mailspike.net/usage.html oldalon található spamassasisn szabály gyűjteményt. Kétféle gyűjteményt ajánl a mailspike, egy nagyon részletes, ahol a 11 kategória szerinti bontásban kapjuk a választ (5 db a rossz hírnévre, és 6 db a jó hírévre) és egy egyszerűt, ahol csak fehér és fekete besorolást kaphat az email. Mi az utóbbit fogjuk használni.

/etc/mail/spamassassin/local.cf

### MailSpike ###
#################

header RCVD_IN_MSPIKE_BL eval:check_rbl('mspike-lastexternal', 'bl.mailspike.net.')
tflags RCVD_IN_MSPIKE_BL net
score RCVD_IN_MSPIKE_BL 3.5
header RCVD_IN_MSPIKE_WL eval:check_rbl('mspike-lastexternal', 'wl.mailspike.net.')
tflags RCVD_IN_MSPIKE_WL net
score RCVD_IN_MSPIKE_WL -2.1

Indítsuk újra az amavis-t:

# service amavisd restart

Tesztelés

A legegyszerűbb ha küldünk magunknak egy levelet egy olyan szerverről, ami biztosan rajta van mailspike fehér listáján, pl a gmail. A spam fejlécek között szerepelnie kell a RCVD_IN_MSPIKE_WL mezőnek is. Láthatjuk hogy a local.cf-ben beállított -2.1-es értéket kapta.

X-Spam-Status: No, score=-3.649 tagged_above=-999 required=6.2
	tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1,
	DKIM_VALID_AU=-0.3, DKIM_VERIFIED=-0.1,
	FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001,
	HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001,
	RCVD_IN_MSPIKE_WL=-2.1, RCVD_IN_SORBS_SPAM=0.5, SPF_PASS=-0.001]
	autolearn=ham

Tanítás, SPAM jelentés

A spam-eket minden felhasználó a spam mappába kell hogy rakja a saját fiókjában. Egy scriptel végig fogunk menni a spam mappákba rakott leveleken, és egyrészt tanítani fogjuk vele a spamassassin-t, másrészt jelenteni fogjuk a razor és a pyzor spam adatbázisok felé.

Spamassassin kézi tanítása

A spamassassin-t a sa-learn prorammal lehet tanítani. Meg kell tanítani, hogy mi a spam és mi a ham, nem elég csak a spam-et megmutatni neki. Fontos hogy tudja, hogy mit nem gondolunk spam-nek. A sa-learn létrehoz egy úgynevezett BayesDB-t, amit a spamassassin használ fel a spam valószínűség eldöntésére. Ez az adatbázis a felhasználó home mappájában a ~/.spamassassin mappában kell hogy legyen. A spamassassin futás közben a futtató user ~/.spamassassin mappájában fogja keresni az adatbázist. Mivel a spamassassin nálunk az amavis user nevében fut, fontos, hogy a /var/spool/amavisd/.spamassassin mappában jöjjön létre az adatbázis.

Emailek betöltése

Azonban a sa-learn programot nem futtathatjuk az amavis nevében, mert az nem fér hozzá a /var/spool/postfix/verutal/.. mappákhoz. A sa-learn programnak meg lehet adni, hogy hova írja az adatbázist.

# /usr/bin/sa-learn --dbpath /var/spool/amavisd/.spamassassin --no-sync --spam /var/spool/postfix/virtual/*/*/.Spam/{cur,new}
Learned tokens from 9 message(s) (9 message(s) examined)

# /usr/bin/sa-learn --dbpath /var/spool/amavisd/.spamassassin --no-sync --ham /var/spool/postfix/virtual/*/*/{cur,new}
Learned tokens from 6 message(s) (6 message(s) examined)
  • --dbpath: Az adatbázis fájl helye.
  • --no-sync : Ne szinkronizálja minden levél után az adatbázist, mert nagyon sokáig tart, majd a végén egyszerre megcsináljuk
  • --spam: SPAM jelentése
  • --ham: HAM-k jelentése
  • A /*/* az összes domain összes fiókján végig fog menni, és megkeresi a .Spam nevű mappákat. (linux funkció, mindig lehet használni)

Szinkronizálás és statisztika

A fenit parancsokat a --no-sync kapcsolóval futtattuk, hogy időt nyerjünk. Ha az összes email be van töltve, akkor szinkronizálni kell az adatbázist (napjában egyszer). Fontos,hogy ezt már az amavis nevében futtassuk, itt már nem lehet megadni az adatbázis mappát.

# sudo -u amavis /usr/bin/sa-learn --sync

Szintnét az amavis felhasználó nevében le lehet kérni az adatbázis tartalmát:

[root@centostest ham]# sudo -u amavis /usr/bin/sa-learn --dump magic
0.000          0          3          0  non-token data: bayes db version
0.000          0         45          0  non-token data: nspam
0.000          0         28          0  non-token data: nham
0.000          0       3065          0  non-token data: ntokens
0.000          0 1279800458          0  non-token data: oldest atime
0.000          0 1475516345          0  non-token data: newest atime
0.000          0 1475613927          0  non-token data: last journal sync atime
0.000          0          0          0  non-token data: last expiry atime
0.000          0          0          0  non-token data: last expire atime delta
0.000          0          0          0  non-token data: last expire reduction count

Finomhangolás

Ha a root nevében fut a sa-learn, akkor a /var/spool/amavisd/.spamassassin mappában az adatbázis fájlok a root nevében jönnek létre első futáskor. Ezeket adjuk az amavis tulajdonába. Innentől kezdve, már az amavis-nál marad, még akkor is, ha a root frissíti.

# chown amavis.amavis /var/spool/amavisd/.spamassassin/*
# ll
total 64
-rw-------. 1 amavis amavis 48416 Oct  4 21:46 bayes_journal
-rw-------. 1 amavis amavis 12288 Oct  4 21:44 bayes_seen
-rw-------. 1 amavis amavis 12288 Oct  4 21:44 bayes_toks

Láthatjuk, hogy a Bayas adatbázis három fájlból áll. Egy emailt többször is át lehet adni az sa-learn-nek, megjegyzi, hogy már egyszer feldolgozta. Ezen felül, ha rájövünk, hogy nem sapm, akkor ha ham-ként újra átadjuk, akkor kiveszi a spam-ek közül.

TipIcon.png

Tip
A BayesDB helyett használhatunk SQL adatbázist is. A Bayes DB egyszerűen áttölthető egy SQL adatbázisba. Az SQL adatbázis használatának akkor van értelme, ha virtuális felhasználónként külön adatbázist akarunk fenntartani


Az /etc/mail/spamassassin/local.cf-ben az alábbi paraméterekkel hangolhatjuk a BayesDB működését:

  • use_bayes ( 0 | 1 ) (default: 1)
  • bayes_min_ham_num: Minimum ennyi ham-et kell neki mutatni, mielőtt elkezdi a BayesDB használatát.
  • bayes_min_spam_num: Minimum ennyi spam-ek az adatbázisába, hogy megkezdje a szűrést.
  • bayes_expiry_max_db_size: (default: 150000): Ha a BayesDB eléri ezt a méretet, akkor a legrégebbi szabályokat kidobja
  • bayes_auto_expire (default: 1): A fenti méret átlépésekor csak akkor dobja ki a régi szabályokat, ha itt engedélyezve van.
...
bayes_min_ham_num	200
bayes_min_spam_num	200
use_bayes 1
...

Tesztelés

A teszt idejére állítsuk be, hogy 10 spam és 10 ham után már használja a Bayes DB-t. A local.cf-be:

bayes_min_ham_num	10
bayes_min_spam_num	10


Tegyünk egy külön mappába 10 biztosan spam és egy másikba 10 biztosan nem spam levelet. Majd tanítsuk meg a spamassassin-nak:

# /usr/bin/sa-learn --dbpath /var/spool/amavisd/.spamassassin --no-sync --spam /root/install/spamassassin/spam
..
# /usr/bin/sa-learn --dbpath /var/spool/amavisd/.spamassassin --no-sync --ham /root/install/spamassassin/ham
..
# sudo -u amavis /usr/bin/sa-learn --sync

Most futtassuk le az egyik spam levélre a spamassassin-t. Látnunk kell hogy figyelembe vette a bayes DB-t, és nagy büntető pontokat adott rá.

# sudo -u amavis spamassassin -D -t 12NCTR~I 
...
Oct  4 22:54:33.493 [2988] dbg: bayes: tie-ing to DB file R/O /var/spool/amavisd/.spamassassin/bayes_toks
Oct  4 22:54:33.494 [2988] dbg: bayes: tie-ing to DB file R/O /var/spool/amavisd/.spamassassin/bayes_seen
...
 pts rule name              description
---- ---------------------- --------------------------------------------------
 3.5 BAYES_99               BODY: Bayes spam probability is 99 to 100%
...
 0.2 BAYES_999              BODY: Bayes spam probability is 99.9 to 100%


Ha olyan email-re futtatjuk, ami a HAM mappában volt, láthatjuk,hogy -1.9 ponttal jutalmazta:

...
pts rule name              description
---- ---------------------- --------------------------------------------------
...
-1.9 BAYES_00               BODY: Bayes spam probability is 0 to 1%
                            [score: 0.0000]

Láthatjuk azt is a log-ban, hogy a spamassassin automatikusan felvette az adott spam emailt a byesDB-be:

...
Oct  8 11:27:02.513 [1552] dbg: plugin: Mail::SpamAssassin::Plugin::AutoLearnThreshold=HASH(0x2caa2c8) implements 'autolearn_discriminator', priority 0
Oct  8 11:27:02.513 [1552] dbg: learn: auto-learn: currently using scoreset 3, recomputing score based on scoreset 1
Oct  8 11:27:02.513 [1552] dbg: learn: auto-learn: message score: 12.308, computed score for autolearn: 14.671
Oct  8 11:27:02.514 [1552] dbg: learn: auto-learn? ham=0.1, spam=12, body-points=14.671, head-points=14.671, learned-points=0.8
Oct  8 11:27:02.514 [1552] dbg: learn: auto-learn? yes, spam (14.671 > 12)
Oct  8 11:27:02.514 [1552] dbg: learn: initializing learner
Oct  8 11:27:02.515 [1552] dbg: learn: learning spam
...

Spamassassin automatikus tanítása

https://spamassassin.apache.org/full/3.1.x/doc/Mail_SpamAssassin_Plugin_AutoLearnThreshold.html
Be lehet állítani, hogy egy bizonyos pontszám alatt vagy felett a spamassassin magától is betegye a bayes adatbázisba a leveleket.

Beállítások

Használatához a AutoLearnThreshold spamassassin plugin-re van szükség:
/etc/mail/spamassassin/v310.pre

..
loadplugin Mail::SpamAssassin::Plugin::AutoLearnThreshold
..

A local.cf-be az alábbi paraméterekkel szabályozhatjuk az autómatikus tanulást:

  • bayes_auto_learn_threshold_nonspam n.nn (default: 0.1) --> The score threshold below which a mail has to score, to be fed into SpamAssassin's learning systems automatically as a non-spam message.
  • bayes_auto_learn_threshold_spam n.nn (default: 12.0) --> The score threshold above which a mail has to score, to be fed into SpamAssassin's learning systems automatically as a spam message.
  • bayes_auto_learn ( 0 | 1 ) (default: 1) --> Whether SpamAssassin should automatically feed high-scoring mails (or low-scoring mails, for non-spam) into its learning systems

Tesztelés

Küldjünk magunknak egy olyan emailcímről levelet, ami biztos hogy nagyon alacsony pontszámot fog kapni, pl gmail. Ekkor a fejlécben meg kell jelenjen, hogy a spamassassin HAM-ként felvette a levelet az adatbázisba: autolearn=ham

X-Spam-Status: No, score=-3.649 tagged_above=-999 required=6.2
	tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1,
	DKIM_VALID_AU=-0.3, DKIM_VERIFIED=-0.1,
	FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001,
	HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001,
	RCVD_IN_MSPIKE_WL=-2.1, RCVD_IN_SORBS_SPAM=0.5, SPF_PASS=-0.001]
	autolearn=ham

AWL-AutoWhiteList

Az AWL használatához szükség van az AWL spamassassin plugin-ra:
/etc/mail/spamassassin/v310.pre

...
loadplugin Mail::SpamAssassin::Plugin::AWL
...

És a local.cf-ben kapcsolhatjuk be:

  • use_auto_whitelist ( 0 | 1 ) (default: 1)
  • auto_whitelist_path /path/filename (default: ~/.spamassassin/auto-whitelist) -->This is the automatic-whitelist directory and filename. By default, each user has their own whitelist database in their ~/.spamassassin directory with mode 0700. For system-wide SpamAssassin use, you may want to share this across all users, although that is not recommended.

Razor és pyzor tanítás

Mivel sem a Razor-nál sem a pyzor-nál nem tudunk közvetlenül visszavonni egy spam jelentést, óvatosabban kell jelenteni. Ráadásul csak egyszer szabad egy levelet jelenteni. Ezért a jelentést csak közvetlen törlés előtt fogjuk megtenni, 30 nap elteltével, hogy legyen ideje visszavonni a felhasználónak a spam státuszt egy levélről.

Fontos, hogy mind a razor mind a pyzor tanítót az amavis nevében kell futtatni. Viszont az amavis nem fér hozzá a levelekhez közvetlenül. Ezért törlés előtt át fogjuk mozgatni a törlendő leveleket az amavis által is olvasható mappába, majd azon futtatjuk a razor és pyzor-t.

Két biztosan spam levélnek állítsuk vissza a modify dátumát 30 nappal az egyik spam mappában.

# touch -d "30 days ago" 13IBYX~R
# touch -d "30 days ago" 13IXCX~X

Majd find paranccsal megkeressük az összes 30 napnál régebbi spam-et, majd a razor-report és a pyzor report paranccsal spam-nek jelentjük.

# find /var/spool/postfix/virtual/*/*/.Spam/cur/ -type f -mtime +10 -exec cp {} /var/spool/amavisd/toReport \;
...
# chown amavis.amavis -R /var/spool/amavisd/toReport
...
# sudo -u amavis find /var/spool/amavisd/toReport -type f -exec razor-report -d {} \;
...
...
# sudo -u amavis find /var/spool/amavisd/toReport -type f -exec sh -c 'pyzor report < "{}"' \;
public.pyzor.org:24441	(200, 'OK')
public.pyzor.org:24441	(200, 'OK')
...
# /bin/rm *

Ezt fogjuk majd automatizálni.


Autómitizálás

A tanító scripteket a /etc/cron.daily mappában kell elhelyezni és 755 jogot kell rá futni. A /etc/cron.daily scriptek körülbelül 3 és 4 között lesznek futtatva hajnalba. Fontos, hogy hajnalba fusson a script, mert ilyenkor a legkisebb a valószínűsége hogy a ham mappában spam is van.

Egyszerűsített script

A script első változatában azon felhasználók email mappája akikre a sa-learn programot futtatni szeretnénk egyenként fel van sorolva. Az összes felhasználóra nem szabad lefuttatni az sa-learn-t, mert egyrészt vannak technikai email címek (mint pl.ahova a spam megy), vagy vannak olyan felhasználók, akik nem rakják a spam mappába a valódi spam-eket.


ImportantIcon.png

Note
Mivel az adatbázis szinkronizálása nagyon időigényes, fontos, hogy ham és spam mappákat átadó futtatások esetében a --no-sync szerepeljen, ami nem frissíti be kapásból a db-be az új szabályokat, hanem egy ideglenes fájlban tárolja őket. Mikor az összes új szabályt hozzáadtuk az ideglenes fájlhoz akkor a végén egyszer meghívjuk a sa-update-et --sync kapcsolóval


#!/bin/bash


AMAVIS_REPORT_DIR="/var/spool/amavisd/toReport"
LOG_TAG="SA_LEARN"


/bin/logger -t $LOG_TAG "Starting mail reporting"

## train spamassasin ##

/usr/bin/sa-learn --dbpath /var/spool/amavisd/.spamassassin --no-sync --spam /var/spool/postfix/virtual/berki2.org/adam/.Spam/{cur,new} | /bin/logger -t $LOG_TAG

/usr/bin/sa-learn --dbpath /var/spool/amavisd/.spamassassin --no-sync --spam /var/spool/postfix/virtual/berki2.org/adam/.Junk/{cur,new} | /bin/logger -t $LOG_TAG

/usr/bin/sa-learn --dbpath /var/spool/amavisd/.spamassassin --no-sync --ham /var/spool/postfix/virtual/berki2.org/adam/{cur,new} | /bin/logger -t $LOG_TAG

sudo -u amavis /usr/bin/sa-learn --sync | /bin/logger -t $LOG_TAG


## train razor and pyzor ##

/bin/find /var/spool/postfix/virtual/*/*/.Spam/cur/ -type f -mtime +10 -exec /bin/mv {} $AMAVIS_REPORT_DIR \;
/bin/find /var/spool/postfix/virtual/*/*/.Junk/cur/ -type f -mtime +10 -exec /bin/mv {} $AMAVIS_REPORT_DIR \;

chown amavis.amavis -R $AMAVIS_REPORT_DIR

if [ "$(ls -A $AMAVIS_REPORT_DIR)" ]; then

	/bin/logger -t $LOG_TAG "Reporting to pyzor and rayzor"

	sudo -u amavis find $AMAVIS_REPORT_DIR -type f -exec razor-report -d {} \; | /bin/logger -t $LOG_TAG

	sudo -u amavis find $AMAVIS_REPORT_DIR -type f -exec sh -c 'pyzor report < "{}"' \; | /bin/logger -t $LOG_TAG

  	/bin/rm $AMAVIS_REPORT_DIR/*		

else
	/bin/logger -t $LOG_TAG "Skipping pyzor and rayzor as folder is empty"
fi

/bin/logger -t $LOG_TAG "Mail reporting finised"

exit

A logoláshoz a logger parancsot használtuk, amivel a /var/log/messages fájlba írhatunk a -t után megadott előtaggal.

Teljes megoldás

Itt csak az alapötletet írom le, nem próbáltam ki. Vagy a webmail felületet vagy az email admin felületet és az email adatbázist ki kell egészíteni egy falg-el, ami azt állítaná, hogy az adott felhasználó akarja e tanítani ezen rendszereket. (Ezt implementálni kell nekünk, jelenleg nincs ilyen).

Majd az adatbázisból lekérdezzük azokat akik részt vesznek a tanításba:


USER=''
PASS=''
HOST=''
LOG='/var/log/sa-learn.log'
...
mysql --skip-column-names -u$USER -p$PASS -h$HOST -D$DB -e "SELECT SUBSTRING(email, 1, LOCATE('@', email) - 1) AS user, SUBSTRING(email, LOCATE('@', email) + 1) AS domain FROM virtual_users" WHERE <be van pipálva hogy részt vesz a tanításban>| while read user domain;
do
  ....
  echo "Syncing the SpamAssassin journal" >> $LOG 2>&1
  ...
  <ide jöhet a tanítás>

  
done

exit

Megtanult szabályok mentése és visszatöltése