Alt aber doch aktuell: Manuelle Client Secret-Aktualisierung für SharePoint Add-Ins

Problembeschreibung

Neulich musste ich eine „alte“ Routinetätigkeit mal durchführen, da bei einer der registrierten Add-Ins das Client Secret abgelaufen war. Es handelt sich hier um einen sogenannten dynamischen Add-in (registriert durch /_layouts/15/AppRegNew.aspx), an sich ja nur ein App Principal in Azure ACS. Die Secrets die durch die o.g. Seite erstellt werden sind standardmäßig so eingestellt, dass sie nach einem Jahr ablaufen.

Lösung

Mal wieder typisch SharePoint: Die Benutzeroberfläche für solche Verlängerungen existiert nicht (oder ist mir zumindest nicht bekannt). Daher muss der gute alte PowerShell wieder her 🙂

Noch ein wichtiger Punkt bevor wir starten: Die Passwortänderung benötigt MINDESTENS 24 Stunden um intern bei Microsoft repliziert zu werden. Sie können das Passwort daher erst nach dieser Zeit einsetzen.

In einem Produktionsszenario soll das neue Key als zweiter Key-Eintrag hinzugefügt werden mindestens 2 Tage (+X falls das Passwort von vielen Apps genutzt wird) vor dem tatsächlichen Ablauf des vorhandenen Keys. So wird sichergestellt, dass das alte Key einige Zeit noch gültig bleibt und die Applikationsowner/IT-Betrieb den notwendigen Vorlauf hat, diese zu ändern.

PowerShell-Vorbereitung

Falls noch nicht installiert (ab PowerShell 5.0):

Import-Module MSOnline
Connect-MsolService
Das Login-Fenster für Connect-MsolService mit Microsoft-Logo und weißem Hintergrund

Warnung: Es gibt Artikeln im Netz die ein Get-Credential -cmdlet vor dem Connect-MsolService abfragen, danach die Eingaben als -credential Parameter übergeben. Dies funktioniert nicht für Konten, wo Mehrfachauthentifizierung (MFA) aktiviert ist (also praktisch für jedes Admin-Konto, wenn es sich nicht gerade um eine Entwicklungsumgebung handelt)!!!

Credential-Erneuerung

Mit den folgenden Codezeilen können Sie eine Auflistung aller Add-Ins im Tenant abrufen in CSV-Format (optimiert für den deutschsprachige Excel, bei anderen Sprachen kann der Delimiter auf Standard „,“ belassen werden oder nach Belieben verändert). Der Code kommt von Microsoft (s. Link 1 unten), ich habe es nur etwas verändert damit die Ausgabe in CSV-Format erfolgt.

$applist = Get-MsolServicePrincipal -all  |Where-Object -FilterScript { ($_.DisplayName -notlike "*Microsoft*") -and ($_.DisplayName -notlike "autohost*") -and  ($_.ServicePrincipalNames -notlike "*localhost*") }

$resultList = @()
foreach ($appentry in $applist) {
    $principalId = $appentry.AppPrincipalId
    $principalName = $appentry.DisplayName

    $currentResult = Get-MsolServicePrincipalCredential -AppPrincipalId $principalId -ReturnKeyValues $false |
     ? { $_.Type -eq "Password" } | 
     Select-Object @{n='App Principal Name';e={$principalName}},@{n='App Id';e={$principalId}}, @{n='Key Id';e={$_.KeyId.ToString()}},@{n='Created on';e={$_.StartDate.ToString()}},@{n='Expires on';e={$_.EndDate.ToString()}}  
    $resultList += $currentResult
}
$resultList| Export-Csv -Path 'C:\temp\appsec.csv' -Delimiter ';'

Falls Sie das alte (abgelaufene) Passwort entfernen wollen (in Produktionsumgebungen bitte nur nachträglich, nachdem das neue Key erfolgreich getestet wurde), können Sie das mit diesen Zeilen tun. VORSICHT: Hiermit werden Schlüsseleinträge für die Apps unwiderruflich gelöscht, stellen Sie bitte sicher dass die IDs korrekt sind bevor Sie dies ausführen. In anderen Worten: Sie nutzen dies auf eigenem Gefahr.

$clientId = 'App Id für die betroffene App'
$keyId1 = "Key Id (aus dem generierten Bericht oder aus der $keys-Auflistung unten"
$keyId2 = "Key Id (aus dem generierten Bericht oder aus der $keys-Auflistung unten"
$keys = Get-MsolServicePrincipalCredential -AppPrincipalId $clientId -ReturnKeyValues $false
##### AB HIER WERDEN DIE ALTEN KEYS ENTFERNT ##### 
Remove-MsolServicePrincipalCredential -KeyIds @($keyId1,$keyId2) -AppPrincipalId $clientId

Nehmen Sie nun Notiz von den betroffenen App Ids die demnächst ablaufen oder bereits abgelaufen sind. Für jede Id soll Folgendes ausgeführt werden (Code von Microsoft, nur verändert damit die Anzahl an Jahre für die Gültigkeit – Maximal 3 Jahre – ersichtlich und leichter zu ändern ist). Das Passwort (Client Secret) wird am Ende ausgegeben, bitte notieren, in PasswordSafe oder im Lieblings-Passwortverwaltungstool abspeichern.

$clientId = 'App Id für die betroffene App'
$anzahlJahreGueltig = 3
$bytes = New-Object Byte[] 32
$rand = [System.Security.Cryptography.RandomNumberGenerator]::Create()
$rand.GetBytes($bytes)
$rand.Dispose()
$newClientSecret = [System.Convert]::ToBase64String($bytes)
New-MsolServicePrincipalCredential -AppPrincipalId $clientId -Type Symmetric -Usage Sign -Value $newClientSecret -StartDate (Get-Date) -EndDate (Get-Date).AddYears($anzahlJahreGueltig )
New-MsolServicePrincipalCredential -AppPrincipalId $clientId -Type Symmetric -Usage Verify -Value $newClientSecret -StartDate (Get-Date) -EndDate (Get-Date).AddYears($anzahlJahreGueltig )
New-MsolServicePrincipalCredential -AppPrincipalId $clientId -Type Password -Usage Verify -Value $newClientSecret -StartDate (Get-Date) -EndDate (Get-Date).AddYears($anzahlJahreGueltig )
$newClientSecret

Erfolgsprüfung und Abschlussanmerkungen

Wichtig: Warten Sie 24 Stunden bevor Sie das neue Passwort ausprobieren. Probieren Sie das Login mit dem neuen Key. Falls alles soweit gut aussieht, können die abgelaufenen Keys entfernt werden.

Kommentar verfassen