Dela via


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 Azure-portalen, PowerShell, Azure REST API eller ARM-mallen. För exemplen med PowerShell loggar du först in på Azure interaktivt med cmdleten Anslut-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 azure-portalen

Utför följande steg:

  1. Logga in på Azure-portalen.

  2. Gå till ditt Automation-konto i Azure-portalen.

  3. Gå till Kontoinställningar och välj Identitet.

  4. Välj fliken Användartilldelade och välj sedan Lägg till.

  5. Välj din befintliga användartilldelade hanterade identitet och välj sedan Lägg till. Sedan returneras du till fliken Användartilldelad .

    Output from Portal.

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:

Output from Set-AzAutomationAccount command.

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/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": {}
    }
  }
}

Syntaxen för API:et är följande:

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 

Exempel

Utför följande steg.

  1. Ä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.

  2. Ändra variabelvärdet nedan och kör sedan.

    $file = "path\body_ua.json"
    
  3. 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": "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"
                    }
        }
    }
    

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.

  1. Kopiera och klistra in mallen i en fil med namnet template_ua.json. Spara filen på den lokala datorn eller på ett Azure-lagringskonto.

  2. Ändra variabelvärdet nedan och kör sedan.

    $templateFile = "path\template_ua.json"
    
  3. 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.

Koppla en roll till en användartilldelad hanterad identitet

Ett Automation-konto kan använda sin användartilldelade hanterade identitet för att hämta token för att få åtkomst till andra resurser som skyddas av Microsoft Entra-ID, till exempel Azure Key Vault. 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-portalen.

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:

  1. Logga in på Azure-portalen.

  2. Gå till ditt Automation-konto.

  3. Under Konto Inställningar väljer du Identitet, Användartilldelad.

  4. Klicka på Användartilldelat identitetsnamn.

    Assigning role in user-assigned identity in Azure portal.

    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.

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

  5. Om du vill ändra prenumerationen klickar du på listrutan Prenumeration och väljer lämplig prenumeration.

  6. Klicka på Lägg till rolltilldelning (förhandsversion)

  7. 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.

  8. I listrutan Roll väljer du en roll som Virtuell datordeltagare.

  9. Klicka på Spara.

    Add a role assignment in Azure portal.

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.