Get-WrongSender

Diese Skript wertet das Messagetracking dahingehend aus, ob Absender eine ungültige Mailadresse beim Einliefern verwenden.

Die Problemstellung

Per Default nimmt Exchange nur Mails von authentifizierten Absendern an und verifiziert dann auch die "Sender"-Adresse. Fälschungen sind ausgeschlossen. Allerdings schalten die meisten Administratoren dann noch den anonymen Zugang frei, um z.B. Mail von internen Systemen und natürlich dem Internet anzunehmen. Damit ist Exchange zwar kein "offenes" Relay, da die Empfänger immer intern als Postfach, Verteiler, Kontakt oder PublicFolder definiert sein müssen aber diese Freischaltung erlaubt nun einem Absender auch mit einer falschen Adresse zu senden. Wer sich also an Exchange korrekt anmeldet, muss zwingend die zum Postfach passende Mailadresse verwenden während ein anonymer Absender quasi jede beliebige Adresse verwenden kann.

Exchange selbst hat leider keine eingebaute Funktion, um diesen Missbrauch zu verhindern. für Mails aus dem Internet sollte diese Filterfunktion im Spamschutz schon integriert sein, so dass von extern niemand mit einer internen Adresse ein Vertrauen vortäuschen kann. Aber all die internen Absender können weiterhin wild ihre Sender-Adresse verändern.

Besonders ungeschickt ist dies natürlich, wenn jemand eine Mail mit einer Adresse der Firmendomäne versendet, die es gar nicht gibt. Solange die Mail den Empfänger erreicht, wird der Fehler gar nicht mal bemerkt aber wehe die Mail kommt einmal nicht an, z.B. weil das Zielpostfach voll ist oder der Empfänger schlicht nicht mehr vorhanden ist. Exchange generiert dann einen NDR der aber aufgrund der ungültigen Absenderadresse wieder unzustellbar wird. Oft werden solche Konstellationen nur durch Zufall bemerkt.

Das lässt sich noch steigern, wenn der Versender z.B. im Marketing steht und über Exchange als Relay die Mails sogar in das Internet senden darf. Hier sind "Unzustellbarkeiten" quasi die Regel und jede Firma ist gut beraten, diese Rückläufer zu verarbeiten. Das geht aber nur, wenn die Absenderadresse auch zu einem Empfänger zugeordnet werden kann

Aufgabenstellung

Mein Ziel war es also heraus zu bekommen, welche Mails durch meine Exchange Server laufen und zu welchen Absender aus meinen Domänen es keinen Exchange Empfänger gibt. Das Skript muss mir also erst eine Liste der eigenen Domänen besorgen (Get-AcceptedDomains) und dann jede per SMTP empfangene Mail im Messagetracking auf den Absender auswerten. Wenn der Absender aus einer anderen Domäne ist, dann wird der Eintrag nicht weiter betrachtet. Ist der Absender aber anscheinend "lokal", dann muss dieser z.B. per "Get-Recipient" gesucht werden. Wird der Eintrag dann nicht gefunden, dann ist dies eine Meldung wert.

Das Skript kann nicht erkennen, ob jemand anonym mit einer "falschen" aber vorhandenen Adresse sendet. Im Idealfall authentifizieren sich alle SMTP-Sender und Exchange kann die Zuordnung der Senderadresse erzwingen. Dies gilt vor allem für Systeme die eine Adresse aus dem gleichen Adressraum nutze. "Massensender" sollten vielleicht eine eigene SMTP-Domain oder Subdomain (z.B., user@newsletter.<firmendomain>) verwenden.

Für den ersten Ansatz reicht aber auch schon die Ermittlung solcher schlicht ungültigen SMTP-Adressen. 

Das Skript

Bei der Entwicklung eines Skripts muss man immer den Blick auf das Ziel behalten. Wen ich 30 Tage Messagetracking auswerten will, dann sollte ich vielleicht vorher eine Liste aller SMTP-Adressen exportieren und dann dagegen checken. Bedenken Sie aber, dass dann durchaus ein Postfach gelöscht sein kann, welches dann irrtümlich als Fehler geliefert wird. Wenn ich aber z.B. immer nur die letzten 30 Minuten als Report erzeugen möchte, dann ist es besser bei jeder Mail individuell nach der Adresse zu suchen und das Ergebnis einfach zu speichern. Insbesondere wenn die Firma sehr groß ist und man dann erst tausende von SMTP-Adressen laden müsste. Ich habe das Skript dafür konzipiert, während der Laufzeit die Empfänger nachzuschlagen.

get-wrongsender.1.1.ps1

Der Aufruf und die Ausgabe

Als Eingabeparameter erwartet das Script eigentlich keine Daten. Es liest dann per Default die letzten 24h aus und speichert sich das zuletzt verarbeitete Datum in einer Datei. Wenn die das Script erneut aufrufen, dann mach es dort weiter, wo es aufgehört hatte. Als Parameter können Sie also den Dateinamen und das maximale Intervall anpassen.

Das Skript ist für die Weiterverarbeitung gedacht, d.h. es filtert die Daten aus dem Messagetracking und gibt die fraglichen Datensätze 1:1 als Pipeline weiter. Das nächste Programm erhält das Exchange Messagetracking mit den fraglichen Ausgaben. Ein einfacher Aufruf ist daher.

$result = (.\get-wrongsender.ps1)

Danach stehen in $result die Ergebnisse drin. Mit den Daten können Sie dann die unterschiedlichsten Auswertungen machen.

# Anzeigen der Absenderadressen absteigend nach der Anzahl der Vorkommen
$result | group sender | select name,count | sort count -descending

# Anzeigen der Anzahl nach Connector absteigend
$result | group connectorID | select connector, count | sort count -descending

# Anzeigen der Anzahl nach IP des einliefernden Systems
$result | group ClientIP | select ClientIP, count | sort count -descending

Natürlich können Sie auch noch weitere Analysen durchführen. Denkbar ist auch daraus einen Report zu erstellen und an den Administrator zu senden.

Noch ein weiterer Tipp: Wenn Sie für den Empfang von internen Systemen nicht den "Default Receive Connector" nutzen, sondern einen eigenen Connector angelegt haben, dann können Sie das Messagetracking noch weiter filtern. Das ist insbesondere interessant, wenn Sie über gesonderte Connectoren z.B. auch ein Relay zulassen. Ich benenne diese "Relay-Connectoren" auch im Namen entsprechend und kann dann so vorfiltern:

Get-Transportserver `
   | Get-MessageTrackingLog `
         -Start $lastrun  `
         -EventId receive  `
         -resultsize unlimited  `
   | ?{($_.source -eq "smtp") -and ($_.Connectorid -liek "*relay*")}

So können Sie sehr schnell ermitteln, welcher Host auf so einen Relay Connector zugreift und mit welchen Absenderadressen er arbeitet.

Was anstellen mit den Ausgaben ?

Das hängt etwas von ihrer Firmenpolicy ab. Ich rate meinen Kunden immer dazu, die Anzahl der "fremden anonymen Einlieferer" überschaubar und klein zu halten und dafür zu sorgen, das diese Mails immer mit gültigen Absenderadressen versenden. Nur dann ist der Rückkanal möglich.

Platt ausgedrückt: Wenn ich eine eine Mail versende und mich nicht interessiert, ob sie angekommen ist, dann kann ich mir den Versand auch sparen. für wichtige Mails sollten Sie immer sicherstellen, dass bei einer unzustellbarkeit jemand davon erfährt. Und dazu ist eine gültige Rückantwortadresse erforderlich

So eine Aussage führt erst einmal zu hitzigen Diskussionen aber letztlich ist der Kern unverändert: Wer Mails mit ungültigen Absendern versendet sollte die Relevanz dieser Meldungen noch mal beleuchten. Zudem ist gerade die Anzahl der "unzustellbaren Mails" ein guter "Key Health Indicator" zur Gesundheit eines Systems.

Nehmen Sie die Liste der Source-IP-Hosts mit den Mailadressen und machen Sie den Betreiber bzw. Verantwortlichen ausfindig, dass er seine Konfiguration korrigiert.

Wenn sich ihr Kollege dagegen sperrt, dann wäre es nicht das erste mal, dass ich dem Exchange Administrator dazu rate die verwendete Absenderadresse einfach an das Postfach des verantwortlichen Mitarbeiters als "sekundäre Adresse" zu addieren. Er wird dann sehr schnell sich um die Rückläufer kümmern.

Wichtig ist natürlich vorher eine quasi "verabschiedete Firmenrichtlinie zum Mailversand" zu haben, die eine Verwendung gültiger Adressen erzwingt.

Weiterentwicklung

Aktuell liefert das Skript die Daten direkt per Pipeline aus. Mit den letzten Einsätzen denke ich das es vielleicht doch besser ist zuerst eine Liste aller Empfänger zu laden anstatt für jeden neuen Empfänger zumindest einmal ein "Get-Recipient" aufzurufen und den Fehler abzufangen. Dies könnte ja auch direkte per ADSI erfolgen und zumindest für den Einsatz "OnPremise" damit sehr schnell sein.

Weitere Links