user: pass:

mta postfix / anleitung zum installieren von postfix / postfix-tls mit sasl


Ich möchte hier eine kurze Anleitung geben, wie Ihr am besten Postfix mit SASL und smtpd-Auth installiert. Als Grundlage wird ein Debian sarge verwedet, mit ein paar individuellen Anpassungen.

Bei Fragen wendet euch an Henrik Hasenkamp.

Problem: Viele böse Leute verwenden offene Mailrelays um anonym zu spamen. Dieses hat zwei grosse Nachteile:

  • Der Mailserver, von dem gespammt wird oder über welchen relayed wird, landet schnell auf sogenannten Blacklisten. Die Blacklisten werden wiederum von vielen anderen Mailservern eingelesen und ein Eintrag führt dann zu dem bedauerlichem Ergebniss, daß Emails nicht mehr akzeptiert werden.
  • Natürlich wollen wir ja nicht den Spam unterstützen, bzw. wollen wir nicht das andere Leute unsere Technik/Traffic sich zu nutze machen. Hierfür bietet es sich ebenfalls an, den Mailserver abzuschotten.

Lösung: Eine Lösung ist z.B. den Mailserver soweit abzuschotten, daß nur noch Emails von bekannten Clienten, z.B. aus dem internen Netz akzeptiert werden. Diese Lösung ist jedoch nur solange trivial, wie kein Benutzer über eine Dial-UP Verbindung auf den Mailserver zugreift, da sich hier meistens die IP-Adresse ständig ändert.

Wir können das sogenannte "POP-b4-SMTP" Verfahren nutzen, hierbei müssen Benutzer zunächst Emails abrufen um anschliessend E-Mails senden zu dürfen. Auch dieser Weg ist nicht wirklich benutzerfreundlich, wenn ich doch nur eine E-Mail abschicken möchte, halte ich es für unklug erstmal E-Mails abzurufen.

Wie dem auch sei. Es haben sich zwischenzeitlich viele Leute Gedanken darüber gemacht, wie ein Mailserver am besten abzuschotten ist. Der hier beschriebene Weg ist natürlich nur einer von vielen, aber er hat sich in der Zwischenzeit als sehr wirkungsvoll erwiesen.

Vorgang: Wir haben ein frisch installiertes Debian / Sarge System mit dem wir arbeiten wollen. Um den Postfix mit der gewünschten Authentifizierung zum laufen zu bringen, müssen wir den Postfix erstmal installieren:

apt-get install postfix postfix-tls

Falls sich Debconf meldet, können wir uns durch Enter einfach durch das Menu klicken, das konfigurieren werden wir anschliessend genauer erklären und Schritt für Schritt machen.

Weiter benötigen wir die SASL-Module und SASL-Binarys:

apt-get install libsasl-dev libsasl-modules libsasl2 libsasl2-modules sasl-bin sasl2-bin

Nun haben wir alles was wir brauchen und noch ein paar Packete mehr. Zugegeben, die SASL Sachen brauchen wir nicht, die Konfiguration wird sich ausschliesslich auf SASL2 beziehen.

Wir haben nun die ersten Hürden genommen und können uns an die Konfiguration machen. Hierzu nehmen wir uns zunächst die Datei /etc/postfix/main.cf vor. Diese gehen wir jetzt Schritt-für-Schritt durch. Wer meine Konfig so übernehmen möchte, kann die Datei auch löschen und meine Einträge in eine neue Datei einfügen.

--snip--
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix
program_directory = /usr/lib/postfix
setgid_group = postdrop
biff = no
--snip--

Ich glaube, zu den ersten Zeilen ist einfach nichts zu sagen, diese erklären sich von selber.

--snip--
smtpd_banner = $myhostname ESMTP $mail_name (Mein Mailserver)
--snip--

Hier können wir festlegen, wie sich den unser Mailserver melden soll. Wenn ich nun mit dieser Einstellung ein Telnet auf den Port 25 mache, dann erhalte ich die Meldung:

--snip--
220 mailserver.de ESMTP Postfix (Mein Mailserver)
--snip--

Weiter im Text, sonst schlafen wir ja hier noch ein.

--snip--
myhostname = mailserver.de
--snip--

Hier legen wir unseren Hostnamen fest. Alternativ können wir auch den $mailname nutzen der wird dann aus der Datei /etc/mailname ausgelesen und verwendet. Wie man es nun macht ist eigentlich egal.

--snip--
append_dot_mydomain = yes
virtual_maps = hash:/etc/postfix/virtual
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
transport_maps = hash:/etc/postfix/transport
myorigin = /etc/mailname
--snip--

Jetzt wird es langsam interessant. append_dot_mydomain steht für "setze meinen Host an die Email dran". Eigentlich uninteressant, daher gehen wir da jetzt auch nicht weiter drauf ein. Die virtual_maps, alias_maps, alias_database und transport_maps legen ein paar Dateien fest, die wir brauchen. Virtual ist eine Datei, in der wir festlegen können, wir wir Benutzer und Emails zusammenlegen. Z.B.

Systemuser = test
Email = webmaster@mailserver.de

Eintrag:

--snip--
webmaster@mailserver.de test
--snip--

Dieses würde die o.s. Email Adresse auf den Systemuser test weiterleiten. Wir können an dieser Stelle auch eine Datenbank ins Spiel holen, dass würde jedoch ein wenig zu komplex für die erste Version werden. Daher werden wir die Datenbanken erstmal noch aussenvor lassen und vielleicht in einer späteren Version nocheinmal darauf zukommen.

--snip--
mydestination = mailserver.de, 3-freun.de, localhost, localhost.localdomain, localhost
--snip--

So teilen wir dem Postfix mit, um welche Domains er sich kümmern muss. Wir nutzen in den nächsten Beispielen nur noch mailserver.de, hier sei jedoch bemerkt, dass mir die Domain natürlich nicht gehört ;)

Es ist weiter möglich, durch den Eintrag

--snip--
mydestination = hash:/etc/postfix/destination
--snip--

Eine Datei anzugeben, in welcher sich die oben aufgeführten Hostnamen befinden. Diese wird dann jedesmal eingelesen.

--snip--
mynetworks = 127.0.0.0/8
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
--snip--

Hier legen wir folgende Parameter fest:

  • mynetworks = Das Netzwerk, von wo wir Emails so oder so akzeptieren. Egal ob wir nun eine Auth vorliegen haben oder nicht.
  • mailbox_command = Unser localer Verteiler. Procmail nutze ich, um die Emails in die einzelnen Postfächer einzusortieren.
  • emailbox_size_limit = Die maximale Größe einer Mailbox. 0 steht für unbegrenzt.
  • recipient_delimiter = Setzt den Parameter einfach, ich habe mich an dieser Stelle für die Bedeutung noch nicht interessiert.

Nun wird es mal interessant, wir kommen zu der eigentlichen Authentifikation:

--snip--
smtpd_helo_required = yes
strict_rfc821_envelopes = yes
disable_vrfy_command = yes
smtpd_delay_reject = yes
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_local_domain =
smtpd_sasl_security_options = noanonymous
smtpd_recipient_restrictions =
permit_sasl_authenticated,
reject_unauth_destination,
warn_if_reject, reject_unknown_client,
warn_if_reject, reject_unknown_hostname,
check_relay_domains,
reject
--snip--

helo_required = Wir nehmen nur Anfragen an, wenn der Client ein "ehlo $Domain" schickt.
strict_rfc821_encelopes = Wir erlauben nur Emails, die dem rfc821-Standart entsprechen. Hier müssen die Email-Adressen im "" Format dem Mailserver übergeben werden.
disable_vrfy_command = Wir nehmen das Commando "vrfy" aus dem Mailserver heraus. Diesers würde einem potentiellem Angreifer ermöglichen, via Bruteforce Attacke herauszufinden welche Benutzer alle auf unserem System angelegt sind.
smtpd_delay_reject = Hiermit wird die "restriction" SOFORT wirksam. Dieses muss nicht zwangsläufig ein Feature sein.
smtpd_sasl_auth_enable = Hier legen wir fest, daß ein Benutzer sich per SASL authentifizieren muss.
broken_sasl_auth_clients = Diesen Parameter sollten wir auf jedenfall setzen, wenn es möglich ist das jemand per Outlook oder Outlook Express Emails senden möchte. Hier hält Microsoft sich mal wieder nicht an die Standarts.
smtpd_sasl_local_domain = Dieser Eintrag MUSS leer bleiben, hierzu kommen wir aber später, da das nicht-setzen diverse Probleme mit sich bringt.
smtpd_sasl_security_options = Hier legen wir lediglich fest, daß kein anonymer Emailversand akzeptiert werden soll.
smtpd_recipient_restrictions = Hier setzen wir diverse Security und überprüfungs Regeln über SASL. Auf die Optionen gehe ich jetzt hier nicht weiter ein, es sei nur gesagt, daß der Parameter "warn_if_reject" einen Eintrag in den Logfiles hinterlässt, sofern die Regel zutrifft. Die Email, welche nach den Regeln nicht versand werden soll, wird jedoch trotzdem verschickt. Wir können damit quasi unsere Einstellungen testen um zu sehen wie oft eine Regel zutrifft und ob es ratsam ist diese Regel fest in die Konfiguration aufzunehmen.

Hiermit sind wir schon am Ende unserer main.cf angekommen. Wenn Ihr alles so gemacht habt, wie ich beschrieben, dann sollte der Mailserver schon wirklich gut laufen, - oder doch nicht? -

Nein der Server wird nicht gut laufen. Warum? Das werden wir jetzt analysieren.

Bitte editiert die Datei master.cf und ändert folgendes ab.

--snip--
smtp inet n smtpd
--snip--

in

--snip--
smtp inet n smtpd -v
--snip--

Hier bekommen wir dann mehr informationen in der Logdatei /var/log/mail.info Wenn wir uns diese Datei nun anschauen und dabei versuchen eine Email abzuschicken, dann sehen wir das der SMTPD einen "bad command"

--snap--
11879427-Dec 31 01:56:13 server1 postfix/master[31234]: warning: process /usr/lib/postfix/smtpd pid 31238 exit status 1
11879538:Dec 31 01:56:13 server1 postfix/master[31234]: warning: /usr/lib/postfix/smtpd: bad command startup -- throttling
--snap--

Ich habe lange gebraucht, bis ich hinter den Fehler kam. In der Postfix Version 1.1.11.0-3 wird der String "smtpd_sasl_local_domain" überprüft. Ist diese Konfigurationszeile nicht vorhanden, so wird automatisch $mailname als Parameter genommen. Lassen wir die Zeile wie oben leer, dann wird nichts übernommen, wir können aber auch keine Emails verschicken weil der Kind-Prozess von Postfix bei jedem Aufruf stirbt.

Nun haben wir zwei Möglichkeiten. Wir können mittels apt-get source postfix uns den Source herunterladen und in C rumfummeln. Dieses funktioniert zweifelslos. Ich habe dazu die überprüfung des Strings einfach auf eine minimale Länge von 0 gesetzt und die Sachen neu übersetzt. Bei dem nächsten Update hätte ich jedoch das selbe Problem, daher habe ich mir einfach mal gedacht wir versuchen die Version aus dem unstable Tree. Da Postfix allgemein sehr sicher ist und dazu noch in einer CHROOT Umgebung läuft, sehe ich das an der Stelle mal nicht so eng. Weiterhin ist der letzte schwere Security-Bug schon über ein Jahr her.

Damit wir auch das System sauber halten, legen wir die Datei /etc/apt/preferences an. Dort schreiben wir folgendes rein:

--snip--
Package: *
Pin: release o=Debian,a=stable
Pin-Priority: 900

Package: *
Pin: release o=Debian,a=testing
Pin-Priority: 400

Package: *
Pin: release o=Debian,a=unstable
Pin-Priority: 300

Package: *
Pin: release o=Debian
Pin-Priority: -1
--snip--

Anschliessend brauchen wir noch die testing und unstable Einträge in unserer /etc/apt/sources.list damit wir ein

apt-get update

ausführen können. Jetzt können wir mittels

apt-get -t unstable postfix postfix-tls

unseren Postfix aus dem unstable-Tree installieren. Hier nutzen wir selbstverständlich die selben Konfigurationsdateien wie auch schon bei unserem "alten" Postfix.

Herzlichen Glückwunsch. Wir haben nun ein schönen Postfix installiert der schon fast funktioniert.

Wir müssen nun aus dem Postfix heraus gehen und uns an die Konfiguration von SASL machen. Wir nutzen zum authentifizieren den "saslauthd" welcher im Packet von "sasl2-bin" ist. Hierzu editieren wir die Datei /etc/default/saslauthd. Wir müssen hier folgende Einträge setzen/ändern:

--snip--
START=yes
MECHANISMS="pam"
--snip--

Warum das jetzt so ist, möchte ich nicht erklären. Welche Authentifikationstypen es noch gibt steht in der Datei ausführlich beschrieben. Anschliessend starten wir den saslauthd mit /etc/init.d/saslautd start.

Nun werden wir sehen, daß trotzdem noch nicht alles so funktioniert wie wir wollen. Aber auch hier gibt es eine Lösung ;)

Bitte führt die folgenden Kommandos einfach nur aus, wer sich für den Sinn und Zweck interessiert, kann mich gerne per Email fragen.

rm -rf /var/run/saslautd
mkdir /var/spool/postfix/run/saslauthd
ln -s /var/spool/postfix/run/saslauthd /var/run/
mkdir /var/spool/postfix/usr/lib/sasl2
rm /usr/lib/sasl2/smtpd.conf /etc/postfix/sasl2/smtpd.conf -rf
touch /var/spool/postfix/usr/lib/sasl2/smtpd.conf
ln -s /var/spool/postfix/usr/lib/sasl2/smtpd.conf /etc/postfix/sasl/
ln -s /var/spool/postfix/usr/lib/sasl2/smtpd.conf /usr/lib/sasl2/smtpd.conf

Nun öffnen wir die Datei /var/spool/postfix/usr/lib/sasl2/smtpd.conf und fügen folgende Zeile ein:

--snip--
pwcheck_method: saslauthd
--snip--

Nun machen wir in einem eigenem Festern das Logfile auf. Benutzt dazu den Befehl tail -f /var/log/mail.info . Wenn Ihr euch jetzt am Server per SMTPD Authentifiziert, dann seht ihr das es funktioniert.

Sollten hier irgendwelche Fehler drinn sein, so schickt mir bitte eine Email, ich werde das dann korrigieren. Ich empfange auch gerne Tipps und/oder Kritik gleich welcher Art. Wenn euch die Dokumentation gefällt und ich euch helfen konnte, dann freue ich mich natürlich ebenfalls über eine Nachricht, vielleicht werde ich dann in Zukunft noch mehr solcher Dokus über einzelne Dienste schreiben.

Grüße Henrik Hasenkamp



Henrik Hasenkamp, 03.01.2004.