Graph mit Shared Mailbox
Wenn sie mit Microsoft Graph auf eine Shared Mailbox zugreifen wollen, dann reicht es nicht, wenn Sie Vollzugriff auf das Postfach haben. Hier eine kleine Testserie.
Vorbereitung
Um das Thema vorzubereiten, habe ich in meinem Test/Lab-Tenant folgendes konfiguriert:
- User1 mit Exchange Lizenz
Ich habe dazu einfach mein vorhandenes Admin-Konto genutzt und ihm eine Exchange Online Lizenz gegeben, damit er ein Postfach hat - User2 ohne Exchange Lizenz
Zur Gegenprobe habe ich auch einen zweiten Benutzer, der kein Exchange Postfach hat - Shared Mailbox 1 mit "Full Acccess" für MailboxUser1 und User2
- Shared Mailbox 2 ohne "Full Acccess" für MailboxUser1 und User2
Mit den vier Objekten kann ich nun sechs Szenarien durchspielen.
Eigene Mailbox | SharedMailbox mit Full Access | SharedMailbox ohne Full Access | |
---|---|---|---|
User1 mit Exchange Lizenz | noch nicht getestet |
noch nicht getestet |
noch nicht getestet |
User1 ohne Exchange Lizenz | noch nicht getestet |
noch nicht getestet |
noch nicht getestet |
Tests mit Graph Explorer
Es gibt mehrere Wege, die GraphAPI zu nutzen. Anstatt nun aber erst ein PowerShell-Skript zu entwickeln oder die MGGraph-PowerShell zu starten, habe ich mich für die GUI-Version mittels "Graph Explorer" (https://aka.ms/ge) entschieden. Ich habe mich hier mit dem User angemeldet und erst einmal mein Postfach geöffnet:
GET https://graph.microsoft.com/v1.0/me/messages
Das sollte bei allen Benutzern mit einem Postfach gehen, wenn der Administrator oder sie selbst die Zustimmung (Consent) gegeben haben, dass Sie den Graph Explorer überhaupt nutzen können.
Den gleichen Schritt habe mit dem Benutzer ohne Exchange Lizenz gemacht aber bin gar nicht weiter gekommen. Ich konnte zwar problemlos "mein Profi" anzeigen aber beim Zugriff auf ein Postfach hat er eine Reauthentication erfordert und selbst dann blieb es bei der Fehlermeldung:
{ "error":{ "code":"ReauthenticationRequired","message":"Reauthentication required.", "innerError":{"oAuthEventOperationId":"<guid>","oAuthEventcV":"r4yDvOpvWZN8gXSHPX9GnA.1.1", "errorUrl":"https://aka.ms/autherrors#error-InsufficientClaims", "requestId":"<guid>", "date":"2024-12-11T08:44:44" } } }
Das war aber noch erwartet und ich konnte die ersten beiden Felder in meiner Tabelle schon einmal beantworten.
|
Eigene Mailbox |
SharedMailbox mit Full Access |
SharedMailbox ohne Full Access |
---|---|---|---|
User1 mit Exchange Lizenz |
OK mit Graph |
Noch nicht getestet |
Noch nicht getestet |
User2 ohne Exchange Lizenz |
Fail mit Graph { "error": { "code": "MailboxNotEnabledForRESTAPI", "message": "The mailbox is either inactive, soft-deleted, or is hosted on-premise." } } |
Noch nicht getestet |
Noch nicht getestet |
Der Benutzer ohne Lizenz kann natürlich auch nicht auf dein Postfach zugreifen. Allerdings kann ich den Benutzer ohne Postfach auch nicht auf eine Shared Mailbox berechtigen, da das Exchange Admin Center das Objekt überhaupt nicht kennt. Das ist ein Unterschied zu OnPremises, wo ich durchaus die Rechte basierend auf der SID auch an Konten ohne Postfach vergeben kann.
Zugriff auf Shared Mailbox
Kommen wir nun zu den Shared Mailboxen. Über die Mailadresse der SharedMailbox kann ich mir die URL für den Zugriff über Graph herleiten, Die erste Mail bekomme ich mit:
https://graph.microsoft.com/v1.0/users/sharedmb1@msxfaq.net/messages?$top=1
Der Zugriff auf das Shared Postfach hat aber erst einmal in allen vier Fällen nicht funktioniert. Es kam immer ein Access Denied
Zugriff per Graph | Eigene Mailbox | SharedMailbox mit Full Access | SharedMailbox ohne Full Access |
---|---|---|---|
User1 mit Exchange Lizenz |
OK |
Access Denied |
Access Denied { "error": { "code": "ErrorAccessDenied", "message": "Acccess is denied. Check credentials and try again." } } |
User2 ohne Exchange Lizenz |
Fail { "error": { "code": "MailboxNotEnabledForRESTAPI", "message": "The mailbox is either inactive, soft-deleted, or is hosted on-premise." } } |
Access Denied { "error": { "code": "ErrorAccessDenied", "message": "Acccess is denied. Check credentials and try again." } } |
Access Denied { "error": { "code": "ErrorAccessDenied", "message": "Acccess is denied. Check credentials and try again." } } |
Das hatte mich nun erst mal überrascht, da ich ja per Outlook oder OWA schon zumindest auf die Shared Mailbox1 zugreifen konnte, auf der ich mit "FullAccess" berechtigt war. Der Zugriff per Outlook oder OWA war möglich.
Zugriff mit Outlook | Eigene Mailbox | SharedMailbox mit Full Access | SharedMailbox ohne Full Access |
---|---|---|---|
User1 mit Exchange Lizenz | OK |
OK mit Outlook |
Access Denied |
User2 ohne Exchange Lizenz | Fail |
Access Denied |
Access Denied |
Allerdings natürlich nur für den Benutzer mit einer Exchange Lizenz auf die SharedMailbox mit Full Access.
Consent Mail.Read.Shared/Mail.ReadWrite.Shared
Die Fehlermeldung hat mich aber auf den Weg geführt, dass mit die Berechtigungen zur Nutzung des "Shared Zugriff" fehlen. Über die Konto-Optionen oben rechts im Graph Explorer kann ich "Consent to permissions" aufrufen und wenn ich hier nach "shared" suche, finde ich alle Gprah Permissions.
Hier habe ich gesehen, dass mit die beiden Berechtigungen "Mail.Read.Shared" und "Mail.ReadWrite.Shared" fehlen. In meinem Labor konnte ich den Consent als User mir selbst geben. Das kann ihr Administrator aber abgeschaltet haben oder er möchte es Zentral für den gesamten Tenant steuern. Die aktualisierten Berechtigungen kann ich im AccessToken sehen:
Nachdem ich mir auch diese Berechtigungen gegeben habe, konnte ich problemlos auf die Shared Mailbox zugreifen
Ich habe den Test für die anderen drei Szenarien wiederholt:
Zugriff per Graph | Eigene Mailbox | SharedMailbox mit Full Access | SharedMailbox ohne Full Access |
---|---|---|---|
User1 mit Exchange Lizenz |
OK |
Ok |
Der Zugriff wurde verweigert, da ich zwar die Graph-Rechte habe aber den Ordner aufgrund fehlenden FullAccess nicht sehe { "error": { "code": "ErrorFolderNotFound", "message": "The specified folder could not be found in the store." } } |
User2 ohne Exchange Lizenz |
Fail |
Der Zugriff wurde verweigert, da ich zwar die Graph-Rechte habe aber den Ordner aufgrund fehlenden FullAccess nicht sehe. { "error": { "code": "ErrorItemNotFound", "message": "The specified object was not found in the store., Default folder AllItems not found." } } |
Der Zugriff wurde verweigert, da ich zwar die Graph-Rechte habe aber den Ordner aufgrund fehlenden FullAccess nicht sehe { "error": { "code": "ErrorFolderNotFound", "message": "The specified folder could not be found in the store." } } |
Interessant finde ich schon, dass hier der Zugriff durch einen Benutzer ohne Exchange Lizenz und damit ohne Postfach nicht den gleichen Fehlercode: "MailboxNotEnabledForRESTAPI" zurückgibt sondern einmal einen "ErrorItemNotFound" und einmal einen "ErrorFolderNotFound".
Ich benötige für einen erfolgreichen Zugriff auf eine Shared Mailbox mittels Microsoft Graph ein Postfach, die Postfachrechte als auch die Graph-Permissions.
Damit kann ein Administrator sehr granular einstellen, mit welcher Applikation ein Anwender überhaupt diesen Zugriff durchführen kann.
Message lesen
Mit meinem User1, der sowohl "Full Access" auf das Postfach als auch die Graph-Rechte hatte, habe ich mir die ID der ersten Mail besorgt:
Die ID ist zwar "BASE64"-Codiert und auch decodierbbar, aber es ist keine lesbare GUID o.ä. Mit der ID lässt sich dann eine URL zur der Nachricht erstellen und diese abrufen.
- List messages
https://learn.microsoft.com/en-us/graph/api/user-list-messages - Get message
https://learn.microsoft.com/en-us/graph/api/message-get
Der Explorer hat kein Problem sowohl die MAPI-Mail als auch die MIME-Mail zu erhalten.
Den Test habe ich wieder mit allen vier Szenarien durchprobiert aber das Ergebnis können Sie vermutlich vorhersehen. Allerdings haben sich die Fehlercodes verändert.
Zugriff per Graph | Eigene Mailbox | SharedMailbox mit Full Access | SharedMailbox ohne Full Access |
---|---|---|---|
User1 mit Exchange Lizenz |
OK |
OK |
Der Zugriff wurde verweigert, da die ID nichte zum Postfach passt { "error": { "code": "ErrorFolderNotFound", "message": "The specified folder could not be found in the store." } } |
User2 ohne Exchange Lizenz |
Fail |
Der Zugriff wurde verweigert, da ich zwar die Graph-Rechte habe aber den Ordner aufgrund fehlenden FullAccess nicht sehe. { "error": { "code": "ErrorAccessDenied", "message": "Access is denied. Check credentials and try again., The process failed to get the correct properties." } } |
Der Zugriff wurde verweigert, da die ID nichte zum Postfach passt { "error": { "code": "ErrorInvalidMailboxItemId", "message": "Item 'AAMkAG.....EAAA=' doesn't belong to the targeted mailbox '6482......'." } } |
Mit Graph schreiben
Zuletzt bleibt noch der Test, on ich ein Element verändern kann. Das geht mit einem PATCH und eine einfache Funktion ist die Änderung der Kategorie einer Mail. Die zu ändernden Werte müssen als "Request Body" mitgegeben werden.
Mit dem Patch bekomme ich die veränderte Mail als Antwort wieder mit. Meine Software sollte also eine eventuell noch lokal in einer Variablen vorgehaltenen Version durch die neue Version ersetzen, damit wie immer mit den aktuellen Daten arbeiten. Den erfolgreichen Schreibvorgang kann ich auch z.B. mit OWA sehen:
Sonderfall "Folder Permission"
Das der Zugriff mit "Full Access" und einem Postfachbenutzer funktioniert, habe ich erwartet. Ich kann leider einen Benutzer, der kein Postfach hat, weder über das Exchange Admin Center noch OWA berechtigen. Dennoch hat es mich interessiert, ob ein Benutzer ohne Postfach nicht doch auf eine Information zugreifen kann, wenn er nur die Rechte hätte. Da eine Vergabe per ACL auf den Benutzer selbst aber nicht geht, habe ich in der Shared Mailbox einen Ordner "Test" angelegt, eine Mail hineinkopiert und dort die Default Rechte von "None" auf "Reviewer" gestellt.
Nun habe ich mir erst mal die Postfachordner der Shared Mailbox mit meinem Exchange User angeschaut, um die grundsätzliche Funktion zu prüfen:
https://graph.microsoft.com/v1.0/users/sharedmb1@msxfaq.net/mailFolders
- mailFolders auflisten
https://learn.microsoft.com/de-de/graph/api/user-list-mailfolders
Damit konnte der Cloud-User ohne Postfach aber erst einmal nichts sehen:
Ich habe mir dann mit dem Exchange Postfachbenutzer die ID des Ordners besorgt.
Mit der ID habe ich dann zuerst mit dem berechtigten Benutzer nach den Nachrichten in genau dem Ordner gesucht.
https://graph.microsoft.com/v1.0/users/sharedmb1@msxfaq.net/mailFolders/AAMkAGE3OWU....W5AAA=/messages
Das hat dann allerdings geklappt!
Es ist also durchaus möglich, auch ohne "Full Access" auf ein Postfach und nur über individuelle Rechte auf einen Ordner den Zugriff zu ermöglich. Das funktioniert sogar für Benutzer, die selbst keine Exchange Lizenz haben. Allerdings kann ich diesen Benutzer ohne Lizenz keine eigenen Berechtigungen geben, da Exchange Sie nicht kennt. Die Vergabe an "Default" war nur ein Test aber ist nicht für einen produktiven Einsatz gedacht.
Damit stellt sich natürlich die Frage, was denn genau "Default" ist. Sind damit nur alle authentifizierten Benutzer in dem gleichen Tenant gemeint oder vielleicht auch Gäste oder sogar die ganze Welt? Daher habe die gleiche URL in einem Graph Explorer-Fenster eingegeben, an dem ich als Benutzer eines anderen Tenants angemeldet war. Graph hat sich über 30 Sekunden beim ersten Aufruf Zeit gelassen, bis ich folgenden Fehler als Antwort bekommen habe:
Darauffolgende Anfragen wurden dann allerdings in weniger als einer Sekunde mit dem gleichen Fehler quittiert. Ich habe danach den Test noch mal mit einem Konto wiederholt, welches als Gast in diesem Tenant angelegt war. Aber auch hier habe ich den gleichen Fehler bekommen,
Über diesen Weg gibt es zumindest kein einfach erreichbares Sicherheitsloch. Es reicht nicht, wenn eine Malware auf einem Client des Anwenders sich die Mailadrese und FolderID besorgt und die Berechtigungen für "default" anlegt, um sich dauerhaft Zugriff zu verschaffen.
Ergebnis
Es ist doch sehr einfach, mit Microsoft Graph und einer Programmiersprache oder Client meiner Wahl nicht nur auf mein eigenes Postfach sondern auch auf ein gemeinsam genutztes Postfach zuzugreifen. Allerdings sollte ich alle drei Einstellungen korrekt umgesetzt haben:
- Der Benutzer sollte selbst ein Exchange
Postfach haben
Ohne eigenes Postfach habe ich nur sehr eingeschränkte Möglichkeiten per "Delegate permission" auf ein andere Postfach zuzugreifen, da das Konto in Exchange nicht bekannt ist und daher maximal über "Default"-Permissions zugelassen werden kann. Das ist keine sinnvolle Nutzung.
Wenn Sie einen Zugriff für eine Automatisierung benötigen, dann ist eine App-Registration mit App-Permission und Zugriffsrechten auf die gewünschten Postfächer der richtige Weg. - Mail.Read.Shared/Mail.ReadWrite.Shared
Es reicht nicht das einfache Recht "Mail.Read" bzw. "Mail.ReadWrite". Für den Zugriff auf eine Shared Mailbox muss ich auch noch die beiden weiteren Berechtigungen Mail.Read.Shared/Mail.ReadWrite.Shared haben. - Vollzugriff auf das Postfach
Zuletzt prüft Exchange natürlich immer noch, ob der zugreifende Benutzer auch tatsächlich berechtigt ist. Mit Vollzugriff können Sie sich die Ordnerstrukturen etc. besorgen. Es ist aber durchaus denkbar, dass Sie nur Berechtigungen auf einen Ordner bekommen und sich dann direkt über die ID mit dem Ordner verbinden.
Verzichten Sie besser aus die abgeschwächten Berechtigungen, d.h. die Benutzung als User ohne Exchange Lizenz oder mit Berechtigungen auf individuellen Ordnern. Dies ist wohl nicht vorgesehen, nicht getestet und kann sich auch schnell wieder ändern.
Weitere Links
- Graph API
- MGGraph Mail
- Graph Explorer
https://aka.ms/ge
https://developer.microsoft.com/en-us/graph/graph-explorer - List messages
https://learn.microsoft.com/en-us/graph/api/user-list-messages - Secure Access To Mailboxes Via Graph
https://c7solutions.com/2024/09/secure-access-to-mailboxes-via-graph - Using Shared Mailboxes in the Microsoft Graph API from PowerShell
https://gsexdev.blogspot.com/2021/01/using-shared-mailboxes-in-microsoft.html - Accessing a Shared Mailbox Folder
https://github.com/gscales/Graph-Powershell-101-Binder/blob/master/Shared-Mailboxes/Accesing%20a%20Shared%20Mailbox%20Folder.md - Shared Mailbox handling with Microsoft Graph
https://learn.microsoft.com/en-us/answers/questions/80006/shared-mailbox-handling-with-microsoft-graph