21x9.org

E-Mail-Server 3: postfix, greylisting, amavis (Debian Wheezy)

Categories: [blog]
Tags: [imported]

Im [[/e-mail-server-2-dovecot-debian-wheezy/|letzten Artikel]] wurde der MDA dovecot installiert und die Konfiguration für das Zusammenspiel mit LDAP und dem Mail-Transport-Agent (MTA) postfix vorbereitet. Postfix ist verantwortlich für den eigentlich Mailtransport und damit für den Empfang und den Versand von E-Mails.## Installation ##

apt-get install postfix postfix-ldap postfix-pcre

Konfiguration

Die Konfiguration von postfix baut stark auf dovecot auf, somit sollte dieses bereits fertig konfiguriert sein.

Die Hauptkonfiguration erfolgt über die Datei /etc/postfix/master.cf:

smtp      inet  n       -       -       -       -       smtpd
pickup    fifo  n       -       -       60      1       pickup
    -o content_filter=
    -o receive_override_options=no_header_body_checks
cleanup   unix  n       -       -       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       -       1000?   1       tlsmgr
rewrite   unix  -       -       -       -       -       trivial-rewrite
bounce    unix  -       -       -       -       0       bounce
defer     unix  -       -       -       -       0       bounce
trace     unix  -       -       -       -       0       bounce
verify    unix  -       -       -       -       1       verify
flush     unix  n       -       -       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       -       -       -       smtp
relay     unix  -       -       -       -       -       smtp
showq     unix  n       -       -       -       -       showq
error     unix  -       -       -       -       -       error
retry     unix  -       -       -       -       -       error
discard   unix  -       -       -       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       -       -       -       lmtp
anvil     unix  -       -       -       -       1       anvil
scache    unix  -       -       -       -       1       scache
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix  -   n   n   -   2   pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
  flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
  ${nexthop} ${user}
smtp-amavis unix    -   -   -   -   2   smtp
    -o smtp_data_done_timeout=1200
    -o smtp_send_xforward_command=yes
    -o disable_dns_lookups=yes
    -o max_use=42

127.0.0.1:10025 inet    n   -   -   -   -   smtpd
        -o content_filter=
        -o local_recipient_maps=
        -o relay_recipient_maps=
        -o smtpd_restriction_classes=
        -o smtpd_delay_reject=no
    -o smtpd_client_restrictions=permit_mynetworks,reject
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o smtpd_data_restrictions=reject_unauth_pipelining
        -o smtpd_end_of_data_restrictions=
        -o mynetworks=127.0.0.0/8
        -o smtpd_error_sleep_time=0
        -o smtpd_soft_error_limit=1001
        -o smtpd_hard_error_limit=1000
        -o smtpd_client_connection_count_limit=0
        -o smtpd_client_connection_rate_limit=0
        -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks

Hier sind insbesondere die Angaben für amavis relevant (127.0.0.1:10025 und smtp-amavis).

Die Benutzerauthentifizierung am SMTP übernimmt dankenswerterweise Dovecot. Eingerichtet wird sie über die Datei: /etc/postfix/main.cf

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases, ldap:/etc/postfix/ldap-aliases.cf
append_dot_mydomain = no
biff = no
body_checks = pcre:/etc/postfix/body_checks.pcre
config_directory = /etc/postfix
content_filter = smtp-amavis:[127.0.0.1]:10024
delay_warning_time = 1h
header_checks = pcre:/etc/postfix/header_checks.pcre
inet_interfaces = all
inet_protocols = all
local_recipient_maps =
luser_relay = dwitt
mailbox_command = /usr/lib/dovecot/deliver
mailbox_size_limit = 0
message_size_limit = 64000000
mydestination = 21x9.net,21x9.org,21x9.sh
myhostname = mail.21x9.org
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
myorigin = /etc/mailname
notify_classes = delay, resource, software
readme_directory = no
recipient_delimiter = +
relayhost =
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtp_tls_loglevel = 1
smtp_tls_policy_maps = hash:/etc/postfix/tls_policy
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination check_client_access hash:/etc/postfix/client_whitelist check_recipient_access hash:/etc/postfix/rejected_recipients reject_non_fqdn_sender reject_non_fqdn_recipient reject_unlisted_recipient reject_invalid_hostname reject_unknown_client reject_rbl_client sbl-xbl.spamhaus.org reject_rbl_client ix.dns1.manitu.net check_policy_service inet:127.0.0.1:10023
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth
smtpd_sasl_type = dovecot
smtpd_tls_CAfile = /etc/postfix/ssl/ca.pem
smtpd_tls_cert_file = /etc/postfix/ssl/21x9.crt
smtpd_tls_key_file = /etc/postfix/ssl/21x9.key
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_use_tls = yes
unknown_client_reject_code = 550
virtual_alias_domains = citizen-cam.de,icanhaslebensraum.de
virtual_alias_maps = ldap:/etc/postfix/ldap-aliases.cf, hash:/etc/postfix/forwarding

Je nachdem welche Angaben in mynetworks gemacht werden müssen Benutzer am SMTP angemeldet sein, damit externe Mails versendet werden können. Die Benutzerdaten hierzu bezieht Dovecot und somit Postfix vom LDAP-Server.

Die unter smtpd_tls_cert_file und smtpd_tls_key_file erwähnten Zertifikatsdateien können z.B. über StartSSL bezogen oder selbst generiert werden. Letzteres hat zur Folge dass die Benutzer eine Zertifikatswarnung erhalten, wenn Sie den Mailserver in ihrem Mailclient einrichten.

Die smtpd_recipient_restrictions legen Regeln fest die erfüllt sein müssen, damit der MTA eine E-Mail von außen annimmt bzw. versendet, sie werden in der angegebenen Reihenfolge abgearbeitet und haben folgende Bedeutung:

Neben den oben genannten Checks werden die Mail außerdem durch postgrey (check_policy_service inet:127.0.0.1:10023) und amavis (content_filter = smtp-amavis:[127.0.0.1]:10024) weiteren Untersuchungen unterzogen und ggf. abgelehnt.

Über die Dateien pcre:/etc/postfix/body_checks.pcre und pcre:/etc/postfix/header_checks.pcre können weiter Filterkriterien erzeugt werden. body_checks.pcre führt hierbei mittels RegEx (Regulärer Ausdrücke) Tests im E-Mail Body durch. So können bestimmte Suchbegriffe zur Ablehnung einer Mail führen. header_checks.pcre für entsprechende Header-Checks durch. So kann z.B. E-Mail an die Adresse noreply@21x9.org mit einer entsprechenden Meldung abgelehnt werden. Immer wenn die .pcre-Dateien geändert werden müssen sie mit postmap /etc/dovecot/$dateiname.pcre umgewandelt und aktiviert werden. Sollen keine Header/Body-Checks durchgeführt werden sollten die Zeilen aus der main.cf entfernt werden.

Die oben genannten Zeilen alias_database und alias_maps veranlassen Postfix nach unbekannten Usern für die lokalen Domains (mydestination) zunächst in /etc/aliases zu suchen. Wird Postfix dort nicht fündig, wird nach den in /etc/postfix/ldap-aliases.cf definierten Regeln nach weiteren Usern gesucht:

# /etc/postfix/ldap-aliases.cf

server_host = localhost
search_base = dc=ldap,dc=21x9,dc=org
bind = no
query_filter = mail=%s
result_attribute = uid
version = 3

Eine exakte Erklärung der Konfigurationseinträge findet sich in der sehr guten Dokumentation von Postfix:
http://www.postfix.org/documentation.html

Die Verwaltung der virtuellen Mailadressen erfolgt nun (am einfachsten) über den LDAP Account Manager (LAM).

Sofern ein ''catch-all'' Mailkonto gewünscht wird ist dies ebenfalls leicht einzurichten:

# /etc/postfix/main.cf>

local_recipient_maps =
luser_relay = gpkvt

Die Konfiguration wird mit /etc/init.d/postfix aktiviert. Außerdem müssen postgrey und amavis gestartet werden, zu denen kommen wir aber noch im nächsten Artikel.

Queue

Mit postqueue -p kann man sich die aktuelle Warteschlange von postfix ansehen:

-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
D688222E6BCB     4303 Wed Jul 11 12:28:12  MAILER-DAEMON
(Host or domain name not found. Name service error for name=microsoftpromo.co.uk type=MX: Host not found, try again)
                                         info@microsoftpromo.co.uk

8D78B22E6BCE     4478 Wed Jul 11 12:23:49  MAILER-DAEMON
(Host or domain name not found. Name service error for name=microsoftpromo.co.uk type=MX: Host not found, try again)
                                         info@microsoftpromo.co.uk

-- 9 Kbytes in 2 Requests.

Mit postqueue -f (flush) wird Postfix veranlasst die Abarbeitung der Warteschlange sofort zu beginnen. Soll eine Mail vorzeitig aus der Warteschleife genommen werden und nicht mehr zugestellt werden, kann postsuper -d $queueid genutzt werden. Mit postsuper -d ALL werden alle Mails aus der Warteschleife entfernt. Die Queue-ID wird von postqueue -p angezeigt.

Weiterleitung

Eine häufige Anforderung an einen Mailserver ist es E-Mails einfach an eine andere Adresse weiterzuleiten, anstatt sie in einem Postfach zu speichern. Dies geht mit postfix sehr einfach, es müssen nur zwei Zeilen zur Konfiguration hinzugefügt werden:

# /etc/postfix/main.cf

virtual_alias_domains = citizen-cam.de
virtual_alias_maps = hash:/etc/postfix/forward

Domains die in virtual_alias_domains gelistet sind dürfen nicht als mydestination gelistet sein. Es ist somit also nicht möglich lokale Postfächer für die Domain anzulegen. Will man dies ermöglichen muss anstelle von virtual_alias_maps einfach alias_maps genutzt werden, virtual_alias_domains entfällt dann.

Anschließend wir das Regelwerk erstellt:

# /etc/postfix/forward

info@citizen-cam.de root@21x9.org
root@citizen-cam.de     vorname.nachname@googlemail.de

Das Regelwerk wird nun zusammen mit der Konfigurationsänderung aktiviert:

postmap /etc/postfix/forward
postfix reload

Die Regeln werden sofort aktiv.

Auch ein catchall-Mailkonto ist so möglich:

# /etc/postfix/forward

@citizen-cam.de     root@21x9.org
@icanhaslebensraum      vorname.nachname@gmail.com