IT-Blog von Sebastian van de Meer

Schlagwort: E-Mail (Seite 2 von 2)

SPF-Record erklärt: Schutz vor gefälschten E-Mails

Ich bin in der letzten Zeit immer mal wieder zu meinem SPF Record Beispiel gefragt worden. Ihr wisst schon… Diese beiden:

kernel-error.de.    IN  TXT "v=spf1 ip4:212.23.142.146 ip6:2001:7d8:8001:100::2 ptr:smtp.kernel-error.de mx a:smtp.kernel-error.de -all"
kernel-error.de.    IN  SPF "v=spf1 ip4:212.23.142.146 ip6:2001:7d8:8001:100::2 ptr:smtp.kernel-error.de mx a:smtp.kernel-error.de -all"

Ich versuche das ganze noch einmal etwas aufzuschlüsseln. Die genannten Beispiele sollen die Möglichkeiten zeigen, welche man hat um den SPF-RECORD zu erstellen. Der echte SPF-RECORD sollte aber so schlank wie irgendwie möglich sein. Denn er wird ja theoretisch bei jeder eingehenden E-Mail geprüft. Um so länger er ist und umso mehr geprüft werden muss umso mehr DNS Lookups müssen gemacht werden. Man hat nach RFC nur maximal 10 DNS Abfragen, eine davon hat man schon verbrannt um den eigentlichen SPF RECORD zu holen. Es bleiben also noch 9 🙂 Kommt man über diese 10 Abfragen stirbt alles mit der Meldung:
Results – PermError SPF Permanent Error: Too many DNS lookups

Ist auch OK so, denn wenn der empfangende Mailserver für jede eingehende E-Mail hunderte DNS lookups durchführen muss, tut er ja nichts anders mehr!

Gut, nun zu meinem Beispielrecord.

v=spf1 ==> Ist die Protokollversion
ip4:212.23.142.146 ==> Von dieser IPv4 Adressen dürfen E-Mails kommen.
ip6:2001:7d8:8001:100::2 ==> Von dieser IPv6 Adresse dürfen E-Mails kommen.
ptr:smtp.kernel-error.de ==> Es dürfen E-Mails von den PTR Adresse“n“ des Hosts smtp.kernel-error.de kommen.
mx ==> Es dürfen E-Mails vom MX (Mail Exchange) der Domäne kernel-error.de kommen.
a:smtp.kernel-error.de ==> Es dürfen E-Mails von den IPv4 / IPv6 Adressen des Hosts smtp.kernel-error.de kommen.
==> Kommt die E-Mail von einem -nicht zutreffenden- System gilt der SPF-Test immer als Fehlschlag
all ==> Das ganze passiert immer.

Bei den IP-Adressen kann ebenfalls ein ganzes Netz angegeben werden. Zum Beispiel: 212.23.142.146/24

Beim mx könnte eine andere Domäne oder Subdomäne stehen. Zum Beispiel: mx:smtp.kernel-error.de damit dürften dann E-Mails vom MX der Domäne smtp.kernel-error.de kommen. Natürlich muss es diesen MX auch geben!!! Es geht noch mehr… Zum Beispiel habe ich in einer weiteren Domain von mir nur folgendes stehen:
v=spf1 include:kernel-error.de -all

include:kernel-error.de ==> Gibt an das bitte der SPF RECORD von der Domain kernel-error.de abgefragt und angewandt werden soll. Damit gilt die SPF-Policy der Domain kernel-error.de. Ich muss also nur eine Policy pflegen und lasse alle anderen Domains nur auf diese verweisen 🙂

Die Abfrage würde dann so aussehen:

DNS record(s):
    vandemeer.de. 86400 IN SPF "v=spf1 include:kernel-error.de -all"
    kernel-error.de. 86400 IN SPF "v=spf1 ip4:212.23.142.146 ip6:2001:7d8:8001:100::2 -all"

Würde man nun den oben stehenden RECORD in die Zone kernel-error.de. werfen und ihn aktiv nutzen; Dann wird er funktionieren und absolut gültig sein. Das empfangende E-Mail System wird aber eine ganz Hand voll DNS Abfragen machen müssen um diese SPF Policy zu prüfen. Jetzt beantwortet sich sicher die Frage, warum ich einen anderen SPF-RECORD einsetzte als hier aufgeführt 😀 Denn die aufgeführten RECORDS sind schlicht ein Beispiel und keine Copy & Paste Vorlagen. Ok ok… Ich hätte das direkt genauer beschreiben sollen, hm?

Weniger ist im SPF RECORD also mehr. Man darf sich also überlegen welcher RECORD für seine Domain und sein System gerade der beste ist. Wenn es wechselnde IP Adresse gibt ist sicher ein A/AAAA RECORD besser, wenn sich dieser oft ändert dann ggf. ein MX der Domain oder ein ganzes Netz oder oder…

Mehr zum Lesen:

SPF
SPF-RECORD
SPF-RECORD erkärt

DMARC: Domain-Based Message Authentication, Reporting & Conformance (DMARC) einrichten

Habt ihr eigentlich schon etwas von DMARC (Domain-based Message Authentication, Reporting & Conformance) gehört? Nein… Dann dann haben wir das ja nun aufgeholt 😛

Im Grunde „erweitert“ DMARC die beiden Systeme SPF (Sender Policy Framework) und DKIM (DomainKeys Identified Mail). Warum und wie?!? Nun ja, beide Techniken sind erstmal ~nicht schlecht~. Setzt man sie ausgehend ein, fehlen dem Admin denn noch etwas die „Rückmeldungen“. OK, wenn etwas schief geht, jammern die User. Setzt man sie eingehend ein, würde es hin und wieder helfen wenn der „Absender“ einem etwas genauer sagen würde wie denn nun mit seinen Nachrichten umgegangen werden soll.

Hier springt nun DMAC -in die Bresche- (woher kommt eigentlich diese Redensart?). DMARC wird, wie bei SPF oder DKMI möglich, einfach als TXT-RECORD in der DNS Zone versenkt. Dort finden sich nun Informationen für den empfangenden Mailserver. Zum Beispiel kann angegeben werden wie viel Prozent der eingehenden E-Mails überhaupt gefiltert werden soll (pct), wie hart bei Fehlern im SPF (aspf) und DKIM (adkim) umgegangen werden soll, wie mit E-Mails der Haupt- (p) oder Subdomänen (sp) umgegangen werden soll und was tierisch geil für den Admin des Absendenden E-Mail Systems ist…. An welche E-Mail Adresse ein forensischer (das Wort trifft es, ich finde es aber doof :-P) Bericht (ruf) und wohin eine tägliche Zusammenfassung (rua) gesendet werden soll.

Diese Berichte schlagen normalerweise als E-Mail mit einem komprimierten ZIP-File im Gebäck auf. In diesem ZIP-File steckt dann ein XML-File (*würk* XML.. für die Auswertung denn noch geil). Diese kann man nun auswerten. So kann der Admin des absendenden E-Mail Systems sehen wie gut oder schlecht seine Bemühungen greifen. Er wird schnell über Probleme informiert und kann erkennen ob und wie stark seine Domain gerade -missbraucht- wird.

Eine E-Mail mit ZIP-File lässt sich sehr einfach automatisch auspacken und die XML Datei wird dann von irgendeinem Stück Software gefressen. Heraus kommt ein täglicher Bericht für den Admin. Ok, man könnte es schön bunt machen, dann kann man es auch einer Krawatte zum klicken geben 🙂

Klar muss der Empfänger es unterstützen, sonst bringt das alles nix. Aber jeder Absender, der bereits SPF und DKIM einsetzt, kann seinen DMARC Record schon mal erstellen, hm?

Ich probiere eine kurze Erklärung des DMARC TXT RECORDS an meinem…

_dmarc.kernel-error.de  IN TXT  "v=DMARC1; pct=100; rua=mailto:postmaster@kernel-error.de; ruf=mailto:postmaster@kernel-error.de; adkim=s; aspf=s; p=quarantine; sp=quarantine"

_dmarc. ==> ist halt der „Bezeichner“
kernel-error.de ==> japp die Domain
IN TXT ==> Internet und Text
„“ ==> Dazwischen ist der Text
; ==> Trennt die Optionen
v=DMARC1 ==> Protokollversion, hier also 1
pct=100 ==> 100% meiner vermeintlichen Nachrichten sollen gefiltert werden
rua=mailto:postmaster@kernel-error.de ==> Zusammenfassung geht an postmaster@kernel-error.de
ruf=… ==> der forensiche Bericht geht ebenfalls an den Postmaster
adkim=s ==> DKIM soll nicht relaxed (r) sondern strict (s) ausgewertet werden
aspf=s ==> auch strict
p=quarantine ==> Fehlgeschlagenes der Hauptdomäne sollen als SPAM markiert werden.
sp=quarantine ==> bei der Subdomäne auch.

Noch eine Kleinigkeit. Wenn man mehrere Domains betreut und die Berichte an eine zentrale E-Mail Adresse senden möchte dann muss man noch etwas beachten. Denn sollen die Berichte an eine E-Mail Adresse außerhalb der Domain des DMARC RECORDS gesendet werden, dann muss dieses in der Empfängerdomäne „erlaubt“ werden. Dieses geht über einen gesonderten TXT RECORD.

kernel-error.com._report._dmarc.kernel-error.de TXT "v=DMARC1"

Wenn man diesen RECORD als Beispiel nimmt, würde er in der Zone kernel-error.DE stehen. Damit würden die Berichte aus der Zone kernel-error.COM an die Adresse xyz@kernel-error.de zugestellt werden können.

Noch Fragen? Na dann fragen 😀


UPDATE 12.12.2013

Ok ok… da die Frage jetzt ein paar mal aufgekommen ist, wie ein solcher Report aussieht…. Hier ein Beispiel: >> klick <<

Zur besseren Ansicht kann ich auch hier nur wieder auf dmarcian.com verlinken. Hier gibt es einen XML du Human Konverter 🙂 

Frage beantwortet?

Outlook Autodiscover für IMAP/SMTP: Wie die automatische Kontoeinrichtung funktioniert

Benutzer wollen ihr E-Mail-Postfach einrichten. Sie geben E-Mail-Adresse und Passwort ein — den Rest soll der Client erledigen. Bei Exchange mit Active Directory funktioniert das seit Jahren automatisch. Aber was, wenn der Mailserver Postfix und Dovecot heißt und kein Exchange in Sicht ist?

Microsoft Outlook unterstützt auch für IMAP und SMTP die automatische Konfiguration per Autodiscover. Man muss nur wissen, wo Outlook nachschaut — und dort die richtigen Antworten bereithalten.

Outlook Autodiscover für IMAP und SMTP – automatische Mailkonto-Konfiguration über DNS, HTTPS und XML

Wo Outlook nach der Konfiguration sucht

Outlook arbeitet eine feste Reihenfolge ab. Sobald ein Schritt eine gültige Konfiguration liefert, ist die Einrichtung fertig. Schlägt ein Schritt fehl, geht es zum nächsten:

1. Active Directory (SCP) — Ist der Rechner Domänenmitglied, fragt Outlook per LDAP nach einem Service Connection Point. Dort steht normalerweise die URL des Exchange-Servers. Für reine IMAP-Setups irrelevant.

2. HTTPS auf der E-Mail-Domain — Outlook versucht https://example.org/autodiscover/autodiscover.xml. Funktioniert nur, wenn der Webserver der Domain den Pfad bedient.

3. HTTPS auf autodiscover.<domain> — Outlook versucht https://autodiscover.example.org/autodiscover/autodiscover.xml. Das ist der Weg, den wir nutzen. Ein Webserver unter diesem Hostnamen mit gültigem TLS-Zertifikat — mehr braucht es nicht.

4. HTTP-Redirect — Outlook versucht http://autodiscover.example.org/autodiscover/autodiscover.xml und folgt einem 301/302-Redirect. Weniger sicher, aber ein Fallback.

5. DNS SRV-Record — Outlook fragt _autodiscover._tcp.example.org und folgt dem SRV-Eintrag. Bei einem SRV-Verweis auf eine andere Domain zeigt Outlook eine Sicherheitsabfrage: „Konfiguration von dieser Webseite zulassen?“ Einmalig bestätigen, danach läuft es.

6. Lokale XML-Datei — Outlook sucht auf dem Rechner nach einer vorinstallierten Konfigurationsdatei. Für Firmenumgebungen mit Software-Verteilung relevant.

7. Manueller Assistent — Wenn nichts funktioniert hat, öffnet Outlook den Konfigurationsassistenten. Genau das wollen wir vermeiden.

Was Outlook per POST schickt und erwartet

Outlook macht einen HTTP-POST auf /autodiscover/autodiscover.xml und schickt im Body ein XML mit der E-Mail-Adresse des Benutzers:

<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006">
  <Request>
    <EMailAddress>benutzer@example.org</EMailAddress>
    <AcceptableResponseSchema>
      http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a
    </AcceptableResponseSchema>
  </Request>
</Autodiscover>

Die Antwort enthält IMAP- und SMTP-Einstellungen. Der Clou: Weil Outlook die E-Mail-Adresse im POST mitschickt, kann ein PHP-Script sie auslesen und als <LoginName> in die Antwort einsetzen. Ohne diesen Trick würde Outlook nur den Teil vor dem @ als Benutzernamen verwenden — bei Mailservern, die die volle E-Mail-Adresse als Login erwarten, ein Problem.

Multi-Domain per DNS SRV-Record

Ein Autodiscover-Webserver reicht für beliebig viele Maildomains. Jede zusätzliche Domain braucht nur einen SRV-Record im DNS:

_autodiscover._tcp.example.org.  IN SRV 0 0 443 autodiscover.kernel-error.de.

Outlook folgt dem SRV-Record, zeigt einmalig die Sicherheitsabfrage, und hat danach die komplette Konfiguration. Das PHP-Script auf dem Zielserver beantwortet Anfragen für alle Domains — die E-Mail-Adresse kommt ja im POST mit.

Umsetzung und aktuelle Konfiguration

Die konkrete Einrichtung — nginx-Konfiguration, PHP-Script und DNS — beschreibe ich im Nachfolgebeitrag: Outlook Autodiscover für IMAP und SMTP konfigurieren. Dort steht auch das Update von 2026 mit den Korrekturen am PHP-Script (GET-Absicherung, XSS-Schutz) und der Zusammenlegung mit Thunderbird Autoconfig.

Wer seine Konfiguration testen will: Microsoft bietet unter testconnectivity.microsoft.com den „Microsoft Remote Connectivity Analyzer“ an. Dort den Autodiscover-Test auswählen und die eigene E-Mail-Adresse eingeben.

Fragen? Gerne per Kontaktformular.

SPF Records

Es gibt seit einiger Zeit einen dedizierten SPF-Record. Dieser wird auch bereits von vielen SPF-Filtern sowie Bind seit Version 9.4 unterstützt. Dieses entlastet etwas die TXT Anfragen und sorgt für mehr Ordnung 🙂 Wird dieser SPF Record vom jeweiligen SPF Filter unterstützt, fragt dieser meist zuerst nach dem SPF-Record und wenn es keine Antwort gibt als nächstes nach einem TXT-SPF Record.

Um diesen Filtern etwas Arbeit zu ersparen, das DNS etwas aufzuräumen und auf lange Sicht RFC konform zu bleiben (es würde mich nicht wundern wenn der TXT-SPF Record bald ausstirbt). Sollte man ebenfalls bei seiner SPF geschützten Domain einen solchen Record erstellen.

Für meinen Bind und die Domain kernel-error.de würde ein Beispiel wie folgt aussehen:

kernel-error.de.    IN    SPF    "v=spf1 ip4:212.23.142.146 ip6:2001:7d8:8001:100::2 ptr:smtp.kernel-error.de mx a:smtp.kernel-error.de -all"

 

Geprüft werden kann alles schnell und einfach mit DIG:

# dig kernel-error.de IN SPF +short
"v=spf1 ip4:212.23.142.146 ip6:2001:7d8:8001:100::2 ptr:smtp.kernel-error.de mx a:smtp.kernel-error.de -all"

 

Sobald alle gängigen Filter die SPF-Records implementiert haben und alle Postmaster ihre Einführungszeit hatten, kann man dann sicher seinen TXT-SPF-Record entfernen. Dieses dauert sicher wieder ein paar Jahre! Ach ja, mein TXT SPF Record schaut so aus:

kernel-error.de.    IN    TXT    "v=spf1 ip4:212.23.142.146 ip6:2001:7d8:8001:100::2 ptr:smtp.kernel-error.de mx a:smtp.kernel-error.de -all"

 

 

Mehr zum Lesen:

SPF
SPF-RECORD
SPF-RECORD erkärt

Die vergessenen abuse und postmaster Adressen

Was oft übersehen wird, ist dass es für jede Domain die Adressen postmaster@domain.tld sowie abuse@domain.tld geben muss. E-Mails an diese Adressen müssen angenommen werden und sollten auch gelesen werden!

 

Geregelt ist dieses im RFC5321 und im RFC2142 (ich verlinke hier mal auf http://www.rfc-ignorant.org , die haben es schön bunt gemacht, das ist ja für viele so wichtig)!

 

Hat man nun technische Fragen zum Mailsystem einer Domain, oder technische Anmerkungen, dann sendet man eine E-Mail an: postmaster@domain.tld
Im schlechtesten Fall sollte dort ein Mensch sitzen welcher in der Lage ist, diese E-Mail an den „echten“ Administrator weiter zu leiten.

 

Jetzt kommen immer mal wieder ~Beschwerden~ bei mir an, weil E-Mails Externer an gehostete Domains abgewiesen werden. Also macht man sich auf die Suche nach dem Grund. Der eigentliche Absender hat diesen zwar mit einer 5xx Meldung zusammen bekommen…. Die Nachricht war aber leider auf Englisch und Fehlermeldungen – vor allem in englischer Sprache – werden gerne und schnell gelöscht! Hat man den Grund also gefunden, schreibt man den Grund an den „Beschwerdeführer“ und natürlich den Postmaster der Absenderdomain. Das die E-Mail abgewiesen wurde weil sie auf eine Blockliste steht, der R-DNS nicht stimmt, alles von einer dynamischen IP kommt usw. usw…. Sehr oft hat man dann 4 – 5 Sekunden nach dem Absenden der E-Mail auch schon eine Antwort: – Sorry, Postfach nicht gefunden. / – Mailbox voll.
Es hängt ja mal schnell zusammen 😛

 

Eine E-Mail an die Abuse Adresse schreibt man immer, wenn auf einen Missbrauch hingewiesen werden soll. Wird also die Domain zum verschleudern von Spam und Viren missbraucht oder ähnliches. Eine Abuse Adresse findet sich auch im Whois der meisten IP Adressen/Netze. Sie erfüllt hier den gleichen Auftrag. Man sollte denn noch folgendes beachten. Wird eine Domain als Absender einer Spam oder Virenmail missbraucht und dieses läuft nicht über den Mailserver der Domain… Dann sind die Verantwortlichen der Domain in gewissem Umfang machtlos. Zwar kann man versuchen sich gegen so etwas mit Techniken wie SPF zu schützten. Dieses muss denn noch beim Empfänger ausgewertet werden.

 

Nun reicht es nicht nur die beiden Adressen postmaster@domain.tld sowie abuse@domain.tld anzulegen. Sondern die Absender sollten diese Adressen erreichen können. Hat jemand also ein Problem damit E-Mails an unsere Domain zu schicken, da sie immer von irgendwelchen Filtern abgewiesen wird, dann versucht er ggf. sich an den Postmaster der Domain zu wenden. Wird diese E-Mail nun ebenfalls gefiltert – dann hat der Absender verloren?!?! So könnte den Postmaster ein Hinweis auf ein echtes Problem mit seinem Mailsystem nicht erreichen. Das wäre schlecht, diese Adressen sollten also unabhängig von den Filtern immer durchgelassen werden.

 

Dieses geht über Whitelisting des jeweiligen Empfängers im Postfix und AMaViS. Denn Postfix sowie AMaViS dürfen ihre Filter nicht auf E-Mails an diesen Empfänger anwenden.

 

Hier nun ein kleines Beispiel dazu:

Postfix access-Tables

Für eine einfache Konfiguration erstellt man am einfachsten die Datei recipient-access unter /etc/postfix, der Inhalt besteht dann aus den jeweiligen Empfängeradressen und der Information was damit gesehen soll.

$ cat /etc/postfix/recipient-access
#Empfänger
postmaster@kernel-error.de    OK
abuse@kernel-error.de        OK

OK ist dabei immer erlauben

REJECT lehnt immer mit einem Error 5xx ab
In der Version 2.0 von Postfix wurde dieses Thema komplett überarbeitet. Es gibt noch viele weitere Möglichkeiten der access-tables. Hier einfach mal RTFM oder fragen.

Damit Postfix am Ende mit den Daten etwas anfangen kann fehlt noch ein:

$ postmap /etc/postfix/recipient-access

 Als letzten Schritt weisst man nun Postfix an, diese Daten auch auszuwerten. Dabei ist die Stelle ganz wichtig! Warum? Ganz einfach… Postfix hat die Möglichkeit verschiedene Filter an verschiedenen Stellen des Ablaufes zu nutzen. Die Filter werden immer von oben nach unten abgearbeitet und sobald einer passt, greift auch dieser. Sehr ähnlich wie bei einer Firewall.

So lassen sich Prüfungen an folgenden Stellen konfigurieren:

smtpd_client_restictions
nach connect

smtpd_helo_restrictions
nach helo

smtpd_sender_restrictions
nach mail from

smtpd_recipient_restrictions
nach rcpt to

smtpd_data_restrictions
nach data

smtpd_end_of_data_restrictions
nach mailübertragung

Ein solches Vorgehen ergibt schnell einen Sinn, wenn man darüber nachdenkt, wie man Last von seinem Mailserver fernhalten kann. Erwartet man zum Beispiel im HELO einen fqdm, kann man dieses direkt nach dem HELO prüfen (smtpd_helo_restrictions) und die Verbindung ggf. ablehnen. Der Mailserver nimmt also nicht noch dem Absender, den Empfänger oder gar die ganze E-Mail entgegen, bevor die Verbindung zurückgesetzt wird. Für einfache Systeme reicht es meist seine Prüfungen nach der Übergabe des Empfängers (smtpd_recipient_restrictions) zu setzten. Erst ganz am Ende (smtpd_end_of_data_restrictions) zu prüfen halte ich für gefährlich. Zwar sollte dieses Vorgehen kleinere Mailsysteme nicht weiter stressen… Denn noch hat man ja schon die komplette E-Mail angenommen, bevor man etwas damit tut. Rechtlich sicherer wäre es die Nachricht abzulehnen, noch bevor sie ganz übertragen ist.

Ich trage daher soweit oben wie möglich meine Whitliste ein:

/etc/postfix/main.cf

smtpd_recipient_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        check_recipient_access hash:/etc/postfix/recipient-access,
        ...........,

Nachdem Postfix die neuen Einstellungen übernommen hat, greifen alle nachfolgenden Filter nicht mehr auf alle Empfänger mit einem OK in der /etc/postfix/recipient-access.

AMaViS spam_lovers_maps

Postfix lässt nun zwar die E-Mails durch, AMaViS wird sie denn noch grillen. Es sei denn wir sagen AMaViS dass diese Empfänger Spam Liebhaber sind 🙂

Folgender Eintrag in /etc/amavis/conf.d/50-user erfüllt dieses:

@spam_lovers_maps = (
  [
        "postmaster\@kernel-error.de",
        "abuse\@kernel-error.de",
  ]
  );

 

AMaViS testet die E-Mail nun zwar noch immer, sie wird denn noch druchgewunken. Nun gibt es nicht nur Spam Liebhaber „spam_lovers_maps“ sondern auch Viren Liebhaber „virus_lovers_maps“ oder Liebhaber gesperrter/verdächtiger Dateianhänge „banned_files_lovers_maps„. Mir kommt nur gerade kein Grund in den Sinn, warum man dem Postmaster einen „verdächtigen“ Dateianhang oder gar einen Virus schicken sollte. Daher fische ich in der Regel diese E-Mails weiterhin raus. Nur Werbung lasse ich für diese beiden Adressen passieren. So sollten mich alle E-Mails an Postmaster oder Abuse erreichen. Selbst wenn sie von einem falschen Absender per Telnet über eine dynamische und gesperrte Adresse versucht mir Viagra zu verkaufen *schnief*.

DKIM

Ich gehe davon aus, das eine funktionsfähige amavis, postfix usw… Konstellation vorhanden ist!

Ich habe einen Server im Internet stehen, welcher sich um meine E-Mails und die meiner Verwanden und Bekannten kümmert. Hier liegen mehrere Domains und die E-Mails in lokalen Postfächern. Diese sind per smtp, imap und webmail zu erreichen.

OS ist Debian Lenny, als MTA nutze ich Postfix welcher mit amavis, spamassassin, clamav, dovecot und etwas Krims mehr zusammenarbeitet.

Meine Idee war nun alle ausgehenden E-Mails jeweils mit DKIM zu signieren und alle eingehenden E-Mails zusätzlich auf eine gültige DKIM Signatur zu prüfen.

Es gibt hier nun mehrere Möglichkeiten dieses umzusetzen. Ich habe mehrere Systeme ausprobiert und finde, für mich ist es über amavis am angenehmsten. Seit der Version 2.6 bringt amavis-new diese Funktionalität mit. Na dann wollen wir mal….

Vorbereitung der Signaturprüfung

Ich habe folgende Einträge in meiner 50-user unter /etc/amavis/conf.d/ dafür ergänzt:

$enable_dkim_verification = 1;

Damit überreden wir amavis die DKIM Signaturen zu prüfen. Dieses läuft in Zusammenarbeit mit spamassassin. Hier müssen folgende Einträge vorgenommen werden:

/etc/spamassassin/v320.pre
loadplugin Mail::SpamAssassin::Plugin::DKIM

Ohne diesen Eintrag wird spamassassin nicht das passende Modul laden und versteht überhaupt nicht was man von ihm will (häufige Fehlerquelle).

/etc/spamassassin/local.cf
#DKIM
score DKIM_VERIFIED -3.0
score DKIM_POLICY_TESTING 0
score USER_IN_DKIM_WHITELIST -8.0
whitelist_from_dkim @kernel-error.de

Hier lege ich nun die Punkte fest, welche von spamassassin vergeben werden. Da natürlich auch Spammer eine DKIM Signatur erstellen könnten (was eher selten ist) gebe ich maximal -3 Punkte für eine erfolgreich geprüfte DKIM Signatur.

Es fehlt nur noch ein Paket: libmail-dkim-perl
Dieses installieren wir einfach schnell mit

apt-get install libmail-dkim-perl

nach!

Ab jetzt werden E-Mails schon auf eine gültige DKIM Signatur überprüft.

Ich werfe, nach einiger Zeit, mal ein: cat /var/log/mail.log|grep dkim_id raus um zu sehen ob schon etwas passiert ist:

Mar 11 10:59:56 kernel-error amavis[10736]: (10736-05) Passed CLEAN, [91.194.xxx.xxx] [91.194.xxx.xxx] <e3@xxxxx.net> -> <xxx@xxx-meckenheim.de>, Message-ID: <0.0.10@e3xxys.net>, mail_id: Cf, Hits: -9.187, size: 33396, queued_as: 6883, dkim_id=eBay@reply.ebay.de,eBay@reply.ebay.de, 6951 ms

Schaut gut aus und im MailHeader dieser E-Mail steht:

Authentication-Results: kernel-error.de (amavisd-new); dkim=pass
header.i=eBay@reply.ebay.de
Authentication-Results: kernel-error.de (amavisd-new); domainkeys=pass

Das geht also schon mal 😀

Vorbereitung der Signierung

In /etc/amavis/conf.d/50-user müssen folgende Konfigurationszeilen eingefügt werden:

$enable_dkim_signing = 1;
dkim_key('kernel-error.de', 'kernel-error', '/pfad/kernel-error.key.pem');
@dkim_signature_options_bysender_maps = (
{ '.' => { ttl => 21*24*3600, c => 'relaxed/simple' } } );
@mynetworks = qw(127.0.0.0/8);  # list your internal networks

Zeile 1 bringt amavis dazu E-Mails per DKIM zu signieren.
Zeile 2 sagt amavis wo für die jeweilige Domain (hier kernel-error.de) die Schlüsseldatei liegt.
Zeile 3 gibt vor wie und was signiert werden soll.
Zeile 4 gibt an, welche IP-Netze als lokal behandelt werden sollen. Da dieser Server bei uns im Rechenzentrum steht gibt es kein lokales Netzwerk, bis auf 127…

Jetzt müssen wir noch den Schlüssel erstellen. amavis hilft dabei mit folgendem Befehl:

amavisd-new genrsa /pfad/kernel-error.key.pem

Wir können uns den Schlüssel anschauen und direkt Testen ob amavis alles richtig verstanden hat, mit Hilfe dieses Befehls:

amavisd-new showkeys

Die Ausgabe sollte ähnlich dieser sein:

kernel-error._domainkey.kernel-error.de.        3600 TXT (
"v=DKIM1; p="
"MIGfMCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC/KYIHw8NZNIB"
"SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS6orDC2DzZ7"
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
"qZZZZZZZZZZZZZZZZZZZZZZZZB")

Genau diesen Schlüssel müssen wir nun in den DNS-Eintrag des DNS-Servers eintragen, welcher für die Domain zuständig ist. Der DNS-Server meiner Domain ist ein Bind9. Um diesem meinen Schlüssel schmackhaft zu machen, muss ich ihn noch etwas umformen. Er wird am Ende so ausschauen:

kernel-error._domainkey.kernel-error.de.        3600 TXT  "v=DKIM1; p="MIGfMCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC/KYIHw8NZNIBSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS6orDC2DzZ7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXqZZZZZZZZZZZZZZZZZZZZZZZZB"

Ich habe alle Zeilenumbrüche und ~überfüssige~ ( „ ) sowie die beiden Klammern entfernt. Der Eintrag im Bind schaut nun also so aus:

$ORIGIN .
$TTL 86400      ; 1 day
kernel-error.de         IN SOA  kernel-error.de. root.kernel-error.de. (
xxxxxxxxx ; serial
10000      ; refresh (2 hours 46 minutes 40 seconds)
1800       ; retry (30 minutes)
2419200    ; expire (4 weeks)
86400      ; minimum (1 day)
)
NS      ns1.kernel-error.de.
NS      ns2.kernel-error.org.
A       213.xx.xx.xx
MX      10 smtp.kernel-error.de.

kernel-error._domainkey.kernel-error.de.        3600 TXT  "v=DKIM1; p="MIGfMCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC/KYIHw8NZNIBSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS6orDC2DzZ7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXqZZZZZZZZZZZZZZZZZZZZZZZZB"


$ORIGIN kernel-error.de.
$TTL 300        ; 5 minutes
imap                    A       213.xx.xx.xx
smtp                    A       213.xx.xx.xx

Ein amavisd-new testkeys sollte nun folgendes ergeben:


TESTING: kernel-error._domainkey.kernel-error.de => pass

Ab jetzt werden alle lokalen E-Mails signiert! Hier ist darauf zu achten, dass nur E-Mails signiert werden, welche als lokal eingestuft werden. Wir erinnern uns daran, dass wir 127.0.0.0/8 als lokales Netzwerk eingestuft haben. Wenn also nun E-Mails von Benutzern signiert werden sollen, welche sich mit ihrem E-Mail Client per smtp am Server anmelden und E-Mails verschicken, dann ist noch etwas mehr Arbeit nötig!

Am einfachsten ist es mit zwei verschiedenen IP-Adressen zu arbeiten und für diese Spezielle Regeln anzulegen. Dazu müssen ein paar Einträge in der /etc/postfix/master.cf vorgenommen werden:

213.xx.xx.xx:smtp      inet  n       -       -       -       -       smtpd 
127.0.0.1:10025 inet n  -       -     -       -  smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_delay_reject=no
-o smtpd_client_restrictions=permit_mynetworks,reject
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o smtpd_data_restrictions=reject_unauth_pipelining
-o smtpd_end_of_data_restrictions=
-o mynetworks=127.0.0.0/8
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o smtpd_client_connection_count_limit=0
-o smtpd_client_connection_rate_limit=0
-o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
-o local_header_rewrite_clients=

Ist hier mein Eintrag für E-Mails, welche über den MX Eintrag an meinen Mailserver gesendet werden, also für die Domains und User bestimmt sein sollten, welche ich über meinen Mailserver verarbeite. Die User sollten über diese Adresse keine E-Mails einliefen!!

### Einlieferung eigene Nutzer
213.xx.xx.xxx:smtp      inet  n       -       y       -       100     smtpd
-o smtpd_proxy_filter=localhost:10028
-o smtpd_etrn_restrictions=reject
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_sasl_auth_enable=yes
-o content_filter=
213.xx.xx.xxx:smtps    inet  n       -       y       -       100       smtpd
-o smtpd_etrn_restrictions=reject
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_tls_wrappermode=yes
-o smtpd_proxy_filter=localhost:10028
-o smtpd_sasl_auth_enable=yes
-o content_filter=

Dieses sind nun meine Einträge für die zweite IP-Adresse. Über welche die User, welche sich per sasl anmelden, ihre E-Mails ins System werfen.

localhost:smtp      inet  n       -       -       -       -       smtpd

Damit auch mein Webmail sauber funktioniert ist dieser Eintrag zuständig. Sonst lauscht halt keiner mehr lokal 😀

Hier ist nun klar zu sehen, das die per smtp angenommenen E-Mails je nach IP anderen Regeln unterliegen und auch lokal an amavis auf anderen Ports weitergeleitet werden. Dieses müssen wir natürlich amavis auch mitteilen. Wenn amavis nicht weiss das es auf weiteren Ports lausch soll, wird es dieses kaum von sich aus tun. Dafür müssen wir einen Eintrag unter /etc/amavis/conf.d/20-debian_defaults ändern.

$inet_socket_port = [10024,10028,10032];  # listen on multiple TCP ports geaendert

Jetzt geben wir in der /etc/amavis/conf.d/50-user noch unsere spezielle Regel für die sasl Benutzer an:

# DKIM
$policy_bank{'SASLNUTZER'} = {   # Einlieferung eigener Nutzer
originating => 1,
os_fingerprint_method => undef,  # eigentlich ueberfluessig
};
$interface_policy{'10028'} = 'SASLNUTZER';

Interessant ist hier im Grunde nur:

originating => 1,

Man könnte originating => 1 auch einfach mit in die 20-debian_defaults werfen und sich das mit der zweiten IP und den amavis Regeln sparen. Damit wird aber jede E-Mail als lokal behandelt. Ob das so gut ist bleibt jedem selbst überlassen 😛

Tja, was soll ich sagen, hier ist nun Ende. Sollte es Fragen oder Probleme geben, könnt ihr euch gerne bei mir melden!

Hier nun noch ein Paar Informationen zu DKIM:

DomainKeys ist ein Identifikationsprotokoll zur Sicherstellung der Authentizität von E-Mail-Absendern, das von Yahoo entwickelt wurde und seit Ende 2004 in Erprobung ist. Es wurde konzipiert, um bei der Eindämmung von unerwünschter E-Mail wie Spam oder Phishing zu helfen.

DomainKeys wurde ursprünglich unter dem Titel Domain-Based Email Authentication Using Public Keys Advertised in the DNS (DomainKeys) im RFC 4870 veröffentlicht und unter dem Titel DomainKeys Identified Mail (DKIM) Signatures durch RFC 4871 abgelöst.

Arbeitsweise

DomainKeys basiert auf asymmetrischer Verschlüsselung. Die E-Mail wird mit einer Digitalen Signatur versehen, die der empfangende Server anhand des öffentlichen Schlüssels, der im Domain Name System (DNS) der Domäne verfügbar ist, verifizieren kann. Schlägt dies fehl, hat der empfangende Mail Transfer Agent (MTA) oder das empfangende Anwendungsprogramm die Möglichkeit, die E-Mail zu verweigern oder auszusortieren.

Kern des Verfahrens ist, dass der sendende MTA jede versendete E-Mail im sogenannten „DomainKey-Signature-Header“ mit einer digitalen Signatur des Inhaltes der E-Mail versieht.

Für die Erzeugung des für die Signatur nötigen Hashwertes unterstützt DKIM die Hashfunktionen SHA-1 und SHA-256, wobei die Verwendung von letzterer empfohlen wird. Die anschließende Verschlüsselung des Hashwertes, die letztlich die digitale Signatur zum Ergebnis hat, wird in beiden Fällen mit dem Verschlüsselungsverfahren RSA realisiert. Damit die Signatur mit dem beim E-Mail-Versand verwendeten ASCII-Zeichensatz dargestellt werden kann, wird sie mit Base64 kodiert.

Die so erzeugte digitale Signatur wird vom empfangenden MTA zunächst base64-dekodiert und dann mit dem öffentlichen Schlüssel der angeblichen Absender-Domäne (z.B. yahoo.com) entschlüsselt, der Hashcode der E-Mail wird neu berechnet. Stimmen der gelieferte entschlüsselte und der selbst berechnete Hashcode überein, stammt die E-Mail wirklich von der angegebenen Domäne. Der oder die verwendeten öffentliche(n) Schlüssel werden hierzu im DNS-Eintrag der sendenden Domäne publiziert. Das heißt, dass der DNS als Zertifizierungsstelle fungiert. Eine mit Hilfe von DomainKeys signierte E-Mail bietet also die Möglichkeit, sicher nachzuprüfen, ob die in der E-Mail-Absenderadresse enthaltene Domäne korrekt ist und dass die E-Mail auf dem Weg der Zustellung nicht verändert wurde.
Spamfilterung

Da es sich bei DomainKeys um einen Authentifizierungsmechanismus handelt, dient DomainKeys nicht dazu, Spam zu filtern. Stattdessen begrenzt DomainKeys die Möglichkeit, E-Mail-Absenderadressen zu verschleiern, da man mit DomainKeys feststellen kann, ob eine E-Mail tatsächlich über die angegebene Domäne versendet wurde.

Diese Nachvollziehbarkeit kann dazu verwendet werden, Bewertungssysteme und Filtertechniken von Spamfiltern wirkungsvoller zu gestalten. Zudem kann DomainKeys den Datendiebstahl durch Phishing begrenzen, da teilnehmende Mailversender ihre E-Mails als Originale zertifizieren können. Fehlt eine solche Zertifizierung, obwohl der vermeintliche Absender angibt, seine E-Mails zu zertifizieren, so kann die E-Mail als mögliche Fälschung betrachtet werden.
Lizenzierung

Yahoo hat das Verfahren patentieren lassen und es bei der IETF zur Standardisierung eingereicht. Das Verfahren wurde mittlerweile als Standard RFC 4871 akzeptiert.

Das DomainKeys-Verfahren kann von Yahoo wahlweise unter den Bedingungen der GPL 2.0 oder den Bedingungen des proprietären Yahoo DomainKeys Patent License Agreement lizenziert und verwendet werden.

Dem DomainKeys-Verfahren werden nach dem Scheitern der Standardisierung von Microsofts Sender ID – bei welchem an keine GNU-Lizenzierung gedacht wurde – gute Chancen eingeräumt, sich neben dem Sender Policy Framework (SPF) im Internet zu etablieren.
Unterstützung

Das DomainKeys-Verfahren erfordert größere Modifikationen am Mailserver – entsprechende Anpassungen existieren derzeit für fast alle gängigen Mail Transfer Agenten. Derzeit wird das DomainKeys-Verfahren nur von sehr wenigen Providern unterstützt; bekannte größere Provider, die Domainkeys einsetzen, sind Yahoo, Gmail und Strato.

Das Problem bei dieser und aller anderen Methoden zur Sicherstellung der Absender-Authentizität ist, dass es einen langen Zeitraum brauchen wird, um ein solches System zu verbreiten, da zuerst die Software angepasst werden muss und diese dann auch noch auf den Mailservern zum Einsatz kommen muss.
Weiterentwicklungen

Im Juli 2005 wurde von Cisco und Yahoo ein gemeinsamer Entwurf mit dem Titel DomainKeys Identified Mail (DKIM) bei der IETF eingereicht. Unterstützt wurde dieser Vorschlag nun auch von anderen Größen der IT-Branche, darunter mit Microsoft und AOL auch von denjenigen, die als Alternativlösung SPF vorschlugen. DKIM wurde im Mai 2007 als RFC 4871 veröffentlicht und ersetzte damit den vorherigen Entwurf RFC 4870.

Neuere Beiträge »

© 2026 -=Kernel-Error=-RSS

Theme von Anders NorénHoch ↑