Parse-SMTPReceivelog

Das Skript Parse-SMTPReceivelog hilft mit bei der Analyse von eingehenden SMTP-Verbindungen beim Receive Connector. Primär wollte ich z.B. wissen, welche und wie viele Verbindungen noch kein STARTTLS machen. Das Skript ist natürlich erweiterbar.

Exchange SMTP Receive Logging

In der Standardeinstellung protokolliert Exchange OnPremises jede übertragene Mail im Messagtracking als "SMTP RECEIVE"-Event. Allerdings ist dort nicht zu sehen, ob die Mail per TLS/STARTTLS oder ohne Verschlüsselung übertragen wurde. Hier ein Auszug einer per SMTP auf dem Receive Connector empfangenen Mail.

ClientIp                : 192.168.100.33
ClientHostname          : ex2019.msxfaq.de
ServerIp                : 192.168.100.33
ServerHostname          : ex2019
ConnectorId             : ex2019\Default Frontend ex2019
Source                  : SMTP
EventId                 : RECEIVE
MessageId               : <bc017063-ff1c-485b-b2ce-63dd490f1810@AM9PR08MB6292.eurprd08.prod.outlook.com>
NetworkMessageId        : eff95d0f-4087-4897-757a-08dcbef7cfa3
Recipients              : {PRTG@msxfaq.de}
RecipientStatus         : {}
TotalBytes              : 7840
RecipientCount          : 1
MessageSubject          : Undeliverable: PRTG Roundtrip Mail: {DD9A7F81-A37F-42A6-A838-33BAA066BDEA}
Sender                  : postmaster@msxfaq.onmicrosoft.com
Directionality          : Incoming
OriginalClientIp        : 193.37.132.219
MessageInfo             : 0cA:
EventData               : {[ProxyHop1, AM3PEPF0000A78E.mail.protection.outlook.com(10.167.16.117)], [ProxyHop2,
                          AM0PR06CA0083.outlook.office365.com(2603:10a6:208:fa::24)], [ProxyHop3, ex2019.msxfaq.de(192.168.100.33)], [MessageValue,
                          MediumHigh], [Replication, Disabled], [FirstForestHop, ex2019.msxfaq.de], [FromEntity, Internet], [Oorg, msxfaq.de],
                          [ProxiedClientIPAddress, 40.93.78.2], [ProxiedClientHostname, FR6P281CU001.outbound.protection.outlook.com], [DeliveryPriority,
                          Normal], [OriginalFromAddress, <>], [AccountForest, msxfaq.de]}
TransportTrafficType    : Email
SchemaVersion           : 15.02.1544.011

Wenn nun die IT Security aber eine Aussage erhalten möchte, welche Mails denn unverschlüsselt ankommen, dann müssen wir etwas tiefer buddeln und auf dem Receive Connector das Logging aktivieren, ehe ich TLS erzwinge.

[PS] C:\>Get-ReceiveConnector "NAWEX19\Default Frontend NAWEX19" |fl name,*tls*,ProtocolLoggingLevel

Name                  : Default Frontend NAWEX19
SuppressXAnonymousTls : False
TlsCertificateName    : <I>......
RequireTLS            : False
TlsDomainCapabilities : {mail.protection.outlook.com:AcceptCloudServicesMail}
ProtocolLoggingLevel  : Verbose

Daher habe "ProtocolLoggingLevel" von "none" auf "verbose" gestellt.

Auf den Einstellungen des TransportService können Sie die Pfade und Haltezeit (30 Tage oder max. 250 MB im Verzeichnis) anpassen. In der Default-Einstellung sind.

[PS] C:\>Get-TransportService | fl ReceiveProtocol*

ReceiveProtocolLogMaxAge           : 30.00:00:00
ReceiveProtocolLogMaxDirectorySize : 250 MB (262,144,000 bytes)
ReceiveProtocolLogMaxFileSize      : 10 MB (10,485,760 bytes)
ReceiveProtocolLogPath             : C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\Logs\Hub\ProtocolLog\SmtpReceive

Die 250 MB können etwas wenig sein, wenn Sie größere Abstände bei der Auswertung haben.

Dateiaufbau

Die dort abgelegten Dateien sind maximal 10 MB groß und folgen einem Namensschema

Der Inhalt ist quasi eine CSV-Datei mit den obligatorischen Kommentaren am Anfang aber auch mitten in der Datei, wenn der Service neu gestartet wurde. Hier habe ich eine Muster-Verbindung extrahiert.

Wenn Sie genau hinschauen, dann sehen Sie den Start der Verbindung mit dem "+", gefolgt von einem EHLO, dem Zertifikatstausch und sogar einer Anmeldung mit AUTH. Alle Interaktionen einer Verbindung werden über eine Session-ID und einer Sequence-Number zusammengehalten.

Auswertung

Damit war aber auch vorgezeichnet, was ich darauf machen werden. Ein PowerShell-Script bekommt eine Liste der Dateien per Pipeline oder Parameter, die es dann als CSV-Datei einliest und alle Zeilen zu einer Transaktion zusammenfasst. Ich möchte als Ergebnis pro Session-ID genau eine Zeile, in der die Zeitpunkte für die Verbindung, den EHLO, den STARTTLS und AUTH stehen und das letzte Feld der Verbindungsabbau ist. Das PowerShell-Script macht genau das, indem es zeilenweise die Daten analysiert und in einer Hashtabelle für jede Verbindung einen Eintrag mit folgender Struktur anlegt:

Die Felder werden dann weiter beim Auftreten der entsprechenden Events gefüllt und über die Pipeline wieder an STDOUT ausgegeben. Die Auswertung von 1 MB dauert auf meinem Laptop von 2019 (Intel I7-8550) ca. eine Sekunde. In 250 MB Logdateien sind ca.74.000 SMTP-Sessions. Hier drei Beispiele:

PS C:\> $result = Get-Item *.log | .\parse-smtpreceivelog.ps1

Die erste Verbindung erfolgte über TLS während die zweite Verbindung wohl kein STARTTLS gesendet hat. Die dritte Verbindung hat STARTLS als auch eine AUTH-Request gesendet. Das Feld "Totaltimesec" errechnet ich aus der Differenz von "connectiontime" und "mailendtime". Mit der Liste kann ich nun auch einfach anfangen die Daten zu gruppieren und weiter auszuwerten, z.B. Verbindungen je RemoteIP.

$result `
| group {$_.remoteendpoint.split(":")[0]} -NoElement `
| sort count -Descending

Oder natürlich auch nach Verbindungen ohne STARTTLS, da dort kein Zeitstempel zu finden ist:

$result `
| group {$_.tlstime -eq $null} -NoElement `
| sort count -Descending

Diese Verbindungen kann ich vorher auch filtern und mit dann die Systeme anschauen:

$result `
| where {$_.tlstime -eq $null} `
| group {$_.remoteendpoint.split(":")[0]} -NoElement `
| sort count -Descending

Leider kann ich aus dem Log keine Rückschlüsse auf die in der Mail verwendeten Absender, Empfänger oder Subject-Informationen erhalten, da es sich ja nur um SMTP-Verbindungen handelt und in einer Verbindung auch mehrere Mails übertragen werden können. Es reicht Daher nur für die IP-Adresse des Absenders, STARTTLS-Verwendung und ggfls. den angemeldeten Benutzer. Aber mit der IP-Adresse können Sie dann ja wieder im Messagetracking diese Mails suchen.

Download

Wenn Sie ihre eigenen Exchange OnPremises Server analysieren wollen dann müssen Sie natürlich zuerst die Funktion "ProtocolLoggingLevel" auf dem gewünschten Receive Connector aktivieren. Danach könnten Sie alle neu aufgebauten Verbindungen mit dem Skript analysieren.

parse-smtpreceivelog20240916.ps1

Denken Sie dran, dass das Skript nach dem Download ggfls. noch mit "Unblock-File" zugelassen werden muss und nicht digital signiert ist. Beim Aufruf können Sie entweder eine LOG-Datei oder eine Liste von Dateien als Parameter mit übergeben oder über STDIN per Pipeline einspeisen. Das Ergebnis landet dann auch wieder in STDOUT. Kleinere Datenmengen können Sie in eine Variable speichern, mit "Out-Grid" visualisieren oder mit Export-CSV in eine Datei speichern lassen.

Ich würde Anfang die LOG-Dateien vom Exchange Server auf einen Admin-PC kopieren und dort auswerten.

Weitere Links