Statisztikai spamszűrő

Jegyzet magamnak (ha mégis használod, öröm bódogság):


apt-get install qsf
touch /etc/postfix/qsf.sh
chmod +x /etc/postfix/qsf.sh

/etc/postfix/qsf.sh:

#!/bin/bash

DB="/etc/postfix/qsf-tokens.db"
IN=$(cat)

# -s subjectbe teszi ezt: [SPAM]
# -L 0-100-ig terjedo skala, mettol felfele spam a level
MAIL=$(echo -e "${IN}" | qsf -d $DB -r -s -L 90)
echo -e "${MAIL}" | /usr/sbin/sendmail -oi -f ${1} ${2}

exit $?

/etc/postfix/main.cf:

#header and body check
header_checks = regexp:/etc/postfix/postfixheader

/etc/postfix/postfixheader:

/^X-Spam: YES/ REDIRECT spam@domain.tld

(vagy megoldod maildroppal, vagy mással, ahogy tetszik, ízlés kérdése)

/etc/postfix/master.cf:

#QSF
filter unix - n n - 1 pipe
flags=Rq user=nobody argv=/etc/postfix/qsf.sh ${sender} ${recipient}

A qsf-tokens.db fájl nem fog létrejönni magától, hanem a
tanítási folyamat során keletkezik. Utána postfix tulajdonába kell tenni.
Postfix restartot ne felejtsd el.

Tanítás:

# spam
qsf -d /etc/postfix/qsf-tokens.db -m < emailfile
#ham
qsf -d /etc/postfix/qsf-tokens.db -M < emailfile

Első körben mutatni kell neki egy valag hamet és kb. ugyanannyi spamet.
Javaslom, hogy élesre állítás előtt ne dobd el a spameket, csak
jelölgesd őket és figyeld, van-e false pozitív.
Nekem kb. egy nap alatt betanult némi terelgetés árán.

Én csináltam egy spamjelölő scriptet, ami óránként lefut és a megjelölt
mappákban lévőket spamnek jelöli:


#!/bin/bash

DB="/etc/postfix/qsf-tokens.db"

SPAMS="/vmail/domain.tld/username/.Junk/cur
/vmail/domain.tld/username/.Junk/new"

for i in $SPAMS ; do
NR=$(ls -l ${i})
if [ "${NR}" != "total 0" ] ; then
for b in `ls ${i}` ; do
qsf -d $DB -m < ${i}/${b}
R="${R}${i}/${b} - ${?}"
done
rm ${i}/*
fi
done

echo -e "${R}" >> /var/log/spamlearn.log

Így a jövőben csak oda kell bedobnom azt, ami véletlenül átcsúszott.
Az eredmény az SA-val szemben, hogy ez a módosult spameket is kiszűri,
míg az SA abban már nem jeleskedett. Szóval nagyon látványos a javulás.

Nem mondom, hogy szépen van megoldva, biztosan lehetne szebben is, de erre a szerverre ez nekem bőven jó így.
Ha van optimalizáló ötleted, szívesen fogadom.

Hozzászólások

Hogy lehetne szépen megoldani, hogy ne kelljen forkolni minden alkalommal (azt leszámítva, hogy ez kis cucc nem tud daemon módban futni)?

hat, akkor sehogy :-) marad a forkolas, ez van. Ha birja a gep, akkor nem gaz.

--
"A politikat, gazdasagot es a tobbi felsorolt faszsagot leszarom, amig engem nem erint (nem erint)" (bviktor)

2 megjegyzés:

- úgy érzem, az a BOOL ott a végén valami korábbi maradvány, de ma már nem kell
- az rm -mel befürödhetsz, ha iszonyatosan sok levél esik be és túlszaladsz az ARG_MAX-on (és kapsz egy szupcsi kis "Arg list too long"-ot törlés helyett).
Mondjuk erről a qsf-ről se hallottam még. (Én ilyen dolgokra a bogofilter-t szoktam amúgy javasolni.)

Igen, anno ezt a scriptet SA-hoz használtam (volt egy további része, ahol további műveletek voltak végezve, ha a BOOL nem üres), onnan maradhatott bent, javítom, thx!
Rm kérdése: a jelzett mappák csak azt tartalmazzák, amit beleteszek, így magától nem fog belepottyanni semmi. De a felvetés ettől függetlenül jogos lehet, ha olyan mappára alkalmazom, amibe egy sieve dobálhat valamit.

Jogos. Elvileg ugyanazon algoritmus szerint dolgoznak ezek nem? Max az implementációja különbözik.
A qsf egyébként számomra is ismeretlen volt ezelőtt. Kipróbáltam egy pár ismertebbet, majd a tárolóban belefutottam ebbe. Bár nem nagyon fejlesztik már, de teszi a dolgát, egyszerű konfolni. Amíg jól végzi a rábízott feladatot, marad, ha aggályaim merülnek fel, cserélem.

Jaja. Mondjuk ha jól rémlik, annyival nyújt többet, hogy tud valami olyat, hogy daemonként figyel a levelekre és dobja vissza, hogy H/S. Pont a fent már kritizált "minden levélre forkolok egyet" funkciót lehet vele kikerülni (de az tény, hogy azt az üzemmódját asszem az életben nem használtam).