Wie man SPF in Postfix implementiert

Version 1.0
Author: Falko Timme <ft [at] falkotimme [dot] com>

Diese Anleitung veranschaulicht, wie man SPF (Sender Policy Framework) in eine Postfix 2.x Installation implementiert. Das Sender Policy Framework ist ein Open Standard, der eine technische Methode beschreibt, um dem Verfälschen der Absenderadresse vorzubeugen (siehe http://www.openspf.org/Introduction). Es gibt viele SPF Erweiterungen und Patches für Postfix, aber die meisten verlangen, dass Du Postfix neu kompilierst. Daher installieren wir das postfix-policyd-spf-perl Paket von openspf.org, was ein Perl Paket ist und in vorhandene Postfix Installationen implementiert werden kann (eine Postfix Kompilierung ist nicht nötig).

Ich möchte an dieser Stelle darauf hinweisen, dass dies nicht der einzige Weg ist ein solches System einzurichten. Es gibt viele Möglichkeiten dieses Ziel zu erreichen – dies ist der Weg, den ich gewählt habe. Ich übernehme keine Garantie, dass dies auch bei Dir funktioniert!

1 Vorbemerkung

Ich gehe davon aus, dass Du bereits einen funktionstüchtigen Postfix Mail Server aufgesetzt hast.

Die folgende Prozedur ist Distributions-unabhängig, d.h. es sollte auf jeder Linux Distribution funktionieren (ich habe es jedoch auf Debian Etch getestet).

2 Installation benötigter Perl Module

Das postfix-policyd-spf-perl Paket hängt vom Mail::SPF und den NetAddr::IP Perl Modulen ab. Daher werden wir sie unter Verwendung der Perl Kommandozeile installieren. Starte die Perl Kommandozeile wie folgt:

perl -MCPAN -e shell

Wenn Du die Perl Kommandozeile zum ersten Mal ausführst, werden Dir einige Fragen gestellt. Du kannst alle Standardwerte beibehalten. Du wirst auch gefragt, welche CPAN Paketdatenbanken verwendet werdens sollen. Wähle Paketdatenbanken aus, die sich in Deiner Nähe befinden.

Nach der anfänglichen Perl Kommandozeilenkonfiguration können wir damit beginnen, die benötigten Module zu installieren. Um Mail::SPF zu installieren, führe einfach dies aus

install Mail::SPF

In meinem Fall habe ich versucht, Module::Build (was eine Abhängigkeit ist) zu installieren, was dann aber fehlgeschlagen ist. Wenn Dir das passiert, beende einfach die Perl Kommandozeile indem Du Folgendes eingibst

q

Starte dann die Perl Kommandozeile erneut:

perl -MCPAN -e shell

und versuche erneut Mail::SPF zu installieren:

install Mail::SPF

Dieses Mal sollte es klappen und Du müsstest feststellen, dass auch die Module Net::DNS::Resolver::Programmable und NetAddr::IP installiert werden, von denen Mail::SPF abhängig ist.

Eine erfolgreiche Installation von Mail:SPF sollte so enden:

Installing /usr/local/bin/spfquery
Writing /usr/local/lib/perl/5.8.8/auto/Mail/SPF/.packlist
/usr/bin/make install — OK

Da NetAddr::IP bereits installiert wurde, können wir die Perl Kommandozeile jetzt verlassen:

q

3 Installation von postfix-policyd-spf-perl

Als Nächstes laden wir postfix-policyd-spf-perl von http://www.openspf.org/Software in das /usr/src/ Verzeichnis und installieren es in das /usr/lib/postfix/ Verzeichnis wie folgt:

cd /usr/src
wget http://www.openspf.org/blobs/postfix-policyd-spf-perl-2.001.tar.gz
tar xvfz postfix-policyd-spf-perl-2.001.tar.gz
cd postfix-policyd-spf-perl-2.001
cp postfix-policyd-spf-perl /usr/lib/postfix/policyd-spf-perl

Dann bearbeiten wir /etc/postfix/master.cf und fügen folgende Zeile am Ende hinzu:

vi /etc/postfix/master.cf

[...]
policy  unix  -       n       n       -       -       spawn
        user=nobody argv=/usr/bin/perl /usr/lib/postfix/policyd-spf-perl

(Die vorangestellten Leerzeichen vor user=nobody sind wichtig, damit Postfix weiß, dass diese Zeile zur vorherigen gehört!)

Öffne dann /etc/postfix/main.cf und suche nach der smtpd_recipient_restrictions Direktive. Du müsstest in dieser Direktive reject_unauth_destination haben und direkt nach reject_unauth_destination fügst Du check_policy_service unix:private/policy wie folgt hinzu:

vi /etc/postfix/main.cf

[...]
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination,check_policy_service unix:private/policy
[...]

oder so:

[...]
smtpd_recipient_restrictions =
            [...]
            reject_unauth_destination
            check_policy_service unix:private/policy
            [...]
[...]

Es ist wichtig dass Du check_policy_service NACH reject_unauth_destination festlegst, sonst kann Dein System ein offener Relay Server werden!

Starte Postfix dann neu:

/etc/init.d/postfix restart

Das war’s schon. Du solltest die README Datei überprüfen, die im postfix-policyd-spf-perl Paket ist. Sie enthält einige wichtige Angaben darüber, wie postfix-policyd-spf-perl E-Mails bearbeitet, z.B. wie diesr Teil der postfix-policyd-spf-perl-2.0001 README:

This version of the policy server always checks HELO before Mail From (older
versions just checked HELO if Mail From was null). It will reject mail that
fails either Mail From or HELO SPF checks. It will defer mail if there is a
temporary SPF error and the message would othersise be permitted
(DEFER_IF_PERMIT). If the HELO check produces a REJECT/DEFER result, Mail From
will not be checked.

If the message is not rejected or deferred, the policy server will PREPEND the
appropriate SPF Received header. In the case of multi-recipient mail, multiple
headers will get appended. If Mail From is anything other than completely empty
(i.e. <>) then the Mail From result will be used for SPF Received (e.g. Mail
From None even if HELO is Pass).

The policy server skips SPF checks for connections from the localhost (127.) and
instead prepends and logs ‚SPF skipped – localhost is always allowed.‘

4 policyd-spf-perl testen

Wir können policyd-spf-perl testen, indem wir dies ausführen

perl /usr/lib/postfix/policyd-spf-perl

Der Cursor wartet dann in der policyd-spf-perl Kommandozeile. Wir können nun so tun, als ob wir versuchen würden, eine E-Mail einer bestimmten Domain und eines bestimmten Servers an eine andere E-Mail Adresse zu senden. policyd-spf-perl überprüft dann, ob dieser bestimmte Server E-Mails für die Sender-Domain senden darf und zeigt uns das Ergebnis.

Lass uns also sehen, was passiert wenn wir versuchen, eine E-Mail von info@h****forge.com vom Server h****.server*********.net (IP Adresse 81.169.1**.**) zu senden. h****forge.com hat einen SPF Eintrag, der 81.169.1**.** erlaubt, E-Mails von h****forge.com zu senden.

Also geben wir in der policyd-spf-perl Kommandozeile dies ein:

request=smtpd_access_policy
protocol_state=RCPT
protocol_name=SMTP
helo_name=h****forge.com
queue_id=8045F2AB23
sender=info@h****forge.com
recipient=falko.timme@*******.de
client_address=81.169.1**.**
client_name=h****.server*********.net
[empty line]

Die Ausgabe sollte wie folgt aussehen:

action=PREPEND Received-SPF: pass (h****forge.com: 81.169.1**.** is authorized to use ‚info@h****forge.com‘ in ‚mfrom‘ identity (mechanism ‚ip4:81.169.1**.**‘ matched)) receiver=server1.example.com; identity=mfrom; envelope-from=“info@h****forge.com“; helo=h****forge.com; client-ip=81.169.1**.**

was heißt, dass wir den Test bestanden haben.

Lass uns einen weiteren Test durchführen. Dieses Mal senden wir vom Client 1.2.3.4 (www.example.com), der keine E-Mails von h****forge.com aus senden darf:

request=smtpd_access_policy
protocol_state=RCPT
protocol_name=SMTP
helo_name=h****forge.com
queue_id=8045F2AB23
sender=info@h****forge.com
recipient=falko.timme@*******.de
client_address=1.2.3.4
client_name=www.example.com
[empty line]

Dies ist die Ausgabe, der Test ist wie erwartet fehlgeschlagen:

action=PREPEND Received-SPF: softfail (h****forge.com: Sender is not authorized by default to use ‚info@h****forge.com‘ in ‚mfrom‘ identity, however domain is not currently prepared for false failures (mechanism ‚~all‘ matched)) receiver=server1.example.com; identity=mfrom; envelope-from=“info@h****forge.com“; helo=h****forge.com; client-ip=1.2.3.4

Wir können nun sogar versuchen, das sender Feld frei zu lassen, wie es viele Spammers tun. policyd-spf-perl sollte dennoch in der Lage sein, seine Tests abzuschließen:

request=smtpd_access_policy
protocol_state=RCPT
protocol_name=SMTP
helo_name=h****forge.com
queue_id=8045F2AB23
sender=
recipient=falko.timme@*******.de
client_address=81.169.1**.**
client_name=h****.server*********.net
[empty line]

Dies ist die Ausgabe, wir dürfen immer noch E-Mails von h****forge.com aus senden:

action=PREPEND Received-SPF: pass (h****forge.com: 81.169.1**.** is authorized to use ‚h****forge.com‘ in ‚helo‘ identity (mechanism ‚ip4:81.169.1**.**‘ matched)) receiver=server1.example.com; identity=helo; helo=h****forge.com; client-ip=81.169.1**.**

Lass uns den gleichen Test mit einem ungültigen Client durchführen:

request=smtpd_access_policy
protocol_state=RCPT
protocol_name=SMTP
helo_name=h****forge.com
queue_id=8045F2AB23
sender=
recipient=falko.timme@*******.de
client_address=1.2.3.4
client_name=www.example.com
[empty line]

Wie erwartet ist dies die Ausgabe:

action=PREPEND Received-SPF: softfail (h****forge.com: Sender is not authorized by default to use ‚h****forge.com‘ in ‚helo‘ identity, however domain is not currently prepared for false failures (mechanism ‚~all‘ matched)) receiver=server1.example.com; identity=helo; helo=h****forge.com; client-ip=1.2.3.4

Um die policyd-spf-perl Kommandozeile zu verlassen, tippen wir

[CTRL+C]

5 Links

Das könnte dich auch interessieren …