Condividi tramite


Uso di un'identità gestita assegnata dall'utente per un account di Automazione di Azure

Questo articolo illustra come aggiungere un'identità gestita assegnata dall'utente per un account Automazione di Azure e come usarla per accedere ad altre risorse. Per altre informazioni sul funzionamento delle identità gestite con Automazione di Azure, vedere Identità gestite.

Nota

Non è possibile usare un'identità gestita assegnata dall'utente in un ruolo di lavoro ibrido per runbook quando è stata creata un'identità gestita (sistema o utente assegnato) per l'account di Automazione. Se l'identità gestita non è stata assegnata all'account di Automazione, è possibile usare l'identità gestita assegnata dal sistema o dall'utente della macchina virtuale in un ruolo di lavoro ibrido per runbook che è una macchina virtuale di Azure con le identità gestite assegnate.

Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.

Prerequisiti

  • Un account di automazione di Azure. Per istruzioni, vedere Creare un account di Automazione di Azure.

  • L'identità gestita assegnata dall'utente e le risorse di Azure di destinazione gestite dal runbook usando tale identità possono trovarsi in sottoscrizioni di Azure diverse.

  • Ultima versione dei moduli dell'account Azure. Attualmente è 2.2.8. (Vedere Az.Accounts per informazioni dettagliate su questa versione.

  • Una risorsa di Azure a cui si vuole accedere dal runbook di Automazione. Questa risorsa deve avere un ruolo definito per l'identità gestita assegnata dall'utente, che consente al runbook di Automazione di autenticare l'accesso alla risorsa. Per aggiungere ruoli, è necessario essere un proprietario della risorsa nel tenant Microsoft Entra corrispondente.

  • Per assegnare un ruolo di Azure, è necessario disporre Microsoft.Authorization/roleAssignments/write delle autorizzazioni, ad esempio Amministratore accesso utenti o Proprietario.

Aggiungere un'identità gestita assegnata dall'utente per Automazione di Azure account

È possibile aggiungere un'identità gestita assegnata dall'utente per un account Automazione di Azure usando il modello portale di Azure, PowerShell, l'API REST di Azure o ARM. Per gli esempi relativi a PowerShell, accedere prima ad Azure in modo interattivo usando il cmdlet Connect-AzAccount e seguire le istruzioni.

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

Inizializzare quindi un set di variabili che verranno usate in tutti gli esempi. Rivedere i valori seguenti e quindi eseguire"

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

Aggiungere usando il portale di Azure

Procedi come segue:

  1. Accedere al portale di Azure.

  2. Nel portale di Azure passare all'account di Automazione.

  3. In Impostazioni account selezionare Autenticazione.

  4. Selezionare la scheda Assegnata dall'utente e quindi selezionare Aggiungi.

  5. Selezionare l'identità gestita assegnata dall'utente esistente e quindi selezionare Aggiungi. Si tornerà quindi alla scheda Assegnata dall'utente .

    Output dal portale.

Aggiungere con PowerShell

Usare il cmdlet di PowerShell Set-AzAutomationAccount per aggiungere le identità gestite assegnate dall'utente. Bisogna innanzitutto considerare se esiste un'identità gestita assegnata dal sistema. L'esempio seguente aggiunge due identità gestite assegnate dall'utente esistenti a un account di automazione e disabilita un'identità gestita assegnata dal sistema, se presente.

$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

Per mantenere un'identità gestita assegnata dal sistema, usare quanto segue:

$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

L'output dovrebbe essere simile al seguente:

Output dal comando Set-AzAutomationAccount.

Per un output aggiuntivo, eseguire: $output.identity | ConvertTo-Json.

Aggiungere usando un'API REST

Di seguito sono riportati i passaggi di sintassi e di esempio.

Sintassi

La sintassi del corpo di esempio seguente abilita un'identità gestita assegnata dal sistema se non è già abilitata e assegna due identità gestite assegnate dall'utente esistenti all'account di Automazione esistente.

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 sintassi dell’API è la seguente:

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 

Esempio

Effettuare i seguenti passaggi.

  1. Rivedere la sintassi del corpo precedente in un file denominato body_ua.json. Salvare il file nel computer locale o in un account di archiviazione di Azure.

  2. Rivedere il valore della variabile riportato di seguito e quindi eseguire.

    $file = "path\body_ua.json"
    
  3. Questo esempio usa il cmdlet Invoke-RestMethod di PowerShell per inviare la richiesta PATCH all'account di Automazione.

    # 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
    

    L'output dovrebbe essere simile al seguente:

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

Aggiungere usando un modello di Resource Manager

Di seguito sono riportati i passaggi di sintassi e di esempio.

Sintassi del modello

La sintassi del modello di esempio seguente abilita un'identità gestita assegnata dal sistema se non è già abilitata e assegna due identità gestite assegnate dall'utente esistenti all'account di Automazione esistente.

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

Esempio

Effettuare i seguenti passaggi.

  1. Copiare e incollare il modello in un file denominato template_ua.json. Salvare il file nel computer locale o in un account di archiviazione di Azure.

  2. Rivedere il valore della variabile riportato di seguito e quindi eseguire.

    $templateFile = "path\template_ua.json"
    
  3. Usare il cmdlet di PowerShell New-AzResourceGroupDeployment per distribuire il modello.

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

    Il comando non produrrà un output; tuttavia, è possibile usare il codice seguente per verificare:

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

    L'output sarà simile all'output illustrato per l'esempio dell'API REST precedente.

Assegnare un ruolo a un'identità gestita assegnata dall'utente

Un account di Automazione può usare la relativa identità gestita assegnata dall'utente per ottenere i token per l'accesso ad altre risorse protette da Microsoft Entra ID, ad esempio Insieme di credenziali chiave di Azure (Azure Key Vault). Questi token non rappresentano un utente specifico dell'applicazione. Al contrario, rappresentano l'applicazione che accede alla risorsa. In questo caso, ad esempio, il token rappresenta un account di Automazione.

Prima di poter usare l'identità gestita assegnata dall'utente per l'autenticazione, configurare l'accesso per tale identità nella risorsa di Azure in cui si prevede di usarla. Per completare questa attività, assegnare il ruolo appropriato all'identità nella risorsa di destinazione di Azure.

Seguire il principio dei privilegi minimi e assegnare con cautela solo le autorizzazioni necessarie per eseguire il runbook. Ad esempio, se l'account di Automazione è necessario solo per avviare o arrestare una macchina virtuale di Azure, le autorizzazioni assegnate all'account RunAs o all'identità gestita devono essere relative soltanto all'avvio e all'arresto della macchina virtuale. Analogamente, se un runbook legge da una risorsa di archiviazione BLOB, assegnare solo autorizzazioni di lettura.

Questo esempio usa Azure PowerShell per illustrare come assegnare il ruolo Collaboratore nella sottoscrizione alla risorsa di Azure di destinazione. Il ruolo Collaboratore viene usato come esempio e può essere richiesto o meno nel caso in uso. In alternativa, è anche possibile assegnare il ruolo alla risorsa di Azure di destinazione nel portale di Azure.

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

Verificare l'assegnazione di ruolo a un'identità gestita dall'utente

Per verificare il ruolo di un'identità gestita assegnata dall'utente dell'account di Automazione, seguire questa procedura:

  1. Accedere al portale di Azure.

  2. Passare all'account di Automazione.

  3. In Impostazioni account selezionare Identità, Assegnata dall'utente.

  4. Fare clic su Nome identità assegnata dall'utente.

    Assegnazione del ruolo nell'identità assegnata dall'utente in portale di Azure.

    Se i ruoli sono già assegnati all'identità gestita assegnata dall'utente selezionata, è possibile visualizzare un elenco di assegnazioni di ruolo. Questo elenco include tutte le assegnazioni di ruolo che si è autorizzati a leggere.

    Visualizzare le assegnazioni di ruolo per cui si dispone dell'autorizzazione nel portale di Azure.

  5. Per cambiare la sottoscrizione, fare clic sull'elenco a discesa Sottoscrizione e quindi sulla sottoscrizione appropriata.

  6. Fare clic su Aggiungi un'assegnazione di ruolo (anteprima)

  7. Nell'elenco a discesa selezionare il set di risorse a cui si applica l'assegnazione di ruolo: Sottoscrizione, Gruppo di risorse, Ruolo e Ambito.
    Se non si ha l'assegnazione di ruolo, è possibile visualizzare le autorizzazioni di scrittura per l'ambito selezionato come messaggio inline.

  8. Nell'elenco a discesa Ruolo, selezionare un ruolo, ad esempio Collaboratore Macchina virtuale.

  9. Fare clic su Salva.

    Aggiungere un'assegnazione di ruolo nel portale di Azure.

Dopo alcuni minuti, all'identità gestita viene assegnato il ruolo nell'ambito selezionato.

Autenticare l'accesso con l'identità gestita assegnata dall'utente

Dopo aver abilitato l'identità gestita assegnata dall'utente per l'account di Automazione e aver consentito a un'identità di accedere alla risorsa di destinazione, è possibile specificare tale identità nei runbook rispetto alle risorse che supportano l'identità gestita. Per il supporto delle identità, usare il cmdlet Az 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

Generare un token di accesso senza usare i cmdlet di Azure

Per gli endpoint HTTP verificare quanto segue.

  • L'intestazione dei metadati deve essere presente e deve essere impostata su "true".
  • Una risorsa deve essere passata insieme alla richiesta, come parametro di query per una richiesta GET e come dati del modulo per una richiesta POST.
  • Impostare il valore della variabile di ambiente IDENTITY_HEADER su X-IDENTITY-HEADER.
  • Il tipo di contenuto per la richiesta Post deve essere application/x-www-form-urlencoded.

Ottenere il token di accesso per l'identità gestita assegnata dall'utente tramite 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 

Ottenere il token di accesso per l'identità gestita assegnata dall'utente tramite 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 

Uso dell'identità gestita assegnata dall'utente 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)  
} 

Uso dell'identità gestita assegnata dall'utente nel runbook Python

#!/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) 

Passaggi successivi