Använda en användartilldelad hanterad identitet för ett Azure Automation-konto
Den här artikeln visar hur du lägger till en användartilldelad hanterad identitet för ett Azure Automation-konto och hur du använder den för att komma åt andra resurser. Mer information om hur hanterade identiteter fungerar med Azure Automation finns i Hanterade identiteter.
Kommentar
Det går inte att använda en användartilldelad hanterad identitet på en Hybrid Runbook Worker när en hanterad identitet (antingen system eller användartilldelad) har skapats för Automation-kontot. Om hanterad identitet inte har tilldelats automationskontot är det möjligt att använda den virtuella datorns system- eller användartilldelade hanterade identitet på en Hybrid Runbook Worker som är en virtuell Azure-dator med de tilldelade hanterade identiteterna.
Om du inte har någon Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.
Förutsättningar
Ett Azure Automation-konto. Anvisningar finns i Skapa ett Azure Automation-konto.
Den användartilldelade hanterade identiteten och de Azure-målresurser som din runbook hanterar med den identiteten kan finnas i olika Azure-prenumerationer.
Den senaste versionen av Azure-kontomoduler. För närvarande är detta 2.2.8. (Se Az.Accounts för information om den här versionen.)
En Azure-resurs som du vill komma åt från din Automation-runbook. Den här resursen måste ha en roll definierad för den användartilldelade hanterade identiteten, vilket hjälper Automation-runbooken att autentisera åtkomsten till resursen. Om du vill lägga till roller måste du vara ägare till resursen i motsvarande Microsoft Entra-klientorganisation.
Om du vill tilldela en Azure-roll måste du ha
Microsoft.Authorization/roleAssignments/write
behörigheter, till exempel administratör för användaråtkomst eller ägare.
Lägga till användartilldelad hanterad identitet för Azure Automation-konto
Du kan lägga till en användartilldelad hanterad identitet för ett Azure Automation-konto med hjälp av mallen Azure Portal, PowerShell, Azure REST API eller ARM. För exemplen med PowerShell loggar du först in på Azure interaktivt med hjälp av cmdleten Connect-AzAccount och följer anvisningarna.
# 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>"
Initiera sedan en uppsättning variabler som ska användas i exemplen. Ändra värdena nedan och kör sedan"
$subscriptionID = "subscriptionID"
$resourceGroup = "resourceGroupName"
$automationAccount = "automationAccountName"
$userAssignedOne = "userAssignedIdentityOne"
$userAssignedTwo = "userAssignedIdentityTwo"
Lägg till med hjälp av Azure Portal
Utför följande steg:
Logga in på Azure-portalen.
I Azure Portal går du till ditt Automation-konto.
Gå till Kontoinställningar och välj Identitet.
Välj fliken Användartilldelade och välj sedan Lägg till.
Välj din befintliga användartilldelade hanterade identitet och välj sedan Lägg till. Sedan returneras du till fliken Användartilldelad .
Lägg till med PowerShell
Använd PowerShell-cmdleten Set-AzAutomationAccount för att lägga till de användartilldelade hanterade identiteterna. Du måste först överväga om det finns en befintlig systemtilldelad hanterad identitet. Exemplet nedan lägger till två befintliga användartilldelade hanterade identiteter till ett befintligt Automation-konto och inaktiverar en systemtilldelad hanterad identitet om en sådan finns.
$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
Använd följande för att behålla en befintlig systemtilldelad hanterad identitet:
$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
Utdata bör se ut ungefär så här:
För ytterligare utdata kör du: $output.identity | ConvertTo-Json
.
Lägga till med hjälp av ett REST-API
Syntax- och exempelsteg finns nedan.
Syntax
Exempeltextsyntaxen nedan aktiverar en systemtilldelad hanterad identitet om den inte redan är aktiverad och tilldelar två befintliga användartilldelade hanterade identiteter till det befintliga Automation-kontot.
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": {}
}
}
}
Syntaxen för API:n är följande:
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
Exempel
Utför följande steg.
Ändra syntaxen för brödtexten ovan till en fil med namnet
body_ua.json
. Spara filen på den lokala datorn eller på ett Azure-lagringskonto.Ändra variabelvärdet nedan och kör sedan.
$file = "path\body_ua.json"
I det här exemplet används PowerShell-cmdleten Invoke-RestMethod för att skicka PATCH-begäran till ditt Automation-konto.
# 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
Utdata bör se ut ungefär så här:
{ "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" } } }
Lägga till med hjälp av en ARM-mall
Syntax- och exempelsteg finns nedan.
Mallsyntax
Syntaxen för exempelmallen nedan aktiverar en systemtilldelad hanterad identitet om den inte redan är aktiverad och tilldelar två befintliga användartilldelade hanterade identiteter till det befintliga Automation-kontot.
{
"$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": {}
}
}
}
]
}
Exempel
Utför följande steg.
Kopiera och klistra in mallen i en fil med namnet
template_ua.json
. Spara filen på den lokala datorn eller på ett Azure-lagringskonto.Ändra variabelvärdet nedan och kör sedan.
$templateFile = "path\template_ua.json"
Använd PowerShell-cmdleten New-AzResourceGroupDeployment för att distribuera mallen.
New-AzResourceGroupDeployment ` -Name "UserAssignedDeployment" ` -ResourceGroupName $resourceGroup ` -TemplateFile $templateFile ` -automationAccountName $automationAccount ` -userAssignedOne $userAssignedOne ` -userAssignedTwo $userAssignedTwo
Kommandot genererar inte några utdata. Du kan dock använda koden nedan för att verifiera:
(Get-AzAutomationAccount ` -ResourceGroupName $resourceGroup ` -Name $automationAccount).Identity | ConvertTo-Json
Utdata ser ut ungefär som de utdata som visas för REST API-exemplet ovan.
Tilldela en roll till en användartilldelad hanterad identitet
Ett Automation-konto kan använda den användartilldelade hanterade identiteten till att hämta token för att få åtkomst till andra resurser som skyddas av Microsoft Entra ID, till exempel Azure nyckelvalv. Sådana token representerar inte någon specifik appanvändare. I stället representerar de appen som använder resursen. I det här fallet representerar till exempel token ett Automation-konto.
Innan du kan använda din användartilldelade hanterade identitet för autentisering måste du konfigurera identitetens åtkomst till den Azure-resurs där identiteten ska användas. För att slutföra den här uppgiften tilldelar du lämplig roll till identiteten på Azure-målresursen.
Följ principen om lägsta behörighet och tilldela endast de behörigheter som krävs för att köra din runbook. Om Automation-kontot till exempel bara behövs för att starta eller stoppa en virtuell Azure-dator ska du bara tilldela behörigheter för att starta eller stoppa den virtuella datorn till Kör som-kontot. På samma sätt tilldelar du skrivskyddade behörigheter om en runbook läser från bloblagring.
I det här exemplet används Azure PowerShell för att visa hur du tilldelar rollen Deltagare i prenumerationen till Azure-målresursen. Deltagarrollen används som exempel och kanske inte krävs i ditt fall. Du kan också tilldela rollen till azure-målresursen i Azure Portal.
New-AzRoleAssignment `
-ObjectId <automation-Identity-object-id> `
-Scope "/subscriptions/<subscription-id>" `
-RoleDefinitionName "Contributor"
Verifiera rolltilldelning till en användarhanterad identitet
Så här verifierar du en roll för en användartilldelad hanterad identitet för Automation-kontot:
Logga in på Azure-portalen.
Gå till ditt Automation-konto.
Gå till Kontoinställningar och välj Identitet, Användartilldelad.
Klicka på Användartilldelat identitetsnamn.
Om rollerna redan är tilldelade till den valda användartilldelade hanterade identiteten ser du en lista med rolltilldelningar. Den här listan innehåller de rolltilldelningar du har behörighet att läsa.
Om du vill ändra prenumerationen klickar du på listrutan Prenumeration och väljer lämplig prenumeration.
Klicka på Lägg till rolltilldelning (förhandsversion)
I listrutan väljer du den uppsättning resurser som rolltilldelningen gäller – Prenumeration, Resursgrupp, Roll och Omfång.
Om du inte har rolltilldelningen kan du visa skrivbehörigheterna för det valda omfånget som ett infogat meddelande.I listrutan Roll väljer du en roll som Virtuell datordeltagare.
Klicka på Spara.
Efter några minuter tilldelas den hanterade identiteten rollen i det valda omfånget.
Autentisera åtkomst med en användartilldelad hanterad identitet
När du har aktiverat den användartilldelade hanterade identiteten för ditt Automation-konto och gett en identitet åtkomst till målresursen kan du ange identiteten i runbooks mot resurser som har stöd för hanterade identiteter. För identitetsstöd använder du Az-cmdleten 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
Generera en åtkomsttoken utan att använda Azure-cmdletar
Kontrollera följande för HTTP-slutpunkter.
- Metadatahuvudet måste vara närvarande och ska vara inställt på "true".
- En resurs måste skickas tillsammans med begäran, som en frågeparameter för en GET-begäran och som formulärdata för en POST-begäran.
- Ange värdet för miljövariabeln IDENTITY_HEADER till X-IDENTITY-HEADER.
- Innehållstyp för Post-begäran måste vara
application/x-www-form-urlencoded
.
Hämta åtkomsttoken för användartilldelad hanterad identitet med 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
Hämta åtkomsttoken för användartilldelad hanterad identitet med 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
Använda användartilldelad hanterad identitet i 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)
}
Använda användartilldelad hanterad identitet i 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)
Nästa steg
Om dina runbooks inte slutförs kan du läsa Felsöka problem med hanterade identiteter i Azure Automation.
Om du behöver inaktivera en hanterad identitet kan du läsa Inaktivera din hanterade identitet för Azure Automation-kontot.
En översikt över Azure Automation-kontosäkerhet finns i Översikt över autentisering av Automation-konto.