DSPAM
Lies, damned lies and statistics. DSPAM je eno tako statistično čudo, ki rado prežvekuje in statistično (ne)natančo ocenjuje vaše maile. Vendar več ko ma izkušenj, bolje mu gre.
Pred inštalacijo
Download. Unpack. Read README. All of it. Read README again. Next, day, read README again.
Odloči se, na kakšen način boš integriral dspam v svoj sistem. Tu opisana varjanta je za maso virtualnih userjev z minimalno interakcijo z dspamom, ki teče kot standalone daemon na samostojni mašini.
Razmisli o tem, kje boš hranil token data. V pomoč nekaj številk: hash_drv naj bi bil tja do 3x hitrejši od mysql_drv (ustno izročilo, nisem preverjal), vendar je v 3.6.x še nov in mu manjka par zadev (že pozabil kaj točno). Mysql_drv je production quality, pgsql_drv ga dohiteva, ostali pa so slow/unmaintained/deprecated. Token storage zahteva redno vzdrževanje, ki se ga da poskriptat in vtaknit v cron: gre predvsem za brisanje tokenov, ki so se izkazali za nepomembne. Zadeva je štorasta toliko, ker je storage driver specific in univerzalen tool, ki naj bi skrbel za to, to počne slabo ali pa sploh ne. Sicer računaj na nekaj gb porabljenega prostora po učenju (vsaj pri mysqlu) in dolgoročno 300-500mb per user. Glavobol? Ja, zato pa preberi README, sekcijo o groupah.
Razmisli o tem, kako boš userjem omogočil, da učijo dspam. Preberi README o možnostih, ki jih imaš na razpolago in se odloči za najbolj všečno glede na situacijo.
Inštalacija
Zadeva je rahlo nestandardna. Tako je recimo dokaj pozno dobila šele config file, prej je bilo potrebno vse navesti pri ./configure. Tudi sedaj ni dosti drugače - v config file je avtor spravil res le zadeve, za katere bi bil recompile res preveč zatežena opcija. Kaj uporabljam sam in zakaj:
–sysconfdir=/etc/dspam .. ker gre sicer nekam v /usr/local
–with-dspam-home=/var/dspam … same
–with-storage-driver=mysql_drv … ali kateri izmed drugih, po želji
–with-mysql-includes=/usr/include/mysql/
–with-mysql-libraries=/usr/lib/ … zadeva je še toliko butasta, da ne zna sama najti tega
–enable-daemon … ker hočemo eno instanco in ne fork()a za vsak mail
–enable-clamav … spotoma naj mail zavije še čez clamd
–enable-large-scale … ena izmed hashing shem za hendlanje user data
–enable-long-usernames … podpora usernameom z @
–enable-virtual-users … nočemo sistemskih userjev
Configure opcij je še precej več. Again, read README.
Make se zgodi mimogrede, make install pravtako.
Konfiguracija
vi /etc/dspam/dspam.conf … je precej selfexplanatory, vendar odprt README v sosednjem tabu terminala pride večkrat zelo prav.
Glede na odločitev o načinu integracije na začetku se tu nastavi, ali bo zadeva delovala kot delivery agent ali bo predala mail naprej prek SMTPja ali LMTPja. V slednjem primeru mu povej še, kam naj dostavlja mail. Sledi nekaj detajlov o karanteni (če jo želite uporabljati), kaj naj se zgodi OnError, ter naslednja zanimiva in glavobole povzročajoča sekcija, Trusted Users. Again, study README. Debug pride prav, če želiš spremljati dogajanje samo za določenega userja (vendar moraš prej skompajlati zadevo še z –enable-debug).
Naslednja reč si zasluži svoj odstavek, training mode. Kaj so kratice:
- toe: train on error
- tum: train until mature
- teft: train everything
- notrain: yay, ni kratica!
Naslednje tri opcije, Feature, Algorithm in PValue so “Don't mess with this unless you know what you're doing” oz. si vsaj akademik z doktoratom iz statistike.
Sledi še nekaj manj pomembnih zadevic (ImprobabilityDrive, hehe), ki jim sledijo preference. Osebno jih imam zabetonirane na:
Preference “signatureLocation=headers”
Preference “showFactors=off”
Preference “spamAction=tag”
Preference “spamSubject=[SPAM]”
Zabetonirane tako, da so vsi AllowOverride zakomentrani.
Sledijo nastavitve za posamezn storage driver. See README …
Najbolj zanimiva in glavobol povzročajoča je MySQLUIDInSignature. Google it. Zadeva je nesramna, ker izgleda kot da dela, samo ubistvu ne dela. Vsaj meni ne. Pa sem mislil, da mi. Whatever.
Sledi nekaj nastavitev o purganju tokenov, ki so z sqlom irelevantni, ker so v ločeni sql skripti.
Sledi LocalMX, ki ga je potrebno pravilno izpolniti glede na infrastrukturo okoli dspama. Več MXov ločimo s presledki.
SystemLog in UserLog, kakor se že lepo slišita, služita zgolj za futranje priloženega CGIja za lepe grafke “za šefeta”. Uporaba po želji.
TrainPristine … Opt … TrackSources … naslednji glavobol, ParseToHeaders & friends. Glede na to, kako si si pred inštalacijo zamislil učenje dspama, odkomentiraj po potrebi in preveri, da stvar res deluje (sam nisem več prepričan v to).
Broken case vedno pride prav (star cyrus, eh eh).
MaxMessageSize … ClamAV nastavitve … Server nastavitve … nastavi vsaj port, pid in ident string.
Sledi še nekaj glede client modea, RABL experimenta in čisto na koncu še par stvari, ki bi morale biti zgoraj pri algoritmih.
Zmedeno? Ja. Že samo po config fajlu se da sklepati, da je avtor en zmeden genij :)
Integracija
Zadeva je seveda brez init skripte. Za debian sem sčaral skupaj nekaj takega:
#!/bin/sh test -x /usr/local/bin/dspam || exit 0 # Source defaults file. PARAMS='' if [ -f /etc/default/dspam ]; then . /etc/default/dspam fi case "$1" in start) echo -n "Starting dspam" start-stop-daemon --start --quiet -b --exec /usr/local/bin/dspam -- $PARAMS echo "." ;; stop) echo -n "Stopping dspam" start-stop-daemon --stop --quiet \ --pidfile /var/run/dspam.pid --exec /usr/local/bin/dspam echo "." ;; restart) echo -n "Restarting dspam" kill -HUP `cat /var/run/dspam.pid` echo "." ;; force-reload|reload) echo -n "Reloading configuration of dspam" start-stop-daemon --stop --signal 1 --quiet \ --pidfile /var/run/dspam.pid --exec /usr/local/bin/dspam echo "." ;; *) echo "Usage: /etc/init.d/dspam " \ " {start|stop|restart|reload|force-reload}" >&2 exit 1 ;; esac exit 0
V našem MTAju (seveda je to postfix) pripravimo en dodaten port, na katerem bo sprejemal obdelane maile. Najlepši primer, kaj in kako za to je v amavis dokumentaciji.
Pripraviti moramo tudi mehanizem za učenje. Moja ideja in želja sta bila dva aliasa za missed spam in fase identified ham, kombinirana z “uid in signature”. Po nekaj tednih čohanja po glavi je ostalo samo pri želji, enak efekt pa sem dosegel s skriptico, ki iz maila izbrska recipienta in ga porine dspamu z njim kot parametrom.
Tole gre v postfixov master.cf:
dspam-relearn unix - n n - 1 pipe flags=Rhqu user=nonroottrusteduser:mail argv=/usr/local/bin/dspam_wrapper.sh ${nexthop} lmtp-dspam unix - - n - 1 lmtp -o lmtp_send_xforward=yes -o disable_dns_lookups=yes
In tole v main.cf:
content_filter=lmtp-dspam:[IP]:PORT
Moj quick & dirty hack dspam_wrapper.sh pa izlgeda tako:
#!/bin/bash TMP=`mktemp /dev/shm/XXXXXX` cat > $TMP user=`cat $TMP | grep ^From: | head -1 | cut -f2 -d' '` cat $TMP | /usr/local/bin/dspam --user $user --class=$1 --source=error rm -f $TMP
Seveda moramo še v ustrezni transport mapi poskrbeti, da se maili routajo na dspam:
spam@domain dspam-relearn:spam ham@domain dspam-relearn:innocent
Ena izmed bolj zanimiv alternativ mojemu hacku je bila pred kratkim na mailing listi:
# /etc/postfix/transport.pcre /^spam-(.*)@(.*)$/ dspam-relearn:spam /^ham-(.*)@(.*)$/ dspam-relearn:innocent
Uporabi domišljijo in znanje iz READMEja, kako v tem primeru poskrbiš za ostalo.
Na koncu moraš poskrbeti, da bodo tvoji userji na njim razumljiv način znali dostavljati pošto na ta dva naslova. Kako to storiš, je up to you. Mogoče se lahko poigraš s priloženim perl CGIjem z grafki, karanteno & god knows what. Iz njega lahko vsaj dobiš idejo, do kakšne mere lahko razvajaš userja z uporabo dspama :)
Mogoče še beseda o začetnem učenju … če imaš pri roki lep arhiv spama, ga vsekakor uporabi. Pozor le na to, da moraš imeti pri roki tudi arhiv vsaj enake, še bolje večje količine hama. Ko imaš zadevo naučeno, lahko preklopiš na toe training in ga futraš samo še z napakami.
Končni vtis
Zadeva “deluje”. Daje vtis čudovite akademske igrače, ki se spogleduje z realnim svetom. Zato ima ogromen potencial, vendar je zanjo potrebno preliti še nekaj švica, da bo domača tudi v realnem svetu. Konkreten primer: če vklopiš ShowFactors in pošiljaš okrog unicode maile, ostane unicode tak kot je v teh faktorjih, ki grejo v headerje … čemur se potem upre vsak pošten MTA. Logging je tudi nonexistant, more or less … Tako da zveš kaj se dogaja samo s strace in gdb, ker pač ne moreš ves čas laufati zadeve v debuggingu in spremljati nekaj sto vrstic outputa per filtered mail …
Po drugi strani pa zadeva na 1.2ghz p3 ne porabi za mail več kot 0.02s, kar je številka iz drugega vesolja napram amavisd/spamassassin opciji in je v določenih okoljih vredna dodatnega truda. Pač za tiste, ki vejo, zakaj jo rabijo.
DSPAM WebUI with Virtual Users
apt-get install dspam-webfrontend apt-get install mod_auth_mysql
Then create a .htaccess file in the DSPAM WebUI folder (/var/www/dspam), containing this configuration:
AuthName "DSPAM Authentication" AuthType Basic AuthBasicAuthoritative Off Auth_MySQL_Host localhost AuthMySQL_User <your mysql user name here> AuthMySQL_Password <your mysql password here> AuthMySQL_DB mail AuthMySQL_Password_Table users AuthMySQL_Username_Field email AuthMySQL_Password_Field password AuthMySQL_Encrypted_Passwords on AuthMySQL on AuthMySQL_Authoritative On require valid-user
After that, create a new virtualhost (or use an existing) with the following settings:
<VirtualHost> DocumentRoot "/var/www/dspam" ServerName dspam.yourdomain.tld SuexecUserGroup dspam dspam <Directory /var/www/dspam> Options ExecCGI Options -Indexes Addhandler cgi-script .cgi DirectoryIndex dspam.cgi </Directory> </VirtualHost>