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 Enterprise Applications w Entra ID

$userUpnOrId = "mgapinski@blueman.net.pl"

4) Wprowadź jako zmienną $clientAppId Application ID aplikacji widocznej w Admin consent request 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 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.

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.

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)')"

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 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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *