Postfixkurs @ UNIT

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

Notation

Översikt över systemet

Licens

Installation

Uppgradering

Dokumentation

Process- och säkerhetsmodell

Process och säkerhetsmodell

Postfix big picture

De olika demonerna

De olika demonerna

Demoner och användare

Utilityprogram

Utilityprogram

Utilityprogram

Kompabilitet

Loggning

Konfiguration

Konfigurationsfiler

Konfigurationsfiler

main.cf

Efter omkonfiguration

Tabeller

Tabeller

Grundinställningar i Postfix

Det vettiga sättet att konfigurera en Postfix

Standardleverans

Alias, transport, relocated

Högersidan av en alias eller .forward-fil

Att tänka på i samband med alias

Virtual

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.

Fin!