Security & Compliance PowerShell Modul und Managed Identity

In diesem Artikel möchte ich euch zeigen, wie man sich mit dem Security & Compliance PowerShell Modul (Connect-IPPSSession) und Managed Identity verbinden kann.

Die Dokumentation von Microsoft gibt zu dieser Möglichkeit leider keinen Hinweis, deshalb zeige ich das Vorgehen am Beispiel einer Function App in Azure.

Zuerst erstellen wir uns eine Function App in Azure.

Security & Compliance PowerShell Modul und Managed Identity
Function App in Microsoft Azure

Als ersten Schritt aktivieren wir die Managed Identity für unsere Function App.

Managed Identity für Function App aktiviert

Im zweiten Schritt müssen wir zuerst unserer Managed Identity noch die grundlegende Berechtigung Exchange.ManageAsApp zuweisen. Das geht z.B. mit dem folgenden Skript.

# Name der Azure Function App bzw. der Managed Identity
$managedIdentityDisplayName = 'fei-blog-seccomp'

# 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

In Zeile 2 muss nur der Name der Function App angepasst werden, wenn diese (hoffentlich 😉 ) bei euch anders heißt.

Dann müssen wir der Managed Identity noch eine entsprechende Rolle für die Berechtigungen zuweisen. In diesem Beispiel nehmen wir zur Vereinfachung die Rolle Compliance Administrator. Allerdings ist auch hier die Empfehlung, für produktive Umgebungen einen entsprechenden Service Principal zu nutzen. Wie das für Exchange Online funktioniert, habe ich bereits in einem anderen Beitrag beschrieben. Das Vorgehen dazu ist analog, nur eben für Security & Compliance.

Als dritten Schritt der Vorbereitung müssen wir noch die notwendigen Module der Function App hinzufügen. Das funktioniert wie gewohnt über die requirements.psd1.

requirements.psd1 mit den notwendigen Modulen

Unsere Function App Funktion soll unsere bestehenden Aufbewahrungsrichtlinien zurück liefern. Folgende Richtlinien sind momentan definiert.

Security & Compliance PowerShell Modul und Managed Identity
Microsoft Purview Aufbewahrungsrichtlinien

Nun erstellen wir uns eine Funktion mit dem Namen Get-CompliancePolicies in der Function App, die uns genau diese Richtlinien zurück liefert.

Die Funktion hat folgenden Code.

using namespace System.Net

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."

try {    
    Connect-AzAccount -Identity
    $accessToken= Get-AzAccessToken -ResourceUrl "https://ps.compliance.protection.outlook.com/"
    
    Connect-ExchangeOnline -AccessToken $accessToken.Token `
        -Organization '<yourOrganization.onmicrosoft.com>' `
        -ConnectionUri 'https://ps.compliance.protection.outlook.com/PowerShell-LiveId' `
        -AzureADAuthorizationEndpointUri 'https://login.microsoftonline.com/organizations'
    
    $body = Get-RetentionCompliancePolicy | Select Name

}
catch {    
    # Implement error handling here    
    $body = "Error occured"
    throw $_
}
finally {
    Disconnect-ExchangeOnline -Confirm:$false
    Get-PSSession | Remove-PSSession
}

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body = $body
})

In den Zeilen 10 bis 16 erfolgt die Authentifizierung Am Security & Compliance PowerShell Modul mit der Managed Identity unserer Function App. In Zeile 14 muss noch der Tenant-Name angepasst werden und in Zeile 18 lassen wir uns die Aufbewahrungsrichtlinien ausgeben und liefern diese im Body der Funktion zurück.

Wenn wir die Funktion testen, sehen wir, dass die Authentifizierung funktioniert und wir die Aufbewahrungsrichtlinien erhalten.

Security & Compliance PowerShell Modul und Managed Identity
Ausführung unserer Funktion

Durch die Nutzung von Managed Identities ist die Nutzung des Security & Compliance PowerShell Moduls wesentlich sicherer und auch einfacher, als mit einer App-Registrierung oder eines Service-Accounts.

Ein Kommentar

Schreibe einen Kommentar

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