Verwenden einer benutzerseitig zugewiesenen verwalteten Identität für ein Azure Automation-Konto

In diesem Artikel erfahren Sie, wie eine benutzerseitig zugewiesene verwaltete Identität für ein Azure Automation-Konto hinzugefügt und für den Zugriff auf andere Ressourcen verwendet wird. Weitere Informationen zur Funktionsweise verwalteter Identitäten mit Azure Automation finden Sie unter Verwaltete Identitäten.

Hinweis

Es ist nicht möglich, eine benutzerzugeordnete verwaltete Identität auf einem Hybrid Runbook Worker zu verwenden, wenn eine verwaltete Identität (entweder system- oder benutzerzugeordnet) für das Automatisierungskonto erstellt wurde. Wenn dem Automatisierungskonto keine verwaltete Identität zugewiesen wurde, ist es möglich, die dem System oder dem Benutzer zugewiesene verwaltete Identität der VM auf einem Hybrid Runbook Worker zu verwenden, der eine Azure-VM mit den zugewiesenen verwalteten Identitäten ist.

Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.

Voraussetzungen

  • Ein Azure Automation-Konto. Eine Anleitung hierzu finden Sie unter Erstellen eines Azure Automation-Kontos.

  • Die benutzerseitig zugewiesene verwaltete Identität und die Azure-Zielressourcen, die Ihr Runbook mit dieser Identität verwaltet, können sich in verschiedenen Azure-Abonnement befinden.

  • Die neueste Version der Azure-Kontomodule. Derzeit ist dies 2.2.8. (Ausführliche Informationen zu dieser Version finden Sie unter Az.Accounts.)

  • Eine Azure-Ressource, auf die Sie über Ihr Automation-Runbook zugreifen möchten. Für diese Ressource muss eine Rolle für die benutzerseitig zugewiesene verwaltete Identität definiert sein, mit der das Automation-Runbook den Zugriff auf die Ressource authentifizieren kann. Zum Hinzufügen von Rollen müssen Sie Besitzer der Ressource im entsprechenden Microsoft Entra sein.

  • Zum Zuweisen einer Azure-Rolle benötigen Sie Berechtigungen vom Typ Microsoft.Authorization/roleAssignments/write (beispielsweise als Benutzerzugriffsadministrator oder Besitzer).

Hinzufügen einer benutzerseitig zugewiesenen verwalteten Identität für ein Azure Automation-Konto

Sie können eine benutzerseitig zugewiesene verwaltete Identität für ein Azure Automation-Konto hinzufügen, indem Sie das Azure-Portal, PowerShell, die Azure-REST-API oder eine ARM-Vorlage verwenden. Melden Sie sich für die Beispiele, in denen PowerShell verwendet wird, zunächst interaktiv mithilfe des Cmdlets Connect-AzAccount bei Azure an, und befolgen Sie die Anweisungen.

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

Initialisieren Sie dann einen Satz von Variablen, die in den Beispielen verwendet werden. Überarbeiten Sie die unten angegebenen Werte, und führen Sie dann aus.

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

Hinzufügen über das Azure-Portal

Führen Sie die folgenden Schritte aus:

  1. Melden Sie sich beim Azure-Portal an.

  2. Navigieren Sie im Azure-Portal zu Ihrem Automation-Konto.

  3. Wählen Sie unter Kontoeinstellungen die Option Identität aus.

  4. Wählen Sie die Registerkarte Benutzerseitig zugewiesen und dann Hinzufügen aus.

  5. Wählen Sie Ihre vorhandene benutzerseitig zugewiesene verwaltete Identität und dann Hinzufügen aus. Daraufhin werden Sie zur Registerkarte Benutzerseitig zugewiesen zurückgeleitet.

    Output from Portal.

Hinzufügen unter Verwendung von PowerShell

Verwenden Sie das PowerShell-Cmdlet Set-AzAutomationAccount, um die benutzerseitig zugewiesenen verwalteten Identitäten hinzuzufügen. Sie müssen zunächst überlegen, ob eine systemseitig zugewiesene verwaltete Identität vorhanden ist. Im folgenden Beispiel werden einem vorhandenen Automation-Konto zwei bestehende benutzerseitig zugewiesene verwaltete Identitäten hinzugefügt, und, falls vorhanden, wird eine systemseitig zugewiesene verwaltete Identität deaktiviert.

$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

Um eine vorhandene systemseitig zugewiesene verwaltete Identität beizubehalten, verwenden Sie Folgendes:

$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

Die Ausgabe sollte in etwa wie folgt aussehen:

Output from Set-AzAutomationAccount command.

Führen Sie für eine zusätzliche Ausgabe $output.identity | ConvertTo-Json aus.

Hinzufügen mithilfe einer REST-API

Syntax und Beispielschritte sind unten angegeben.

Syntax

Die folgende Beispieltextsyntax aktiviert eine systemseitig zugewiesene verwaltete Identität, sofern sie noch nicht aktiviert ist, und weist dem vorhandenen Automation-Konto zwei bestehende benutzerseitig zugewiesene verwaltete Identitäten zu.

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

Die Syntax der API sieht folgendermaßen aus:

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 

Beispiel

Führen Sie die folgenden Schritte aus.

  1. Überarbeiten Sie die Syntax des obigen Textkörpers in einer Datei namens body_ua.json. Speichern Sie die Datei auf Ihrem lokalen Computer oder in einem Azure-Speicherkonto.

  2. Überarbeiten Sie den Variablenwert unten, und führen Sie dann aus.

    $file = "path\body_ua.json"
    
  3. In diesem Beispiel wird das PowerShell-Cmdlet Invoke-RestMethod verwendet, um die PATCH-Anforderung an Ihr Automation-Konto zu senden.

    # 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
    

    Die Ausgabe sollte in etwa wie folgt aussehen:

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

Hinzufügen mithilfe einer ARM-Vorlage

Syntax und Beispielschritte sind unten angegeben.

Vorlagensyntax

Die folgende Beispielvorlagensyntax aktiviert eine systemseitig zugewiesene verwaltete Identität, sofern sie noch nicht aktiviert ist, und weist dem vorhandenen Automation-Konto zwei bestehende benutzerseitig zugewiesene verwaltete Identitäten zu.

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

Beispiel

Führen Sie die folgenden Schritte aus.

  1. Kopieren Sie die Vorlage, und fügen Sie sie in eine Datei namens template_ua.json ein. Speichern Sie die Datei auf Ihrem lokalen Computer oder in einem Azure-Speicherkonto.

  2. Überarbeiten Sie den Variablenwert unten, und führen Sie dann aus.

    $templateFile = "path\template_ua.json"
    
  3. Verwenden Sie das PowerShell-Cmdlet New-AzResourceGroupDeployment, um die Vorlage bereitzustellen.

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

    Der Befehl erzeugt keine Ausgabe. Sie können jedoch den folgenden Code verwenden, um Folgendes zu überprüfen:

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

    Die Ausgabe sieht in etwa wie die obige Ausgabe für das REST-API-Beispiel aus.

Zuweisen einer Rolle zu einer vom Benutzer zugewiesenen verwalteten Identität

Ein Automation-Konto kann mithilfe seiner benutzerseitig zugewiesenen verwalteten Identität Token für den Zugriff auf andere durch Microsoft Entra ID geschützte Ressourcen wie z. B. Azure Key Vault abrufen. Diese Token repräsentieren keinen bestimmten Benutzer der Anwendung. Stattdessen stellen sie die Anwendung dar, die auf die Ressource zugreift. In diesem Fall stellt das Token beispielsweise ein Automation-Konto dar.

Bevor Sie die benutzerseitig zugewiesene verwaltete Identität für die Authentifizierung verwenden können, richten Sie den Zugriff dieser Identität auf die Azure-Ressource ein, in der Sie die Identität verwenden möchten. Für diese Aufgabe muss der Identität in der Azure-Zielressource die entsprechende Rolle zugewiesen werden.

Befolgen Sie das Prinzip der geringsten Berechtigung und weisen Sie sorgfältig nur die Berechtigungen zu, die für die Ausführung Ihres Runbooks erforderlich sind. Beispiel: Wenn das Automatisierungskonto nur zum Starten oder Stoppen einer Azure-VM erforderlich ist, dann müssen die dem ausführenden Konto oder der verwalteten Identität zugewiesenen Berechtigungen nur zum Starten oder Beenden der VM dienen. Weisen Sie ebenso Lesezugriffsberechtigungen zu, wenn ein Runbook aus Blobspeicher liest.

In diesem Beispiel wird Azure PowerShell verwendet, um zu zeigen, wie die Rolle Mitwirkender im Abonnement der Azure-Zielressource zugewiesen wird. Die Rolle „Mitwirkender“ wird als Beispiel verwendet und kan in Ihrem Fall erforderlich sein oder auch nicht. Alternativ können Sie der Azure-Zielressource die Rolle auch im Azure-Portal zuweisen.

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

Überprüfen der Rollenzuweisung zu einer vom Benutzer verwalteten Identität

Führen Sie die folgenden Schritte aus, um eine Rolle für eine vom Benutzer zugewiesene verwaltete Identität des Automation-Kontos zu überprüfen:

  1. Melden Sie sich beim Azure-Portal an.

  2. Navigieren Sie zu Ihrem Automation-Konto.

  3. Wählen Sie unter Kontoeinstellungen die Option Identität, Vom Benutzer zugewiesen aus.

  4. Klicken Sie auf Name der vom Benutzer zugewiesenen Identität.

    Assigning role in user-assigned identity in Azure portal.

    Wurden der ausgewählten, vom Benutzer zugewiesenen verwalteten Identität bereits Rollen zugewiesen, wird die Liste der Rollenzuweisungen angezeigt. Diese Liste enthält alle Rollenzuweisungen, für die Sie über Leseberechtigungen verfügen.

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

  5. Klicken Sie zum Ändern des Abonnements auf die Dropdownliste Abonnement, und wählen Sie das entsprechende Abonnement aus.

  6. Klicken Sie auf Rollenzuweisung hinzufügen (Vorschau).

  7. Wählen Sie in der Dropdownliste die Ressourcen aus, für die die Rollenzuweisung gelten soll: Abonnement, Ressourcengruppe, Rolle und Bereich.
    Wenn Sie die entsprechende Rollenzuweisung nicht haben, können Sie die Schreibberechtigungen für den ausgewählten Bereich als Inlinemeldung anzeigen.

  8. Wählen Sie in der Dropdownliste Rolle eine Rolle aus, z. B. Mitwirkender von virtuellen Computern.

  9. Klicken Sie auf Speichern.

    Add a role assignment in Azure portal.

Nach einigen Augenblicken wird der verwalteten Identität die Rolle für den ausgewählten Bereich zugewiesen.

Authentifizieren des Zugriffs mit der benutzerseitig zugewiesenen verwalteten Identität

Nachdem Sie die benutzerseitig zugewiesene verwaltete Identität für Ihr Automation-Konto aktiviert und einer Identität Zugriff auf die Zielressource gegeben haben, können Sie diese Identität in Runbooks für Ressourcen angeben, die die verwaltete Identität unterstützen. Verwenden Sie für die Identitätsunterstützung das 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

Generieren eines Zugriffstokens ohne Verwendung von Azure-Cmdlets

Stellen Sie für HTTP-Endpunkte Folgendes sicher.

  • Der Metadatenheader muss vorhanden sein und auf „true“ festgelegt werden.
  • Eine Ressource muss zusammen mit der Anforderung als Abfrageparameter für eine GET-Anforderung und als Formulardaten für eine POST-Anforderung übergeben werden.
  • Legen Sie den Wert der Umgebungsvariablen IDENTITY_HEADER X-IDENTITY-HEADER fest.
  • Der Inhaltstyp für die Post-Anforderung muss application/x-www-form-urlencoded sein.

Abrufen des Zugriffstokens für die benutzerseitig zugewiesene verwaltete Identität mithilfe von 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 

Abrufen des Zugriffstokens für die benutzerseitig zugewiesene verwaltete Identität mithilfe von 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 

Verwenden der benutzerseitig zugewiesenen verwalteten Identität 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)  
} 

Verwenden der benutzerseitig zugewiesenen verwalteten Identität in einem 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ächste Schritte