Okay, kleiner Disclaimer gleich zu Beginn: Der folgende Blogeintrag sollte NICHT als Security Best Practice herangezogen werden. Dennoch hat er seine Berechtigung, denn unter gewissen Umständen kann die folgende Anleitung richtig hilfreich sein.
Worum geht es konkret?
Wer in der Azure Cloud unterwegs ist, ist sicher schon mal über sogenannte "App Registrierungen" gestolpert. Im Grunde genommen sind App Registrierungen nichts anderes als die "Identität" einer Anwendung. (Wie sich das von Managed Identities unterscheidet, schauen wir uns in einem eigenen Blogpost an.)

Einer App Registrierung könnt ihr ein Secret zuweisen bzw. direkt über das Azure Portal eines erstellen. In Kombination mit den vergebenen API Berechtigungen kann diese App Registrierung dann verwendet werden, um auf Services zuzugreifen. Ein Beispiel aus dem Dynamics 365 Kontext: Dort wird so eine App Registrierung gerne als Anwendungsbenutzer (Application User) angelegt, über den Integrationen auf Dataverse zugreifen.
Der Haken
Beim Anlegen eines neuen Secrets im Portal liegt das Ablaufdatum maximal 2 Jahre (24 Monate) in der Zukunft:

Aus Security Sicht reicht das meistens auch völlig aus - bei häufigeren Key Rotationen sollte die Laufzeit sogar kürzer sein, je nach Unternehmensrichtlinie und Compliance.
In der Praxis gibt es aber immer wieder Fälle, in denen ein "Never Ending Secret" hilfreich wäre und den Wartungsaufwand reduziert. Achtung, nochmal Disclaimer: Mittlerweile gibt es Managed Identities, die genau solche Fälle adressieren. Wenn eure Anwendung oder eure Services aber noch auf klassische App Registrierungen setzen, könnt ihr mit folgendem Guide ein Secret mit sehr langer Laufzeit erstellen.
Los geht's!
1. Voraussetzungen
Ihr braucht das Microsoft Graph PowerShell SDK. Installiert ist es ganz einfach mit:
Install-Module Microsoft.Graph -Scope CurrentUser
2. Mit Microsoft Graph verbinden
Connect-MgGraph -Scopes "Application.ReadWrite.All"
Damit verbindet ihr euch per PowerShell mit eurem Tenant. Achtung: Der Scope Application.ReadWrite.All braucht einen Admin Consent. Habt ihr keine Admin Rechte, muss euer Global Admin bzw. Application Administrator ran.
3. Objekt Id der App Registrierung kopieren
Kopiert euch aus eurer App Registrierung die Objekt Id raus. WICHTIG: Nicht die Client Id (Anwendungs-ID), sondern die Objekt Id, wie im Screenshot zu sehen:

4. Variablen setzen
Laufzeit und Anzeigename des Secrets könnt ihr selbst festlegen:
$ApplicationObjectId = "00000000-0000-0000-0000-000000000000"
$SecretName = "secret web app 2026"
$EndDate = (Get-Date).AddYears(99)
In diesem Fall läuft das Secret erst in 99 Jahren ab. ;)
5. Secret erstellen
Jetzt kommt das eigentliche Skript. Hier gleich in der vollständigen Version inklusive Verbindung und Variablen, so könnt ihr es in einem Rutsch ausführen:
Connect-MgGraph -Scopes "Application.ReadWrite.All"
$ApplicationObjectId = "00000000-0000-0000-0000-000000000000"
$SecretName = "secret web app 2026"
$EndDate = (Get-Date).AddYears(99)
$params = @{
passwordCredential = @{
displayName = $SecretName
endDateTime = $EndDate
}
}
$Credential = Add-MgApplicationPassword `
-ApplicationId $ApplicationObjectId `
-BodyParameter $params
Write-Host ""
Write-Host "============================================================"
Write-Host "Microsoft Graph Application Password wurde erstellt"
Write-Host "============================================================"
Write-Host ""
Write-Host "Application Object ID:"
Write-Host $ApplicationObjectId
Write-Host ""
Write-Host "Secret Name:"
Write-Host $SecretName
Write-Host ""
Write-Host "KeyId:"
Write-Host $Credential.KeyId
Write-Host ""
Write-Host "EndDateTime:"
Write-Host $Credential.EndDateTime
Write-Host ""
Write-Host "SECRET VALUE - NUR JETZT SICHTBAR:"
Write-Host $Credential.SecretText
Write-Host ""
$Output = @"
ApplicationObjectId=$ApplicationObjectId
KeyId=$($Credential.KeyId)
SecretValue=$($Credential.SecretText)
SecretEndDate=$($Credential.EndDateTime)
"@
$Output | Set-Clipboard
Write-Host "============================================================"
Write-Host "Zum Kopieren:"
Write-Host "============================================================"
Write-Host $Output
Write-Host ""
Write-Host "Die wichtigsten Werte wurden auch in die Zwischenablage kopiert."
Write-Host ""
Write-Host "Achtung: Der Secret Value kann später nicht erneut angezeigt werden."
Das Skript erstellt das Secret mit der angegebenen Laufzeit, gibt alle wichtigen Werte aus und kopiert sie zusätzlich in die Zwischenablage.
Kleiner Security Hinweis: Das Secret landet damit im Klartext in eurer Zwischenablage. Wenn ihr unter Windows den Zwischenablageverlauf (Win + V) aktiviert habt, bleibt es dort gespeichert. Legt das Secret also direkt in euren Key Vault und löscht danach den Verlauf.
Achtung: App Management Policies
Manche Tenants haben Richtlinien zur Anwendungsverwaltung (App Management Policies) aktiv, die die maximale Laufzeit von Secrets begrenzen. In diesem Fall bricht Add-MgApplicationPassword mit einem Fehler ab - und das ist dann auch so gewollt. Hier hilft nur das Gespräch mit eurem Security Team.
Das Ergebnis
Bei Erfolg seht ihr in eurem PowerShell Fenster folgende Ausgabe, inklusive dem Secret selbst:

Und im Azure Portal seht ihr dann unter eurer App Registrierung das neue Secret:

Die Gültigkeit ist bis zum 28.10.2125 angegeben. Zack! Das sollte für ein paar Release Zyklen reichen. ;)
Fazit
Mit ein paar Zeilen PowerShell und dem Microsoft Graph SDK erstellt ihr ein Secret, das deutlich länger als 2 Jahre gültig ist. Aber bitte bewusst einsetzen: Ein Secret, das nie abläuft, ist auch ein Secret, das bei einem Leak nie von selbst ungültig wird. Wo immer möglich, sind Managed Identities die bessere Wahl.
Kommentare
Coole Sache! Danke für den Beitrag :-)
Kommentar hinterlassen
Kommentare werden moderiert und bei Regelverstößen oder Missbrauch ausnahmslos entfernt.