Dlaczego Service Principal jest Principal?
Miło mi, że zerknąłeś tutaj. Na razie strona zawiera wyłącznie czyste instrukcje ale zostanie uzupełniona o dodatkowe informacje związane z danym tematem. Tymczasem życzę owocnego korzystania z podanych tutaj skryptów.
I
Delegacja wybranych uprawnień użytkownikom do aplikacji via Powershell
1. Wstęp
Instrukcja opisuje sposób nadawania uprawnień użytkownikowi do wybranej aplikacji widocznej w Enterprise Applications w MS Entra ID.
2. Wymagane uprawnienia
Poniżej lista wymaganych uprawnień oraz inne wymagania:
1) Rola Cloud Application Administrator w Entra ID.
2) Wydelegowane uprawnienia do aplikacji Microsoft Graph PowerShell. Uprawnienia: „User.ReadBasic.All Application.ReadWrite.All”, „DelegatedPermissionGrant.ReadWrite.All”, „AppRoleAssignment.ReadWrite.All
3) Zainstalowane moduły w PowerShellu: Microsoft.Graph
3. Delegacja wybranych uprawnień użytkownikom do aplikacji via Powershell.
1) Zaloguj się do portalu Azure z poziomu przeglądarki (https://portal.azure.com) a następnie przejdź do https://portal.azure.com/#view/Microsoft_AAD_IAM/StartboardApplicationsMenuBlade/~/AccessRequests/menuId~/null
2) Uruchom PowerShell i połącz się z modułem Microsoft.Graph via Powershell kontem, które posiada wymagane uprawnienia:
Connect-MgGraph -Scopes ("User.ReadBasic.All Application.ReadWrite.All " `
+ "DelegatedPermissionGrant.ReadWrite.All " `
+ "AppRoleAssignment.ReadWrite.All")
3) Wprowadź jako zmienną $userUpnOrId UPN lub Object ID użytkownika, który ma otrzymać uprawnienia do aplikacji widocznej w Admin consent request w Enterprise Applications w Entra ID
$userUpnOrId = "mgapinski@blueman.net.pl"
4) Wprowadź jako zmienną $clientAppId Application ID aplikacji widocznej w Admin consent request w Enterprise Applications w Entra ID
$clientAppId = "b85d4eeb-78d7-4650-bae0-abb5eccbd6d5"
5) Ważnym jest aby wskazać API przez które dostęp będzie nadany. Jako, że jest to requests do Microsoft Graph API, to zmienna $resourceAppId przyjmie poniższą wartość
$resourceAppId = "00000003-0000-0000-c000-000000000000"
6) Zdarza się, że aplikacja o wskazanym Service Principal dla której powstała prośba (request) nie istnieje jeszcze na liście All applications w Enterprise applications w Entra ID, jest widoczny tylko w Admin consent request w Enterprise Applications w Entra ID, wówczas należy aplikację o takim Service Principal utworzyć wykonując poniższe polecenie:
$clientSp = Get-MgServicePrincipal -Filter "appId eq '$($clientAppId)'"
if (-not $clientSp) {
$clientSp = New-MgServicePrincipal -AppId $clientAppId
}
7) Następnie wykonaj poniższe polecenia celem przygotowania wymaganych danych (zmiennych) do dalszych działań
$user = Get-MgUser -UserId $userUpnOrId
$resourceSp = Get-MgServicePrincipal -Filter "appId eq '$($resourceAppId)'"
$principalId = $user.Id
$clientId = $clientSp.Id
8) Na tym etapie masz do rozpatrzenia kilka scenariuszy (A,B,C), po wykonaniu odpowiedniego (albo A, albo B, albo C) przejdź do punktu 9.
A) Gdy istnieje obiekt PermissionGrant dla danego użytkownika i chcesz wykonać automatycznie jego update (rozszerzyć uprawnienia) aby był zgodny z użytkownikami, którzy posiadają odpowiedni zestaw uprawnień
A.1) Znajdź obiekt PermissionGrant, który zawiera zestaw uprawnień danego użytkownika do danej aplikacji
$grant2Update = Get-MgOauth2PermissionGrant -Filter "(ClientId eq '$($clientId)')"
A.2) Wybierz gotowy zestaw uprawnień pierwszego z listy użytkownika (scope)
$scope = $grant2Update[0].Scope
A.3) Po czym wykonaj update interesującego Cię obiektu PermissionGrant do danej aplikacji
Update-MgOauth2PermissionGrant -OAuth2PermissionGrantId $grant2Update.Id -Scope $scope
B) Gdy istnieje obiekt PermissionGrant dla danego użytkownika i chcesz wykonać ręcznie jego update tzn. chcesz wskazać własny zestaw uprawnień oparty o uprawnienia, które są wymagane.
Uwaga!!! Uprawnienia, które są potrzebne uzyskasz w Entra ID https://portal.azure.com/#view/Microsoft_AAD_IAM/StartboardApplicationsMenuBlade/~/AccessRequests/menuId~/null Poniżej sposób w jaki należy te uprawnienia znaleźć
B.1) Znajdź obiekt PermissionGrant, który zawiera zestaw uprawnień danego użytkownika do danej aplikacji
$grant2Update = Get-MgOauth2PermissionGrant -Filter "(ClientId eq '$($clientId)') and (PrincipalId eq '$($principalId)')"
B.2) Przygotuj zestaw uprawnień (scope) a następnie przypisz do zmiennej $permissions np.: permissions = @(„openid”, „profile”, „offline_access”, „User.Read”, „User.ReadBasic.All”)
$permissions = @("Files.ReadWrite", "Files.ReadWrite.All", "Sites.Read.All", "Sites.ReadWrite.All", "offline_access", "User.ReadBasic.All")
$scope = $permissions -join " "
B.3) Po czym wykonaj update interesującego Cię obiektu PermissionGrant dodanej aplikacji
Update-MgOauth2PermissionGrant -OAuth2PermissionGrantId $grant2Update.Id -Scope $scope
C) Gdy nie istnieje obiekt PermissionGrant dla danego użytkownika i chcesz go utworzyć tzn. chcesz stworzyć obiekt PermissionGrant i wskazać własny zestaw uprawnień oparty o uprawnienia, które są wymagane.
Uwaga!!! Uprawnienia, które są potrzebne uzyskasz w Entra ID https://portal.azure.com/#view/Microsoft_AAD_IAM/StartboardApplicationsMenuBlade/~/AccessRequests/menuId~/null – patrz pkt B.
C.1) Przygotuj zestaw uprawnień (scope) a następnie przypisz do zmiennej $permissions np.: permissions = @(„openid”, „profile”, „offline_access”, „User.Read”, „User.ReadBasic.All”)
$permissions = @("Files.ReadWrite", "Files.ReadWrite.All", "Sites.Read.All", "Sites.ReadWrite.All", "offline_access", "User.ReadBasic.All")
$scope = $permissions -join " "
C.2) Utwórz nowy obiekt PermissionGrant dla danego użytkownika i wskaż własny zestaw uprawnień
New-MgOauth2PermissionGrant -ResourceId $resourceSp.Id -Scope $scope-ClientId $clientSp.Id -ConsentType "Principal" -PrincipalId $user.Id
C.3) Upewnij się, że powstał interesujący Cię obiekt PermissionGrant
Get-MgOauth2PermissionGrant -Filter "(ClientId eq '$($clientId)') and (PrincipalId eq '$($principalId)')"
Uwaga!!! Istnieje możliwość pobrania gotowego zestawy uprawnień (scope) ale na podstawie innego obiektu PermissionGrant – przekształcenie pkt A.
9) W celu upewnienia się, że aplikacja jest przypisana do użytkownika wykonaj poniższe cmdlets’y (w razie braku przypisania, użytkownik zostanie przypisany):
if ($clientSp.AppRoles | ? { $_.AllowedMemberTypes -contains "User" }) {
Write-Warning ("A default app role assignment cannot be created because the client application exposes user-assignable app roles. You must assign the user a specific app role for the app to be listed in the user's My Apps access panel.")
} elseif (Get-MgServicePrincipalAppRoleAssignedTo -ServicePrincipalId $clientSp.Id | ? {$PSItem.PrincipalId -eq $principalId}) {
} else {
$assignment = New-MgServicePrincipalAppRoleAssignedTo `
-ServicePrincipalId $clientSp.Id `
-ResourceId $clientSp.Id `
-PrincipalId $user.Id `
-AppRoleId "00000000-0000-0000-0000-000000000000"
}
10) Uprawnienia zostały nadane. Niestety, działania nie usuwają informacji o żądaniu uprawnień w Admin consent request w Enterprise Applications w Entra ID.
II
Usuwanie uprawnień użytkownikowi dla wybranej aplikacji widocznej w Enterprise Applications w MS Entra ID
1. Wstęp
Instrukcja opisuje sposób usuwania uprawnień użytkownikowi dla wybranej aplikacji widocznej w Enterprise Applications w MS Entra ID.
2. Wymagane uprawnienia:
1) Rola Cloud Application Administrator w Entra ID.
2) Wydelegowane uprawnienia do aplikacji Microsoft Graph PowerShell. Uprawnienia: „User.ReadBasic.All Application.ReadWrite.All”, „DelegatedPermissionGrant.ReadWrite.All”, „AppRoleAssignment.ReadWrite.All
3) Zainstalowane moduły w PowerShellu: Microsoft.Graph
3. Usuwanie uprawnień użytkownikom do aplikacji via Powershell.
1) Uruchom PowerShell i połącz się z modułem Microsoft.Graph via Powershell kontem, które posiada wymagane uprawnienia:
Connect-MgGraph -Scopes ("User.ReadBasic.All Application.ReadWrite.All " `
+ "DelegatedPermissionGrant.ReadWrite.All " `
+ "AppRoleAssignment.ReadWrite.All")
2) Wprowadź jako zmienną $userUpnOrId UPN lub Object ID użytkownika, któremu chcesz odebrać uprawnienia do aplikacji widocznej w All applications w Enterprise Applications w Entra ID
$userUpnOrId = "mgapinski@blueman.net.pl"
3) Wprowadź jako zmienną $clientAppId Application ID wybranej aplikacji (do której chcesz odebrać uprawnienia) widocznej w All applications w Enterprise Applications w Entra ID
$clientAppId = "b85d4eeb-78d7-4650-bae0-abb5eccbd6d5"
4) Ważnym jest aby wskazać API dla którego dostęp będzie odebrany. Jako, że jest to requests do Microsoft Graph API, to zmienna $resourceAppId przyjmie poniższą wartość
$resourceAppId = "00000003-0000-0000-c000-000000000000"
5) Następnie wykonaj poniższe polecenia celem przygotowania wymaganych danych (zmiennych) do dalszych działań:
$clientSp = Get-MgServicePrincipal -Filter "appId eq '$($clientAppId)'"
$user = Get-MgUser -UserId $userUpnOrId
$resourceSp = Get-MgServicePrincipal -Filter "appId eq '$($resourceAppId)'"
$principalId = $user.Id
$clientId = $clientSp.Id
6) Wyszukaj obiekt PermissionGrant który chcesz usunąć wykonując poniższe polecenie
$grant2remove = Get-MgOauth2PermissionGrant -Filter "(ClientId eq '$($clientId)') and (PrincipalId eq '$($principalId)')"
7) Usuń ten obiekt wykonując poniższy cmdlets
Remove-MgOauth2PermissionGrant -OAuth2PermissionGrantId $grant2remove.Id
8) Po tych działaniach uprawnienia użytkownika powinny zostać usunięte.
III
Skrypt generuje raport dotyczący zbliżającej się daty wygaśnięcia ważności Client Secret/Certificate zarejestrowanych w aplikacji Entra ID
#Script generates report concerning upcoming client secret/certificate expiration date of registered Entra ID applications
$Data = Get-Date -Format "yyyy-MM-dd HH:mm"
$PathJason = "C:\Skrypty\AppRedistrationSecretExpiration\Reports\AppRedistrationSecretExpiration.json"
$TLS12Protocol = [System.Net.SecurityProtocolType] 'Tls12'
[System.Net.ServicePointManager]::SecurityProtocol = $TLS12Protocol
Connect-AzureAD
$LimitExpirationDays = 30
$SecretsToExpire = Get-AzureADApplication -All:$true | ForEach-Object {
$app = $PSItem
@(
Get-AzureADApplicationPasswordCredential -ObjectId $_.ObjectId
Get-AzureADApplicationKeyCredential -ObjectId $_.ObjectId
) | Where-Object {
$_.EndDate -lt (Get-Date).AddDays($LimitExpirationDays)
} | ForEach-Object {
if ($_.GetType().name -like "PasswordCredential"){
[PSCustomObject] @{
"Application name"= $app.DisplayName
#"Application (client) ID" = $app.AppId
"Owner" = (Get-AzureADApplicationOwner -ObjectId $app.ObjectId | Select -ExpandProperty UserPrincipalName)
"Certificate / Secret"= "Client Secret"
"Certificate / Secret ID" = $_.KeyId
"Expiration Date" = $_.EndDate
"Remaining Time (Days)" = (New-TimeSpan -Start (Get-Date) -End $_.EndDate).Days
}
} elseIf ($_.GetType().name -like "KeyCredential") {
[PSCustomObject] @{
"Application name"= $app.DisplayName
#"Application (client) ID" = $app.AppId
"Owner" = (Get-AzureADApplicationOwner -ObjectId $app.ObjectId | Select -ExpandProperty UserPrincipalName)
"Certificate / Secret"= "Certificate"
"Certificate / Secret ID" = $_.KeyId
"Expiration Date" = ($_.EndDate)
"Remaining Time (days)" = (New-TimeSpan -Start (Get-Date) -End $_.EndDate).Days
}
}
}
}
#Start of exporting to JSON
$i = 1
"[" | Out-File $PathJason -Encoding utf8 -Force
$SecretsToExpire | % {
if ($i -lt $SecretsToExpire.count)
{
$line = "{`"{#KEYID}`":`"" + $SecretsToExpire[$i-1]."Certificate / Secret ID" + "`",`"{#APPNAME}`":`"" + $SecretsToExpire[$i-1]."Application Name" + "`",`"{#OWNER}`":`"" + $SecretsToExpire[$i-1]."Owner" + "`",`"{#KEY}`":`"" + $SecretsToExpire[$i-1]."Certificate / Secret" + "`",`"{#EXPIRED}`":`"" + $SecretsToExpire[$i-1]."Expiration Date" + "`",`"{#REMAINING}`":`"" + $SecretsToExpire[$i-1]."Remaining Time (days)" + "`"}`,"
}
elseif ($i -ge $SecretsToExpire.count)
{
$line = "{`"{#KEYID}`":`"" + $SecretsToExpire[$i-1]."Certificate / Secret ID" + "`",`"{#APPNAME}`":`"" + $SecretsToExpire[$i-1]."Application Name" + "`", `"{#OWNER}`":`"" + $SecretsToExpire[$i-1]."Owner" + "`",`"{#KEY}`":`"" + $SecretsToExpire[$i-1]."Certificate / Secret" + "`",`"{#EXPIRED}`":`"" + $SecretsToExpire[$i-1]."Expiration Date" + "`",`"{#REMAINING}`":`"" + $SecretsToExpire[$i-1]."Remaining Time (days)" + "`"}"
}
$i++;
$line | Out-File $PathJason -Append -Encoding utf8
}
"]" | Out-File $PathJason -Append -Encoding utf8
#End of exporting to JSON