Utilisation d’une identité managée affectée par le système pour un compte Azure Automation

Cette rubrique vous montre comment activer une identité managée affectée par le système 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.

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.

  • La version la plus récente des modules Az PowerShell Az.Accounts, Az.Resources, Az.Automation et Az.KeyVault.

  • 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, 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 locataire Microsoft Entra correspondant.

  • Si vous souhaitez exécuter des tâches hybrides à l’aide d’une identité managée, mettez à jour le Runbook Worker hybride basé sur l’agent vers la dernière version. Il n’y a pas version minimale requise pour le Runbook Worker hybride basé sur l’extension, et toutes les versions fonctionnent. Les versions minimales requises pour le Worker hybride basé sur l’agent sont les suivantes :

    • Runbook worker hybride Windows : version 7.3.1125.0
    • Runbook worker hybride Linux : version 1.7.4.0

    Pour vérifier les versions :

    • Runbook Worker hybride Windows : accédez au chemin d’installation – C:\ProgramFiles\Microsoft Monitoring Agent\Agent\AzureAutomation\. ; le dossier Azure Automation contient un sous-dossier dont le nom représente le numéro de version.
    • Runbook Worker hybride Linux : accédez au chemin – vi/opt/microsoft/omsconfig/modules/nxOMSAutomationWorker/VERSION. ; le fichier VERSION indique le numéro de version du Worker hybride.
  • Pour attribuer un rôle Azure, vous devez disposer d’une autorisation Microsoft.Authorization/roleAssignments/write telles que Administrateur de l’accès utilisateur ou Propriétaire.

Activer une identité managée affectée par le système pour un compte Azure Automation

Une fois activées, les propriétés suivantes seront affectées à l’identité managée affectée par le système.

Propriété (JSON) Valeur Description
principalid <principal-ID> L'identifiant global unique (GUID) de l'objet principal de service pour l'identité managée attribuée par le système qui représente votre compte Automation dans le locataire Microsoft Entra. Ce GUID apparaît parfois sous la forme d’un « ID d’objet » ou objectID.
tenantid <Azure-AD-tenant-ID> L'identifiant global unique (GUID) qui représente le locataire Microsoft Entra dont le compte Automation est désormais membre. Dans le locataire Microsoft Entra, le principal du service porte le même nom que le compte Automation.

Vous pouvez activer 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"

Important

La nouvelle identité au niveau du compte Automation remplace toutes les identités attribuées par le système au niveau de la machine virtuelle précédentes, et décrites dans Utiliser l’authentification du runbook avec les identités managées. Si vous exécutez des tâches hybrides sur des machines virtuelles Azure qui utilisent l’identité affectée par le système d’une machine virtuelle pour accéder aux ressources du runbook, l’identité du compte Automation sera utilisée pour les tâches hybrides. Cela signifie que l’exécution de votre tâche existante peut être affectée si vous avez utilisé la fonctionnalité de clés gérées par le client (CMK) de votre compte Automation.

Si vous souhaitez continuer à utiliser l’identité managée de la machine virtuelle, vous ne devez pas activer l’identité au niveau du compte Automation. Si vous l’avez déjà activée, vous pouvez désactiver l’identité managée affectée par le système du compte Automation. Consultez Désactiver votre identité managée de compte Azure Automation.

Activer à l’aide 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. Affectez la valeur On (Activé) à l’option Affecté(e) par le système, puis appuyez sur Enregistrer. Lorsque vous êtes invité à confirmer, sélectionnez Oui.

    Enabling system-assigned identity in Azure portal.

    Votre compte Automation peut désormais utiliser l'identité attribuée par le système, qui est enregistrée avec Microsoft Entra ID et représentée par un ID d'objet.

    Managed identity object ID.

Activer à l’aide de PowerShell

Utilisez l’applet de commande PowerShell Set-AzAutomationAccount pour activer l’Identité managée affectée par le système.

$output = Set-AzAutomationAccount `
    -ResourceGroupName $resourceGroup `
    -Name $automationAccount `
    -AssignSystemIdentity

$output

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

Output from set-azautomationaccount command.

Pour obtenir une sortie supplémentaire, modifiez l’exemple pour spécifier : $output.identity | ConvertTo-Json.

Activer à l’aide d’une API REST

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

Syntaxe

La syntaxe du corps ci-dessous active une identité managée affectée par le système à un compte Automation existant à l’aide de la méthode HTTP PATCH. Toutefois, cette syntaxe supprimera toutes les identités managées affectées par l’utilisateur existantes associées au compte Automation.

{ 
 "identity": { 
   "type": "SystemAssigned" 
  } 
}

Si plusieurs identités affectées par l’utilisateur sont définies, pour les conserver et supprimer uniquement l’identité affectée par le système, vous devez spécifier chaque identité affectée par l’utilisateur à l’aide d’une liste délimitée par des virgules. L’exemple ci-dessous utilise la méthode PATCH HTTP.

{ 
  "identity" : {
    "type": "SystemAssigned, UserAssigned",
    "userAssignedIdentities": {
        "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resourceGroupName/providers/Microsoft.ManagedIdentity/userAssignedIdentities/cmkID": {},
        "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resourceGroupName/providers/Microsoft.ManagedIdentity/userAssignedIdentities/cmkID2": {}
    }
  }
}

La syntaxe de l’API est la suivante :

PATCH 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. Copiez et collez la syntaxe du corps dans un fichier nommé body_sa.json. Enregistrez le fichier sur votre ordinateur local ou dans un compte de stockage Azure.

  2. Mettez à jour la valeur de la variable ci-dessous, puis exécutez.

    $file = "path\body_sa.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 :

    {
        "PrincipalId":  "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
        "TenantId":  "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
        "Type":  0,
        "UserAssignedIdentities":  null
    }
    

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

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

Syntaxe des modèles

La syntaxe de l’exemple de modèle ci-dessous active une identité managée affectée par le système au compte Automation existant. Toutefois, cette syntaxe supprimera toutes les identités managées affectées par l’utilisateur existantes associées au compte Automation.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Automation/automationAccounts",
      "apiVersion": "2020-01-13-preview",
      "name": "yourAutomationAccount",
      "location": "[resourceGroup().location]",
      "identity": {
        "type": "SystemAssigned"
        },
      "properties": {
        "sku": {
          "name": "Basic"
        }
      }
    }
  ]
}

Exemple

Procédez comme suit :

  1. Modifiez la syntaxe du modèle ci-dessus pour utiliser votre compte Automation et enregistrez-le dans un fichier nommé template_sa.json.

  2. Mettez à jour la valeur de la variable ci-dessous, puis exécutez.

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

    New-AzResourceGroupDeployment `
        -Name "SystemAssignedDeployment" `
        -ResourceGroupName $resourceGroup `
        -TemplateFile $templateFile
    

    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.

Attribuer un rôle à une identité managée affectée par le système

Un compte Automation peut utiliser son identité managée affectée par le système 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 le système 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.

L’exemple suivant 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.

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 le système

Pour vérifier un rôle attribué à une identité managée affectée par le système 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é.

    Assigning role in system-assigned identity in Azure portal.

  4. Sous Autorisations, cliquez sur Attributions de rôles Azure.

    Si les rôles sont déjà attribués à l’identité managée affectée par le système 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 le système

Après avoir activé l’identité managée 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 l’applet de commande Connect-AzAccount de l’applet de commande Az. Consultez Connect-AzAccount dans les informations de référence sur PowerShell.

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

# Connect to Azure with system-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity).context

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

Remarque

Si votre organisation utilise toujours les applets de commande AzureRM dépréciées, vous pouvez utiliser Connect-AzureRMAccount -Identity.

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 Post doit être « application/x-www-form-urlencoded ».

Obtenir le jeton d’accès pour l’identité managée affectée par le système à l’aide de HTTP Get

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

Obtenir le jeton d’accès pour l’identité affectée par le système à l’aide de HTTP Post

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

Utilisation de l’identité managée affectée par le système pour accéder à Azure Key Vault dans Azure PowerShell

Pour plus d'informations, consultez Get-AzKeyVaultSecret.

Write-Output "Connecting to azure via  Connect-AzAccount -Identity" 
Connect-AzAccount -Identity 
Write-Output "Successfully connected with Automation account's Managed Identity" 
Write-Output "Trying to fetch value from key vault using MI. 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 le système dans Python Runbook

#!/usr/bin/env python3 
import os 
import requests  
# printing environment variables 
endPoint = os.getenv('IDENTITY_ENDPOINT')+"?resource=https://management.azure.com/" 
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) 

Utilisation d’une identité managée affectée par le système pour accéder à la Base de données SQL

Pour plus d’informations sur le provisionnement de l’accès à une base de données Azure SQL, consultez Provisionner l’administrateur Microsoft Entra (base de données SQL).

$queryParameter = "?resource=https://database.windows.net/" 
$url = $env:IDENTITY_ENDPOINT + $queryParameter
$Headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" 
$Headers.Add("X-IDENTITY-HEADER", $env:IDENTITY_HEADER) 
$Headers.Add("Metadata", "True") 
$content =[System.Text.Encoding]::Default.GetString((Invoke-WebRequest -UseBasicParsing -Uri $url -Method 'GET' -Headers $Headers).RawContentStream.ToArray()) | ConvertFrom-Json 
$Token = $content.access_token 
echo "The managed identities for Azure resources access token is $Token" 
$SQLServerName = "<ServerName>"    # Azure SQL logical server name  
$DatabaseName = "<DBname>"     # Azure SQL database name 
Write-Host "Create SQL connection string" 
$conn = New-Object System.Data.SqlClient.SQLConnection  
$conn.ConnectionString = "Data Source=$SQLServerName.database.windows.net;Initial Catalog=$DatabaseName;Connect Timeout=30" 
$conn.AccessToken = $Token 
Write-host "Connect to database and execute SQL script" 
$conn.Open()  
$ddlstmt = "CREATE TABLE Person( PersonId INT IDENTITY PRIMARY KEY, FirstName NVARCHAR(128) NOT NULL)" 
Write-host " " 
Write-host "SQL DDL command" 
$ddlstmt 
$command = New-Object -TypeName System.Data.SqlClient.SqlCommand($ddlstmt, $conn) 
Write-host "results" 
$command.ExecuteNonQuery() 
$conn.Close()

Migrer à partir de comptes d’identification existants vers une identité managée

Azure Automation fournit une authentification pour la gestion des ressources Azure Resource Manager ou des ressources déployées sur le modèle de déploiement classique avec un compte d’identification. Pour passer d’un compte d’identification à une identité managée pour l’authentification du runbook, suivez les étapes ci-dessous.

  1. Activez une identité managée affectée par le système, affectée par l’utilisateur, ou les deux types d’identités managées.

  2. Accordez à l’identité managée les mêmes privilèges que les ressources Azure correspondant à ce que le compte d’identification a été affecté.

  3. Mettez à jour vos runbooks pour l’authentification à l’aide de l’identité managée.

  4. Modifiez des runbooks pour utiliser l’identité managée. Pour la prise en charge des identités, utilisez l’applet de commande Connect-AzAccount de l’applet de commande Az. Consultez Connect-AzAccount dans les informations de référence sur PowerShell.

    • Si vous utilisez des modules AzureRM, mettez à jour AzureRM.Profile vers la version la plus récente et remplacez l’utilisation de la cmdlet Add-AzureRMAccount par Connect-AzureRMAccount –Identity.
    • Si vous utilisez des modules Az, effectuez une mise à jour vers la dernière version en suivant les étapes décrites dans l’article Mettre à jour les modules Azure PowerShell.

Étapes suivantes