Benutzer-Werkzeuge

Webseiten-Werkzeuge


tachtler:postfix_centos_7_-_spf_anbinden_spf-milter

Postfix CentOS 7 - SPF anbinden (spf-milter)

Mit Hilfe von SPF kann definiert werden, welche Mailserver für welche Domains e-Mails verschicken darf, oder eben nicht darf. Dies soll das Fälschen von Absender-Angaben erschwert werden. Dabei wird via SPF festgelegt, welcher MTA (Mail Transport Agent) z.B. Postfix ausgehend für den Versandt von e-Mails einer Domain zugelassen ist.

Mit SPF soll hauptsächlich das fälschen von e-Mail Absender Adressen verhindert werden.

Probleme tauchen mit unter bei Mailumleitungen, Mailinglisten und/oder Webformularen bzw. elektronischen Grusskarten auf. Auch wird bei sehr konservativen SPF-Definition die Möglichkeit verhindert, e-Mails mit der eigenen Absender e-Mail-Adresse über einen dritten Server zu versenden. Es wäre also nur möglich e-Mails über den Mail-Server zu versenden, auf dem auch das Postfach liegt!

Technisch gesehen wird bei SPF ein TXT-Record im DNS in der Zonendatei der betreffenden Domain eingetragen. Hier wird definiert, welche SMTP-Server berechtigt sind, Nachrichten für diese Domain zu verschicken. Mailserver können dann bei der Annahme einer e-Mail abfragen, ob der sendende Mailserver überhaupt berechtigt ist, diese Nachricht zuzustellen.

Ab hier werden zur Ausführung nachfolgender Befehle root-Rechte benötigt. Um der Benutzer root zu werden, melden Sie sich bitte als root-Benutzer am System an, oder wechseln mit nachfolgendem Befehl zum Benutzer root:

$ su -
Password:

Herunterladen

Nachfolgend sollen zwei Drittanbieter-Repositories, das erste wird von dem von mir sehr geschätzten Michael Nausch betrieben und ist eine sichere und verlässliche Quelle für rpm-Pakete, und kann wie unter nachfolgendem internen Link dargestellt, eingebunden werden:

Das zweite benötigte Drittanbieter-Repository ist das von EPEL, welches wie unter nachfolgendem internen Link dargestellt, eingebunden werden kann:

Installation

Nachfolgendes rpm-Paket ist zur Installation erforderlich:

Zusätzlich wird nachfolgendes rpm-Paket als Abhängigkeit zusätzlich installiert:

  • libspf2 - ist im epel-Repository des Drittanbieters EPEL enthalten

Die Installation von smf-spf, kann durch ausführen des nachfolgenden Befehls durchgeführt werden:

# yum install smf-spf
Loaded plugins: changelog, priorities
149 packages excluded due to repository priority protections
Resolving Dependencies
--> Running transaction check
---> Package smf-spf.x86_64 0:2.0.4-1.el7.centos will be installed
--> Processing Dependency: libspf2.so.2()(64bit) for package: smf-spf-2.0.4-1.el7.centos.x86_64
--> Running transaction check
---> Package libspf2.x86_64 0:1.2.10-5.20150405gitd57d79fd.el7 will be installed
--> Finished Dependency Resolution

Changes in packages about to be updated:


Dependencies Resolved

===============================================================================
 Package  Arch    Version                            Repository           Size
===============================================================================
Installing:
 smf-spf  x86_64  2.0.4-1.el7.centos                 mailserver.guru-os   17 k
Installing for dependencies:
 libspf2  x86_64  1.2.10-5.20150405gitd57d79fd.el7   epel                 66 k

Transaction Summary
===============================================================================
Install  1 Package (+1 Dependent package)

Total download size: 83 k
Installed size: 180 k
Is this ok [y/d/N]: y
Downloading packages:
(1/2): libspf2-1.2.10-5.20150405gitd57d79fd.el7.x86_64.rp |  66 kB   00:00     
(2/2): smf-spf-2.0.4-1.el7.centos.x86_64.rpm              |  17 kB   00:00     
-------------------------------------------------------------------------------
Total                                             233 kB/s |  83 kB  00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : libspf2-1.2.10-5.20150405gitd57d79fd.el7.x86_64             1/2 
  Installing : smf-spf-2.0.4-1.el7.centos.x86_64                           2/2 
  Verifying  : smf-spf-2.0.4-1.el7.centos.x86_64                           1/2 
  Verifying  : libspf2-1.2.10-5.20150405gitd57d79fd.el7.x86_64             2/2 

Installed:
  smf-spf.x86_64 0:2.0.4-1.el7.centos                                          

Dependency Installed:
  libspf2.x86_64 0:1.2.10-5.20150405gitd57d79fd.el7                            

Complete!

Die Installation von smf-spf, kann durch ausführen des nachfolgenden Befehls durchgeführt werden:

# rpm -qil smf-spf
Name        : smf-spf
Version     : 2.0.4
Release     : 1.el7.centos
Architecture: x86_64
Install Date: Sat 17 Oct 2015 04:43:08 PM CEST
Group       : System Environment/Daemons
Size        : 26876
License     : GPLv2+
Signature   : RSA/SHA1, Wed 17 Dec 2014 02:00:24 PM CET, Key ID 60ecfb9e8195aea0
Source RPM  : smf-spf-2.0.4-1.el7.centos.src.rpm
Build Date  : Wed 17 Dec 2014 02:00:16 PM CET
Build Host  : vml000200.dmz.nausch.org
Relocations : (not relocatable)
Packager    : Django <django@mailserver.guru>
Vendor      : django
URL         : http://smfs.sourceforge.net/smf-spf.html
Summary     : Mail filter for Sender Policy Framework verification
Description :
smf-spf is a lightweight, fast and reliable Sendmail milter that implements the
Sender Policy Framework technology with the help of the libspf2 library. It
checks SPF records to make sure that e-mail messages are authorized by the
domain that it is coming from. It's an alternative for the spfmilter,
spf-milter, and milter-spiff milters.
/etc/mail/smfs
/etc/mail/smfs/smf-spf.conf
/run/smfs
/run/smfs/smf-spf.sock
/usr/lib/systemd/system/smf-spf.service
/usr/lib/tmpfiles.d/smfs.conf
/usr/sbin/smf-spf

iptables Regel

Damit der SPF auch über den Postfix - spf-milter erreichbar ist und nicht das Empfangen der IP-Paket vom Paketfilter iptables blockiert wird, muss nachfolgende Regel zum iptables-Regelwerk hinzugefügt werden.

Um die aktuellen iptables-Regeln erweitern zu können, sollten diese erst einmal aufgelistet werden, was mit nachfolgendem Befehl durchgeführt werden kann:

# iptables -L -nv --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
4        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22  
5        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Nachfolgender Befehl, fügt folgende iptables-Regel dem iptables-Regelwerk nach der Position 4 hinzu, ohne das der Paketfilter angehalten werden muss:

  • -A INPUT -p tcp --dport 10011 -j ACCEPT

und hier der Befehl:

# iptables -I INPUT 5 -p tcp --dport 10011 -j ACCEPT

Ein erneute Abfrage des iptables-Regelwerts, sollte dann nachfolgend dargestellte Ausgabe ergeben, was mit folgendem Befehl durchgeführt werden kann:

# iptables -L -nv --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
3        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
4        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5        0     0 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:10011 state NEW
6        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Die neue Zeile ist an Position 5 (INPUT) zu sehen, hier nachfolgend zur Verdeutlichung noch einmal dargestellt (nur relevanter Ausschnitt):

...
5        0     0 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:10011 state NEW
...

Um diese iptables-Regel dauerhaft, auch nach einem Neustart des Server, weiterhin im iptables-Regelwerk zu speichern, muss nachfolgend dargestellter Befehl abschließend noch ausgeführt werden:

# /usr/sbin/iptables-save > /etc/sysconfig/iptables 

Konfiguration: SPF

/etc/mail/smfs/smf-spf.conf

Standardmäßig wird nach der Installation von SPF - spf-milter in nachfolgendem Verzeichnis mit nachfolgendem Namen die Konfigurationsdatei für den SPF - spf-milter hinterlegt:

  • /etc/mail/smfs/smf-spf.conf

Nachfolgende Änderungen sind an der Konfigurationsdatei /etc/mail/smfs/smf-spf.conf durchzuführen:

(Komplette Konfigurationsdatei)

# /etc/mail/smfs/smf-spf.conf
#
# smf-spf configuration file v2.0.4 (it's read at start)
#
 
# Whitelist by a sender IP address
#
# The syntax is an IP address followed by a slash
# and a CIDR netmask (if the netmask is omitted, /32 is assumed)
#
# Tachtler
WhitelistIP	127.0.0.0/8
# default: WhitelistIP	10.0.0.0/8
# default: WhitelistIP	172.16.0.0/12
# default: WhitelistIP	192.168.0.0/16
WhitelistIP	192.168.0.0/24
WhitelistIP	192.168.1.0/24
WhitelistIP	192.168.2.0/24
 
# Whitelist by a sender PTR record (reverse DNS record)
#
# Performs a case insensitive substring match
#
#WhitelistPTR	.friendlydomain.tld
#WhitelistPTR	friendlyhost.friendlydomain.tld
 
# Whitelist by an envelope sender e-Mail address
#
# Performs a case insensitive substring match
#
#WhitelistFrom	friend@
#WhitelistFrom	@friendlydomain.tld
#WhitelistFrom	friend@friendlydomain.tld
 
# Whitelist by an envelope recipient e-Mail address
#
# Performs a case insensitive substring match
#
#WhitelistTo	postmaster@
#WhitelistTo	@yourspamloverdomain.tld
#WhitelistTo	spamlover@yourdomain.tld
 
# Refuse e-Mail messages at SPF Fail results (RFC-4408)
#
# Default: on
#
# Tachtler
# default: RefuseFail	off	# (on|off)
 
# Subject tagging of e-Mail messages at SPF SoftFail
# and Fail (if RefuseFail set to off) results
#
# Default: on
#
#TagSubject	on	# (on|off)
 
# Subject tagging string
#
# Default: [SPF:fail]
#
#Tag		[SPF:fail]
 
# Build a standard Received-SPF: header
#
# Default: on
#
#AddHeader	on	# (on|off)
 
# Quarantine of e-Mail messages at SPF SoftFail
# and Fail (if RefuseFail set to off) results
#
# Default: off
#
#Quarantine	off	# (on|off)
 
# Quarantine mailbox
#
# Default: postmaster
#
#QuarantineBox	postmaster
#QuarantineBox	spambox@yourdomain.tld
 
# In-memory cache engine TTL settings
#
# The time is given in seconds, except if a unit is given:
# m for minutes, h for hours, and d for days
# Specify zero to disable caching
#
# Default: 1h
#
#TTL		1h
 
# Run as a selected user (smf-spf must be started by root)
#
# Default: smfs
#
#User		smfs
 
# Socket used to communicate with Sendmail daemon
#
# Default: unix:/var/run/smfs/smf-spf.sock
#
# Tachtler
# default: #Socket		unix:/var/run/smfs/smf-spf.sock
Socket		inet:10011@192.168.0.70
 
# Facility for logging via Syslog daemon
#
# Default: mail
#
#Syslog		mail	# (daemon|mail|local0...local7)

Nachfolgende Änderungen sollten vorgenommen werden:

  • WhitelistIP	127.0.0.0/8
    # default: WhitelistIP	10.0.0.0/8
    # default: WhitelistIP	172.16.0.0/12
    # default: WhitelistIP	192.168.0.0/16
    WhitelistIP	192.168.0.0/24
    WhitelistIP	192.168.1.0/24
    WhitelistIP	192.168.2.0/24

Definition von IP-Adressen/Netzen, welche in einer „whitelist“ von der Prüfung ausgenommen werden sollen.

  • # default: RefuseFail	off	# (on|off)

:!: HINWEIS - Auskommentieren der Einstellung, das e-Mails die die Prüfung nicht bestehen, trotzdem angenommen werden.
Die eigentliche Standardeinstellung ist die Ablehnung, was auch wieder aktiviert werden soll !!!

  • Socket		inet:10011@192.168.0.70

Socket über den mit dem SPF - spf-milter über die IP-Adresse: 192.168.0.70 und den Port: 10011 kommuniziert werden kann.

SPF Dienst/Daemon-Start einrichten

Um den SPF der als Dienst/Deamon als Hintergrundprozess läuft, auch nach einem Neustart des Servers zur Verfügung zu haben, soll der Dienst/Daemon mit dem Server mit gestartet werden, was mit nachfolgendem Befehl realisiert werden kann:

# systemctl enable smf-spf
ln -s '/usr/lib/systemd/system/smf-spf.service' '/etc/systemd/system/multi-user.target.wants/smf-spf.service'

Eine Überprüfung, ob beim Neustart des Server der smf-spf-Dienst/Deamon wirklich mit gestartet wird, kann mit nachfolgendem Befehl erfolgen und sollte eine Anzeige, wie ebenfalls nachfolgend dargestellt ausgeben:

# systemctl list-unit-files --type=service | grep -e smf-spf
smf-spf.service                        enabled
bzw.
# systemctl is-enabled smf-spf
enabled

Erster Start SPF

Um den SPF zu starten kann nachfolgender Befehl angewandt werden:

# systemctl start smf-spf

Eine Überprüfung ob der Start des SPF erfolgreich war kann mit nachfolgendem Befehl durchgeführt werden, welcher eine Ausgabe in etwa wie nachfolgende erzeugen sollte:

# systemctl status smf-spf
smf-spf.service - Sender Policy Framework milter
   Loaded: loaded (/usr/lib/systemd/system/smf-spf.service; enabled)
   Active: active (running) since Sat 2015-10-17 17:23:24 CEST; 8s ago
  Process: 1365 ExecStart=/usr/sbin/smf-spf (code=exited, status=0/SUCCESS)
 Main PID: 1366 (smf-spf)
   CGroup: /system.slice/smf-spf.service
           └─1366 /usr/sbin/smf-spf

Oct 17 17:23:24 server70.idmz.tachtler.net systemd[1]: Started Sender Policy...
Hint: Some lines were ellipsized, use -l to show in full.

bzw. mit nachfolgendem Befehl, ob der Dienst/Daemon in der Prozessliste erscheint:

# ps aux | grep smf-spf
smfs      1366  0.0  0.0  25860   668 ?        Ssl  17:23   0:00 /usr/sbin/smf-spf
root      1370  0.0  0.0 112640   928 pts/0    S+   17:23   0:00 grep --color=auto smf-spf

Eine weitere Möglichkeit ist die Überprüfung des journal, was mit nachfolgendem Befehl durchgeführt werden kann:

Oct 17 17:23:24 server70.idmz.tachtler.net systemd[1]: Starting Sender Policy F
-- Subject: Unit smf-spf.service has begun with start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit smf-spf.service has begun starting up.
Oct 17 17:23:24 server70.idmz.tachtler.net smf-spf[1365]: starting smf-spf 2.0.
Oct 17 17:23:24 server70.idmz.tachtler.net smf-spf[1365]: running as uid: 398, 
Oct 17 17:23:24 server70.idmz.tachtler.net systemd[1]: Started Sender Policy Fr
-- Subject: Unit smf-spf.service has finished start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit smf-spf.service has finished starting up.
-- 
-- The start-up result is done.

Konfiguration: spf-milter

Nachfolgende Änderungen werden an den Konfigurationsdateien

  • /etc/postfix/main.cf
  • /etc/postfix/master.cf

durchgeführt, um eine Anbindung des Postfix an den SPF zu realisieren.

Dabei soll die Anbindung von Postfix an den SPF mit dem Verfahren

  • spf-milter erfolgen.

/etc/postfix/main.cf

Hier die Änderungen an der Konfigurationsdatei /etc/postfix/main.cf

(Nur relevanter Ausschnitt):

...
# SPF (spf-milter)
spf_milter = inet:192.168.0.70:10011
...

/etc/postfix/master.cf

Hier die Änderungen an der Konfigurationsdatei /etc/postfix/master.cf

(Nur relevanter Ausschnitt):

#
# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: "man 5 master" or
# on-line: http://www.postfix.org/master.5.html).
#
# Do not forget to execute "postfix reload" after editing this file.
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
# Tachtler - disabled - 
#smtp      inet  n       -       n       -       -       smtpd
# Tachtler - new - 
# Incoming traffic from untrust networks, with postscreen.
192.168.1.60:2525      inet  n       -       n       -       1       postscreen
# Tachtler - enabled - 
# Incoming traffic passed from untrust networks, with postscreen.
smtpd     pass  -       -       n       -       -       smtpd
  -o smtpd_milters=${spf_milter}
...

Nachfolgend Erklärungen zu den WICHTIGSTEN Konfigurationen:

  •  -o smtpd_milters=${spf_milter}

Die Option sorgt dafür, dass dem Parameter smtpd_milter der Inhalt des Parameters spf_milter übergeben wird. Falls mehrere MILTER zum Einsatz kommen, wird hier die Reihenfolge festgelegt, in der diese aufgerufen werden!

Neustart

Falls vorstehende Änderungen (natürlich an die jeweiligen Bedürfnisse angepasst) durchgeführt wurden, muss ein Neustart von Postfix durchgeführt werden.

Danach kann der postfix-Server mit nachfolgendem Befehle neu gestartet werden:

# systemctl restart postfix

Mit nachfolgendem Befehl kann der Status des abgefragt werden:

# systemctl status postfix
postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled)
   Active: active (running) since Thu 2015-10-15 11:11:26 CEST; 7s ago
  Process: 1128 ExecStop=/usr/sbin/postfix stop (code=exited, status=0/SUCCESS)
  Process: 1144 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
  Process: 1141 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
  Process: 1138 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)
 Main PID: 1216 (master)
   CGroup: /system.slice/postfix.service
           ├─1216 /usr/libexec/postfix/master -w
           ├─1217 pickup -l -t unix -u -o content_filter=lmtp:[192.168.0.70]...
           └─1218 qmgr -l -t unix -u

Oct 15 11:11:26 server60.idmz.tachtler.net systemd[1]: Starting Postfix Mail...
Oct 15 11:11:26 server60.idmz.tachtler.net postfix/postfix-script[1214]: sta...
Oct 15 11:11:26 server60.idmz.tachtler.net postfix/master[1216]: daemon star...
Oct 15 11:11:26 server60.idmz.tachtler.net systemd[1]: Started Postfix Mail ...
Hint: Some lines were ellipsized, use -l to show in full.

Test

Nachfolgend soll ein Test darin bestehen, dass eine e-Mail von einem externen Server an Postfix gesendet wird, und dieser dann den SPF-Record des absendenden e-Mail-Servers prüft.

Wichtig sind zwei Einträge, in

  • den Header-Zeilen der eingehenden e-Mail
  • die LOG-Einträge im Server, auf dem SPF - spf-milter läuft:

Überprüfung: Header-Zeilen

Nachfolgender Eintrag sollte in den Header-Zeilen einer eingehenden e-Mail zu finden sein, um das Ergebnis der SPF - spf-milter Überprüfung zu zeigen:

Authentication-Results: mx1.tachtler.net; spf=pass smtp.mailfrom=<michael@nausch.org> smtp.helo=mx01.nausch.org
* Das Ergbenis kann hier pass, fail und none sein.

Überprüfung: /var/log/maillog

Nachfolgender Eintrag sollte in den LOG-Einträgen des Servers auf dem der SPF - spf-milter läuft bei einer eingehenden e-Mail zu finden sein, um das Ergebnis der SPF - spf-milter Überprüfung zu dokumentieren:

Oct 19 06:56:56 server70 smf-spf[2157]: SPF pass: ip=217.91.103.190, fqdn=mx01.nausch.org, helo=mx01.nausch.org, from=<michael@nausch.org>
* Das Ergbenis kann hier pass, fail und none sein.

Test Werkzeuge

Nachfolgende externe Links führen zu verschiedenen Test Werkzeugen:

Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
tachtler/postfix_centos_7_-_spf_anbinden_spf-milter.txt · Zuletzt geändert: 2015/10/22 12:38 von klaus