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).
MaxMessageSizeClamAV 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>
dspam.txt · Last modified: 2009/05/25 00:35 (external edit)
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 ipv6 ready