Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung Nächste ÜberarbeitungBeide Seiten der Revision | ||
centos:mail_c7:spam_10 [22.11.2022 14:23. ] – [Definition unseres SPF-Records] django | centos:mail_c7:spam_10 [23.11.2022 15:19. ] – django | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | /* | ||
+ | ====== SPF - Sender Policy Framework unter CentOS 7.x ====== | ||
+ | {{: | ||
+ | Mit Hilfe von SPF((**S**ender **P**olicy **F**rameworks)) kann definiert werden, welche Mailserver für welche Domains eMails verschickt werden (können), oder nicht, oder anders ausgedrückt, | ||
+ | |||
+ | Dieses here Ziel wirft bei genauerer Betrachtung viele Fragen auf und erzeugt bei manchen Mailserver-Betreibern nicht gerade viel Begeisterungsstürme. Probleme tauchen mit unter bei Mailumleitungen, | ||
+ | |||
+ | Beim **SPF** wird ein TXT-Record in der Zonendatei im DNS der betreffenden (Mail)Domain eingetragen. Dort wird definiert, welche SMTP-Server berechtigt sind, Nachrichten der (Mail)Domain zu verschicken. Mailserver können dann bei der Annahme der eMails abfragen, ob der sendende Mailserver überhaupt berechtigt ist, diese Nachricht zu verschicken. So soll bzw. kann mit Hilfe von SPF versucht werden, Absenderadressfälschungen - eine Form des eMail-Identitätsbetrugs - zu verhindern. SPAM kann aber mit Hilfe des Sender Policy Framework nicht direkt bekämpft werden! | ||
+ | |||
+ | Nachfolgende Skizze zeigt exemplarisch auf, wo genau SPF beim Verarbeiten einer eMail beim Kommunikationsaufbau und -ablauf zweier **MTA**((**M**ail**Transport**A**gent)) das **SPF** zum Tragen kommt. Sobald eine eMail von einem Mailserver empfangen wird, benutzt dieses das SPF um festzustellen, | ||
+ | |||
+ | <uml> | ||
+ | title Mailversand einer eMail\n | ||
+ | |||
+ | participant " | ||
+ | participant " | ||
+ | participant " | ||
+ | |||
+ | links -> mitte : connect von mx01.nausch.org zu mx1.tachtler.net | ||
+ | note left : \n Verbindungsaufbau \n vom Quell- zum \n Zielserver \n | ||
+ | links <-- mitte : . 220 mx1.tachtler.net ESMTP Postfix | ||
+ | links --> mitte : HELO mx01.nausch.org | ||
+ | links <-- mitte : . 250 mx1.tachtler.net | ||
+ | links --> mitte : MAIL FROM:< | ||
+ | |||
+ | mitte -> rechts : host -t TXT nausch.org | ||
+ | note right : \n Abfrage der \n SPF-Records \n | ||
+ | mitte <- rechts : nausch.org descriptive text " | ||
+ | note left : \n Der Mailserver mit der \n IP 217.91.103.190 ist berechtigt \n eMails der Mail-Domain \n nausch.org zu versenden \n | ||
+ | links <-- mitte : . 250 2.1.0 Ok | ||
+ | |||
+ | links --> mitte : RCPT TO:< | ||
+ | links <-- mitte : . 250 2.1.0 Ok | ||
+ | |||
+ | links --> mitte : Übermittlung der Nachricht | ||
+ | links <-- mitte : 250 2.0.0 Ok: queued as 5950581 | ||
+ | note left : \n Beenden der Verbindung \n | ||
+ | |||
+ | </ | ||
+ | |||
+ | Weitere Informationen rund um SPF findet man im übrigen auf der [[http:// | ||
+ | |||
+ | ===== Definition unseres SPF-Records ===== | ||
+ | Aus den eingangs genannten Gründen sollte eine Sender Policy Framework Definition so gewählt werden, das auch weiterhin Nachrichten umgeleitet, Mailinglisten oder bei Bedarf Webformulare genutzt werden können. | ||
+ | |||
+ | ==== Format der SPF-Richtlinie ==== | ||
+ | Ein SPF-Record beinhaltet mehrere durch Leerzeichen getrennte Angaben, die jeweils der Reihe nach von links nach rechts ausgewertet werden. Eine solche Angabe kann ein Modifikator wie z.B. **'' | ||
+ | |||
+ | Der erste Wert gibt an, welche SPF-Version genutzt wird, aktuell SPF-Version " | ||
+ | |||
+ | Folgendes Format wird hierbei verwendet: | ||
+ | [Präfix][Mechanismus][: | ||
+ | |||
+ | === Präfix === | ||
+ | Das Präfix bestimmt das SPF-Validierungsergebnis, | ||
+ | * **+** : **positiv** Die nachfolgende IP-Adresse ist als legitimer Sender definiert. Wird jeweils __kein__ Qualifer angegeben, wird automatisch der Wert **+** herangezogen (Defaulteinstellung). | ||
+ | * **-** : **negativ** Die nachfolgende IP-Adresse definiert ein nicht autorisiertes Sendesystem. Die Direktive Fail definiert nicht autorisierte Sender. | ||
+ | * **?** : **neutral** Über die Rechtmässigkeit des Sendesystems kann nichts ausgesagt werden; Der Sender muss daher akzeptiert werden. | ||
+ | * **~** : **soft-fail** Die nachfolgende IP-Adresse definiert ein nicht autorisiertes Sendesystem. Das Empfangssystem soll jedoch die Annahme der Nachricht dennoch annehmen (Test-Qualifier). | ||
+ | |||
+ | === Mechanismus === | ||
+ | Der [[https:// | ||
+ | * **'' | ||
+ | * **'' | ||
+ | * **'' | ||
+ | * **'' | ||
+ | * **'' | ||
+ | * **'' | ||
+ | * **'' | ||
+ | * **'' | ||
+ | |||
+ | ==== Beispiele ==== | ||
+ | === einfach " | ||
+ | Im ersten Konfigurationsbeispiel, | ||
+ | | ||
+ | Wir tragen also bei unserem zuständigen DNS im Zonenfile entsprechend die richtigen Daten ein. | ||
+ | | ||
+ | |||
+ | Ändert sich die Anzahl der MX-Records bei unserer Domäne werden automatisch die zutreffenden Hosts bei einer SPF-Anfage honoriert, ohne dass wir extra den SPF-TXT-Record anfassen müssen. Sehr wohl ist jedoch anzumerken, dass für die vollständige Ermittlung der sendeberechtigten Systeme zusätzliche DNS-Abfragen notwendig werden, was mit unter zu Problemen führen kann, sofer die max. Anzahl von **10 DNS-Abfragen** überschrittenwerden wird. Wie wir damit besser umgehen und diese Herausforderung meistern können, betrachten wir im Abschnitt XXXYYYZZZ dann noch extra genauer! | ||
+ | |||
+ | === Erweiterungen um weitere Mechanismen === | ||
+ | Im zweiten Beispiel nehmen wir an, dass neben dem MX der Domäne auch noch eine Webanwendung **'' | ||
+ | | ||
+ | |||
+ | Da wir statt der IP-Adresse den Namen **cloud.nausch.org** angegeben haben, wird auch hier eine weitere DNS-Abfrage notwendig werden, wenn der vollständige SPF-Definition ermittelt werden soll. Alternativ kann man hier natürlich mit den **'' | ||
+ | | ||
+ | |||
+ | Zu bedenken ist hier natürlich, dass keinenfals die maximale Länge von **255 Zeichen** eines TXT-Records keinenfalls überschritten werden darf! | ||
+ | |||
+ | |||
+ | ==== zusätzliche Hinweise ==== | ||
+ | <WRAP center round tip 100%> | ||
+ | **Hinweise: | ||
+ | |||
+ | Will man neben dem **SPF**-Record in Form eines TXT-Records auch noch einem **google-site-verification** TXT-Record anlegen, dann kann man nicht zwei TXT-Records für die Domain im DNS hinterlegen. Um dennoch beide Funktionenn nutzen zu können, trägt man beide Werte in einem TXT-Record ein. So z.B. < | ||
+ | </ | ||
+ | |||
+ | ==== Testing-Tools ==== | ||
+ | Zum Testen auf Validität unseres SPF-Records stehen uns im WEB unter anderem folgende Dienste (SPF Record Testing Tools) zur Verfügung. Die Ergebnisse können helfen auf Mängel in den Records hinzuweisen, | ||
+ | * **https:// | ||
+ | * **https:// | ||
+ | * **https:// | ||
+ | * **https:// | ||
+ | | ||
+ | |||
+ | |||
+ | |||
+ | /* | ||
+ | |||
+ | nausch@ecmmai04: | ||
+ | " | ||
+ | nausch@ecmmai04: | ||
+ | nausch@ecmmai04: | ||
+ | " | ||
+ | nausch@ecmmai04: | ||
+ | " | ||
+ | |||
+ | |||
+ | */ | ||
+ | |||
+ | ===== SPF-Bewertung bei der Mailannahme ===== | ||
+ | Neben der Befragung von [[centos: | ||
+ | |||
+ | <WRAP round tip> \\ Auf den ersten Blick erscheint der Postfix Poliyd-Daemon **pypolicyd-spf** aus dem [[centos: | ||
+ | |||
+ | Möchte man aber hingegen später **[[centos: | ||
+ | |||
+ | </ | ||
+ | |||
+ | ==== Installation ==== | ||
+ | Die einfachste und schnellste Variante bei der Installation ist die aus dem Repository **[[centos: | ||
+ | # yum install smf-spf | ||
+ | |||
+ | Will oder kann man nicht auf das Repository **[[centos: | ||
+ | # yum localinstall http:// | ||
+ | http:// | ||
+ | |||
+ | Was das RPM alle mitbrachte zeigt ein Blick in die RPM-Datenbank. | ||
+ | # rpm -qil smf-spf | ||
+ | < | ||
+ | Version | ||
+ | Release | ||
+ | Architecture: | ||
+ | Install Date: Wed 17 Dec 2014 02:01:33 PM CET | ||
+ | Group : System Environment/ | ||
+ | Size : 26876 | ||
+ | License | ||
+ | Signature | ||
+ | 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 | ||
+ | Vendor | ||
+ | URL : http:// | ||
+ | Summary | ||
+ | Description : | ||
+ | smf-spf is a lightweight, | ||
+ | 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. | ||
+ | / | ||
+ | / | ||
+ | /run/smfs | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | ==== Konfiguration ==== | ||
+ | Die Konfiguration des **smf-spf**-Daemons gestaltet sich vergleichsweise einfach und erfolgt lediglich mit Hilfe Der Datei // | ||
+ | |||
+ | Mit unserem Editor der Wahl, z.B. **vim** bearbeiten wir diese Konfigurationsdatei. | ||
+ | # vim / | ||
+ | |||
+ | <file bash / | ||
+ | # | ||
+ | # smf-spf configuration file v2.0.2 (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) | ||
+ | # | ||
+ | WhitelistIP 127.0.0.0/ | ||
+ | WhitelistIP 10.0.0.0/ | ||
+ | # Django : 2014-12-17 | ||
+ | # nicht benutzte (private) Netzbereiche entfernt | ||
+ | # WhitelistIP 172.16.0.0/ | ||
+ | # WhitelistIP 192.168.0.0/ | ||
+ | |||
+ | # Whitelist by a sender PTR record (reverse DNS record) | ||
+ | # | ||
+ | # Performs a case insensitive substring match | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | |||
+ | # Whitelist by an envelope sender e-Mail address | ||
+ | # | ||
+ | # Performs a case insensitive substring match | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | |||
+ | # Whitelist by an envelope recipient e-Mail address | ||
+ | # | ||
+ | # Performs a case insensitive substring match | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | |||
+ | # Refuse e-Mail messages at SPF Fail results (RFC-4408) | ||
+ | # | ||
+ | # Default: on | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | |||
+ | |||
+ | # Subject tagging of e-Mail messages at SPF SoftFail | ||
+ | # and Fail (if RefuseFail set to off) results | ||
+ | # | ||
+ | # Default: on | ||
+ | # | ||
+ | # | ||
+ | |||
+ | # Subject tagging string | ||
+ | # | ||
+ | # Default: [SPF:fail] | ||
+ | # | ||
+ | # | ||
+ | |||
+ | # Build a standard Received-SPF: | ||
+ | # | ||
+ | # Default: on | ||
+ | # | ||
+ | # | ||
+ | |||
+ | # Quarantine of e-Mail messages at SPF SoftFail | ||
+ | # and Fail (if RefuseFail set to off) results | ||
+ | # | ||
+ | # Default: off | ||
+ | # | ||
+ | # | ||
+ | |||
+ | # Quarantine mailbox | ||
+ | # | ||
+ | # Default: postmaster | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | |||
+ | # 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:/ | ||
+ | # | ||
+ | # | ||
+ | # Django : 2014-12-17 | ||
+ | Socket inet: | ||
+ | |||
+ | # Facility for logging via Syslog daemon | ||
+ | # | ||
+ | # Default: mail | ||
+ | # | ||
+ | # | ||
+ | |||
+ | </ | ||
+ | |||
+ | In der Konfigurationsdatei **main.cf** unseres Postfix-Mailserver definieren wir uns nun eine eigene Variable, die wir dann in der Datei // | ||
+ | # vim / | ||
+ | <file bash / | ||
+ | |||
+ | ################################################################################ | ||
+ | ## MILTER | ||
+ | # Django : 2014-11-18 | ||
+ | # DMARC Test | ||
+ | spf_milter | ||
+ | # | ||
+ | # | ||
+ | amavisd_milter | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | In der Konfigurationsdatei // | ||
+ | # vim / | ||
+ | |||
+ | < | ||
+ | |||
+ | smtp inet n | ||
+ | smtpd | ||
+ | -o smtpd_sasl_auth_enable=no | ||
+ | -o smtpd_milters=${spf_milter}, | ||
+ | dnsblog | ||
+ | tlsproxy | ||
+ | </ | ||
+ | |||
+ | ==== Programmstart ==== | ||
+ | Das Starten des Daemon erfolgt über folgenden Aufruf. | ||
+ | # systemctl start smf-spf | ||
+ | |||
+ | Den erfolgreichen Start bzw. den Status des **smf-spf**-Daemon können wir bei Bedarf mit folgendem Aufruf abfragen. | ||
+ | # systemctl status smf-spf | ||
+ | |||
+ | < | ||
+ | | ||
+ | | ||
+ | Process: 19140 ExecStart=/ | ||
+ | Main PID: 19141 (smf-spf) | ||
+ | | ||
+ | | ||
+ | |||
+ | Dec 17 14:05:12 vml000087.dmz.nausch.org systemd[1]: Started Sender Policy Framework milter | ||
+ | </ | ||
+ | |||
+ | |||
+ | Im Maillog wird der Start des Daemon entsprechend dokumentiert. | ||
+ | # less / | ||
+ | |||
+ | Dec 17 14:05:12 vml000087 smf-spf[19140]: | ||
+ | Dec 17 14:05:12 vml000087 smf-spf[19140]: | ||
+ | |||
+ | |||
+ | Mit Hilfe von **netstat** können wir überprüfen, | ||
+ | # netstat -tulpen | ||
+ | |||
+ | < | ||
+ | Proto Recv-Q Send-Q Local Address | ||
+ | tcp 0 0 0.0.0.0: | ||
+ | tcp 0 0 127.0.0.1: | ||
+ | </ | ||
+ | |||
+ | Gleiches können wir natürlich auch mit dem Befehl **lsof** erreichen. | ||
+ | # lsof -i:8890 | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | Damit der Daemon automatisch beim Hochfahren des Servers gestartet wird, nutzen wir folgenden Aufruf. | ||
+ | # systemctl enable smf-spf.service | ||
+ | |||
+ | ln -s '/ | ||
+ | |||
+ | Wollen wir überprüfen ob der Dienst automatisch startet, verwenden wir folgenden Aufruf. | ||
+ | |||
+ | # systemctl is-enabled smf-spf.service | ||
+ | |||
+ | | ||
+ | |||
+ | Die Rückmeldung **enabled** zeigt an, dass der Dienst automatisch startet; ein **disabled** zeigt entsprechend an, dass der Dienst __nicht__ automatisch startet. | ||
+ | |||
+ | ==== Tests und Logging ==== | ||
+ | Zum Testen schicken wir uns von einem fremden Mailserver aus, der einen gültigen SPF-Record vorweisen kann eine eMail an unseren Mailserver und beobachten unser Maillog. | ||
+ | # less / | ||
+ | |||
+ | Mar 26 14:27:32 vml000080 smf-spf[26416]: | ||
+ | |||
+ | Damit nicht bei jeder Anfrage, der SPF-Record beim DNS abgerufen werden muss, cacht der Daemon auch entsprechend den SPF-Record. Wir sehen dann bei der Nutzung dieser gecachten Daten im maillog. | ||
+ | Mar 26 14:40:18 vml000080 smf-spf[26416]: | ||
+ | |||
+ | Natürlich wird ein Fehler beim Überprüfen des SPF-records auch im maillog vermerkt. | ||
+ | Dec 15 14:39:49 vml000080 smf-spf[1501]: | ||
+ | |||
+ | Im Mailheader der empfangenen eMail findet sich dann auch die entsprechenden Einträge: | ||
+ | | ||
+ | |||
+ | Zum Testen des SPF-Records kann man auch auf Dienste im WWW zurückgreifen. So kann man seinen SPF-Record z.B. über den **[[http:// | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Alternativ dazu bietet sich auch kitterman' | ||
+ | ===== SRS - Sender Rewriting Scheme ===== | ||
+ | Zu Beginn dieses Artikels wurde bereits darauf hingewiesen, | ||
+ | |||
+ | ====== Links ====== | ||
+ | * **⇐ [[centos: | ||
+ | * **⇒ [[centos: | ||
+ | * **[[centos: | ||
+ | * **[[wiki: | ||
+ | * **[[http:// | ||
+ | |||
+ | */ | ||
+ | |||
+ | |||
====== SPF - Sender Policy Framework unter CentOS 7.x ====== | ====== SPF - Sender Policy Framework unter CentOS 7.x ====== | ||
{{: | {{: | ||
Zeile 41: | Zeile 446: | ||
Aus den eingangs genannten Gründen sollte eine Sender Policy Framework Definition so gewählt werden, das auch weiterhin Nachrichten umgeleitet, Mailinglisten oder bei Bedarf Webformulare genutzt werden können. | Aus den eingangs genannten Gründen sollte eine Sender Policy Framework Definition so gewählt werden, das auch weiterhin Nachrichten umgeleitet, Mailinglisten oder bei Bedarf Webformulare genutzt werden können. | ||
- | Ein SPF-Record beinhaltet mehrere Angaben, die jeweils von links nach rechts ausgewertet werden. Der erste Wert gibt an, welche SPF-Version genutzt wird, aktuell SPF-Version " | + | Ein SPF-Record beinhaltet mehrere Angaben, die jeweils |
- | * **+** : **positiv** Die nachfolgende IP-Adresse ist als legitimer Sender definiert. Wird kein Qualifer angegeben, wird automatisch der Wert **+** herangezogen (Defaulteinstellung). | + | * **+** : **positiv** Die nachfolgende IP-Adresse ist als legitimer Sender definiert. Wird jeweils __kein__ |
- | * **-** : **negativ** Die nachfolgende IP-Adresse definiert ein nicht autorisiertes Sendesystem | + | * **-** : **negativ** Die nachfolgende IP-Adresse definiert ein nicht autorisiertes Sendesystem. Die Direktive |
- | * **?** : **neutral** Über die Rechtmäßigkeit | + | * **?** : **neutral** Über die Rechtmässigkeit |
* **~** : **soft-fail** Die nachfolgende IP-Adresse definiert ein nicht autorisiertes Sendesystem. Das Empfangssystem soll jedoch die Annahme der Nachricht dennoch annehmen (Test-Qualifier). | * **~** : **soft-fail** Die nachfolgende IP-Adresse definiert ein nicht autorisiertes Sendesystem. Das Empfangssystem soll jedoch die Annahme der Nachricht dennoch annehmen (Test-Qualifier). | ||