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 :
Connectez-vous au portail Azure.
Sur le Portail Azure, accédez à votre compte Automation.
Sous Paramètres du compte, sélectionnez Identité.
Sélectionnez l’onglet Affecté(e) par l’utilisateur, puis Ajouter.
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.
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 :
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/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0/resourceGroups/resource-group-name/providers/Microsoft.ManagedIdentity/userAssignedIdentities/firstIdentity": {},
"/subscriptions/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0/resourceGroups/resource-group-name/providers/Microsoft.ManagedIdentity/userAssignedIdentities/secondIdentity": {}
}
}
}
La syntaxe de l’API est la suivante :
https://management.azure.com/subscriptions/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0/resourceGroups/resource-group-name/providers/Microsoft.Automation/automationAccounts/automation-account-name?api-version=2020-01-13-preview
Exemple
Procédez comme suit :
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.Révisez la valeur de la variable ci-dessous, puis exécutez.
$file = "path\body_ua.json"
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": "ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0", "tenantId": "ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0", "userAssignedIdentities": { "/subscriptions/ContosoID/resourcegroups/ContosoLab/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ContosoUAMI1": { "PrincipalId": "ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0", "ClientId": "00001111-aaaa-2222-bbbb-3333cccc4444" }, "/subscriptions/ContosoID/resourcegroups/ContosoLab/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ContosoUAMI2": { "PrincipalId": "ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0", "ClientId": "00001111-aaaa-2222-bbbb-3333cccc4444" } } }
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 :
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.Révisez la valeur de la variable ci-dessous, puis exécutez.
$templateFile = "path\template_ua.json"
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 :
Connectez-vous au portail Azure.
Accédez à votre compte Automation.
Sous Paramètres du compte, sélectionnez Identité , Affectée par l’utilisateur.
Cliquez sur Nom de l’identité affectée par l’utilisateur.
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.
Pour modifier l’abonnement, cliquez sur la liste déroulante Abonnement et sélectionnez l’abonnement approprié.
Cliquez sur Ajouter une attribution de rôle (préversion).
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.Dans la liste déroulante Rôle, sélectionnez un rôle comme Contributeur de machine virtuelle.
Cliquez sur Enregistrer.
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
Si l’exécution de vos runbooks ne se termine pas correctement, consultez Résoudre les problèmes d’identité managée Azure Automation.
Si vous devez désactiver une identité managée, consultez Désactiver votre identité managée de compte Azure Automation.
Pour obtenir une vue d’ensemble de la sécurité du compte Azure Automation, consultez Vue d’ensemble de l’authentification du compte Automation.