Inhaltsverzeichnis
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 [http://www.open-spf.org/|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.
Beschreibung | Externer Link |
---|---|
Homepage | http://www.open-spf.org/ |
Dokumentation | http://www.open-spf.org/SPF_Record_Syntax |
FAQ | http://www.open-spf.org/FAQ |
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:
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: