Eingeschränkte Exchange Online Berechtigungen mit Managed Identities

In diesem Beitrag möchte ich euch zeigen, wie man einer Managed Identity granulare Berechtigungen in Exchange Online vergeben kann.

Managed Identities sind eine super Sache und sicherheitstechnisch auch eine Weiterentwicklung zu einer App Registration, weil dort weder ein Zertifikat noch ein geheimer Schlüssel benötigt wird.

Viele Beispiele im Internet zeigen, wie man in Azure Automation eine Verbindung zu Exchange Online herstellen kann. Allerdings nutzen diese Beispiele immer die Rolle Exchange Administrator, was in den meisten Fällen eine viel zu hohe Berechtigung darstellt und hoffentlich nicht genutzt wird.

In diesem Beispiel haben wir eine Azure Function App, die zum Lesen der Exchange Mailboxen (Konfiguration, nicht der Inhalt) genutzt werden soll.

Exchange Online Berechtigungen mit Managed Identities
Beispiel einer Function App

Natürlich müssen wir noch die notwendigen Module in unserer Function App hinzufügen.

Exchange Online Berechtigungen mit Managed Identities
requirements.psd1 Datei mit notwendigen Modulen

Und auch noch die profile.ps1 Datei anpassen.

Exchange Online Berechtigungen mit Managed Identities
profile.ps1 Datei für die Nutzung mit Managed Identities

Für dieses Beispiel nehmen wir an, dass die Exchange Berechtigung View-Only Recipients ausreichend ist.

Wir legen also im Exchange Admin Center eine neue Rolle dafür an.

Exchange Admin Center

Wir vergeben einen Namen und optional eine Beschreibung für die Rolle.

Erstellen einer neuen Exchange Online Rolle

Dann vergeben wir die genannte Berechtigung für unsere neue Rolle.

Berechtigung für die Rolle vergeben

Admins müssen wir an der Stelle nicht unbedingt angeben, deshalb lassen wir diese erstmal leer.

Admins für die Rolle definieren

Danach können wir die Rolle erstellen und finden sie auch in der Übersicht.

Exchange Online Berechtigungen mit Managed Identities
Neue Rolle im Exchange Admin Center

Nun müssen wir „nur“ noch unsere Managed Identity in die neue Rolle aufnehmen, damit wir mit unserer Function App auf Exchange Online zugreifen können.

Am einfachsten geht das über ein kleines PowerShell Skript, auch weil es für die Aktionen keine grafische Oberfläche gibt.

# Name der Azure Function App bzw. der Managed Identity
$managedIdentityDisplayName = 'fei-exchangetest'
# Exchange Rolle
$exchangerole = 'View-Only Recipients'
# Name des Tenant
$organizationName = '<tenant>.onmicrosoft.com'

# Notwendige Module validieren bzw. installieren
if(-not (Get-Module Az -ListAvailable)){
    Install-Module Az -Scope CurrentUser -Force
}
if(-not (Get-Module Microsoft.Graph -ListAvailable)){
    Install-Module Microsoft.Graph -Scope CurrentUser -Force
}
if(-not (Get-Module ExchangeOnlineManagement -ListAvailable)){
    Install-Module ExchangeOnlineManagement -Scope CurrentUser -Force
}

Connect-AzAccount
$adServicePrincipal = Get-AzADServicePrincipal -Filter "displayName eq '$($managedIdentityDisplayName)'"

Connect-MgGraph -Scopes AppRoleAssignment.ReadWrite.All, Application.Read.All, RoleManagement.ReadWrite.Directory
$resourceId = (Get-MgServicePrincipal -Filter "AppId eq '00000002-0000-0ff1-ce00-000000000000'").Id
# Exchange.ManageAsApp (die GUID ist in allen Tenants gleich)
$appRoleId = "dc50a0fb-09a3-484d-be87-e023b12c6440"
# Exchange.ManageAsApp Berechtigung hinzufügen
New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $adServicePrincipal.Id -PrincipalId $adServicePrincipal.Id -AppRoleId $appRoleId -ResourceId $resourceId

Connect-ExchangeOnline -Organization $organizationName
$exoServicePrincipalDisplayName = "Service Principal $managedIdentityDisplayName"
# Neuen Service Principal erstellen
New-ServicePrincipal -AppId $adServicePrincipal.AppId -ObjectId $adServicePrincipal.Id -DisplayName $exoServicePrincipalDisplayName
# Service Principal der Rolle hinzufügen
Add-RoleGroupMember -Identity $exchangerole -Member $appServicePrincipal.AppId

In den Zeilen 1 bis 6 müssen nur die Variablen für eure Managed Identity, Exchange Online Rolle und Tenant-Name angepasst werden. Den Rest erledigt das Skript für euch. 🙂

Das Ergebnis kann man dann auch über die Web Oberfläche vom Exchange Online Admin Center kontrollieren. Dort sollte unser neu angelegter Service Principal nun in den Berechtigungen der Rolle erscheinen.

Exchange Online Rolle mit Service Principal

Wenn wir jetzt unsere Function App ausführen, können nun alle Postfächer gelesen werden.

Log der Azure Function

Somit habt ihr eine wesentlich granulare Möglichkeit, Berechtigungen für Managed Identities in Exchange Online zu vergeben und müsst nicht immer Administrator-Rechte vergeben.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert