Postfixkurs @ UNIT
Erik Forsberg <forsberg at unit dot liu dot se>
I icke LiU-relaterade frågor: <forsberg at lysator dot liu dot se>
Agenda
- Översikt över systemet
- Konfiguration
- Något om prestanda
- Felsökning
Notation
- Italic betecknar kommandon, demoner.
- Bold betecknar konfiguration.
Översikt över systemet
- Licens
- Installation
- Dokumentation
- Process- och säkerhetsmodell
- Demonerna
- Utilities
- Kompabilitet
- Loggning
Licens
- "IBM PUBLIC LICENSE VERSION 1.0"
- Godkänd av opensource.org
- Mindre restriktiv än GPL.
Installation
- Kompilering fungerar OK på de flesta unix.
- Fråga mig före kompilering på IRIX.
- Något förvirrande frågor vid första installation
- Baskatalog anges först.
- Vidare kataloger är relativt baskatalogen, trots / i början.
- Paket finns för många Linuxar.
- Lite småkinkig Makefile-rad ibland.
Uppgradering
- Postfix kommer nu ihåg kataloginställningar (via konfigfil).
- Spara gammal konfiguration, kolla i gammal Makefile
- Changelog listar inkompatibla förändringar
Dokumentation
- Väldokumenterat
- Alla kommandon, demoner och många tabeller har mansidor.
- virtual(8) - demonen
- virtual(5) - tabellen
- postfix(1) - kontrollprogrammet
- http://www.postfix.org
- Användarmailinglistan postfix-users@postfix.org - oftast mycket bra svar.
Process- och säkerhetsmodell
- Flera små program i stället för ett stort.
- Flera nivåer från nätet till säkerhetssensitiva program.
- Unixtänkande - ett program ska göra en sak bra.
- Semiresidenta processer. Få forkningar.
- Processer kommunicerar via sockets i filsystemet.
- Lätt att strippa ett system
- Lätt att byta ut delar av systemet. Det finns alternativa kömanagers.
- Säkerhet modell "Wietse Venema".
Process och säkerhetsmodell
De olika demonerna
- master - övervakar övriga demoner.
- Startar nya om det behövs.
- Dödar demoner som verkar ofungera.
- smtpd - inkommande mail via smtp. Lyssnar på nätet
- pickup - lyssnar på inkommande mail från sendmail
- cleanup - snygga upp mailen, lägg det i incoming
- qmgr - ta emot mailet, leverera på något sätt.
De olika demonerna
- trivial-rewrite - skriv om eller hitta leveransväg
- local - Lokal leverans, läser även aliasfil.
- smtp - leverans via (e)smtp
- lmtp - leverans via lmtp, ex.vis Cyrus
- virtual - leverans till virtuella mailboxar
- pipe - leverans till kommando.
- Cyrus
- komimportmail
- SpamAssassin
Demoner och användare
- master kör som root för att kunna binda portar
och för att kunna köra igång local. - local kör leveranser till en viss användare som den användaren.
- Övriga demoner kör som användaren definierad i mail_owner.
Default är användaren 'postfix'.
Utilityprogram
- Postconf - visa konfiguration
- postconf -n ger skillnad mellan defaultkonfiguration och din konfiguration
- -e ger möjlighet till omkonfiguration från kommandoraden.
- -m talar om vilka mapptyper Postfix förstår
- -l talar om vilka mailboxlåsningsmetoder som stödjs.
- postmap - används för att göra om textbaserade tabeller
till databaser.
- Kan även fråga databaser och ta bort saker ur dem.
Utilityprogram
- postfix - styr Postfix
- check - utför en koll av kataloger, skapar saknade kataloger.
- reload - ladda om efter konfigurationsändring.
- start - Starta systemet. Kör även 'postfix check'
- stop - Stoppa systemet snyggt.
Utilityprogram
- postsuper - Postfix superintendent
- Tar bort köentrys
- Flyttar entrys mellan köer
- postcat - Titta på entrys i kön
Köfiler är i ett smått binärt format. Postcat avkodar till läsbart format.
Kompabilitet
- Många av sendmails styrfiler är bara att kopiera.
(mer om detta senare) - Binären 'sendmail', oftast /usr/lib/sendmail, finns och är
en kompabilitetsbinär.- sendmail pratar med postdrop (setgid) som pratar med pickup
- Möjlighet att ha ett globalt utdelat
maildrop-directory
och bara sendmail samt postdrop på klienterna.
- Tänk på sendmail vid operativsystemsuppgraderingar
(Been there, done that..) - newaliases funkar precis som för sendmail.
Databaserna i inställningen alias_database uppdateras.
Databaserna i alias_maps används. - mailq funkar som på sendmail. Outputformatet är möjligen olika.
- Flushar kön gör man med postfix flush
Loggning
- Syslog - som vanligt.
- Flera loggrader per meddelande - pga processmodellen
- Tips: Slå av synkron skrivning av loggmeddelanden i
Linux.
Linux bryr sig mer om loggmeddelanden än om mailen..
Konfiguration
- Var?
- Huvudsakliga filer och dess funktion
- Allt är tabeller
- Alias, virtual, transport, relocated
- Restriktioner/spamskydd
Konfigurationsfiler
- Alla konfigurationsfiler är samlade på ett ställe som definieras vid kompilering.
- Default är /etc/postfix
- Flera postfix på samma dator kan dock startas med
postfix start -c sökväg/till/konfigurationskatalog
Varje postfix får då en egen konfiguration.
Konfigurationsfiler
- master.cf
- Styr master-demonen
- definierar vilka services som finns i Postfix-systemet.
- smtpd, smtp, qmgr, etc. är definierade här.
- main.cf - all annan konfiguration.
- Tabeller - pekas på från main.cf
main.cf
- nyckelord = värde
- Fri form
nyckelord = värde0, värde1, värde2 nyckelord = värde0 värde1 värde2 nyckelord = värde0, värde1, värde2 - nyckelord = /fil/namn
Efter omkonfiguration
- postfix reload
- Automatisk omkonfiguration förutom för qmgr.
Tabeller
- Mycket är baserat på tabeller.
- Textfiler - skrivs om till dbm, db, btree med postmap
- MySQL, Postgres
- LDAP
- Regexp
- Postfix har inget omskrivningsspråk, som Sendmail
- Tabeller anges med "URL". Exempelvis
dbm:/etc/postfix/canonical
mysql:/etc/postfix/sender_access.mysql
pcre:/etc/postfix/virtual.pcre - postconf -m talar om vilka tabelltyper som finns.
Tabeller
- Tänk på antalet samtidiga uppkopplingar vid databastabeller!
Grundinställningar i Postfix
- Väldigt mycket är per default vettigt.
- Standardkonfigurationer finns att kopiera
- mydestination, mydomain, mynetworks
- Se http://www.postfix.org/basic.html
Det vettiga sättet att konfigurera en Postfix
- Börja med en minimalt omkonfigurerad defaultinställning
- Ändra en sak i taget.
- Gå sakta mot nirvana :-)
Standardleverans
- home_mailbox - standard ger leverans till unixmailbox.
- home_mailbox=Maildir/ - leverans till maildir.
- Möjlighet finns att leverera via LMTP
Alias, transport, relocated
- Samma format som sendmail
Möjligen får man ersätta esmtp: i transport mot smtp:.
Vidare ska domäner vars subdomäner ska levereras till en viss
host ha punkt framför sig i transport. Se mansidan. - Alias anges i tabeller listade i alias_maps. Se aliases(5)
- Transport anges i tabeller listade i transport_maps. Se transport(5)
- Relocated anges i tabeller listade i relocated_maps. Se relocated(5)
- Kan alltså även vara regexpar - superpraktiskt!
Högersidan av en alias eller .forward-fil
- address - leverera till en viss mailadress.
- /file/name - leverera till mailspool i form av /file/name
- /directory/name/ - Leverera till Maildir
- !command - pipa mailet in i kommandot command
(Funkar även med | i stället för !) - :include:/file/name- Inkludera filen /file/name
/file/name kan här innehålla mailadresser, kommandon,
filnamn eller katalognamn för funktion som ovan.
Se dock inställningarna allow_mail_to_{commands|files}.
Att tänka på i samband med alias
- Kommandon och filskrivningar från aliastabeller görs som ägaren till filen.
- Om ägaren är root görs skrivningen som användaren i variabeln default_privs. Oftast "nobody".
- Variabeln allow_mail_to_commands avgör om alias, forward etc får köra kommandon.
- Variabeln allow_mail_to_files avgör om alias, forward etc får leverera till filer.
Virtual
- Virtuella domäner
- Listas i virtual_maps
- Sendmail-style: virtuella domäner listas i mydestination
Lokala användare och alias "syns"- Postfix-style: virtuella domäner listas ej i mydestination
Lokala användare och alias "syns" ej.- Se virtual(5)
- Sendmail-style: virtuella domäner listas i mydestination
Kanonisk omskrivning
- Omskrivning av ex.vis fnorp@domain.example.com till fnorp@lists.domain.example.com pga kinkig mailinglistprogramvara.
- Kan även användas i stället för alias för att skriva om firstname.lastname
- Skriver om alla headers.
- canonical_maps - skriv om åt båda hållen.
- recipient_canonical_maps - skriv om ingående.
- sender_canonical_maps - skriv om utgående.
Mer avancerad virtual
- Helt utan lokala användare - virtual som leveransagent.
- Användare, deras uid och var deras mailbox bor
konfigureras
i virtual_gid_maps, virtual_uid_maps, virtual_mailbox_maps
Restriktionsrelaterade inställningar
- SMTP-sessionsrestriktioner
- Headerfiltrering
- Bodyfiltrering
- Content-filter
Access-tabeller
- Används i SMTP-sessionsrestriktioner
- pattern action
- pattern: user@domain, domain.name, user@
net.work.addr.ess, net.work.addr, net.work, net
- action: {4|5}NN text, REJECT, OK, restriction..
- "Rekursiva" restriktioner. Superpraktiskt! :-)
SMTP-sessionsrestriktioner
- Client/hostname restrictions (smtpd_client_restrictions)
- reject_unknown_client - avvisa servrar som inte har PTR i DNS.
- check_client_access - avvisa/tillåt servrar enligt tabell.
- permit_mynetworks - tillåt servrar listade i mynetworks
- reject_maps_rbl - slå upp servern i en DNS-baserad
svartlista.
maps_rbl_domains bestämmer vilka RBL-domäner som används.
- reject_unauth_pipelining - Kolla att andra sidan vet att Postfix fattar pipelining. Stoppar felaktigt skrivna bulkmailers.
SMTP-sessionsrestriktioner
- HELO/EHLO restrictions (smtpd_helo_restrictions)
- smtpd_helo_required - Kolla att andra sidan skickar ett helo eller ehlo.
- reject_invalid_hostname - Kolla syntax på helo/ehlo.
- reject_unknown_hostname - Kolla att hostname i helo/ehlo finns i DNS.
- check_helo_access - Slå upp hostname från helo/ehlo i tabell.
SMTP-sessionsrestriktioner
- Sender address restrictions (smtpd_sender_restrictions)
- reject_unknown_sender_domain - Avvisa avsändardomäner som inte finns i DNS.
- check_sender_access - Slå upp avsändardomänen i en tabell.
- reject_non_fqdn_sender - Avsändardomän måste vara FQDN.
- reject_sender_login_mismatch - Inloggning med SASL (SMTP AUTH).
SMTP-sessionsrestriktioner
- Recipient address restrictions (smtpd_recipient_restrictions)
- check_recipient_access - Slå upp mottagaradressen i tabell.
- check_relay_domains - Kolla om mottagaradressen tillhör en domän servern är relä för.
- reject_unauth_destination - Bra
slutrestriction.
Tar emot mailet om servern är destination eller relä, avvisar annars.
Restriktionsklasser
- smtpd_restriction_classes är ett sätt att sätta upp
"klasser" med olika restriktioner.
smtpd_restriction_classes = cl_sender_domain, cl_check_spamlist cl_sender_domain = reject_unknown_sender_domain cl_check_spamlist = check_client_access hash:/etc/spamlist, check_recipient_access mysql:/etc/postfix/cra.mysql
Restriktionsklasser i kombination med check_recipient_access
- Låt användarna själva välja vilka antispamåtgärder som ska
användas för deras adress.
smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/recipient_map forsberg@domain.example.com cl_sender_domain, cl_check_spamlist
Extrapatchar med mer avancerade antispam-möjligheter
- Per-user UCE patch från http://www.kfki.hu/~kadlec/sw/postfix_patch.html
- Häftigare makroexpansion
- Möjliggör restriktionsklasser för enskilda RBL-listor
smtpd_recipient_restrictions = rbl:/etc/postfix/rbl_domain relays.orbs.org 554 Service unavailable; [$client_address] blocked using relays.orbs.org. ${rbl_txt?$rbl_txt:See http://www.orbs.org/ for details.} - Parametriserade tabeller
cl_user_exceptions = check_access \{$sender}|\$recipient hash:/etc/postfix/user_exceptions spammer@hotmail.com|forsberg@domain.example.com REJECT snyggblondin@blockeddomain.example.com|forsberg@domain.example.com OK
Headerfiltrering
- header_checks - specificera en tabell med headermatchningsrader.
- Använd lämpligen en regexptabell.
- Färdiga rader finns att tillgå för LiU från UNIT.
Bodyfiltrering
- body_checks - fungerar på samma sätt som header_checks.
- Läser rader från bodyn, en rad i taget.
- Vettigt ställe att filtrera bort *.doc, *.vbs, etc. på.
Content-filter
- Ett sätt att stoppa in mer avancerade kollar än vad body_checks klarar.
- SpamAssassin - http://spamassassin.taint.org/
- Scriptbaserad eller smtp-baserad lösning.
- Dokumenterat i FILTER_README i distributionen
Content-filter, scriptbaserat
- Kör ett script som på något sätt återinjicerar mailet via sendmail.
- Ger i värsta fall en faktor fyra sämre prestanda.
- SpamAssassin går runt detta.
- I master.cf:
smtp inet n - n - - smtpd -o content_filter=filter:dummy filter unix - n n - - pipe flags=Rq user=postfilt argv=/bin/script -f ${sender} -- ${recipient}
script
#!/bin/sh
# Localize these
INSPECT_DIR=/var/filter/tmp
SENDMAIL="/usr/lib/sendmail -i"
# Exit codes from <sysexits.h>
EX_TEMPFAIL=75
EX_UNAVAILABLE=69
# Start processing.
cd $INSPECT_DIR || { echo $INSPECT_DIR does not exist; exit $EX_TEMPFAIL; }
(/spamassassin/bin/spamc | $SENDMAIL "$@" ) || { echo filtering failed; exit $EX_TEMPFAIL; }
exit $?
Content-filter, smtp-baserat
- Skicka iväg mailet en extra gång med smtp
- Skicka tillbaka till en särskild port
- master.cf:
/etc/postfix/master.cf: localhost:10026 inet n - n - 10 smtpd -o content_filter= -o local_recipient_maps= -o myhostname=localhost.domain.name - main.cf:
content_filter = smtp:localhost:10025 - Låt filtret lyssna på localhost:10025
Andra vettiga inställningar
- local_recipient_maps = $alias_maps
unix:passwd.byname
- Släpp inte in mail till okända användare i systemet. - mailbox_size_limit - maxstorlek på en mailbox.
- message_size_limit - maxstorlek på enskilt mail.
- recipient_delimiter - tillåt ex.vis username+foo@domain
Prestanda
- Diskprestanda, diskprestanda, diskprestanda, diskprestanda.
- DNS - kör gärna en egen caching-only bind på mailservern.
- Antalet smtpd och smtp-processer spelar stor roll.
- Flera postfix kan köras på en maskin, mot olika diskar.
- Alternativ kömanager finns/jobbas på.
Prestandatester
- smtp-source - generera testmail.
- smtp-sink - ta emot testmail.
Felsökning
- egrep '(warning|fatal|panic):' maillog
- pflogsumm.pl - sammanställning av loggen.
- Generellt beter sig Postfix rätt snyggt om något är felkonfigurerat.
- Kolla loggen vid reload
- Sätt soft_bounce = yes vid utprovning av restrictions
Då sker studsar med 450-felkod i stället för 550-felkod. - Lägg på -v, -vv eller -vvv på kommandoraden i master.cf för små,
lagom eller stora mängder debugoutput från just en demon.