Een door een gebruiker toegewezen beheerde identiteit gebruiken voor een Azure Automation-account

In dit artikel leest u hoe u een door de gebruiker toegewezen beheerde identiteit toevoegt voor een Azure Automation-account en hoe u deze gebruikt voor toegang tot andere resources. Zie Beheerde identiteiten voor meer informatie over hoe beheerde identiteiten werken met Azure Automation.

Notitie

Het is niet mogelijk om een door de gebruiker toegewezen beheerde identiteit te gebruiken op een Hybrid Runbook Worker wanneer er een beheerde identiteit (systeem of gebruiker toegewezen) is gemaakt voor het Automation-account. Als beheerde identiteit niet is toegewezen aan het Automation-account, is het mogelijk om het systeem of de door de gebruiker toegewezen beheerde identiteit van de virtuele machine te gebruiken op een Hybrid Runbook Worker die een Azure-VM is met de toegewezen beheerde identiteiten.

Als u geen Azure-abonnement hebt, maakt u een gratis account voordat u begint.

Vereisten

  • Een Azure Automation-account. Zie Een Azure Automation-account maken voor instructies.

  • De door de gebruiker toegewezen beheerde identiteit en de doel-Azure-resources die door uw runbook worden beheerd met behulp van die identiteit, kunnen zich in verschillende Azure-abonnementen bevinden.

  • De nieuwste versie van Azure-accountmodules. Dit is momenteel 2.2.8. (Zie Az.Accounts voor meer informatie over deze versie.)

  • Een Azure-resource waartoe u toegang wilt krijgen vanuit uw Automation-runbook. Deze resource moet een rol hebben die is gedefinieerd voor de door de gebruiker toegewezen beheerde identiteit, waarmee het Automation-runbook de toegang tot de resource kan verifiëren. Als u rollen wilt toevoegen, moet u eigenaar zijn van de resource in de bijbehorende Microsoft Entra-tenant.

  • Als u een Azure-rol wilt toewijzen, moet u machtigingen hebbenMicrosoft.Authorization/roleAssignments/write, zoals gebruikerstoegang Beheer istrator of eigenaar.

Door de gebruiker toegewezen beheerde identiteit toevoegen voor een Azure Automation-account

U kunt een door de gebruiker toegewezen beheerde identiteit toevoegen voor een Azure Automation-account met behulp van Azure Portal, PowerShell, de Azure REST API of ARM-sjabloon. Voor de voorbeelden van PowerShell meldt u zich eerst interactief aan bij Azure met behulp van de cmdlet Verbinding maken-AzAccount en volgt u de instructies.

# 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>"

Initialiseer vervolgens een set variabelen die in de voorbeelden worden gebruikt. Wijzig de onderstaande waarden en voer deze vervolgens uit"

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

Toevoegen met behulp van Azure Portal

Voer de volgende stappen uit:

  1. Meld u aan bij de Azure-portal.

  2. Navigeer in Azure Portal naar uw Automation-account.

  3. Selecteer bij Accountinstellingen de optie Identiteit.

  4. Selecteer het tabblad Gebruiker toegewezen en selecteer vervolgens Toevoegen.

  5. Selecteer uw bestaande door de gebruiker toegewezen beheerde identiteit en selecteer vervolgens Toevoegen. Vervolgens keert u terug naar het tabblad Gebruiker toegewezen .

    Output from Portal.

Toevoegen met Behulp van PowerShell

Gebruik de PowerShell-cmdlet Set-AzAutomationAccount om de door de gebruiker toegewezen beheerde identiteiten toe te voegen. U moet eerst overwegen of er een bestaande door het systeem toegewezen beheerde identiteit is. In het onderstaande voorbeeld worden twee bestaande door de gebruiker toegewezen beheerde identiteiten aan een bestaand Automation-account toegevoegd en wordt een door het systeem toegewezen beheerde identiteit uitgeschakeld als deze bestaat.

$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

Als u een bestaande door het systeem toegewezen beheerde identiteit wilt behouden, gebruikt u het volgende:

$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

De uitvoer moet er als volgt uitzien:

Output from Set-AzAutomationAccount command.

Voor extra uitvoer voert u het volgende uit: $output.identity | ConvertTo-Json.

Toevoegen met behulp van een REST API

Hieronder ziet u de syntaxis en voorbeeldstappen.

Syntaxis

De onderstaande syntaxis van de voorbeeldtekst maakt een door het systeem toegewezen beheerde identiteit mogelijk als deze nog niet is ingeschakeld en wijst twee bestaande door de gebruiker toegewezen beheerde identiteiten toe aan het bestaande Automation-account.

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

De syntaxis van de API is als volgt:

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 

voorbeeld

Voer de volgende stappen uit.

  1. Wijzig de syntaxis van de bovenstaande hoofdtekst in een bestand met de naam body_ua.json. Sla het bestand op uw lokale computer of in een Azure-opslagaccount op.

  2. Wijzig de onderstaande variabelewaarde en voer deze vervolgens uit.

    $file = "path\body_ua.json"
    
  3. In dit voorbeeld wordt de PowerShell-cmdlet Invoke-RestMethod gebruikt om de PATCH-aanvraag naar uw Automation-account te verzenden.

    # 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
    

    De uitvoer moet er als volgt uitzien:

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

Toevoegen met behulp van een ARM-sjabloon

Hieronder ziet u de syntaxis en voorbeeldstappen.

Sjabloonsyntaxis

Met de onderstaande voorbeeldsjabloonsyntaxis kunt u een door het systeem toegewezen beheerde identiteit inschakelen als deze nog niet is ingeschakeld en twee bestaande door de gebruiker toegewezen beheerde identiteiten aan het bestaande Automation-account toewijzen.

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

voorbeeld

Voer de volgende stappen uit.

  1. Kopieer en plak de sjabloon in een bestand met de naam template_ua.json. Sla het bestand op uw lokale computer of in een Azure-opslagaccount op.

  2. Wijzig de onderstaande variabelewaarde en voer deze vervolgens uit.

    $templateFile = "path\template_ua.json"
    
  3. Gebruik de PowerShell-cmdlet New-AzResourceGroupDeployment om de sjabloon te implementeren.

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

    De opdracht produceert geen uitvoer; U kunt echter de onderstaande code gebruiken om te controleren:

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

    De uitvoer ziet er ongeveer uit als de uitvoer die wordt weergegeven voor het REST API-voorbeeld hierboven.

Een rol toewijzen aan een door een gebruiker toegewezen beheerde identiteit

Een Automation-account kan de door de gebruiker toegewezen beheerde identiteit gebruiken om tokens te verkrijgen voor toegang tot andere resources die worden beveiligd door Microsoft Entra-id, zoals Azure Key Vault. Deze tokens vertegenwoordigen geen specifieke gebruiker van de toepassing. In plaats daarvan vertegenwoordigen ze de toepassing die toegang heeft tot de resource. In dit geval vertegenwoordigt het token bijvoorbeeld een Automation-account.

Voordat u uw door de gebruiker toegewezen beheerde identiteit kunt gebruiken voor verificatie, moet u toegang instellen voor die identiteit in de Azure-resource waar u de identiteit wilt gebruiken. Als u deze taak wilt voltooien, wijst u de juiste rol toe aan die identiteit in de azure-doelresource.

Volg de principal van minimale bevoegdheden en wijs zorgvuldig machtigingen toe die alleen zijn vereist voor het uitvoeren van uw runbook. Als het Automation-account bijvoorbeeld alleen is vereist om een Azure-VM te starten of te stoppen, zijn de machtigingen die zijn toegewezen aan het Uitvoeren als-account of beheerde identiteit alleen vereist voor het starten of stoppen van de VM. Evenzo, als een runbook uit blob-opslag leest, wijs dan alleen-lezen rechten toe.

In dit voorbeeld wordt Azure PowerShell gebruikt om te laten zien hoe u de rol Inzender in het abonnement toewijst aan de Azure-doelresource. De rol Inzender wordt gebruikt als voorbeeld en is mogelijk of niet vereist in uw geval. U kunt ook de rol toewijzen aan de Azure-doelresource in Azure Portal.

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

Roltoewijzing verifiëren voor een door de gebruiker beheerde identiteit

Voer de volgende stappen uit om een rol te verifiëren voor een door de gebruiker toegewezen beheerde identiteit van het Automation-account:

  1. Meld u aan bij de Azure-portal.

  2. Ga naar uw Automation-account.

  3. Selecteer Onder Account Instellingen de optie Identiteit, Gebruiker toegewezen.

  4. Klik op Door de gebruiker toegewezen identiteitnaam.

    Assigning role in user-assigned identity in Azure portal.

    Als de rollen al zijn toegewezen aan de geselecteerde door de gebruiker toegewezen beheerde identiteit, kunt u een lijst met roltoewijzingen bekijken. Deze lijst bevat alle roltoewijzingen waarvoor u machtigingen hebt om te lezen.

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

  5. Als u het abonnement wilt wijzigen, klikt u op de vervolgkeuzelijst Abonnement en selecteert u het juiste abonnement.

  6. Klik op Roltoewijzing toevoegen (preview)

  7. Selecteer in de vervolgkeuzelijst de set resources waarop de roltoewijzing van toepassing is: abonnement, resourcegroep, rol en bereik.
    Als u de roltoewijzing niet hebt, kunt u de schrijfmachtigingen voor het geselecteerde bereik weergeven als een inlinebericht.

  8. Selecteer in de vervolgkeuzelijst Rol een rol als Inzender voor virtuele machines.

  9. Klik op Opslaan.

    Add a role assignment in Azure portal.

Na een paar minuten wordt aan de beheerde identiteit de rol toegewezen in het geselecteerde bereik.

Toegang verifiëren met door de gebruiker toegewezen beheerde identiteit

Nadat u de door de gebruiker toegewezen beheerde identiteit voor uw Automation-account hebt ingeschakeld en een identiteit toegang hebt tot de doelresource, kunt u die identiteit opgeven in runbooks voor resources die beheerde identiteit ondersteunen. Gebruik voor identiteitsondersteuning de Az-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

Een toegangstoken genereren zonder Azure-cmdlets te gebruiken

Voor HTTP-eindpunten moet u het volgende controleren.

  • De koptekst van de metagegevens moet aanwezig zijn en moet worden ingesteld op 'true'.
  • Een resource moet samen met de aanvraag worden doorgegeven als queryparameter voor een GET-aanvraag en als formuliergegevens voor een POST-aanvraag.
  • Stel de waarde van de omgevingsvariabele IDENTITY_HEADER in op X-IDENTITY-HEADER.
  • Inhoudstype voor de Post-aanvraag moet zijn application/x-www-form-urlencoded.

Toegangstoken ophalen voor door de gebruiker toegewezen beheerde identiteit met 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 

Toegangstoken ophalen voor door de gebruiker toegewezen beheerde identiteit met behulp van 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 

Door de gebruiker toegewezen beheerde identiteit gebruiken in 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)  
} 

Door de gebruiker toegewezen beheerde identiteit gebruiken in 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) 

Volgende stappen