Difference between revisions of "Email Server - Extended Spam filtering"
(→Pyzor) |
(→Pyzor tesztelése a parancssorból) |
||
Line 134: | Line 134: | ||
public.pyzor.org:24441 (200, 'OK') | public.pyzor.org:24441 (200, 'OK') | ||
</pre> | </pre> | ||
+ | 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. | ||
Revision as of 22:24, 20 September 2016
Eszközök
Spamassassin
Bayes and AWL
The Auto-WhiteList
DKIM
DKIM (DomainKeys Identified Mail): http://www.dkim.org/
- A DKIM szerver a levelet elküldés előtt a titkos kulcsával aláírja, majd az aláírást elhelyezi az email fejlécében.
- A DKIM kliens az email-hez hozzárakott digitális aláírás segítségével ellenőrzi a beérkező emailt, hogy valóban az küldte e aki a feladókén szerep benne, ezen felül az időpont és a tárgy lett e módosítva. A DKIM kliens a publikus kulcsot az email domain DNS szerverétől kérdezi le.
A DNS szerverben lehetőség van úgynevezett TXT rekordok felvételére. A TXT rekordokban tetszőleges, emberek által is megérthető szöveget lehet elhelyezni. DNS rekordok:
- SOA: globális beállításai a zóna fájlnak
- NS: a DNS szerver domain neve az adott domain-ben.
- MX: (mail exchange), a mail kiszolgálója az adott domain-nek
- A: normál domain – ip cím összerendelések.
- TXT: tetszőleges szöveg
A DNS szerverünkben el kell helyezni egy új TXT rekordot az adott domainhez. Pl a berki.org domainhez hozzá adjuk a dkim nevű TXT típusú rekordot, amiben elhelyezzük a berki.org publikus kulcsát. Ezt a TXT típusú rekordot nevezik a DKIM terminológia szerint selctor-nak. A DKIM szerverünk a kiküldött email fejlécében az aláíráson felül elhelyezi a szelektort is. A DKIM kliens lekérdezi a DNS szervertől a szelekor-ban megadott TXT típusú rekordot, és kiolvassa belőle a szerver publikus kulcsát, amivel kititkosítja a DKIM szerver által készített aláírást. A benne található host nevet összehasonlítja az email fejlécében szereplő host névvel. Három féle DKIM aláírás típus létezik, ami befolyásolja azon email-ek sorsát amik nincsenek aláírva.
- Nem minden email van aláírva az adott domain-ből.
- Miden email alá van írva amit az adott domain-ből küldünk. Ha egy email nincs aláírva, akkor valószínűleg spam.
- Minden email alá lesz írva. Ha egy email nincs aláírva, akkor az tuti hogy spam, azonnal törlendő.
Az aláírás típusát két további TXT típusú DNS rekord vezérli, melyeknek a neve kötött, a szabvány írja elő a nevüket:
- _domainkey (domain policy)
- "o=~"
- "o=-"
- _adsp._domainkey:
- "dkim=unknown"
- "dkim=all"
- "dkim=discardable"
A selector TXT rekordja a típust is tárolja, ezért mikor a DKIM szerver lekérdezi a DNS -töl az aláírást, azt is megtudja, hogy mit tegyen hogy ha a selctor megléte ellenére nincs egy mail aláírva.
Warning
Ha egy email nincs aláírva annak ellenére, hogy a DNS szerverben találunk DKIM rekordot, vagy az aláírás nem valid, nem jelenti azt hogy az email 100%-ban spam. A fejléc menet közben módosulhat, megsérülhet, vagy átmenetileg szünetelhet a DKIM aláírás a szerben bármilyen technikai hiba miatt
Tip
A no-ip.com dinamikus DNS szolgáltató is támogatja a DKIM használatát
- https://www.howtoforge.com/set-up-dkim-domainkeys-identified-mail-working-with-postfix-on-centos-using-opendkim-p2
- https://www.rosehosting.com/blog/how-to-install-and-integrate-opendkim-with-postfix-on-a-centos-6-vps/
- https://www.rosehosting.com/blog/how-to-install-and-integrate-opendkim-with-postfix-on-a-centos-6-vps/
- http://www.stevejenkins.com/blog/2011/08/installing-opendkim-rpm-via-yum-with-postfix-or-sendmail-for-rhel-centos-fedora/
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.
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
mailspike
http://mailspike.net/usage.html
Telepítés
Pyzor
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
/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
Pyzor tesztelése a parancssorból
http://pyzor.readthedocs.io/en/release-1-0-0/client.html
Szerver kapcsolat tesztelése
# 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:
# cat ~/.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:
# pyzor check < Need_to_See_Ya.mbox public.pyzor.org:24441 (200, 'OK') 1 0
vagy:
# 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
Email spam jelentése:
# 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 vebes 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:
# pyzor whitelist < spam.eml
Saját szerver használata
Ha nagyon sok egyedi spam-ünkvan, 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
# yum install spamassassin
Mi hol van
- DEF_RULES_DIR=/usr/share/spamassassin,
- LOCAL_RULES_DIR=/etc/mail/spamassassin
- LOCAL_STATE_DIR=/var/lib/spamassassin
DKIM
Ha nem használnánk az amavis email szkennert, akkor a DKIM ellenőrzést a spamassassin-ba kéne beállítani, az aláírás elhelyezését pedig a postfix-be. Ehhez szükség lenne az openDKIM programra és a DKIM spamassassin plugin-ra. De az amavis-new ezt beépítetten tudja.
# yum install perl-Mail-DKIM
- http://tech.cbjck.de/2014/02/08/dkim-with-amavis/
- https://sys4.de/de/blog/2013/09/02/amavisd-new-dkim-howto/
Kulcsok generálása
amavisd.conf
DNS módosítások
Tesztelés
Szabályok frissítése
Spam adatbázis
A Spamassassin szabály adatbázisa a /var/lib/spamassassin/<verziószám> mappában található, az esetünkben itt: /var/lib/spamassassin/3.003001
Ezen belül minden úgynevezett "csatornának" van egy saját almappája, amiben az adott csatorna szabálygyűjteménye található. A csatorna egy "szervezetnek" a saját szabálygyűjteménye. A hivatalos "gyári" csatorna/szabálygyűjteménye az update_spamassassin_org nevet viseli. Ezen felül még rengeteg egyéb nem hivatalos csatorna/szabálygyűjteménye létezik.
A sa-update parancsnak meg kell adni, hogy milyen csatornákat frissítsen ill. töltsön le. Ezt a --channel kapcsoló után tudjuk megadni, ahol a csatorna/szabálygyűjteménye URL-jét várja.
A hivatalos CentOS repository-ból telepített spamassassin esetében a sa-update parancsot a /usr/share/spamassassin/sa-update.cron script hívja meg. A csatornákat a /usr/share/spamassassin/sa-update.cron használata esetén a /etc/mail/spamassassin/channel.d mappában elhelyezett csatorna leíró fájlokból olvassa ki a script, és ezekkel a csatorna URL-ekkel hívja meg a sa-update parancsot.
Gyárilag két csatorna van a /etc/mail/spamassassin/channel.d mappában, a hivatalos updates_spamassassin_org és a széles körben elterjedt sought_rules_yerp_org:
[root@server channel.d]# ll /etc/mail/spamassassin/channel.d total 12 -rw-r--r--. 1 root root 2572 Dec 5 2013 sought.conf -rw-r--r--. 1 root root 4915 Dec 5 2013 spamassassin-official.conf
A csatorna leírók fájl elején található a csatorna URL-je, majd ezt követi az a kulcs amivel a frissítéseket aláírja a kibocsájtó. Pl. a spamassassin-official.conf fájl eleje az alábbi:
# http://wiki.apache.org/spamassassin/RuleUpdates CHANNELURL=updates.spamassassin.org KEYID=5244EC45 # Ignore everything below. return 0 This is the GPG key that updates are signed with (currently, as of Wed Dec 21 19:31:38 PST 2005. Please contact <dev /at/ spamassassin.apache.org> with any questions. -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.2 (SunOS) .....
A /usr/share/spamassassin/sa-update.cron script kiolvassa innen az összes csatorna leíró fájlt, és hozzáfűzi a --channel paraméterhez a leírókból kiolvasott URL-eket.
Minden csatornának van egy saját almappája és egy csatorna leírója a /var/lib/spamassassin/3.003001 szabály adatbázis gyűjtőmappában.
[root@server 3.003001]# ll /var/lib/spamassassin/3.003001 total 16 drwxr-xr-x. 2 root root 4096 Mar 12 2015 sought_rules_yerp_org -rw-r--r--. 1 root root 123 Mar 12 2015 sought_rules_yerp_org.cf drwxr-xr-x. 2 root root 4096 Sep 8 05:53 updates_spamassassin_org -rw-r--r--. 1 root root 2851 Sep 8 05:53 updates_spamassassin_org.cf
Tip
Ezekről a mappákról teljesen felesleges biztonsági mentést csinálni, mivel a sa-update mindig a legfrissebb gyűjteményt hozza le.
Warning
Úgy tűnik, hogy a sought szabályokhoz már jó ideje nem jön frissítés. A sa-update ezt a választ adja manuális update esetén minden nap:
# /usr/bin/sa-update -v --channel sought.rules.yerp.org --gpgkey 6C6191E3 Update finished, no fresh updates were available
Tanítás
https://kb.site5.com/email/how-to-train-spamassassin/
http://www.hostdango.com/train-spamassassin/
https://spamassassin.apache.org/full/3.1.x/doc/sa-learn.html
Szerintem nem jó, hogy a root nevében fut, és hogy oda rakja le a ./spamassassin mappába amit talál. Onnan hogy fogja felnyalni?
#!/bin/bash
## Database details
USER=''
PASS=''
HOST=''
DB='postfix'
## Where to log stuff
LOG='/var/log/sa-learn.log'
## How many days to wait before deleting spam
## Comment out to disable
CLEAN=30
echo -e "\n\nRun started `date +%c`" >> $LOG 2>&1
## Spam and ham training for all virtual users
## Delete spam older than $CLEAN days
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" | while read user domain;
do
## Spam
echo "Spam training for $user@$domain" >> $LOG 2>&1
/usr/bin/sa-learn --no-sync --spam /var/spool/postfix/virtual/$domain/$user/.Junk/{cur,new} >> $LOG 2>&1
## Ham
echo "Ham training for $user@$domain" >> $LOG 2>&1
/usr/bin/sa-learn --no-sync --ham /var/spool/postfix/virtual//$domain/$user/{cur} >> $LOG 2>&1
## Delete
if [ -n $CLEAN ]; then
echo "Deleting spam for $user@$domain older than $CLEAN days" >> $LOG 2>&1
find /var/spool/postfix/virtual/$domain/$user/.Junk/cur/ -type f -mtime +$CLEAN -exec rm {} \;
fi
done
## Sync the SpamAssassin journal and print out stats
echo "Syncing the SpamAssassin journal" >> $LOG 2>&1
/usr/bin/sa-learn --sync >> $LOG 2>&1
echo "Statistics for this run:" >> $LOG 2>&1
/usr/bin/sa-learn --dump magic >> $LOG 2>&1
echo -e "Run finished `date +%c`" >> $LOG 2>&1
exit
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
Run started Sat 10 Sep 2016 10:57:28 PM CEST Spam training Learned tokens from 3889 message(s) (3889 message(s) examined) Learned tokens from 1 message(s) (1 message(s) examined) Learned tokens from 1 message(s) (1 message(s) examined) Ham training Learned tokens from 3479 message(s) (3479 message(s) examined) bayes: bayes db version 0 is not able to be used, aborting! at /usr/share/perl5/vendor_perl/Mail/SpamAssassin/BayesStore/DBM.pm line 203. Learned tokens from 11401 message(s) (11503 message(s) examined) Deleting spam for @ older than 30 days Syncing the SpamAssassin journal expired old bayes database entries in 37 seconds 132820 entries kept, 645263 deleted token frequency: 1-occurrence tokens: 49.55% token frequency: less than 8 occurrences: 23.04% Statistics for this run: 0.000 0 3 0 non-token data: bayes db version 0.000 0 3890 0 non-token data: nspam 0.000 0 14880 0 non-token data: nham 0.000 0 132820 0 non-token data: ntokens 0.000 0 1462517177 0 non-token data: oldest atime 0.000 0 1473531473 0 non-token data: newest atime 0.000 0 0 0 non-token data: last journal sync atime 0.000 0 1473542242 0 non-token data: last expiry atime 0.000 0 11059200 0 non-token data: last expire atime delta 0.000 0 645263 0 non-token data: last expire reduction count Run finished Sat 10 Sep 2016 11:17:25 PM CEST
# ll total 5744 -rw-------. 1 root root 2535424 Sep 10 23:17 bayes_seen -rw-------. 1 root root 4837376 Sep 10 23:17 bayes_toks