Postfix'i arhitektuuri kirjeldus ja kasutamise keerulisemad võimalused

Allikas: Kuutõrvaja
                                        Roheline.jpg Toores. Ehk seda pala võib täiendada.

Postfixi arhitektuur

Postfix on vabavaraline mail transfre agent (MTA), serveritarkvara mis mõeldud emailide vastuvõtmiseks ning saatmiseks. Postfixi kiirus, kergelt administreeritavus ja turvalisus on teinud sellest ühe enimkasutatava mta ja laialdase alternatiivi sendmailile.

Selle kirjutas hollandlane Wietse Venema ja kasutusse võeti esmakordselt 1999.a.

Abstraktsel tasemel võiks Postfixi tööd iseloomustada sellise skeemiga

                     SISEND                                                      VÄLJUND
 
       postimasinast saadetud kiri                                          
             võrgust saabunud kiri   -------->  järjekorrahaldur -------->  smtp, relay, lmtp
 kohapeal tekitatud edasisuunamine                queue manager             local, virtual, pipe
        kohapeal moodustatud teade

kus on üldiselt kujutatud, et Postfixi sisendisse saabuvate kirjadega asub tegelema järjekorrahaldur ning seejärel väljub kiri ühel kuuest näidatud viisil.

Vasakul on loetletud neli erinevat võimalust, kuidas kiri võib jõuda Postfixi töötlemisele

Kitsam pilt MTA'st oleks allolev. Tegemist on hea pildiga n2itamaks ,et postfixi näol ei ole tegemist mingi väikese tarkvaraga. Kokku koosneb postfix kuskil 11'nest põhilisest käsurea utiliidist ja 20nest protsessist/deemonist.

Img17.png

Skeemil suur mull "Master", mille sees kõik teised deemoneid sümboliseerivad kastikesed asuvad, on postfixi nn emadeemon, mis kontrollib kõiki teise protsesse. Tema on postfix aju mis käivitab vajaduse korral erinevaid postfixi ala-deemoneid muude tarvilike tööde jaoks. Nö kubjas

Väiksemad kandilised kastikesed on:

  • smtpd - Tegeleb sissetulevate ühendustega
  • smtp - haldab väljuvaid ühendusi
  • qmgr - controls all messages in the mail queues.
  • local - Postfix own local delivery agent. It stores messages in mailboxes.

Järjekordadest jutustades on Posfixil neli põhilist järjekorda: maildrop, incoming, active ja deferred.

Lokaalne meil saadetakse maildropile ja kopeeritakse incoming järjekorda. Incoming järjekord on mailidele mis äsja saabunud ja queue manager pole neid veel ülevaadanud. Mailid mida ei saa edastada tõstetakse defferred järjekorda ,et see ei jääks saabuvatele-saadetavatele kirjadele jalgu.

Kui laiemalt vaadata siis ümbritseb postfixi omakorda veel terve pilv mitmesugustest abitarkvaradest, millega postfix atkiivselt suhtleb nagu spämmitõrje, viirusetõrje jne. Lühidalt oleks ühe tänapäevase viirusetõejga varustatud postiserveri skeem järgnev:

Openbsd-postfix.png

Ehk siis kiri liigutatakse enne postkasti potsatamist veel läbi portide ning socketite mitmesuguse kontrollprogrammistiku kätte.

Pisut detailsemat juttu http://www.linuxjournal.com/article/9454

Paigalduse osas peaks iga vähegi enesest lugupidavam ja suurem operatsioonisüsteem omama mingit oma porti/installipakki postfixist. Postfix on juba paljude operatsioonisüsteemide vaikimisi mta'ks, näiteks ubuntul. Kaasa tuleb installiga ka ohtralt seadistuse näiteid, abifaile ja manuale

Postimasinast endast saadetud kiri

Nt postimasin seest kasutaja enda poolt saadetud /usr/sbin/sendmail käsuga

 $ echo "kirja sisu" | sendmail -s subjekt mart@loomaaed.tartu.ee

Kirja

  • võrgust saabunud kiri - kõnealune Postfix kuulab arvuti võrguseadme port 25/tcp peal ning üle võrgu pöördub nt teine Postfix
  • kohapeal tekitatud edasisuunamine - nt aliaste lahendamisel
  • kohapeal moodustatud teade - Postfix genereerib oma töö käigus teated, nt nn bounce kirju kui kiri võeti küll töötlemisele nt võrgust, aga kirja töötlemisel selgus, et kirja ei õnnestu edasi saata

Eposti kirja ja kirja edastamise protokollid

Huvitav asjaolu on, et eposti kirja formaat ja eposti kirjade vahetamine on kirjeldatud erinevates RFC (Request for Comments) tekstides, vastavalt

Kui postiprogrammiga, nt Icedove koostada kiri ja see saata, siis iseenesest saadab klient postimasinale nt sellise teksti

 Message-ID: <4A90629C.6050100@loomaaed.tartu.ee>
 Date: Sun, 23 Aug 2009 00:26:52 +0300
 From: Priit Kask <priit@loomaaed.tartu.ee>
 User-Agent: Mozilla-Thunderbird 2.0.0.22 (X11/20090706)
 MIME-Version: 1.0
 To: Mart Kask <mart@loomaaed.tartu.ee>
 Subject: testkiri
 Content-Type: text/plain; charset=UTF-8
 Content-Transfer-Encoding: 8bit
 
 Tere!
 
 Ja siit tuleb üks test kiri.
 
 
 Priit

kus

  • read kuni esimese tühja reani moodustavad kirja päised (headers)
  • ülejäänud read moodustavad kirja keha (body)

Kui aga kirja kätte saanud kasutaja vaatab kogu kirja, siis paistab talle kiri selline

 ...

kus kirja algusse seda kirja töötlenud postimasinad lisanud juurde kirjeid

  • Received - iga postimasin lisab reeglina ühe sellise rea (see on üks rida kuna protokolli kohaselt rida jätkub kui järgmine rida algab tühikuga (ingl. k. whitespace))
  • Return-Path - kohaliku kättetoimetamise (ingl. k. local delivery) teinud postimasin lisab nn ümbriku from aadressi

Kõik juurde lisatud andmed on lisatud SMTP protokolli rääkimise alusel, st need kõik väljendavad kirja teekonna erinevatel etappidel kasutatud ümbriku aadresse.

Aadressiklassid

Aadressiklasside (ingl. k. address classes) http://www.postfix.org/ADDRESS_CLASS_README.html abil otsustab Postfix milliseid kirju vastu võtta ja kuidas neid edasi toimetada. Addressklass on määratletud kolme tunnuse alusel

  • klassiga seotud domeenide nimekiri (ingl. k. list of domains that are a member of the class) - nt kõik local_domains, kõik relay_domains
  • vaikimisi edasitoimetamise transport (ingl. k. default delivery transport) - nt local, virtual või relay
  • kirjasaajate nimekiri (ingl. k. list of valid recipient addresses)

Vaikimisi on 2009 aastal Postfixis kasutusel sellised aadressklassid

  • local domain class - canonical domains
  • virtual alias domain class - hosted domains
  • virtual mailbox domain class - hosted domains
  • relay domain class - relay domains
  • default domain class

Virtuaalsed domeenid

Oletame, et meil on olukord, kus serveri aadressiks on zoo.tartu.ee ja meil on veel sellel serveril kaks domeeni. Esimene domeen on siil.ee ja teine domeen on karu.ee. Nüüd oleks kiusatus kirjutada need domeenid mydestination muutujale aga sellega kaasneb probleeme. Näiteks, kui meil on serveris kasutaja mart, siis töötaksid seejärel automaatselt mailiaadressid mart@siil.ee ja mart@karu.ee, mida me ei pruugi tahta. Olukorra elegantseks lahendamiseks on virtual maps.

mail.cf konfi kirjutame esiteks virtuaalsed domeenid ja defineerime map faili askoha

 # cat mail.cf:
 ...
 virtual_alias_domains = siil.ee, karu.ee
 virtual_alias_maps = hash:/etc/postfix/virtual

Seejärel tekitame virtual faili, kus kinnistame domeenid kindlate kasutajatega.

 # cat virtual
 mart@siil.ee   mart
 ants@karu.ee   ants

Ja seejärel tekitame virtual faili alusel map faili.

# postmap /etc/postfix/virtual

Ühe domeeni kirjade blokeerimine

Näiteks on teemist meil releeserveriga, mis edastab paljude veebiserverite meili. Või siis ühe hostinguserveri meili, kus on sadu domeene. Üks domeenidest hakkab aga agaralt spammima ja vaja oleks sealt lähtuvad kirjad blokeerida.

Spämmivaks domeeniks on näites hundionu.ee

smtpd_sender_restrictions =
        check_sender_access hash:/etc/postfix/access
        permit_mynetworks
        ...

NB! Järjekord peab kindlasti olema, et permit_mynetworks ja muud lubamised tuleksid peale saatja ligipääsu kontrolli. Nimelt osustatakse esimese reegliga sageli kirja saatus ära ja edasisis reegleid enam ei vaadata.

Seejärel tekitame access faili

# cat /etc/postfix/access
hundionu.ee     REJECT

Tekitame map faili

# postmap /etc/postfix/access

Testimiseks võime anda käsu:

$ echo test | mail kirja_saaja@zoo.tartu.ee -r kirja_saatja@hundionu.ee 

Logis on seejärel näha

Jun 13 11:50:40 re2 postfix/smtpd[4988]: NOQUEUE: reject: RCPT from wwww.zoo.tartu.ee[193.40.0.47]: 554  5.7.1 <jacquelyn_dejesus@hundionu.ee>: Sender address rejected: Access denied; from =<jacquelyn_dejesus@hundionu.ee> to=<kallinson@yahoo.com> proto=ESMTP helo=<www.localdoma

Blokeerida võib ka mitte ainult domeene vaid üksikuid kirju, näiteks kirjutades

ants@hundionu.ee     REJECT

Ajutiste kiirete piirangute jaoks on see lahendus hea kuid püsiva spamitabeli teemiseks ilmselt liiga tülikas

Kirjade ümbersuunamine teise serverisse

Abiks on kirjade edasi suunamisel ka transports mis Võimaldab kõiki või teatud domeenide maile suunata edasi teisele aadressile

Kasutamiseks vaja main.cf'is defineerida

transport_maps = hash:/etc/postfix/transport

Ning faili /etc/postfix/transport

*midagi.ee smtp:mail.tartu.ee

postmapi andmebaasi genereerimiseks

postmap /etc/postfix/transport

restart postfix and now every e-mail sent to example.com will relay through your specified e-mail server.

sender_canonical_maps võimaldab saatja aadresse ümber kirjutada, kasutamine

sender_canonical_maps = hash:/etc/postfix/sender_canonical 

ja sinna faili kirjutada midagi sellist:

root@localhost	root@loomaaed.zoo.edu.ee

Postfixi konfiguratsioon ehk failid main.cf ja master.cf

Postfixi põhilisteks seadistusfailideks on main.cf ja master.cf. Main.cf sisaldab postfixi seadistusparameetreid mis vajalikud mailide liigutamiseks ning master.cf seadistab deemonprotsesse

Kõige lihtsamaks main.cf seadistuseks oleks

smtpd_banner = $myhostname ESMTP $mail_name (no spam please ;) )
myhostname = loomaaed.tartu.ee
mydomain = $myhostname
myorigin = $mydomain
inet_interfaces = all
mynetworks = 127.0.0.0/8, 192.168.1.0/24
mydestination = $myhostname, localhost.$mydomain, elva.loomaaed.tartu.ee ../etc/postfix/mydestination
unknown_local_recipient_reject_code = 550
alias_maps = hash:/etc/mail/aliases
alias_database = hash:/etc/mail/aliases
relay_domains = $mydestination, ../relay_domains
home_mailbox = mbox
smtpd_sender_restrictions = permit_mynetworks, reject_unknown_sender_domain
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination

See kõik on üldine ja töötab ühtemoodi nii freebsd, solarise kui debiani või kasvõi windowsil (kui postfix sinna kunagi porditakse)

Seejärel tuleb muidugi seadistada ka postfixi septsiifilisem osa, mis varieerub erinevatel operatsioonisüsteemidel omasuudu, näiteks kus asub deemon, kus spool kaust või mis õigustes töötab postfix

Kasutada võib ka muutujaid stiilis config_directory = ../postfix ja kasutada stiilis transport_maps = hash:$config_directory/transport

Seletaks pisut põhilisi ridu lahti

smtpd_banner = $myhostname ESMTP $mail_name (no spam please ;) )

Üldine teade mida näeb kui ühenduda 25 pordi külge, üldiselt täidab pigem ilu ülesannet :)

myhostname = kool.edu.ee

See muutuja võetakse tavaliselt shellist ja sõltub mis on sereri hostnameks määratud, üldiselt võib olla soov seda siiski sageli muuta

mydomain = $myhostname

mydomain võib samuti sageli erineda myhostnamest, üldiselt kui aga ei võib kasutada näiteks muutujat $myhostname

myorigin = $mydomain

is the domain name that locally-posted email appears to have come from and is delivered to.

inet_interfaces = all

Postfix kuulab vaikimisi kõikidel võrguseadmetel mis serveril küljes 25ndat porti ja kust posti ka vastu võetakse

mynetworks = 127.0.0.0/8, 192.168.1.0/24

IP aadressid või võrkude vahemikud mis on turvalised nimetame localhosti ja serveri taguse kontori sisevõrgu. Nendest võrkudest võib saata maile läbi serveri. Kõik katsed saata või relay'da maili teistelt mitte siin defineeritud ip'delt keelatakse

Selleks, et etteantud IP vahemikust mõni aadress ajutiselt välja jätta, näiteks on see arvuti hakanud levitama spammi ning ei soovi, et postimasin pakuks talle relay ehk kirjade edasisaatmise võimalusi saab $mynetworks sisse kirjutada ka kujul !1.2.3.4/32 või !/path/to/file ja viimase sees siis IP numbrid/vahemikud, mis tuleb välja jätta. Töötab ka type:table. Seejuures tuleb tähele panna, et esimene sobivus võidab ehk soovitatav on kirjutada need piirangud enne teisi aadresse.

mydestination = $myhostname, localhost.$mydomain, ../etc/mydestination

Siin võib defineerida veel kõik masina küljes olevad domeenid neid komaga eraldadest, kust server peaks emaile vastuvõtma, lihtustamise huvides võib need kõik mydestination faili lisada ning faili korraga külgevõtta

../etc/mydestination
loomaaed.tartu.ee
mail.tartu.ee

unknown_local_recipient_reject_code = 550

Viisakas seadistada teiste mailisaatjate jaoks.

alias_maps = hash:/etc/mail/aliases

alias faili, vaikimisi etc all

alias_database = hash:/etc/mail/aliases

Alias faili andmebaas

relay_domains = $mydestination, /etc/postfix/relay_domains

Nimed domeenidest millele mailiserver on teiseks mx'iks. Näiteks lihtsalt loeteluna.

loomaaed.tartu.ee
mail.tartu.ee

home_mailbox = mbox

Mailide salvestamise formaadiks mailbox. See on kõige vanem ja lihtsam formaat kuid mitte kõige parem ja tänapäeval oleks tegelikult juba üsnagi mõttekas kasutada maildir'i home_mailbox = Maildir/ võimalik on kogu maili kettale transportimine anda eraldi programmine, näit cyrusele mailbox_transport = cyrus

smtpd_sender_restrictions = permit_mynetworks, reject_unknown_sender_domain

Piirangud läbi mailiserveri saatjale, lubame automaatselt mynetworgist saatmised ning keelame tundmatud

smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination

siinpuhul saab seadistada veel

 permit_sasl_authenticated,
 reject_non_fqdn_hostname,
 reject_non_fqdn_sender,
 reject_non_fqdn_recipient,
 reject_unauth_destination,
 reject_unauth_pipelining,
 reject_invalid_hostname,
 reject_rbl_client bl.spamcop.net,
 reject_rbl_client sbl-xbl.spamhaus.org

Kui on soov suunata väljuv epost läbi mingi kindla serveri tasub kasutada relayhost muutujat, nt

relayhost = mail.hot.ee

Ja veel main.cf'i kasulikke muutujaid töökindluse suurendamiseks

Kõikide muutujate lahtiseletamine ja esiletoomine läheks väga pikaks, nendekohta on üsnagi mahukas ja põhjalik kirjeldus ametlikuls postconf manualis http://www.postfix.org/postconf.5.html aga püüaks veel mõningaid ja põhiliselt spamimise /ddos'imisi piiravaid ja töökindlust suurendavaid parameetreid esiletuua

maximal_queue_lifetime = 3d bounce_queue_lifetime = 3h

Saba elupikkuse reguleerimine, oluline masinates mis näiteks paljudele teistele domeenidele relay'ks

relay_domains = /etc/mail/relay-domains

domeenid milledele näiteks ollakse teiseks mx'iks

Suhtlemiskiiruste limiteerimised

anvil_rate_time_unit = 60s
smtpd_client_connection_count_limit = 5
smtpd_client_connection_rate_limit = 100
smtpd_client_message_rate_limit = 100
smtpd_client_recipient_rate_limit = 200
smtpd_client_event_limit_exceptions = $mynetworks, ".ee"
smtpd_timeout = 60s

Hea kasutada spammimiste pidurdamisteks

selleks hea näiteks nõuda ka smtpd_helo_required = yes kui korrektset suhtlus pole ei tule ka vastuseid ja määrata veel lisatäiendusi smtpd_helo_restrictions = permit_mynetworks, reject_non_fqdn_hostname, reject_invalid_hostname

Kui on vaja omakorda mingit ip'd või domeeni whitelistida mis on ometigi mitmetes rbl listides sees või ei vasta mingitele tingimustele tuleks see lisada rida check_client_access hash:/etc/postfix/client_access tekitada vastav fail sisuga näiteks 193.40.0.9 OK ning genereerida failile postmapiga andmebaas

Aadresside laiendused

postfixi main.cf'i tuleb lisada

recipient_delimiter = +

See teeb võimalikuks saata kirje aadressitele kasutaja+laiend@loomaaed.zoo.ee

See on hea seepärast, et saaks erinevatesse kohtadesse panna näiliselt erinevad aadressid, samas aliasi defineerimata. Postfix üritab esmalt saata kirja kasutajale 'kasutaja+laiend', kui see ei õnnestu, siis 'kasutaja'.

Nüüd saan panna aadressid nt kasutaja+plesk_admin ja kasutaja+plesk_reseller ja postkastist kirja lugedes saan teada, kellele mingisugune kiri mõeldud oli.

Seda on hea kasutada ka mingitesse foorumitesse jne registreerimisel, kus paned kasutaja+fooruminimi@zoo.ee aadressiks ja kui spämmi tulema hakkab, on kohe teada, kust lekkis (vähemalt saab pahandada ja teisi hoiatada).

Postisüsteemi testimine

Postisüsteemi heaks testimise abivahendiks on ikka telnet muidugi ja telnet port 25 sest kui MX pole masinale määratud siis on talle väga raske maili normaalsete vahenditega saata

Ühendume mailiserveriga

# telnet zoo.loomaaed.ee 25
Trying 193.40.0.17...
Connected to zoo.loomaaed.ee.
Escape character is '^]'.
220 zoo.loomaaed.ee ESMTP

Ütleme tervituse

HELO zoo.loomaaed.ee
250 zoo.loomaaed.ee

Aadress kellele soovime maili saata

MAIL FROM: kadri@mailiserver.ee
250 2.1.0 Ok

Kirjutame aadressi mis aadressilt saadetakse

RCPT TO: katsetus@zoo.loomaaed.ee
250 2.1.5 Ok

Sisestame andmed

DATA
354 End data with <CR><LF>.<CR><LF>
tere

Kui enam midagi lisada ei soovi lõpetame punktiga

.
250 2.0.0 Ok: queued as 95C49F3118

Kirjutatud mail on ülal oleva teksti järgi lisatud järjekorda ning võime väljuda quit käsuga

quit

Jõudlus

TODo

Spam

Aadressil http://spamassassin.apache.org/gtube/ on nö standard spammi, mille nt Spamassassin peaks avastama

 XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

Katsetamiseks tuleks see järgnevus sisestada kirja eraldi reane reavahetusega lõpus.

Viirus

Aadressil http://www.eicar.org/anti_virus_test_file.htm on nö standardne viirus, mille nt ClamAV peaks avastama

 X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Katsetamiseks tuleks see salvestada tekstifaili reavahetusega lõpus ning lisada kirjale.

Piirangute rakendamine töödeldavale epostile

Postfix võimaldab üksikasjaliselt kontrollida, millist eposti süsteem töötlema hakkab, st võtab vastu ning saadab edasi või edasisaatmise asemel teeb local delivery. Käesolevas punktis käsitletavad piirangud on nn before-queue piirangud, st need rakendatakse enne kirja sabasse (ingl. k. queue) võtmist.

Selleks, et paremini mõista Postfix poolt pakutavate piirangute seadistamise võimalusi, kordame üle milline järgnevust sooritatakse vastavalt SMTP protokollile kui postimasina poole pöördub SMTP klient; rea lõpus on märgitud millist Postfixi piirangute nimekirja on mingi andmevahetuse etapi juures võimalik rakendada.

 smtp-client ---> smtp-klient.auul ühendub Postfix serveri 25/tcp pordile   <--- smtpd_client_restrictions
 smtp-server ---> 220 smtp-server.auul ESMTP Postfix (Debian/GNU)        
 smtp-klient ---> EHLO post-klient.auul                                     <--- smtpd_helo_restrictions
 smtp-server ---> 250-smtp-server.auul
                  250-PIPELINING
                  250-SIZE 10240000
                  250-VRFY
                  250-ETRN
                  250-STARTTLS
                  250-ENHANCEDSTATUSCODES
                  250-8BITMIME
                  250 DSN
 smtp-klient ---> MAIL FROM:<priit@loomaaed.tartu.ee> SIZE=325              <--- smtpd_sender_restrictions
                  RCPT TO:<mart@bmail.com> ORCPT=rfc822;mart@bmail.com      <--- smtpd_recipient_restrictions
                  DATA
 smtp-server ---> 250 2.1.0 Ok
                  250 2.1.5.Ok
                  354 End data with <CR><LF>.<CR><LF>
 smtp-klient ---> saadab kirja osa
                  ...

Piirangute nimekiri võib olla mõnel juhul tühi ja mõnel juhul peab kindlasti sisaldama vähemalt kindlaksmääratud piiranguid. Piirangute kontroll toimub selliselt

  • piirangute nimekirjast rakendatakse esimene klappinud piirang, järgmisi selle nimekirja piiranguid ei kontrollita
  • rakendatakse esimene tulemusega (REJECT, DEFER või PERMIT) lõppenud piirangute nimekiri

Kontrolli tulemus rakendatakse peale RCPT TO andmete saamist.

Nt võiks kasutada sellist piirangute nimekirja, selline on nimekiri vaikimisi Debiani Lenny puhul ja väljund on esitatud järjestatuna rakendamise järjekorras

 # postconf | grep smtpd_ | egrep "(_client_|_helo_|_sender_|_recipient_)" | egrep "restrictions "
 smtpd_client_restrictions = 
 smtpd_helo_restrictions = 
 smtpd_sender_restrictions = 
 smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination

Siinjuures tuleb tähele panna asjaolu, et igas reeglite nimekirjas on lubatud kasutada ainult teatud kontrolle, kusjuures igas järgmises on lubatud kasutada eelmiste nimekirjade kontrolle. Antud juhul ongi smtpd_recipient_restrictions juures kasutatud permit_mynetworks'i, mis on iseenesest smtpd_client_restrictions nimekirja kontroll, vt http://www.postfix.org/postconf.5.html

Esitatud näites esimesena kehtestatav ning ainuke piirangute nimekiri on smtpd_recipients_restrictions ja mis sisaldab kahte kontrolli

  • permit_mynetworks - lubada saata posti nendest alamvõrkudest, milles asub postimasin
  • reject_unauth_destination - keeldutaks töötlemast posti mida ei ole postimasin seadistatud kas vahendama või millele tegema local deliverit

Mõned allikad soovitavad kõik piirangud seadistada ühe smtpd_recipient_restrictions parameetri abil kuna nii on ehk tagatud parem ülevaatlikkus.

Seadistamine

Süsteemist väljuva posti ümbriku muutmiseks tuleb kasutada mail.cf failis rida

 smtp_generic_maps = hash:/etc/postfix/generic

ning /etc/postfix/generic ise sisaldab näiteks selliseid ridu

 www-data@arvuti.sisedomeen   www-bounce@valisdomeen.ee
 root@arvuti.sisedomee       www-bounce@valisdomeen.ee

Muudatuste kehtestamiseks tuleb generic'ikile vastav andmebaas moodustada käsuga

 # postmap /etc/postfix/generic

ning laadida reload'iga Postfix.

Käskuga postconf estitatakse parasjagu kehtetatud Posfixi seadistused

 # postconf

ning lisades võtme -n esitatakse main.cf failis ilmutatult kasutatud parameetrite väärtused

 # postconf -n

Konkreetse parameetri väärtust saab küsida nii, nt

 # postconf mail_version
 mail_version = 2.5.5

Kui on vaja näha postfixi vaikimisi seatud väärtusi siis tuleb käivitada postconf -d võtmega


TLS krüpteering ja SASL auth

Kasutajate autentimine ja kürpteeritud login

Postfix TLS

Postiserverite vahelise andmevahetuse krüptimine

Selleks, et server võimaldaks krüptida smtp klientide sissetulevaid ühendusi peavad olema seadistusfailis main.cf read

smtpd_tls_key_file = /etc/postfix/serdid/smtp.loomaaed.tartu.ee.pem
smtpd_tls_cert_file = /etc/postfix/serdid/smtp.loomaaed.tartu.ee.crt
smtpd_tls_CAfile = /etc/postfix/serdid/loomaaed-ca.crt
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

kus

  • smtpd_tls_key_file näitab, millises failis asub sertifikaadile vastav salajane võti
  • smtpd_tls_cert_file näitab, millises failis asub sertifikaat
  • smtpd_tls_CAfile näitab, millises failis asuvad sertifikaadi allkirjastanud ahela ülemised sertifikaadid

Selleks, et teha kindlaks, kas postiserver toetab SMTP STARTSSL laiendust sobib öelda

$ openssl s_client -starttls smtp -showcerts -connect 192.168.1.251:25

Kirjade töötlemine välise programmiga

Ühel või teisel põhjusel võib olla vaja sellist asjakorraldus, et kas postisüsteemi kõiki või vaid teatud tunnustele vastavaid kirju saaks töödelda välise programmiga. Ja selliselt, et väline programm saab andmeid oma stdio'sse ning järele mõned argumendid. Üheks võimaluseks seda korraldada on kostümiseeritud transporti kirjeldamise abil.

  • /etc/postfix/main.cf faili tuleb lisada rida
 transport_maps = hash:/etc/postfix/transport
  • /etc/postfix/transport failis peab sisalduma nt rida
 loomaaed.tartu.ee pf

ning tuleb öelda

 # postmap /etc/postfix/transport
  • /etc/postfix/master.cf failis peab sisaldub sektsioon
 pf    unix  -       n       n       -       -       pipe   
 flags=RDX user=programmikasutaja argv=/bin/pf.pl ${user} ${domain}

ning kui /bin/pf.pl sisaldab nt

 #!/usr/bin/perl
 open (fh, ">>/tmp/pf.log");
 
 print fh "$ARGV[0]\n";
 print fh "$ARGV[1]\n\n\n";
 
 @read=<STDIN>;
 
 foreach $rida (@read) {
   print fh $rida;
 }

Siis selle faili algusse kirjutatakse epostiaadressi @ märgist vasemale ja paremale jääv osa erinevatele ridadele ning kirja sisu kusjuures lisatakse päisele mõned read vastavalt sellele, mida lipud flags järel ütlevad.

SPF - Sender Policy Framework

SPF (Sender Policy Framework - ingl. k. epost saatja kontrollimise raamistik) http://www.openspf.org/Project_Overview võimaldab saavutada sellised eesmärke

  • kaitsta eposti vastuvõtjat ümbriku from aadressi võltsijate eest (eeldusel, et võltsitava domeeninime omanikud oma oma domeenidele kirjeldanud spf või sfp sisuga txt kirjed)
  • kaitsta domeeninime omanikku ümbriku from aadressi võltsijate tegevuse eest, tulemusena ei saa võltsijad saata kontrollimatult adressaatidele võltsitud eposti

SPF tööpõhimõtte kirjeldus

Leidub palas Spam

Eposti vastuvõtja ettevalmistamine

Postfix sisaldab 'Postfix SMTP access policy delegation' http://www.postfix.org/SMTPD_POLICY_README.html süsteemi, mille abil saab ühendada MTA välise lahendusega, antud juhul SPF'iga, selleks, et teostada täiendavat kontrolli, milliste omadustega kirju saab läbi kõnealuse postisüsteemi saata.

Logi ja probleemidega tegelemine

Kui mingil põhjusel on tarvis uurida mõnda parasjagu sabas olevat kirja, siis sobib selleks programm postcat. Tavaliselt saab logist või mailq programmi väljundist teada kirja identifikaatori ning selle abil õnnesub sabast kirjale vastav fail üles leida.

 # mailq
 ....
 C558C4DC80      794 Sat Dec 20 10:18:55  bounce@loomaaed.tartu.ee
           (connect to smtp-gw.loomaaed.tartu.ee[10.0.2.5]: Connection refused)
                                        mart@loomaaed.tartu.ee
 ..
 # find /var/spool/postfix -name C558C4DC80 -ls
 313873    4 -rw-------   1 postfix  postfix       257 Dec 21 23:14 /var/spool/postfix/defer/C/C558C4DC80
 318592    4 -rwx------   1 postfix  postfix      1001 Dec 22 00:20 /var/spool/postfix/deferred/C/C558C4DC80
 
 # postcat /var/spool/postfix/deferred/C/C558C4DC80
 ... 
 nö inimloetaval kujul formateeritud väljund

Kui on vajadus sabas olev kiri kustutada, siis ei tohiks seda teha niisama failisüsteemist vastavate failide kustutamise teel vaid tuleb kasutada nt programmi postsuper, öeldes

 # postsuper -d C558C4DC80

Suuremate mailivoogude ning blokeerumiste korral on hea uurida mis domeenid on probleemiks ja mis järjekordades on need kinni. Mailq pole samuti sageli selles osas eriti ülevaatlik.

# qshape deferred | head
                                         T  5 10 20 40 80 160 320 640 1280 1280+
                                 TOTAL 540  0  3  1  2 10   4  14  31   59   416
                          mingi.edu.ee 320  0  2  1  0  9   3   4  11   51   239
                           hotmail.org  25  0  0  0  0  1   0   0   0    0    24

Mõne domeeni või saatja kõigi kirjade eemaldamiseks võib kasutada sarnast käsku

# mailq | grep spamidomeen.ee | awk '{ print $1 }' | postsuper -d -

Või

# mailq | grep 'MAILER-DAEMON$' | cut -d ' ' -f 1 | postsuper -d - 

Selleks, et eemaldada sabast kõik kirjad siis allolev käsk, soovites mõnda spetsiifilist järjekorda siis lisada sellele käsu lõppu veel näiteks DEFERRED

# postsuper -d ALL

Kirjade sabast ära saatmiseks

 # postqueue -f

Peudograafiline mailisaba haldur pfqueue http://pfqueue.sourceforge.net/

Pfqueue.JPG

Postfixi sabaga töötamist hõlbustav skript

Postfixi queue on kasutamiseks üsnagi halvas formaadis, nimelt esitatakse iga kirja kohta info kolmel real. Selle hõlbustamiseks võiib tekitada nt järgneva bashi skripti.

# cat /usr/local/bin/mailq_filter 
#!/bin/bash

if "$1" == "-l" 
then
  LONG='" " err'
fi
mailq | awk "BEGIN{ RS = \"\n\n\"};
{
  gsub(/\n/,\" \");
  match(\$0, /\(.*\)/);
  err = substr(\$0, RSTART, RLENGTH);
  sub(/\(.*\)/, \"->\", \$0);
  if( \$1 != \"--\") \$2 = \"\";
  gsub(/  */, \" \");
  print \$0 $LONG
}"

See skript väljastab ühel real mail ID kuupäev saatja -> saajad. Kui lisada võti '-l' (nagu long), siis paneb kõige lõppu ka Postfixi veateate, mispärast see deferredis istub.

Nüüd saab näiteks selliseid otsinguid korraldada:

$ mailq_filter | grep "\.com ->  .*\.com"

Või kirjutada omakorda selliseid konstruktsioone

$ mailq_filter | grep mingistring-domeen | awk '{ print $1 }' | postsuper -d -

Või koostada pingerida sabas olevatest kirjadest saatja alusel

$ mailq_filter | awk '{ print $6 }' | sort | uniq -c | sort -rn | head

tulemuseks

      7 notification+kjdm13h7wupd@facebookmail.com
      6 personalikeskus@gmail.com
      5 web.office.0100.10@att.net
      5 notification+kr4mwb45snxr@facebookmail.com
      3 returned@mail2market.net

Milter

TODO

Postfixi olulised tööriistad

Oluliseimad posfixi käsud mida sagedaimini igapäevaelus võib vajaminna on

  • postalias - loob aliase andmebaasi
  • postcat - võimaldab vaadata järjekorras olevate fialide sisu
  • postmap - loob lookup map'e, suur hulk postfixi konfiguratsiooni informatsiooni hoitakse lookup tabelites.
  • postconf - postfixi parameetrite/seadistuse vaatamine ja muutmine

konfiguratsiooniooni saab jooksvalt vaadata käsuga postconf -n

Postconf võimaldab kiirelt ja mugavalt muuta mingeid parameetreid main.cf seadistuses ning seda võib kasutada nii hästi skriptimisel näiteks

postconf -e 'readme_directory = no'

Käsuga muudetakse readme_directory väli

  • postqueue - võimaldab ligipääsu postfixi järjekorrale
  • postsuper - võimaldab järjekorraga manipuleerida, kustutada neid või liigutada ringi, samuti parandada vajaduse korral järjekorra struktuuri
  • postdrop -
  • postfix
  • postkick
  • postlock
  • postlog

Imap deemonid mis sobivad kasutamiseks koos postfixiga

Imap-uw

Vanem ja lihtsam deemon, suudab vaid mbox formaati jagada. Halvasti konfigureeritav ja ebastabiilsem. Suurtesse süsteemidesse ei soovitaks

Dovecot

Lihtne, töökindel ja äärmiselt hästi konfigureeritav imap klient, loeb nii maildir++ kui mbox formaati. Sobib väiksematesse mailiserveritesse eriti hästi.

Courier

maildir++ formaati hästi lugev töökindel imapideemon, mboxi ei toeta, võimaldab mysqlilt autentimist. Sobib koos mysql ja postfixadminiga ideaalselt keskmiste suurustega süsteemidesse.

Cyrus

Lisaks imap deemonile tegeleb ka ise mailide kettale toimetamisega. Hoiab neid eraldi muudetud maildir++ formaadis ning peab berkeley db andmebaasides infot. Sobib väga suure koormusega süsteemidesse.

POstfix delivery tegemine Mysql kataloogi alusel

TODO

Postfix delivery tegemine LDAP kataloogi alusel

Valmistada LDAP kliendi seadistused ette /etc/ldap/ldap.conf failis ja Postfixi jaoks põhimõtteliselt midagi sellist

 # cat /etc/postfix/ldap.cf
 server_host = ldaps://ldap.loomaaed.tartu.ee
 version = 3
 
 search_base = dc=loomaaed,dc=tartu,dc=ee
 query_filter = mail=%s
 result_attribute = sn

kontrolliks sobib küsida

 # postmap -q mart@loomaaed.tartu.ee ldap:/etc/postfix/ldap.cf 
 Kask

Queue kopeerimine postimasinate vahel

Kui mitu postimasinat töötavad koostöös, siis võib olla asjakohane nt ühe arvuti hoolduse ajaks sinna sappa kogunenud kirjad paigutada mõnda sobivasse muusse postimasinasse ringi. Selleks peab teine postimasin lubama kõnealuse postimasina kirju ning hooldusse minevas postimasinas tuleb nt relayhost parameetri abil kopeerida kirjad ära.

Kasulikud lisamaterjalid

  • The book of Postfix: state-of-the-art message transport (Ralf Hildebrandt, Patrick Koetter) - 2009 aasta seisuga tõenäoliselt parim raamat teemal

Lingid

http://www.postfix.org/documentation.html Ametlik dokumentatsioon

http://en.wikipedia.org/wiki/Comparison_of_mail_servers Mailiserverite võrdlused

http://dspam.nuclearelephant.com/index.shtml dspam koduleht

http://www.redhat.com/support/resources/howto/RH-postfix-HOWTO/x368.html redhat'i postfixi põhjalikud manualid

http://www.postfix.org/OVERVIEW.html postfixi arhidektuuri täpsem ülevaade

http://www.onlamp.com/pub/a/onlamp/2004/01/22/postfix.html postfixi logimisest

http://www.cyberciti.biz/faq/howto-blacklist-reject-sender-email-address/ blacklist aadressidele

http://www.linuxjournal.com/article/9454 Postfixi anatoomia

http://www.compwrite.com/?p=57

http://www.cyberciti.biz/tips/howto-postfix-flush-mail-queue.html saba puhastamisest