X-MS-Exchange-CrossTenant-Id

Bei der Analyse der SMTP-Header in Exchange Online ist mir das Feld "X-MS-Exchange-CrossTenant-Id" aufgefallen. Diese Seite beschreibt die Details dazu und der weiteren Felder wie X-OriginatorOrg und X-MS-Exchange-Organization-AuthAs.

TenantID

Mit Exchange Online betreibt Microsoft eine "Multi Tenant"-Version von Exchange, bei der sehr viele Firmen sich die gleiche Infrastruktur teilen aber dennoch von einander separiert sind. Während bei Exchange OnPremises eine Zieladresse immer anhand der GAL aufgelöst und direkt zugestellt wird, passiert das bei Exchange Online nur innerhalb des gleichen Tenants und Mails an Domains, die nicht als "Accepted Domain" des jeweiligen Tenants hinterlegt sind, werden immer über Connectoren nach "Extern" gesendet.

Um die Tenants zu unterscheiden, hat jeder Tenant eine eindeutige ID, welche die Anwender eigentlich nie sehen aber sie findet sich an vielen Stellen, z.B. in den URLS für Teams-Meeting, in diversen PowerShell Ausgaben und eben auch im Exchange SMTP-Header. Verwechseln Sie das Feld nicht mit dem Feld "X-MS-Exchange-CrossTenant-Network-Message-Id", welches im Messagetracking eine andere Bedeutung hat.

CrossTenant-Header

Es gibt mehrere Felder mit dem String "CrossTenant" im Namen und sie haben alle eine Funktion bei der Übermittlung von Mails zwischen zwei Tenants. Hier eine Auswahl:

X-MS-Exchange-CrossTenant-FromEntityHeader    <"HOSTED" oder "HybridOPrem">
X-MS-Exchange-CrossTenant-Id:                 < GUID des Tenant >
X-MS-Exchange-CrossTenant-AuthSource:         < FQDN des Servers, welcher die Authentifizierung geprüft hat >
X-MS-Exchange-CrossTenant-AuthAs: Internal    <"internal" oder "anonymous">
X-MS-Exchange-CrossTenant-MailboxType:        <"HOSTED"   oder "HybridOPrem">

Achten Sie auch hier darauf, dass es Header gibt, die sehr ähnlich klingen, wie z.B.:

X-MS-Exchange-Organization-AuthAs:

Wer setzt das Feld?

Damit stellt sich die Frage, wer das Feld wann setzt. Leider gibt es keinen Artikel von Microsoft, der hier 100% passt aber in den Parametern zu "Set-InboundConnector" von Exchange Online findet sich folgender Abschnitt


Quelle: Set-InboundConnector -CloudServicesMailEnabled https://learn.microsoft.com/de-de/powershell/module/exchange/set-inboundconnector?view=exchange-ps#-cloudservicesmailenabled

Über den Parameter "CloudServicesEnabled" kann ich einer Verbindungen einen Vertrauenslevel geben, wie Exchange die Header, die im Prinzip immer gefälscht sein können, interpretiert. Das Flag kann ich nur bei einem "OnPremises"-Connector setzen aber nicht bei einem Partner Connector. Im Exchange Admin Portal sehen Sie die aktuelle Einstellung hier:

Der Eintrag "Retain internal Exchange email headers" teils der Exchange Header Firewall mit, dass die Gegenseite eine vertrauenswürdiges System ist und die internen Header durchgereicht werden sollten. Hier sehen wie die beiden Header-Präfixe:

X-MS-Exchange-Organization-*
X-MS-Exchange-CrossTenant-*

Der ausgehende Server sendet eventuell Informationen im Header in den Feldern mit "X-MS-Exchange-Organization-*" als Anfang und der empfangende Exchange Server übernimmt diese Werte in "X-MS-Exchange-CrossTenant-*", wenn es eine vertrauenswürdige Verbindung ist.

Auch in die Senderichtung kann ich dies über den gleichen Parameter steuern:


https://learn.microsoft.com/en-us/powershell/module/exchange/set-outboundconnector?view=exchange-ps#-cloudservicesmailenabled

Wobei sich das hier nur auf den Versand der  "X-MS-Exchange-Organization-*" bezieht, die dann wieder beim Empfänger in die "X-MS-Exchange-CrossTenant-*"-Felder übertragen werden.

Die Option ist übrigens nur auf Connectoren vom Typ "OnPremises" nutzbar, wie ein Fehler in der PowerShell z.B. bei einem Partner-Connector direkt liefert:

Also war es an der  Zeit mit zwei Tenants und einem externen Postfach eine Testserie zu starten. Die Ergebnisse basieren auf zwei Tenants in Europa am 8 Januar 2024.

  • Absender: MSXFAQDEV ist 604d9047-44e5-443a-ad8f-98abe5748b0a
  • Empfänger MSXFAQLAB (Empfänger) ist 463e98ae-b7d4-4af2-8ef8-3eda0b4d8a7c
  • Empfänger CARIUS.DE IMAP4-Postfach beim Internetprovider

Ich habe je Konfiguration immer eine Testmail an mehrere Empfänger gesendet.

Ohne Connectoren

Ich habe in meinen "MSXFAQDEV"-Tenant keine Connectoren aktiv gehabt und einfach eine Mail an einen anderen Exchange Online Server und an einen SMTP/IMAP4-Server gesendet. Es wurde kein besonderer "Inbound Connector" in Exchange Online zum Empfang angelegt.

Outbound Connector Empfänger X-MS-Exchange-CrossTenant-*

(default) 

IONOS (IMAP)

Die X-MS-Exchange-CrossTenant-Id sind neben vielen anderen Feldern vorhanden. Da IONOS mit den "X-MS-Exchange-*"-Feldern nicht anfangen kann, wird er sie vermutlich unverändert einfach durchreichen. Die "X-MS-Exchange-CrossTenant-id" entspricht dem Quell-Tenant "MSXFAQDEV"

X-MS-Exchange-CrossTenant-id: 604d9047-44e5-443a-ad8f-98abe5748b0a

Alle "x-ms-exchange-*" Header

x-ms-exchange-senderadcheck: 1
x-ms-exchange-antispam-relay: 0
X-OriginatorOrg: msxfaqdev.onmicrosoft.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-AuthSource: BEZP281MB1864.DEUP281.PROD.OUTLOOK.COM
X-MS-Exchange-CrossTenant-Network-Message-Id: efeba37c-256e-43ef-0b98-08dd31869a4c
X-MS-Exchange-CrossTenant-originalarrivaltime: 10 Jan 2025 14:53:54.0516 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-id: 604d9047-44e5-443a-ad8f-98abe5748b0a
X-MS-Exchange-CrossTenant-mailboxtype: HOSTED
X-MS-Exchange-CrossTenant-userprincipalname: 0Kzx2l8...
X-MS-Exchange-Transport-CrossTenantHeadersStamped: BEXP281MB0182

(default)

Tenant1 (msxfaqlab) 

Wenn Exchange Online die Mails annimmt, dann kommen weitere Header wie "X-MS-Exchange-Transport-CrossTenantHeadersStamped" und "X-MS-Exchange-Transport-CrossTenantHeadersStripped" hinzu, die ein Zeichen sind, dass hier etwas verändert wurde. Wie sehen aber, dass der Inhalt von "X-MS-Exchange-CrossTenant-Id" auf den Zieltenant geändert wurde. Exchange Online vertraut hier also nicht dem Feld, welches der Absender anderes gesendet hat.

X-MS-Exchange-CrossTenant-Id: 463e98ae-b7d4-4af2-8ef8-3eda0b4d8a7c
X-MS-Exchange-Transport-CrossTenantHeadersStamped: BEXP281MB0182
X-MS-Exchange-Transport-CrossTenantHeadersStripped: FR2PEPF000004F1.DEUP281.PROD.OUTLOOK.COM
X-MS-Exchange-Transport-CrossTenantHeadersPromoted: FR2PEPF000004F1.DEUP281.PROD.OUTLOOK.COM

Alle weiteren Felder sind wie erwartet:

x-ms-exchange-senderadcheck: 1
x-ms-exchange-antispam-relay: 0
X-MS-Exchange-AntiSpam-MessageData-Original-ChunkCount: 1
X-MS-Exchange-Transport-CrossTenantHeadersStamped: BEXP281MB0182
X-MS-Exchange-Organization-ExpirationStartTime: 10 Jan 2025 14:54:07.6814 (UTC)
X-MS-Exchange-Organization-ExpirationStartTimeReason: OriginalSubmit
X-MS-Exchange-Organization-ExpirationInterval: 1:00:00:00.0000000
X-MS-Exchange-Organization-ExpirationIntervalReason: OriginalSubmit
X-MS-Exchange-Organization-Network-Message-Id: 802cb635-3b45-4503-8bf5-08dd3186a26b
X-EOPTenantAttributedMessage: 463e98ae-b7d4-4af2-8ef8-3eda0b4d8a7c:0
X-MS-Exchange-Organization-MessageDirectionality: Incoming
X-MS-Exchange-Transport-CrossTenantHeadersStripped: FR2PEPF000004F1.DEUP281.PROD.OUTLOOK.COM
X-MS-Exchange-Transport-CrossTenantHeadersPromoted: FR2PEPF000004F1.DEUP281.PROD.OUTLOOK.COM
X-MS-Exchange-Organization-AuthSource: FR2PEPF000004F1.DEUP281.PROD.OUTLOOK.COM
X-MS-Exchange-Organization-AuthAs: Anonymous
X-MS-Exchange-Organization-SCL: 1
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Jan 2025 14:54:07.6189 (UTC)
X-MS-Exchange-CrossTenant-Network-Message-Id: 802cb635-3b45-4503-8bf5-08dd3186a26b
X-MS-Exchange-CrossTenant-Id: 463e98ae-b7d4-4af2-8ef8-3eda0b4d8a7c
X-MS-Exchange-CrossTenant-AuthSource: FR2PEPF000004F1.DEUP281.PROD.OUTLOOK.COM
X-MS-Exchange-CrossTenant-AuthAs: Anonymous
X-MS-Exchange-CrossTenant-FromEntityHeader: Internet
X-MS-Exchange-Transport-CrossTenantHeadersStamped: BE1P281MB2839

Hinweis: Diese sind die Header einer empfangenen Mail im Zielpostfach. Sie können durch den empfangenden Exchange Server natürlich erweitert und ersetz worden sein.

Das Feld "X-MS-Exchange-CrossTenant-id" listet nur dann den Source-Tenant auf, solange die Mail nicht von Exchange Online selbst empfangen wurde. Exchange Online ersetzt den Inhalt des Feldes X-MS-Exchange-CrossTenant-id immer mit der GUID des Tenants, über den die Mail geroutet wurde. Das macht das Feld natürlich zu einem guten Indikator unabhängig von der Absenderdomain. 3rd-Party-Gateways, die gerne "neben" Exchange Online oder ausgehend vor Exchange Online gesetzt werden, können Sie "ihren" Tenant von fremden Tenants unterscheiden.

OnPremises Connector

Im zweiten Schritt hat mich natürlich interessiert, ob sich dieses Verhalten verändert, wenn die Mail über einen Outbound-Connector vom Typ "OnPremises" versendet wird.. Bei beiden habe ich sichergestellt, dass "CloudServicesMailEnabled" auch auf True ist.

Folgende Ergebnisse habe ich bei einer Mail von DEV zu LAB und CARIUS erhalten. Es wurde kein besonderer "Inbound Connector" in Exchange Online zum Empfang angelegt.

Outbound Connector Empfänger X-MS-Exchange-CrossTenant-*

(default) 

IONOS (IMAP)

Die X-MS-Exchange-CrossTenant-Id sind neben vielen anderen Feldern vorhanden. Da IONOS mit den "X-MS-Exchange-*"-Feldern nicht anfangen kann, wird er sie vermutlich unverändert einfach durchreichen. Die "X-MS-Exchange-CrossTenant-id" entspricht dem Quell-Tenant "MSXFAQDEV"

X-MS-Exchange-CrossTenant-id: 604d9047-44e5-443a-ad8f-98abe5748b0a
X-MS-Exchange-Transport-CrossTenantHeadersStamped: FR3P281MB2943

Alle "x-ms-exchange-*" Header

x-ms-traffictypediagnostic: BEZP281MB1864:EE_|FR3P281MB2943:EE_
x-ms-exchange-senderadcheck: 1
x-ms-exchange-antispam-relay: 0
X-OriginatorOrg: msxfaqdev.onmicrosoft.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-AuthSource: BEZP281MB1864.DEUP281.PROD.OUTLOOK.COM
X-MS-Exchange-CrossTenant-Network-Message-Id: 49d10f49-957c-441b-9daf-08dd398d02ce
X-MS-Exchange-CrossTenant-originalarrivaltime: 20 Jan 2025 19:59:55.6658 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-id: 604d9047-44e5-443a-ad8f-98abe5748b0a
X-MS-Exchange-CrossTenant-mailboxtype: HOSTED
X-MS-Exchange-CrossTenant-userprincipalname: MA2....
X-MS-Exchange-Transport-CrossTenantHeadersStamped: FR3P281MB2943

Durch die Aktivierung von "CloudServicesMailEnabled" habe ich aber keine weiteren Felder gesehen, wenn die Mail einen "Nicht Exchange Server" erreicht har. Vielleicht liegt das auch daran, dass ein fremder Mailserver keinen Support für XOORG und Exchange anbietet?

Leider schreibt Exchange Online nicht den Connectornamen oder dessen GUID für weitere Analysen mit in den Header.

(default)

Tenant1 (msxfaqlab) 

Wenn Exchange Online die Mails annimmt, dann kommen weitere Header wie "X-MS-Exchange-Transport-CrossTenantHeadersStamped" und "X-MS-Exchange-Transport-CrossTenantHeadersStripped" hinzu, die ein Zeichen sind, dass hier etwas verändert wurde. Wie sehen aber, dass der Inhalt von "X-MS-Exchange-CrossTenant-Id" auf den Zieltenant geändert wurde. Exchange Online vertraut hier also nicht dem Feld, welches der Absender anderes gesendet hat.

X-EOPTenantAttributedMessage: 463e98ae-b7d4-4af2-8ef8-3eda0b4d8a7c:0
X-MS-Exchange-Transport-CrossTenantHeadersStamped: BE1P281MB2449
X-MS-Exchange-Transport-CrossTenantHeadersStripped: FR1PEPF00000F0E.DEUP281.PROD.OUTLOOK.COM
X-MS-Exchange-Transport-CrossTenantHeadersPromoted: FR1PEPF00000F0E.DEUP281.PROD.OUTLOOK.COM
X-MS-Exchange-CrossTenant-Id: 463e98ae-b7d4-4af2-8ef8-3eda0b4d8a7c
X-MS-Exchange-Transport-CrossTenantHeadersStamped: FR0P281MB1515

Hinweis: Das Feld "X-OriginatorOrg" habe ich hier nicht gefunden. Exchange Online scheint es eingehend zu entfernen, denn beim Empfang über einen fremden Mailserver ist es enthalten. Hier alle "x-ms-exchange-*" Header.

Hier die Header der Mail im Posteingang

x-ms-exchange-senderadcheck: 1
x-ms-exchange-antispam-relay: 0
X-MS-Exchange-Transport-CrossTenantHeadersStamped: FR3P281MB2943
X-MS-Exchange-Organization-ExpirationStartTime: 20 Jan 2025 20:00:10.0152 (UTC)
X-MS-Exchange-Organization-ExpirationStartTimeReason: OriginalSubmit
X-MS-Exchange-Organization-ExpirationInterval: 1:00:00:00.0000000
X-MS-Exchange-Organization-ExpirationIntervalReason: OriginalSubmit
X-MS-Exchange-Organization-Network-Message-Id: d9525e2b-530b-419e-d3d8-08dd398d0b5a
X-EOPAttributedMessage: 0
X-EOPTenantAttributedMessage: 463e98ae-b7d4-4af2-8ef8-3eda0b4d8a7c:0
X-MS-Exchange-Organization-MessageDirectionality: Incoming
X-MS-Exchange-Transport-CrossTenantHeadersStripped: BE1PEPF0000056D.DEUP281.PROD.OUTLOOK.COM
X-MS-Exchange-Transport-CrossTenantHeadersPromoted: BE1PEPF0000056D.DEUP281.PROD.OUTLOOK.COM
X-MS-PublicTrafficType: Email
X-MS-Exchange-Organization-AuthSource: BE1PEPF0000056D.DEUP281.PROD.OUTLOOK.COM
X-MS-Exchange-Organization-AuthAs: Anonymous
X-MS-Office365-Filtering-Correlation-Id-Prvs: 49d10f49-957c-441b-9daf-08dd398d02ce
X-MS-Exchange-Organization-SCL: 1
X-Microsoft-Antispam: BCL:0;ARA:13230040|35042699022|8096899003;
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jan 2025 20:00:09.9214 (UTC)
X-MS-Exchange-CrossTenant-Network-Message-Id: d9525e2b-530b-419e-d3d8-08dd398d0b5a
X-MS-Exchange-CrossTenant-Id: 463e98ae-b7d4-4af2-8ef8-3eda0b4d8a7c
X-MS-Exchange-CrossTenant-AuthSource: BE1PEPF0000056D.DEUP281.PROD.OUTLOOK.COM
X-MS-Exchange-CrossTenant-AuthAs: Anonymous
X-MS-Exchange-CrossTenant-FromEntityHeader: Internet
X-MS-Exchange-Transport-CrossTenantHeadersStamped: BE1P281MB1875

Auch hier wurde wieder die CoressTenantID durch die ID des Zieltenants ersetzt.

Echte Header dank NDR

Durch einen Tippfehler habe ich aber noch ein Szenario analysieren können. Wenn eine Mail durch das Ziel angenommen wird, dann kann auch das Zielsystem die Header verändern, ehe ich diese als Benutzer in meinem Postfach sehe. Als ich aber von DEV zu LAB eine Mail gesendet habe und der Empfänger war in LAB nicht bekannt,, lieferte mein Exchange Tenant mir eine Unustellbarkeitsmeldung samt den bis dahin aufgelaufenen Headern zurück.

Diese Information finde ich interessant, denn damit habe ich die ausgehenden Header erhalten, die Exchange Online an ein anderes Exchange online mit aktiven XOORG erhalten.

x-ms-exchange-senderadcheck: 1
x-ms-exchange-antispam-relay: 0
x-ms-exchange-antispam-messagedata-chunkcount: 1
X-OriginatorOrg: msxfaqdev.onmicrosoft.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-AuthSource: BEZP281MB1864.DEUP281.PROD.OUTLOOK.COM
X-MS-Exchange-CrossTenant-Network-Message-Id: 76c73e0e-f51a-46c4-a38d-08dd39893a6c
X-MS-Exchange-CrossTenant-originalarrivaltime: 20 Jan 2025 19:32:50.9779 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-id: 604d9047-44e5-443a-ad8f-98abe5748b0a
X-MS-Exchange-CrossTenant-mailboxtype: HOSTED
X-MS-Exchange-CrossTenant-userprincipalname: KDByxr
X-MS-Exchange-Transport-CrossTenantHeadersStamped: FR5P281MB4461

Es ist gut zu sehen, dass der ausgehende Exchange Server schon die "X-MS-Exchange-CrossTenant-*"-Felder setzt abre hier die CrossTenant-ID noch dem Quell-Tenant entspricht.

Es ist also der empfangende Server, der die zusätzlichen Zeilen addiert 

Interne Mail

Nur aus Neugier habe eine interne Mail von einem Postfach in MSXFAQDEV zum anderen Postfach in MSXFAQDEV gesendet. Interessant war auch hier, dass es die "X-MS-Exchange-CrossTenant-*"-Felder gegeben hat. Das hätte ich so nicht erwartet.

From: "user1"
To: "user2" 
Subject: Testmail Intern zu Intern
X-MS-Exchange-Organization-SCL: -1
X-MS-Exchange-Organization-MessageDirectionality: Originating
X-MS-Exchange-Organization-AuthSource: AM0PR04MB5362.eurprd04.prod.outlook.com
X-MS-Exchange-Organization-AuthAs: Internal
X-MS-Exchange-Organization-AuthMechanism: 04
X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted
X-MS-Exchange-CrossTenant-Id: 604d9047-44e5-443a-ad8f-98abe5748b0a 
X-MS-Exchange-CrossTenant-AuthSource: AM0PR04MB5362.eurprd04.prod.outlook.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-MailboxType: HOSTED
 

Aber es gibt zusätzliche Felder, wie z.B. "X-MS-Exchange-Organization-AuthMechanism", die beim Verlassen der Mail aus dem Tenant an einen Tenant oder ein fremdes Mailsystem nicht mehr vorhanden sind. Hier scheint es eine ausgehende Header-Firewall in Exchange Online zu geben, um solche vielleicht sensiblen Informationen nicht öffentlich werden zu lassen.

Inbound Connector "OnPremises"

Zuletzt bleibt noch die Frage, wie eine Mail im Ziel ankommt, wenn Sie von einem "OnPremises" empfangen wird. Ich wollte daher im Zieltenant MSXFAQLAB einen eingehenden OnPremises Connector mit der Domain "mail.protection.outlook.com" anlegen. Das blockiert aber Microsoft.

Ich kann damit keine direkte Verbindung zwischen zwei Tenants als "Partner" anhand des Zertifikats definieren und eine Konfiguration über die IP-Adresse macht keinen Sinn, weil dann zur Tenant Attribution die FROM-Domain genutzt würde.


Quelle: Office 365 Message Attribution https://techcommunity.microsoft.com/blog/exchange/office-365-message-attribution/749143  

Die Mail würde dann wieder zum absendenden Tenant zugeordnet. Es gibt keinen "Regelfall", dass eine Mail von extern mit einen sinnvollen Wert in "X-MS-Exchange-CrossTenant-Id" gefüllt ist.

"X-MS-Exchange-CrossTenant-Id" nicht "fälschbar"

Ich habe natürlich auch versucht den Wert im Header "X-MS-Exchange-CrossTenant-Id" zu setzen. Dazu habe ich per SMTPAUTH eine Mail mit vordefiniertem Header als authentifizierter Benutzer eingeliefert und Exchange Online versenden lassen. Das Ergebnis war deutlich. Anscheinend überschreibt schon der eingehende Exchange Server dieses Feld mit der TenantID des empfangenden Exchange Tenant. Meine gefälschte ID wurde weder bei einem weiteren Routing nach extern noch bei einer Zustellung an Postfächer im gleichen Tenant durchgereicht. Es wurde immer die ID ersetzt.

Auch ein versuch das Feld per Transport-Regel zu entfernen wirkte nicht. Ich denke, dass Exchange diese Header auf der letzten Station beim Versand und nach der Verarbeitung von Transportregeln setzt.

Daraus ergibt sich, dass im Feld "X-MS-Exchange-CrossTenant-Id" immer die ID des absenden verantwortlichen Tenants zu finden ist, egal ob der Empfänger intern, ein externer Partner oder per "OnPremises"-Connector ein vertrauenswürdiger Server ist.

Damit kann auch eine "Shared 3rd Party Gateway-Lösung" (EXO mit 3rd Party Service) diese Information nutzen, um den einliefernden Tenant korrekt zu klassifizieren.

Das gilt natürlich nur, wenn die Mail von Exchange Online kommt. Jedes Gateway sollte das vom entfernten Mailserver gelieferte Zertifikat prüfen, ob es den Namen "mail.protection.outlook.com" einer vertrauenswürdigen RootCA enthält. Nur dann ist Exchange Online der Absender und der Header vertrauenswürdig. Notfalls könnte man sich auch auf die IP-Adressen von Exchange Online beschränken.

Weitere Links