Sähköpostin suodatus procmaililla ja SpamAssassinilla
Sähköposti on monimutkainen järjestelmä, jossa on paljon menneisyyden painolastia. Fixmen sähköpostiratkaisu koostuu monesta osasta, joista mainittakoon mm.
- Postfix – MTA eli Mail Transport Agent, "SMTP-palvelin", välittää sähköpostia muualta meille ja meiltä muualle
- Dovecot – POP3- ja IMAP-palvelin, mahdollistaa sähköpostin lukemisen "perinteisillä" sähköpostiohjelmilla
- SpamAssassin – roskapostisuodatin, merkitsee roskapostiksi epäillyt viestit
- procmail – sähköpostin lajitteluohjelma, lajittelee viestit kansioihin otsikkotietojen mukaisesti
Tämä ohje käsittelee kahta jälkimmäistä komponenttia eli SpamAssassinia ja procmailia Fixmen ympäristössä. Ohje saattaa olla rajoitetusti sovellettavissa muuallekin, mutta sähköpostijärjestelmän konfiguraatiossa esiintyy villiä palvelinkohtaista vaihtelua.
Huomautetaan vielä, että SpamAssassin ja procmail eivät ole Fixmellä käytössä globaalisti (site-wide), vaan kunkin käyttäjän on otettava ne itse käyttöön. Tämä lisää hieman käyttäjien vaivaa, mutta toisaalta mahdollistaa myös muiden vastaavien ohjelmistojen käytön. Tämä ohje käsittelee kuitenkin vain SpamAssassinia ja procmailia, joten jos haluat käyttää jotain muita vastaavia ohjelmistoja, löytyy sinulta toivottavasti niiden käyttöön vaadittu asiantuntemus.
Yleiskuva
Tässä ohjeessa oletetaan, että haluat käyttää nimenomaan Fixmeä (yhteistä virtuaalikonetta) "saapuvan sähköpostin palvelimenasi" eli lukea sähköpostisi IMAPilla tai POP3:lla palvelimelta mail.fixme.fi.
Olennaisesti aiomme tässä ohjeessa pystyttää seuraavanlaisen liukuhihnan sähköpostin käsittelyyn:
postfix --> procmail --> deliver
| ^
| |
v |
spamassassin
Hieman yksityiskohtaisemmin siis
- Postfix vastaanottaa sähköpostiviestin joko paikallisesti (mail, sendmail jne.) tai intra- tai Internetistä SMTP:llä
- Postfix antaa viestin käyttäjän konfiguroiman procmail-lajittelijan käsiteltäväksi
- procmail antaa viestin SpamAssassinin käsiteltäväksi
- SpamAssassin tarkistaa, onko viesti roskapostia, ja palauttaa sen procmailille
- procmail päättää .procmailrc-tiedostossa annettujen ohjeiden perusteella, mihin kansioon viesti lajitellaan
- procmail antaa viestin Dovecotin deliver-ohjelmalle kertoen sille samalla, mihin kansioon viesti kuuluu
- deliver tallettaa viestin oikeaan kansioon ja päivittää Dovecotin välimuistitiedostot
Yksinkertaista, eikö totta?
Ylläpidon ja käyttäjän välinen rajapinta on käytännössä Postfixin ja procmailin välillä ja toisaalta procmailin ja deliverin (Dovecotin) välillä: ylläpito vastaa vaiheiden 1 ja 7 konfiguroinnista, ja itse vastaat vaiheista 2-6.
procmailin käyttöönotto
Aivan aluksi otamme käyttöön sähköpostin lajittelusta vastaavan procmail-sovelluksen. Tämä tapahtuu luomalla kotihakemistoon tiedosto .forward, joka sisältää ainoastaan seuraavan rivin:
|/usr/bin/procmail
Tiedosto käskee siis Postfixiä toimittamaan kaiken käyttäjätunnuksellesi saapuvan mailin normaalin käsittelyn sijasta komennolle /usr/bin/procmail eli procmail-ohjelmalle.
Tämä vaihe olikin sitten tässä! Yksinkertaista, eikö totta? Oletuksena procmail ei tosin tee sähköpostille yhtään mitään, vaan viestit päätyvät wanhanaikaiseen UNIX-sähköpostilokeroon /var/mail/käyttäjätunnus mistä Dovecot ei niitä osaa etsiä. Käytännössä siis IMAP-sähköpostiohjelmassasi näyttää siltä, että sähköpostia ei vaan tule. Tähän täytyy luonnollisesti saada muutos.
procmailin konfigurointi
Pieni varoituksen sana ennen kuin ryhdymme konfiguroimaan procmailia: Suurin osa procmailia Interneteissä käsittelevästä dokumentaatiosta olettaa perinteiset mbox- tai maildir-tyyliset sähköpostilokerot eikä siten sovellu Fixmen Dovecot-pohjaiseen järjestelmään. Jos siis näet seuraavanlaisia procmail-sääntöjä
:0:
* X-Spam-Flag: YES
spam
niin suhtaudu ohjeeseen lievällä epäluulolla! Ohje ei todennäköisesti ole suoraan sovellettavissa Fixmelle.
procmailia ohjaa kotihakemistossa tiedosto .procmailrc. Tiedostossa ylimpänä ovat yleisten muuttujien määritykset, ja sen jälkeen tulee liuta sääntöjä, joita saapuvaan sähköpostiin sovelletaan.
Alla esitetään yksinkertainen .procmailrc-tiedosto, jota voit käyttää Fixmellä. Voit kopioida sen sisällön kotihakemistoosi .procmailrc-tiedostoon.
LOGFILE=$HOME/.procmail.log
DELIVER=/usr/lib/dovecot/deliver
:0w
| $DELIVER
Käydään tiedosto rivi riviltä läpi:
LOGFILE=$HOME/.procmail.log
Tällä rivillä asetetaan lokitiedosto, jossa procmail selittää, mitä se kullekin sähköpostiviestille tekee. Tätä tiedostoa kannattaa ihmetellä siinä vaiheessa, kun procmail-sääntösi eivät toimikaan niin kuin toivoisit.
Huomaa, että lokitiedostoon tallentuvat jokaisen vastaanottamasi sähköpostiviestin tunnistetiedot. Siksi tiedoston oikeudet kannattaa asettaa siten, että siihen pääsee käsiksi ainoastaan omalla käyttäjätunnuksellasi (chmod 600 ~/.procmail.log).
DELIVER=/usr/lib/dovecot/deliver
Määritellään muuttuja $DELIVER ja sijoitetaan siihen deliver-ohjelman absoluuttinen polku. Muuttuja ei ole millään muotoa maaginen, vaan siihen viitataan säännöissämme eksplisiittisesti.
:0w
| $DELIVER
Nämä rivit määrittelevät säännön, jota sovelletaan kaikkiin sähköpostiviesteihin. Sääntö määrää, että viestit, jotka sääntöön sopivat (eli tässä tapauksessa kaikki), putkitetaan yllä määrittelemällemme deliver-ohjelmalle. Kun lisäät .procmailrc-tiedostoon sääntöjä, laita ne aina tämän säännön yläpuolelle, sillä säännöt tarkistetaan aina järjestyksessä aina ylhäältä alaspäin.
Tässä vaiheessa (ja muutoinkin aina muutettuasi procmailin asetuksia) on hyvä lähettää itsellesi sähköpostiviesti ja varmistaa, että se tulee perille.
Sääntöjen lisääminen
Man-sivua procmailrc tarkastelemalla selviää, että procmail-säännön yleinen muoto on
:0 [flags] [ : [locallockfile] ]
<zero or more conditions (one per line)>
<exactly one action line>
Meidän säännöissämme action line on yleensä putkitus deliver-komennolle, ja tästä seuraa että flags-kohtaan on hyvä laittaa w.
Tarkastellaan seuraavaa esimerkkisääntöä:
:0w
* ^Subject: test
| $DELIVER -m INBOX.test
Tässä :0w aloittaa jälleen säännön. Sen jälkeen tulee ehtorivi. Ehtorivit alkavat aina -merkillä ja ehtorivin loppuosa tulkitaan säännöllisenä lausekkeena (regex*), jota yritetään löytää (oletuksena) viestin otsikkotiedoista. Mikäli osuma löytyy, sääntöä sovelletaan.
Tässä halutaan siis löytää viestit, joiden otsikko alkaa sanalla test. Säännöllisen lausekkeen ei tarvitse sopia koko otsikkoriviin, vaan osa rivistä riittää.
Lopuksi annetaan toiminto, joka suoritetaan viesteille joihin ehto sopii: putkitetaan viesti jälleen deliver-komennolle. Uutena asiana annamme tällä kertaa deliverille parametrit -m INBOX.test, jotka käskevät tallettamaan viestin kansion INBOX alikansioon test. Kansioerottimena toimii siis piste eikä suinkaan kauttaviiva.
Säännöistä täytyy vielä mainita pieni erikoisuus: Sähköpostiviesti voi päätyä tiettyyn sähköpostiosoitteeseen monen eri otsikkotiedon vuoksi. Tällaisia ovat esimerkiksi tutut To, Cc sekä Bcc. Jotta kaikkia näitä ei tarvitsisi luetella erikseen procmailrc:ssä aina kun halutaan suodattaa viestejä vastaanottajan sähköpostiosoitteen perusteella (esimerkiksi sähköpostilistat), tarjoaa procmail näppärän (mutta ruman) lyhenteen ^TO, jota käyttävä sääntö näyttää tältä:
:0w
* ^TOjasenet@fixme
| $DELIVER -m INBOX.fixme
Tästä kannattaa huomata, että ^TO-lyhenteen ja osoitteen alun väliin ei tule välilyöntiä.
Kuten yllä mainittiinkin, on uudet säännöt lisättävä aina kaikki loput sähköpostiviestit nappaavan säännön yläpuolelle.
SpamAssassinin käyttöönotto
Lopuksi luomme säännöt, joiden perusteella procmail skannauttaa saapuvan sähköpostimme SpamAssassinilla ja lajittelee roskapostin suoraan roskikseen. Säännöt näyttävät tältä:
:0fw
| spamc
:0w
* X-Spam-Flag: YES
| $DELIVER -m INBOX.Trash
Nämä säännöt tulee lisätä procmailrc-tiedostoon ylimmäisiksi heti muuttujien määrittelyn jälkeen. Näin saamme samalla säännöllä napattua myös esimerkiksi erikseen lajitelluille postituslistoille mahdollisesti tulevan roskapostin.
Näistä säännöistä ylemmässä on flags-kentässä meille toistaiseksi tuntematon kirjain f. Tämä saa aikaan sen, että procmail syöttää saapuvan sähköpostiviestin säännössä mainitulle komennolle (spamc), kerää komennon tulosteen ja soveltaa myöhempiä sääntöjä tähän tulosteeseen kuin se olisi alkuperäinen sähköpostiviestimme. SpamAssassin puolestaan tutkii viestin ja tulostaa sen lisäten siihen omat otsikkotietonsa, joita seuraavalla säännöllä sitten etsimme.
Kokonainen .procmailrc
Koska et kuitenkaan jaksanut lukea kaikkea ylläolevaa selitystä, tässä vielä kokonainen, toimiva .procmailrc-tiedosto, jossa SpamAssassin-suodatus on otettu käyttöön:
LOGFILE=$HOME/.procmail.log
DELIVER=/usr/lib/dovecot/deliver
:0 fw
| spamc
:0 w
* X-Spam-Flag: YES
| $DELIVER -m INBOX.Trash
# Lisää omat sääntösi tähän.
:0 w
| $DELIVER
Ja vielä kertauksena: .forward meni näin:
|/usr/bin/procmail
Lisätietoja
- man postfix
- man procmail
- man procmailrc
- man spamassassin
- perldoc Mail::SpamAssassin
- perldoc Mail::SpamAssassin::Conf
- man deliver
- man dovecot
- http://www.postfix.org
- http://www.procmail.org
- http://www.dovecot.org