Utilisation d’une identité managée affectée par l’utilisateur pour un compte Azure Automation

Cette rubrique vous montre comment ajouter une identité managée affectée par l’utilisateur pour un compte Azure Automation et comment l’utiliser pour accéder à d’autres ressources. Pour plus d’informations sur le fonctionnement des identités managées avec Azure Automation, consultez Identités managées.

Remarque

Il n’est pas possible d’utiliser une identité managée affectée par l’utilisateur sur un Runbook Worker hybride lorsqu’une identité managée (système ou utilisateur affecté) a été créée pour le compte Automation. Si l’identité managée n’a pas été attribuée au compte Automation, il est possible d’utiliser l’identité managée affectée par l’utilisateur ou le système de la machine virtuelle sur un Runbook Worker hybride qui est une machine virtuelle Azure avec les identités managées affectées.

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

Prérequis

  • Un compte Azure Automation. Pour obtenir des instructions, consultez Créer un compte Azure Automation.

  • L’identité managée affectée par l’utilisateur et les ressources Azure cibles que votre runbook gère à l’aide de cette identité peuvent se trouver dans des abonnements Azure différents.

  • La dernière version des modules de compte Azure. Il s'agit actuellement de la version 2.2.8. (Pour plus d'informations sur cette version, consultez Az.Accounts).

  • Une ressource Azure à laquelle vous souhaitez accéder à partir de votre runbook Automation. Cette ressource doit avoir un rôle défini pour l’identité managée affectée par l’utilisateur, ce qui aide le runbook Automation à authentifier l’accès à la ressource. Pour ajouter des rôles, vous devez être propriétaire de la ressource dans le tenant Microsoft Entra correspondant.

  • Pour attribuer un rôle Azure, vous devez disposer d’autorisations Microsoft.Authorization/roleAssignments/write, telles que Administrateur de l’accès utilisateur ou Propriétaire.

Ajouter une identité managée affectée par l’utilisateur pour un compte Azure Automation

Vous pouvez ajouter une identité managée affectée par le système pour un compte Azure Automation à l’aide du Portail Azure, de PowerShell, de l’API REST Azure ou du modèle ARM. Pour les exemples impliquant PowerShell, connectez-vous d’abord à Azure de manière interactive à l’aide de l’applet de commande Connect-AzAccount et suivez les instructions.

# Sign in to your Azure subscription
$sub = Get-AzSubscription -ErrorAction SilentlyContinue
if(-not($sub))
{
    Connect-AzAccount
}

# If you have multiple subscriptions, set the one to use
# Select-AzSubscription -SubscriptionId "<SUBSCRIPTIONID>"

Ensuite, initialisez un ensemble de variables qui seront utilisées dans les exemples. Modifiez les valeurs ci-dessous, puis exécutez.

$subscriptionID = "subscriptionID"
$resourceGroup = "resourceGroupName"
$automationAccount = "automationAccountName"
$userAssignedOne = "userAssignedIdentityOne"
$userAssignedTwo = "userAssignedIdentityTwo"

Ajouter au moyen du Portail Azure

Appliquez la procédure suivante :

  1. Connectez-vous au portail Azure.

  2. Sur le Portail Azure, accédez à votre compte Automation.

  3. Sous Paramètres du compte, sélectionnez Identité.

  4. Sélectionnez l’onglet Affecté(e) par l’utilisateur, puis Ajouter.

  5. Sélectionnez votre identité managée affectée par l’utilisateur existante, puis sélectionnez Ajouter. Vous revenez à l’onglet Affecté(e) par l’utilisateur.

    Output from Portal.

Ajouter à l’aide de PowerShell

Utilisez la cmdlet PowerShell Set-AzAutomationAccount pour ajouter les identités managées affectées par l’utilisateur. Vous devez d’abord déterminer s’il existe une identité managée affectée par le système existante. L’exemple ci-dessous ajoute deux identités managées affectées par l’utilisateur existantes à un compte Automation existant, et désactive une identité managée affectée par le système, le cas échéant.

$output = Set-AzAutomationAccount `
    -ResourceGroupName $resourceGroup `
    -Name $automationAccount `
    -AssignUserIdentity "/subscriptions/$subscriptionID/resourcegroups/$resourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$userAssignedOne", `
        "/subscriptions/$subscriptionID/resourcegroups/$resourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$userAssignedTwo"

$output

Pour conserver une identité managée affectée par le système existante, utilisez ce qui suit :

$output = Set-AzAutomationAccount `
    -ResourceGroupName $resourceGroup `
    -Name $automationAccount `
    -AssignUserIdentity "/subscriptions/$subscriptionID/resourcegroups/$resourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$userAssignedOne", `
        "/subscriptions/$subscriptionID/resourcegroups/$resourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$userAssignedTwo" `
    -AssignSystemIdentity

$output

Le résultat doit être semblable à ce qui suit :

Output from Set-AzAutomationAccount command.

Pour obtenir une sortie supplémentaire, exécutez : $output.identity | ConvertTo-Json.

Ajouter à l’aide d’une API REST

Vous trouverez ci-dessous une syntaxe et des exemples d’étapes.

Syntaxe

L’exemple de syntaxe de corps ci-dessous active une identité managée affectée par le système si elle n’est pas déjà activée et affecte deux identités managées affectées par l’utilisateur existantes au compte Automation existant.

PATCH

{
  "identity": {
    "type": "SystemAssigned, UserAssigned",
    "userAssignedIdentities": {
      "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resource-group-name/providers/Microsoft.ManagedIdentity/userAssignedIdentities/firstIdentity": {},
      "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resource-group-name/providers/Microsoft.ManagedIdentity/userAssignedIdentities/secondIdentity": {}
    }
  }
}

La syntaxe de l’API est la suivante :

https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resource-group-name/providers/Microsoft.Automation/automationAccounts/automation-account-name?api-version=2020-01-13-preview 

Exemple

Procédez comme suit :

  1. Révisez la syntaxe du corps ci-dessus dans un fichier nommé body_ua.json. Enregistrez le fichier sur votre ordinateur local ou dans un compte de stockage Azure.

  2. Révisez la valeur de la variable ci-dessous, puis exécutez.

    $file = "path\body_ua.json"
    
  3. Cet exemple utilise la cmdlet PowerShell Invoke-RestMethod pour envoyer la requête PATCH à votre compte Automation.

    # build URI
    $URI = "https://management.azure.com/subscriptions/$subscriptionID/resourceGroups/$resourceGroup/providers/Microsoft.Automation/automationAccounts/$automationAccount`?api-version=2020-01-13-preview"
    
    # build body
    $body = Get-Content $file
    
    # obtain access token
    $azContext = Get-AzContext
    $azProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile
    $profileClient = New-Object -TypeName Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient -ArgumentList ($azProfile)
    $token = $profileClient.AcquireAccessToken($azContext.Subscription.TenantId)
    $authHeader = @{
        'Content-Type'='application/json'
        'Authorization'='Bearer ' + $token.AccessToken
    }
    
    # Invoke the REST API
    $response = Invoke-RestMethod -Uri $URI -Method PATCH -Headers $authHeader -Body $body
    
    # Review output
    $response.identity | ConvertTo-Json
    

    Le résultat doit être semblable à ce qui suit :

    {
    "type": "SystemAssigned, UserAssigned",
    "principalId": "00000000-0000-0000-0000-000000000000",
    "tenantId": "00000000-0000-0000-0000-000000000000",
    "userAssignedIdentities":  {
        "/subscriptions/ContosoID/resourcegroups/ContosoLab/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ContosoUAMI1":  {
                "PrincipalId":  "00000000-0000-0000-0000-000000000000",
                "ClientId":  "00000000-0000-0000-0000-000000000000"
                    },
        "/subscriptions/ContosoID/resourcegroups/ContosoLab/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ContosoUAMI2":  {
                "PrincipalId":  "00000000-0000-0000-0000-000000000000",
                "ClientId":  "00000000-0000-0000-0000-000000000000"
                    }
        }
    }
    

Ajouter à l’aide d’un modèle ARM

Vous trouverez ci-dessous une syntaxe et des exemples d’étapes.

Syntaxe des modèles

L’exemple de syntaxe de modèle ci-dessous active une identité managée affectée par le système si elle n’est pas déjà activée et affecte deux identités managées affectées par l’utilisateur existantes au compte Automation existant.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "automationAccountName": {
     "defaultValue": "YourAutomationAccount",
      "type": "String",
      "metadata": {
        "description": "Automation account name"
      }
    },
    "userAssignedOne": {
     "defaultValue": "userAssignedOne",
      "type": "String",
      "metadata": {
        "description": "User-assigned managed identity"
      }
	  },
    "userAssignedTwo": {
     "defaultValue": "userAssignedTwo",
      "type": "String",
      "metadata": {
        "description": "User-assigned managed identity"
      }
	  }
   },
  "resources": [
    {
      "type": "Microsoft.Automation/automationAccounts",
      "apiVersion": "2020-01-13-preview",
      "name": "[parameters('automationAccountName')]",
      "location": "[resourceGroup().location]",
      "identity": {
        "type": "SystemAssigned, UserAssigned",
        "userAssignedIdentities": {
          "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',parameters('userAssignedOne'))]": {},
          "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',parameters('userAssignedTwo'))]": {}
        }
      },
      "properties": {
        "sku": {
          "name": "Basic"
        },
        "encryption": {
          "keySource": "Microsoft.Automation",
          "identity": {}
        }
      }
    }
  ]
}

Exemple

Procédez comme suit :

  1. Copiez et collez le modèle dans un fichier nommé template_ua.json. Enregistrez le fichier sur votre ordinateur local ou dans un compte de stockage Azure.

  2. Révisez la valeur de la variable ci-dessous, puis exécutez.

    $templateFile = "path\template_ua.json"
    
  3. Utilisez la cmdlet PowerShell New-AzResourceGroupDeployment pour déployer le modèle.

    New-AzResourceGroupDeployment `
        -Name "UserAssignedDeployment" `
        -ResourceGroupName $resourceGroup `
        -TemplateFile $templateFile `
        -automationAccountName $automationAccount `
        -userAssignedOne $userAssignedOne `
        -userAssignedTwo $userAssignedTwo
    

    La commande ne génèrera pas de sortie. Toutefois, vous pouvez utiliser le code ci-dessous pour vérifier :

    (Get-AzAutomationAccount `
    -ResourceGroupName $resourceGroup `
    -Name $automationAccount).Identity | ConvertTo-Json
    

    La sortie ressemblera à la sortie affichée pour l’exemple d’API REST ci-dessus.

Affecter un rôle à une identité managée affectée par l’utilisateur

Un compte Automation peut utiliser son identité managée affectée par l’utilisateur pour obtenir des jetons afin d’accéder à d’autres ressources protégées par Microsoft Entra ID, comme Azure Key Vault. Ces jetons ne représentent pas un utilisateur spécifique de l’application. Ils représentent plutôt l’application qui accède à la ressource. Dans ce cas, par exemple, le jeton représente un compte Automation.

Avant de pouvoir vous servir de l’identité managée affectée par l’utilisateur dans le cadre de l’authentification, configurez l’accès de cette identité à la ressource Azure où vous prévoyez de l’utiliser. Pour effectuer cette tâche, attribuez le rôle approprié à cette identité sur la ressource Azure cible.

Suivez le principe des privilèges minimum et attribuez avec précaution les seules autorisations nécessaires pour exécuter votre runbook. Par exemple, si le compte Automation est requis uniquement pour démarrer ou arrêter une machine virtuelle Azure, les autorisations affectées au compte d’identification ou à l’identité managée doivent servir uniquement à démarrer ou arrêter la machine virtuelle. De même, si un runbook lit à partir du stockage blob, attribuez des autorisations en lecture seule.

Cet exemple utilise Azure PowerShell pour montrer comment attribuer le rôle Contributeur dans l’abonnement à la ressource Azure cible. Le rôle Contributeur est utilisé à titre d’exemple et peut ne pas être requis dans votre cas. Vous pouvez également attribuer le rôle à la ressource Azure cible dans le portail Azure.

New-AzRoleAssignment `
    -ObjectId <automation-Identity-object-id> `
    -Scope "/subscriptions/<subscription-id>" `
    -RoleDefinitionName "Contributor"

Vérifier l’attribution de rôle à une identité managée par l’utilisateur

Pour vérifier un rôle attribué à une identité managée affectée par l’utilisateur du compte Automation, procédez comme suit :

  1. Connectez-vous au portail Azure.

  2. Accédez à votre compte Automation.

  3. Sous Paramètres du compte, sélectionnez Identité , Affectée par l’utilisateur.

  4. Cliquez sur Nom de l’identité affectée par l’utilisateur.

    Assigning role in user-assigned identity in Azure portal.

    Si les rôles sont déjà attribués à l’identité managée affectée par l’utilisateur sélectionnée, vous pouvez voir une liste d’attributions de rôles. Cette liste inclut toutes les attributions de rôle que vous êtes autorisé à lire.

    View role-assignments that you have permission in Azure portal.

  5. Pour modifier l’abonnement, cliquez sur la liste déroulante Abonnement et sélectionnez l’abonnement approprié.

  6. Cliquez sur Ajouter une attribution de rôle (préversion).

  7. Dans la liste déroulante, sélectionnez l’ensemble de ressources auquel s’applique l’attribution de rôle : Abonnement, Groupe de ressources, Rôle et Étendue.
    Si vous n’avez pas d’attribution de rôle, vous pouvez afficher les autorisations d’accès en écriture pour l’étendue sélectionnée sous forme de message inlined.

  8. Dans la liste déroulante Rôle, sélectionnez un rôle comme Contributeur de machine virtuelle.

  9. Cliquez sur Enregistrer.

    Add a role assignment in Azure portal.

Après quelques minutes, le rôle est attribué à l’identité managée dans l’étendue sélectionnée.

Authentifier l’accès à l’aide d’une identité managée affectée par l’utilisateur

Après avoir activé l’identité managée affectée par l’utilisateur pour votre compte Automation et accordé à une identité l’accès à la ressource cible, vous pouvez spécifier cette identité dans les runbooks pour les ressources qui prennent en charge l’identité managée. Pour la prise en charge des identités, utilisez la cmdlet Connect-AzAccount.

# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process

# Connect to Azure with user-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity -AccountId <user-assigned-identity-ClientId>).context

# set and store context
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext

Générer un jeton d’accès sans utiliser les applets de commande Azure

Pour les points de terminaison HTTP, vérifiez les points suivants.

  • L’en-tête de métadonnées doit être présent et avoir la valeur « true ».
  • Une ressource doit être passée avec la demande, en tant que paramètre de requête pour une demande GET et en tant que données de formulaire pour une demande POST.
  • Définissez la valeur de la variable d’environnement IDENTITY_HEADER sur X-IDENTITY-HEADER.
  • Le type de contenu de la demande de publication doit être application/x-www-form-urlencoded.

Obtenir le jeton d’accès pour l’identité managée affectée par l’utilisateur à l’aide de la requête HTTP Get

$resource= "?resource=https://management.azure.com/"
$client_id="&client_id=<ClientId of USI>"
$url = $env:IDENTITY_ENDPOINT + $resource + $client_id 
$Headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"  
$Headers.Add("Metadata", "True")
$headers.Add("X-IDENTITY-HEADER", $env:IDENTITY_HEADER) 
$accessToken = Invoke-RestMethod -Uri $url -Method 'GET' -Headers $Headers
Write-Output $accessToken.access_token 

Obtenir le jeton d’accès pour l’identité managée affectée par l’utilisateur à l’aide de la requête HTTP Post

$url = $env:IDENTITY_ENDPOINT
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Metadata", "True")
$headers.Add("X-IDENTITY-HEADER", $env:IDENTITY_HEADER) 
$body = @{'resource'='https://management.azure.com/' 
'client_id'='<ClientId of USI>'}
$accessToken = Invoke-RestMethod $url -Method 'POST' -Headers $headers -ContentType 'application/x-www-form-urlencoded' -Body $body
Write-Output $accessToken.access_token 

Utilisation d’une identité managée affectée par l’utilisateur dans Azure PowerShell

Write-Output "Connecting to azure via  Connect-AzAccount -Identity -AccountId <ClientId of USI>"  
Connect-AzAccount -Identity -AccountId <ClientId of USI> 
Write-Output "Successfully connected with Automation account's Managed Identity"  
Write-Output "Trying to fetch value from key vault using User Assigned Managed identity. Make sure you have given correct access to Managed Identity"  
$secret = Get-AzKeyVaultSecret -VaultName '<KVname>' -Name '<KeyName>'  
$ssPtr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secret.SecretValue)  
try {  
  $secretValueText = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($ssPtr)  
    Write-Output $secretValueText  
} finally {  
    [System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ssPtr)  
} 

Utilisation d’une identité managée affectée par l’utilisateur dans Python Runbook

#!/usr/bin/env python3  
import os  
import requests   

resource = "?resource=https://management.azure.com/" 
client_id = "&client_id=<ClientId of USI>" 
endPoint = os.getenv('IDENTITY_ENDPOINT')+ resource +client_id 
identityHeader = os.getenv('IDENTITY_HEADER') 
payload={}  
headers = {  
  'X-IDENTITY-HEADER': identityHeader,
  'Metadata': 'True' 
}  
response = requests.request("GET", endPoint, headers=headers, data=payload)  
print(response.text) 

Étapes suivantes