Comment donner des permissions à l’API Graph à une identité gérée

Certains services Azure exposent une identité gérée. Il s’agit d’un identité créée et entièrement prise en charge par Azure. On a pas à s’en soucier et c’est très pratique.

L’alternative est d’utiliser un Service Principal comme un compte de service. On a plus de travail à faire, mais parfois c’est la seule option.

Que se passe t’il lorsque vient le temps de donner des permissions? Cela ne pose pas de problèmes avec un SP, mais pour une identité gérée?

Ce sera le thème de cet article. Donc au programme:

  • Préliminaire important
  • Démonstration
  • Le problème Devops
  • Bibliographie

Une dernière chose, dès que vous trouvez un lien vers un site Microsoft dans cet article, cela m’arrangerait que vous cliquiez dessus, merci d’avance!

Préliminaire important

Je me suis inspiré de cet article:

Grant Graph API Permission to Managed Identity Object – Microsoft Tech Community

Seulement la méthode proposée ne marchera pas avec PowerShell 7 et de plus il est conseillé d’utiliser Microsoft Graph plutôt que Graph Api.

On trouvera ici une la documentation de cette API ici:

https://docs.microsoft.com/fr-fr/graph/use-the-api?WT.mc_id=DT-MVP-5004831

NOTE: Si vous avez besoin de retrouver la correspondance entre Azure AD et Microsoft Graph:

https://docs.microsoft.com/en-us/powershell/microsoftgraph/azuread-msoline-cmdlet-map?view=graph-powershell-1.0#service-principals&WT.mc_id=DT-MVP-5004831

J’ai donc refais l’article dans ce nouveau contexte avec l’aide des commentaires ajoutés à l’article.

 

Nous allons utiliser Graph API. Vous devrez être Global Administrator sur Azure Active Directory.

Pour démarrer vous devrez récupérer les informations suivantes sur le portail:

  • TenantID:
    L’identifiant du tenant de l’abonnement

 

Vous aurez peut-être aussi besoin d’installer le module Az.Resources:

Install-Module az.resources

Démonstration

Préparation

Je vais reprendre l’exemple de l’article d’origine et configurer une Logic App:

2022-09-11_11-32-46

MSI est automatiquement activé:

2022-09-11_11-33-57

Ce n’est pas le cas de certains services comme les VM.

Mon service s’appelle AmethysteLogicApp. On peut commencer par vérifier que son identité a été créée. Rendez-vous ans AAD, puis le menu Enterprise applications:

2022-09-11_11-43-29

Il faudra peut-être supprimer des filtres. On peut auditer les permissions et constater que pour l’instant il n’y en a pas:

2022-09-11_11-44-50

Script

Commencez par relever le tenant Id. On initialise ensuite ces variables:

$DestinationTenantId = "7dda5ce2-...-229ad439811e"
$MsiName = "AmethysteLogicApp" 

$oPermissions = @(
    "Directory.ReadWrite.All"
    "Group.ReadWrite.All"
    "GroupMember.ReadWrite.All"
    "User.ReadWrite.All"
    "RoleManagement.ReadWrite.Directory"
)

$GraphAppId = "00000003-0000-0000-c000-000000000000" # On ne change pas ceci

On va ensuite lancer deux fois Get-AzADServicePrincipal:

$oMsi = Get-AzADServicePrincipal -Filter "displayName eq '$MsiName'"

Cette commande liste les identités connues dans AAD et avec le bon filtrage on va remonter celles de notre Logic App.

Nous recherchons ensuite la description de tous les rôles demandés:

$oGraphSpn = Get-AzADServicePrincipal -Filter "appId eq '$GraphAppId'"

$oAppRole = $oGraphSpn.AppRole `
            | Where-Object { ($_.Value -in $oPermissions) `
            -and ($_.AllowedMemberType -contains "Application") }

Notez la valeur du paramètre $GraphAppId. C’est l’identité de Microsoft Graph, celle qui permet d’obtenir un jeton MS Graph.

Je me suis, par le passé, fait bien pourrir avec: 00000002-0000-0000-c000-000000000000 qui lui donne accès à un jeton AAD Graph.

La ligne suivante:

Connect-MgGraph -TenantId $DestinationTenantId

Connect-MgGraph nous connecte à Microsoft Graph. Un consentement sera demandé:

2022-09-11_12-01-33

Puis:

2022-09-11_12-23-13

La console va afficher:

Welcome To Microsoft Graph!

 

Pour terminer, on enregistre chaque permission:

foreach ($AppRole in $oAppRole) {
    $oAppRoleAssignment = @{
        "PrincipalId" = $oMSI.Id
        "ResourceId"  = $oGraphSpn.Id
        "AppRoleId"   = $AppRole.Id
    }
  
    New-MgServicePrincipalAppRoleAssignment `
        -ServicePrincipalId $oAppRoleAssignment.PrincipalId `
        -BodyParameter $oAppRoleAssignment `
        -Verbose
}

Pour mon malheur, je ne suis pas Global Administrator de ma souscription. Je ne peux donc pas montrer le résultat dans AAD.

On trouvera dans la bibliographie d’autres scénarios possibles.

Script complet

$DestinationTenantId = "7dda5ce2-2fb6-4f82-bc27-229ad439811e"
$MsiName = "AmethysteLogicApp" 

$oPermissions = @(
    "Directory.ReadWrite.All"
    "Group.ReadWrite.All"
    "GroupMember.ReadWrite.All"
    "User.ReadWrite.All"
    "RoleManagement.ReadWrite.Directory"
)

$GraphAppId = "00000003-0000-0000-c000-000000000000" # On ne change pas ceci


$oMsi = Get-AzADServicePrincipal -Filter "displayName eq '$MsiName'"
$oGraphSpn = Get-AzADServicePrincipal -Filter "appId eq '$GraphAppId'"

$oAppRole = $oGraphSpn.AppRole `
            | Where-Object { ($_.Value -in $oPermissions) `
            -and ($_.AllowedMemberType -contains "Application") }

Connect-MgGraph -TenantId $DestinationTenantId

foreach ($AppRole in $oAppRole) {
    $oAppRoleAssignment = @{
        "PrincipalId" = $oMSI.Id
        "ResourceId"  = $oGraphSpn.Id
        "AppRoleId"   = $AppRole.Id
    }
  
    New-MgServicePrincipalAppRoleAssignment `
        -ServicePrincipalId $oAppRoleAssignment.PrincipalId `
        -BodyParameter $oAppRoleAssignment `
        -Verbose
}

Le problème devops

Connect-MgGraph lance l’ouverture d’une popin Windows comme on l’a vu dans la démo. C’est assez inquiétant en contexte devops, d’autant plus qu’il n’y a pas de propriété -Credential à ce jour.

Le sujet est discuté sur la page Github de Graph:

https://github.com/microsoftgraph/msgraph-sdk-powershell/issues/1366

Il y a des réflexions, mais une alternative est de passer un certificat via l’attribut –Certificate. On peut également se connecter à Graph avec un SP. Je vous invite à aller voir la bibliographie.

A suivre

Bibliographie

Publicité

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s