Cross-tenant sync - Details
Diese Seite beschäftigt sich mit den Hintergründen und Feinheiten zum Cross-tenant sync und der Cross-tenant sync - Konfiguration.
Testserie
Wer eine Synchronisation betreibt, muss auch mit den Konflikten umgehen. ich hatte den Sync auf "automatisch" gestellt, womit er aktuell alle 40 Min läuft. Änderungen brauchen daher immer einige Zeit.
Denken Sie daran, dass "Cross-tenant Sync" keine Änderungen im Ziel sucht oder erkennt und entsprechend nicht korrigiert.
Die Suche in der Quelle basiert auf Änderungen, d.h. der Provisioning-Prozess sucht seit dem letzten Lauf geänderte Objekte, ähnlich der lokalen Windows AD DirsyncAPI oder über USN oder Last Modified
Einen "FullSync können Sie pro Objekt mit einem manuellen "Provisioning on demand" oder durch einen Neustart des Synchronisation auslösen. Verändert aber dann die Ergebnisse im Unterschied zu einem "Delta"-Sync des Regelbetriebs.
Normalerweise legt der Sync "MemberUser" an. Ich habe in meinem Lab dies angepasst, dass er "Guest"-User anlegt.
Hier meine Testergebnisse (Stand Juni 2023):
Testfall | Synchronisiert? | Status | Verhalten |
---|---|---|---|
Regulärer Testuser Typ= Member |
Ja | OK |
Der reguläre Benutzer der Quelle wird natürlich im Ziel angelegt. Da ich den "UserType" auf "Guest" gestellt habe, ist es ein Gast im Ziel. |
Regulärer Testuser Typ= Gast |
Ja | OK |
Aber auch ein regulärer Benutzer vom Type "Guest" aus der Quelle wird im Ziel angelegt. Da ich den "UserType" auf "Guest" gestellt habe, ist es ein Gast im Ziel. |
Regulärer Testuser ohne AzureAD P1-Lizenz |
Ja | OK |
Wird repliziert.
Anscheinend prüft "Cross-tenant
Sync" nicht, ob das
Quellobjekt auch eine
AzureAD P1-Lizenz zugewiesen
bekommen hat. |
Regulärer Testuser mit "onmicrosoft.com UPN" |
Ja | OK |
Der "Cross-tenant Sync"
ist nicht auf legacy-Domains
beschränkt. Auch
onmicrosoft.com-Konten
kommen mit |
Konflikt mit bestehendem Gast |
Nein, erwartet |
OK |
Ich habe im Ziel einen Benutzer angelegt und ihm die Mailadresse eines Benutzers in der Quelle gegeben.
Beim nächsten Export sollte es zu einem Konflikt kommen. Das konnte im Provisioninglog auch nachvollzogen werden.
"Cross-tenant sync" nutzt zwar das Feld "Mail" nicht zum matchen aber erkennt Konflikte und blockiert. Solche Konflikte muss der Admin der Quelle manuell lösen, indem er den Admin im Ziel informiert. |
Gast-Benutzer mit LiveID in der Quelle |
Nein, erwartet | OK |
Wie erwartet wurde ein Gast-Konto in der Quelle mit einer LiveID wird natürlich nicht synchronisiert, auch wenn er im Scope eingeschlossen ist. |
Gast-Benutzer mit ExternalAzureAD |
Nein, erwartet |
OK |
Wie erwartet wurde ein Gast-Konto in der Quelle mit einer externen Identitäten natürlich nicht synchronisiert. Identityprovider ist carius.onmicrosoft.com |
Gast-Benutzer eines anderen Tenant in der Quelle |
Nein, erwartet |
OK |
Ein Gast-Konto in der Quelle wird ebenfalls nicht synchronisiert, auch wenn er im Scope eingeschlossen ist. Das ist aber so erwartet. |
Regulärer Testuser Delete1 Typ= Member aus Gruppe entfernt |
Ja |
OK |
Konto wird bei aktivierter
"Delete-Option" im Ziel in
den Papierkorb verschoben. |
Benutzer in der Quelle gelöscht |
Ja |
OK |
Wenn "Crosstenant Sync" den "Delete" in der Quelle erkennt und Sie "Delete" als Option im Sync aktiviert haben dann wird das Objekte auch im Ziel gelöscht.
Genaugenommen erkennt er wohl das "Soft Delete" als Change. |
Benutzer manuell in der Quelle mittels "Hard delete" gelöscht" |
Ja |
OK |
Natürlich habe ich nun auch einen Test-User in der Quelle komplett gelöscht. Er ist also nicht mehr "softDelete=True". Der nächste Lauf findet dennoch das nicht mehr vorhandene Objekt und löscht es im Ziel.
|
Benutzer im Ziel gelöscht |
|
Warn |
Wenn der Administrator im Ziel-Tenant das durch den Sync angelegte Konto löscht, dann landet es im Papierkorb und nach 30 weiteren Tagen ist des komplett weg. "Cross-tenant sync" in der Quelle beschwert sich zwar leise aber holt das Objekt beim regulären Sync-Lauf nicht mehr zurück. Erst wenn das Objekt in der Quelle geändert wird, erkennt der Sync-Prozess dies und holt das Konto zurück.
Der Administrator in der Quelle kann aber jederzeit einen "FullSync" oder ein "On demand provisioning" anstoßen, damit das Objekt wieder neu angelegt oder aus Papierkorb zurückgeholt und aktualisiert wird. |
Neusync eines im Ziel "soft deleted" Users |
|
OK |
Durch einen FullSync wird ein Konto aus dem Papierkorb reaktiviert.
Manchmal funktioniert es aber wohl nicht. Dann muss der Admin im Ziel das Objekt wieder herstellen.
|
Neusync eines im Ziel "hard deleted" Users |
Ja |
OK |
Durch einen manuell auszulösenden FullSync wird das Objekt im Ziel neu angelegt. Es muss aber vom Administrator im Ziel wieder komplett neu berechtigt werden. |
Änderungen der Regeln -> Fullsync? |
Ja |
OK |
Änderungen an den Sync-Regeln triggern einen neuen FullSync. |
Gruppen |
Nein |
OK |
Aktuell synchronisiert "Cross-tenant Sync" keine Gruppen. Sie können aber die Mitgliedschaft in einer Gruppe als Scope nutzen. |
Partnerschaft gelöscht |
Nein |
Warn |
Der letzte Test ist das Löschen der "Cross-tenant Sync"-Konfiguration in der Quelle. Ich entferne also nicht erst alle Benutzer aus den Scope und warte einen letzten Sync ab, sondern lösche direkt die Konfiguration. Die Objekte im Ziel sind unverändert verblieben. |
Matching und Linking
Bei jedem Verzeichnisabgleich muss überlegt werden, wie die von der Quelle im Ziel angelegte Objekte wiedergefunden wrden. Insbesondere könnte der Administrator im Ziel das Objekt ja umbenennen, löschen o.ä. Bei einem klassischen Active Directory gibt es ja sogar mehrere Domains und OUs, in die solche Dirsync-Objekte verlagert und damit aus dem Write-Scope des Sync-Prozess verschwinden. Im AzureAD gibt es keine "OU" und nicht mal Domains, sondern es ist quasi eine flache "Userliste".
Laut Microsoft findet ein Matching statt, aber beschreibt nicht, welche Felder per Default genutzt werden.
Quelle: Auf What is cross-tenant synchronization? - Object types
https://learn.microsoft.com/en-us/azure/active-directory/multi-tenant-organizations/cross-tenant-synchronization-overview#object-types
Allerdings können Sie dies auch einfach in der Konfiguration einsehen. Bei der Zuordnung der Attribute können Sie auch vorgeben. welche Werte nach der Konvertierung ins Ziel verbunden mit einer Priorität dafür genutzt werden
In der Standardkonfiguration wird nur die "NetID" dazu genutzt und weder das Feld "mail" noch "UserPrincipalname", die sich z.B. bei Heirat/Scheidung/Umfirmierung ja auch ändern können.
- User profile attributes
https://learn.microsoft.com/en-us/azure/active-directory-b2c/user-profile-attributes
Interessant fand ich im ProvisioningLog aber auch, dass es ein Feld im Ziel gibt, welches in der Liste der Felder nicht aufgeführt ist.
Anscheinend merkt sich "Cross-tenant sync" im Feld "Source" im Ziel, woher das Element gekommen ist.
Über die AzureAD oder AzureADPreview-PowerShell kommt man aber ebenso wenig an das Feld wie per Azure Portal. Es wäre doch nett, wenn ein Admin im Ziel anhand dieses Feldes einen Filter oder Ansicht erhalten könnte.
Auch eine direkte Abfrage per Graph (1.0 und beta) lieferte genau diese Feld nicht.
- Graph: Get-user
https://learn.microsoft.com/en-us/graph/api/user-get?view=graph-rest-1.0&tabs=http
https://learn.microsoft.com/en-us/graph/api/user-get?view=graph-rest-beta&tabs=http - user resource type
https://learn.microsoft.com/en-us/graph/api/resources/user?view=graph-rest-1.0 - What is cross-tenant synchronization? - Object types
https://learn.microsoft.com/en-us/azure/active-directory/multi-tenant-organizations/cross-tenant-synchronization-overview#object-types - How to access Source Property on Azure AD user profile?
https://social.msdn.microsoft.com/Forums/azure/en-US/60b437c7-4bb5-4985-ac30-365eb6e46a7a/how-to-access-source-property-on-azure-ad-user-profile?forum=WindowsAzureAD - Understand how provisioning integrates
with Azure Monitor logs
https://learn.microsoft.com/en-us/azure/active-directory/app-provisioning/application-provisioning-log-analytics
FullSync/DeltaSync
Wenn Sie mit ADSync / AADConnect zu tun haben, dann kennen Sie schon den Unterschied zwischen "Differenz/Incremental-Sync" und einem kompletten "Full/Initial-Sync". Ein kompletter Abgleich findet in der Regel zu Beginn statt während danach es speziell in größeren Umgebungen zu teuer ist, immer wieder alle Elemente zu lesen und zu schreiben.
Von Vorteil ist es, wenn die Quelle schon die Möglichkeit zur Abfrage von Änderungen bietet. Das kann z.B. das Active Directory entweder über USNs (Get-USNChanges) oder DirSyncAPI (GET-ADChanges). Die Anfrage von "USNChanged" braucht weniger Rechte aber liefert nicht alle Felder und könnte bei Löschen von Objekten in der Quelle dies nicht zuverlässig erkennen.
Auch das AzureAD kennt wohl den ähnlichen Ansatz denn "Cross-tenant sync" kann schon zuverlässig die Änderungen in der Quell als auch Löschungen erkennen und die Felder gemäß der Konfiguration in das Ziel übertragen.
- Azure AD synchronization API overview
https://learn.microsoft.com/en-us/graph/api/resources/synchronization-overview?view=graph-rest-beta
Eine Änderung an der Konfiguration, z.B. des Scope kann auch einen FullSync anstoßen.
Auch die Änderungen von Mappings startet die Synchronisation neu.
Natürlich kann ich jederzeit z.B. über Azure Portal den Sync anhalten, starten oder gleich neustarten.
Der druck auf "Restart Provisioning" entspricht eine "Stop provisioning" mit nachfolgendem "Start provisioning". Der Druck auf "Stop/Start" ändert auch den Schieber in der Konfiguration.
Überlappende Sync-Jobs
AzureAD verhindert nicht, dass Sie mehrere Synchronisierungsjobs in einer Quelle zum gleichen Ziel anlegen.
Das mag auf den ersten Blick unsinnig erscheinen, aber es gibt schon Konstellationen, bei denen z.B. in der Quelle verschiedene Benutzerkreise im gleichen Ziel mit anderen Feldern gefüllt werden sollen. Entsprechend haben ich in jeder Konfiguration ein Mapping addiert, welches in das Feld "Company" einen eindeutigen String schreibt.
Entsprechend war ich dann mal gespannt, welche Information im Ziel ankommt und welche Konflikte es gibt.
Testfall | Synchronisiert? | Status | Verhalten |
---|---|---|---|
Initiale Einrichtung |
Ja | OK |
Der erste Job legt den Benutzer an und der zweite Job erkennt ein "RedundantExport
|
User aus Scope |
Ja |
Warn |
Wenn ich einen Benutzer aus SYNC2 aus dem Scope nehme, dann löscht er diesen im Ziel, obwohl der andere Sync-Job diesen auch synchronisieren würde. SYNC1 bemerktt dies nicht!, d.h. es erfolgt kein Reexport. Lösung: Manuell ein "On demand Provisioning" für das Objekt machen oder den Sync neustarten. |
Feldkonflikt |
Last Write Wins |
Warn |
Normalerweise gibt es den Fall nicht, dass das gleiche Objekt durch zwei Syncs in den gleichen Zieltenant repliziert wird. Ich habe es dennoch absichtlich "falsch" gemacht und zusätzlich ein Feld abweichend übertragen Wenn sich in der Quelle etwas ändert, erkennen beide Sync-Jobs diese Änderungen. Letztlich gewinnt der zuletzt ausgeführte Job. |
Sync Fehler bei Konflikt
Einen Fehler konnte ich produziere, der nicht direkt zu sehen ist. Ich habe einige Synchronisationen getestet und in dem Zuge auch einen Benutzer wieder im Ziel gelöscht und dann die Mailadresse einem anderen Benutzer gegeben. Ich habe auf einen Fehler im ProvisioningLog gehofft, aber der kam nicht. im Ziel einen Benutzer angelegt, der die gleiche Mailadresse wie ein danach zu synchronisierendes Konto hat:
Der nächste Lauf hat aber folgende Meldung geliefert:
Angeblich findet "Cross-tenant Sync" einen passenden Benutzer im Ziel mit der angegeben GUID. Schade nur, dass ich den Benutzer nicht im AzureAD sehe und auch per PowerShell nicht finden kann.
Selbst nach einigen Stunden Replikation hat sich hier nichts gebessert. Ich habe dann ein "Provisioning on demand " für den Benutzer gestartet und da war die Aussage dann doch wieder eindeutig:
Wichtig: Laut meiner Beobachtung landen "Provisioning on demand"-Aktionen aus mir unverständlichen Gründen nicht im Provisoininglog der Quelle.
Sync-Problem mit Delete
Einen weiteren Fall habe ich entdeckt, bei der ein Sync eines Objekts nicht mehr funktioniert hat. Der Prozess war:
- Benutzer in der Quelle aus dem Sync rausnehmen
- Das Objekt wird im Ziel dann nicht gelöscht (?)
- Admin im Ziel löscht das Objekt nach SoftDelete"
- Quelle nimmt Objekt wieder in den Sync auf
- Sync meldet "alles ok" aber Objekt bleibt in Soft-Delete State
Gelöst habe ich dies dann einfach, indem ich die Synchronisation über einen "Restart" neu gestartet habe:
Das entspricht wohl einem "Full Sync". Ich vermute mal, dass auch "Cross-tenant sync" mit einem Metaverse arbeitet und eben nicht direkt die Quelle und Ziel anspricht, sondern zumindest beim Schreiben ins Ziel die Daten mit einem Cache oder Connector Space vergleich.
Sync-Problem mit Undelete
Ausgangssituation war ein Cloud-Only-Benutzer in der Quell, welcher durch einen Sync-Job in das Ziel kopiert wurde. Dann hat der Administrator im Ziel das Objekt gelöscht, war er ja tun kann. Die nachfolgenden Syncs haben das Objekt nicht wieder restauriert. Um die Wiederherstellung zu erzwingen, haben ich dann in der Quelle den "Displaynamen" des Objekts geändert. Beim nächsten Lauf hat "Cross-tenant sync" dann das Objekt wieder aus dem Papierkorb geholt. Laut Protokoll hat er auch den Displaynamen korrekt gelesen
Und sogar ein Update gemacht:
Allerdings ist im Ziel diese Änderung nicht angekommen. Eventuell haben sich der "Undelete" und der update unglücklich überschnitten. Ein Blick in das Autit-Log im Ziel zeigt auch, was passiert ist:
ich habe gegen 07:20 den Benutzer gelöscht und der nächste Sync startete um 7:30. Zuerst wurde der Benutzer per "Restore user" zurück geholt und dann mit einem Update-user folgende Informationen geschrieben:
Für eine kurze Zeit war alles wir erwartet aber um 7:30:52, also ca.14 Sekunden später erfolgte ein "User Update" durch das "Microsoft Substrate Management" und schreibt den alten Wert wieder hinein
Den Grund konnte ich dazu noch nicht ausfindig machen und ich werde bei Gelegenheit den Test wiederholen. Ein manueller FullSync oder eine erneute Änderung in der Quelle hat die Unstimmigkeit wieder korrigiert. Schön ist es aber nicht.
Quarantäne
Natürlich wollte ich auch sehen, wie Fehler bei der Konfiguration sich auswirken. Ich habe dazu im Ziel einfach die Checkbox deaktiviert, mit der ich der Quelle erlaube die Objekte in meinem Tenant anzulegen:
Beim nächsten Sync hat der Prozess dies gemerkt und den Prozess in Quarantäne gestellt. Die Fehlerbeschreibung ist selbsterklärend. Anscheinend ändert dies aber auch das Intervall von 40 Minuten auf 2h40Min.
Der Link in der Beschreibung wird auf einen Artikel in der Microsoft Dokumentation umgeleitet der dem Fehler schon recht nahe kommt.
- Symptom: Testverbindung schlägt mit
AzureDirectoryB2BManagementPolicyCheckFailure
fehl
aka.ms/TroubleshootingCrossTenantSyncPolicyCheck
https://learn.microsoft.com/de-de/azure/active-directory/multi-tenant-organizations/cross-tenant-synchronization-configure#symptom---test-connection-fails-with-azuredirectoryb2bmanagementpolicycheckfailure
Einschätzung
Ich habe auf dieser Seite viele Tests und deren Ergebnisse dokumentiert, wie ich sie mit Cross-tenant sync" vom Stand Juni 2023 in zwei europäischen Tenants nachstellen konnte. Sie sehen aber auch, dass es durchaus Fälle gibt, in denen die Funktion nicht "selbstheilend" ist. Insbesondere wenn der Administrator im Ziel-Tenant an den per Sync verwalteten Identitäten etwas verändert, kann der Abgleich aus dem Tritt kommen. Die Quelle ist zwar für die konfigurierten Attribute autoritativ aber nicht dominant, d.h. Sie überschreibt keine Werte im Ziel, um sie auf die Werte der Quelle abzugleichen.
Erst wenn Sie in der Quelle an dem Objekt etwas ändern, sie ein "Provisioning on Demand" oder einen FulSync starten, dann liest der Prozess die Daten in der Quelle aus und überschreibt die Einstellungen im Ziel. Weitere Besonderheiten müssen Sie beim Thema "Löschen" beachten, sei es bei Objekten in der Quelle, im Ziel oder der Synchronisation.
Weitere Links
- Cross-tenant sync
- Cross-tenant sync - Konfiguration
- Cross-tenant sync - Details
- Azure AD synchronization API overview
https://learn.microsoft.com/en-us/graph/api/resources/synchronization-overview?view=graph-rest-beta - Generally Availability - Cross-tenant
synchronization
https://learn.microsoft.com/en-us/azure/active-directory/fundamentals/whats-new#generally-availability---cross-tenant-synchronization - What is cross-tenant synchronization?
https://learn.microsoft.com/en-us/azure/active-directory/multi-tenant-organizations/cross-tenant-synchronization-overview - What is cross-tenant synchronization? :
License requirements
https://learn.microsoft.com/en-us/azure/active-directory/multi-tenant-organizations/cross-tenant-synchronization-overview#license-requirements - Overview: Cross-tenant access with Azure AD External Identities
https://learn.microsoft.com/en-us/azure/active-directory/external-identities/cross-tenant-access-overview - B2B direct connect overview
https://learn.microsoft.com/en-us/azure/active-directory/external-identities/b2b-direct-connect-overview - What is a multi-tenant organization in Azure Active Directory?
https://learn.microsoft.com/en-us/azure/active-directory/multi-tenant-organizations/overview - Mergers, Acquisitions and Day 1 – Azure AD Cross-Tenant Synchronization
https://shehanperera.com/2023/03/24/aad-cross-tenant-sync/ - Configure cross-tenant access settings for B2B collaboration
https://learn.microsoft.com/en-us/azure/active-directory/external-identities/cross-tenant-access-settings-b2b-collaboration - Billing model for Azure AD External
Identities
https://learn.microsoft.com/en-us/azure/active-directory/external-identities/external-identities-pricing - Eight things you should know about Azure
AD Cross-tenant Synchronization
https://dirteam.com/sander/2023/06/02/eight-things-you-should-know-about-azure-ad-cross-tenant-synchronization/ - Use Cross-Tenant Synchronization in
Azure AD to Experience Seamless
Collaboration
https://o365reports.com/2023/04/12/use-cross-tenant-synchronization-in-azure-ad/ - Introducing Azure AD Cross-Tenant Synchronization
https://community.dynamics.com/business/b/stefanodemiliani/posts/introducing-azure-ad-cross-tenant-synchronization
https://www.powercommunity.com/introducing-azure-ad-cross-tenant-synchronization/
John Savill's Technical Training:
Azure AD Cross-Tenant Sync
https://www.youtube.com/watch?v=z0J5kteqUVQ