Uso di un'identità gestita assegnata dal sistema per un account di Automazione di Azure

Questo articolo illustra come abilitare un'identità gestita assegnata dal sistema 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.

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 Automazione di Azure.

  • La versione più recente dei moduli Az di PowerShell Az.Accounts, Az.Resources, Az.Automation, Az.KeyVault.

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

  • Per eseguire processi ibridi usando un'identità gestita, aggiornare il ruolo di lavoro ibrido per runbook basato su agente alla versione più recente. Non esiste alcun requisito di versione minima per il ruolo di lavoro ibrido per runbook basato su estensione e tutte le versioni funzionerebbero. Le versioni minime necessarie per il ruolo di lavoro ibrido basato su agente sono:

    • Ruolo di lavoro ibrido per runbook di Windows: versione 7.3.1125.0
    • Ruolo di lavoro ibrido per runbook linux: versione 1.7.4.0

    Per controllare le versioni:

    • Ruolo di lavoro ibrido per runbook di Windows: passare al percorso C:\ProgramFiles\Microsoft Monitoring Agent\Agent\AzureAutomation\. di installazione e la cartella Automazione di Azure contiene una sottocartella con il numero di versione come nome della sottocartella.
    • Ruolo di lavoro ibrido per runbook linux: passare al percorso vi/opt/microsoft/omsconfig/modules/nxOMSAutomationWorker/VERSION. e il file VERSION ha il numero di versione del ruolo di lavoro ibrido.
  • Per assegnare un ruolo di Azure è necessario disporre Microsoft.Authorization/roleAssignments/write dell'autorizzazione, ad esempio Accesso utenti Amministrazione istrator o Proprietario.

Abilitare un'identità gestita assegnata dal sistema per un account Automazione di Azure

Dopo l'abilitazione, le proprietà seguenti verranno assegnate all'identità gestita assegnata dal sistema.

Proprietà (JSON) Valore Descrizione
Principalid <principal-ID> Identificatore univoco globale (GUID) dell'oggetto entità servizio per l'identità gestita assegnata dal sistema che rappresenta l'account di Automazione nel tenant di Microsoft Entra. Questo GUID viene talvolta visualizzato come "ID oggetto" o objectID.
tenantid <Azure-AD-tenant-ID> Identificatore univoco globale (GUID) che rappresenta il tenant di Microsoft Entra in cui l'account di Automazione è ora membro. All'interno del tenant di Microsoft Entra, l'entità servizio ha lo stesso nome dell'account di Automazione.

È possibile abilitare un'identità gestita assegnata dal sistema 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 Connessione-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"

Importante

La nuova identità a livello di account di Automazione esegue l'override di tutte le identità precedenti assegnate dal sistema a livello di macchina virtuale descritte in Usare l'autenticazione del runbook con identità gestite. Se si eseguono processi ibridi in macchine virtuali di Azure che usano l'identità assegnata dal sistema di una macchina virtuale per accedere alle risorse del runbook, l'identità dell'account di Automazione verrà usata per i processi ibridi. Ciò significa che l'esecuzione del processo esistente potrebbe essere interessata se si usa la funzionalità Chiavi gestite dal cliente (CMK) dell'account di Automazione.

Se si vuole continuare a usare l'identità gestita della macchina virtuale, non è consigliabile abilitare l'identità a livello di account di Automazione. Se è già stato abilitato, è possibile disabilitare l'identità gestita assegnata dal sistema dell'account di Automazione. Vedere Disabilitare l'identità gestita dell'account Automazione di Azure.

Abilitare l'uso del portale di Azure

Procedi come segue:

  1. Accedi al portale di Azure.

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

  3. In Impostazioni account selezionare Autenticazione.

  4. Impostare l'opzione Assegnata dal sistema su e premere Salva. Quando viene richiesto di confermare, selezionare .

    Enabling system-assigned identity in Azure portal.

    L'account di Automazione può ora usare l'identità assegnata dal sistema, registrata con l'ID Microsoft Entra ed è rappresentata da un ID oggetto.

    Managed identity object ID.

Abilitare con PowerShell

Usare il cmdlet di PowerShell Set-AzAutomationAccount per abilitare l'identità gestita assegnata dal sistema.

$output = Set-AzAutomationAccount `
    -ResourceGroupName $resourceGroup `
    -Name $automationAccount `
    -AssignSystemIdentity

$output

L'output dovrebbe essere simile al seguente:

Output from set-azautomationaccount command.

Per un output aggiuntivo, modificare l'esempio per specificare: $output.identity | ConvertTo-Json.

Abilitare l'uso di un'API REST

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

Sintassi

La sintassi del corpo seguente abilita un'identità gestita assegnata dal sistema a un account di Automazione esistente usando il metodo HTTP PATCH . Tuttavia, questa sintassi rimuoverà tutte le identità gestite assegnate dall'utente esistenti associate all'account di Automazione.

{ 
 "identity": { 
   "type": "SystemAssigned" 
  } 
}

Se sono definite più identità assegnate dall'utente, per conservarle e rimuovere solo l'identità assegnata dal sistema, è necessario specificare ogni identità assegnata dall'utente usando un elenco delimitato da virgole. L'esempio seguente usa il metodo HTTP PATCH .

{ 
  "identity" : {
    "type": "SystemAssigned, UserAssigned",
    "userAssignedIdentities": {
        "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resourceGroupName/providers/Microsoft.ManagedIdentity/userAssignedIdentities/cmkID": {},
        "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resourceGroupName/providers/Microsoft.ManagedIdentity/userAssignedIdentities/cmkID2": {}
    }
  }
}

La sintassi dell'API è la seguente:

PATCH 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

Esempio

Effettuare i seguenti passaggi.

  1. Copiare e incollare la sintassi del corpo in un file denominato body_sa.json. Salvare il file nel computer locale o in un account di archiviazione di Azure.

  2. Aggiornare il valore della variabile seguente e quindi eseguire.

    $file = "path\body_sa.json"
    
  3. Questo esempio usa il cmdlet di PowerShell Invoke-RestMethod 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:

    {
        "PrincipalId":  "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
        "TenantId":  "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
        "Type":  0,
        "UserAssignedIdentities":  null
    }
    

Abilitare l'uso di 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 all'account di Automazione esistente. Tuttavia, questa sintassi rimuoverà tutte le identità gestite assegnate dall'utente esistenti associate all'account di Automazione.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "resources": [
    {
      "type": "Microsoft.Automation/automationAccounts",
      "apiVersion": "2020-01-13-preview",
      "name": "yourAutomationAccount",
      "location": "[resourceGroup().location]",
      "identity": {
        "type": "SystemAssigned"
        },
      "properties": {
        "sku": {
          "name": "Basic"
        }
      }
    }
  ]
}

Esempio

Effettuare i seguenti passaggi.

  1. Rivedere la sintassi del modello precedente per usare l'account di Automazione e salvarla in un file denominato template_sa.json.

  2. Aggiornare il valore della variabile seguente e quindi eseguire.

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

    New-AzResourceGroupDeployment `
        -Name "SystemAssignedDeployment" `
        -ResourceGroupName $resourceGroup `
        -TemplateFile $templateFile
    

    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 dal sistema

Un account di Automazione può usare l'identità gestita assegnata dal sistema per ottenere token per accedere ad altre risorse protette da Microsoft Entra ID, ad esempio 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 dal sistema 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.

L'esempio seguente 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 necessario o meno nel caso in uso.

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

Verificare l'assegnazione di ruolo a un'identità gestita dal sistema

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

  1. Accedi al portale di Azure.

  2. Passare all'account di Automazione.

  3. In Impostazioni account selezionare Autenticazione.

    Assigning role in system-assigned identity in Azure portal.

  4. In Autorizzazioni fare clic su Assegnazioni di ruolo di Azure.

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

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

  5. Per modificare la sottoscrizione, fare clic sull'elenco a discesa Sottoscrizione e selezionare la sottoscrizione appropriata.

  6. Fare clic su Aggiungi 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 come Collaboratore macchina virtuale.

  9. Fare clic su Salva.

    Add a role assignment in Azure portal.

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

Autenticare l'accesso con l'identità gestita assegnata dal sistema

Dopo aver abilitato l'identità gestita 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 cmdlet Connect-AzAccount . Vedere Connect-AzAccount nelle informazioni di riferimento su PowerShell.

# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process

# Connect to Azure with system-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity).context

# Set and store context
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext

Nota

Se l'organizzazione usa ancora i cmdlet Di AzureRM deprecati, è possibile usare Connect-AzureRMAccount -Identity.

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 dal sistema tramite HTTP Get

$resource= "?resource=https://management.azure.com/" 
$url = $env:IDENTITY_ENDPOINT + $resource 
$Headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" 
$Headers.Add("X-IDENTITY-HEADER", $env:IDENTITY_HEADER) 
$Headers.Add("Metadata", "True") 
$accessToken = Invoke-RestMethod -Uri $url -Method 'GET' -Headers $Headers
Write-Output $accessToken.access_token

Ottenere il token di accesso per l'identità assegnata dal sistema tramite HTTP Post

$url = $env:IDENTITY_ENDPOINT  
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" 
$headers.Add("X-IDENTITY-HEADER", $env:IDENTITY_HEADER) 
$headers.Add("Metadata", "True") 
$body = @{resource='https://management.azure.com/' } 
$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 dal sistema per accedere ad Azure Key Vault in Azure PowerShell

Per altre informazioni, vedere Get-AzKeyVaultSecret.

Write-Output "Connecting to azure via  Connect-AzAccount -Identity" 
Connect-AzAccount -Identity 
Write-Output "Successfully connected with Automation account's Managed Identity" 
Write-Output "Trying to fetch value from key vault using MI. 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 dal sistema nel runbook Python

#!/usr/bin/env python3 
import os 
import requests  
# printing environment variables 
endPoint = os.getenv('IDENTITY_ENDPOINT')+"?resource=https://management.azure.com/" 
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) 

Uso dell'identità gestita assegnata dal sistema per accedere database SQL

Per informazioni dettagliate sul provisioning dell'accesso a un database SQL di Azure, vedere Effettuare il provisioning dell'amministratore di Microsoft Entra (database SQL).

$queryParameter = "?resource=https://database.windows.net/" 
$url = $env:IDENTITY_ENDPOINT + $queryParameter
$Headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" 
$Headers.Add("X-IDENTITY-HEADER", $env:IDENTITY_HEADER) 
$Headers.Add("Metadata", "True") 
$content =[System.Text.Encoding]::Default.GetString((Invoke-WebRequest -UseBasicParsing -Uri $url -Method 'GET' -Headers $Headers).RawContentStream.ToArray()) | ConvertFrom-Json 
$Token = $content.access_token 
echo "The managed identities for Azure resources access token is $Token" 
$SQLServerName = "<ServerName>"    # Azure SQL logical server name  
$DatabaseName = "<DBname>"     # Azure SQL database name 
Write-Host "Create SQL connection string" 
$conn = New-Object System.Data.SqlClient.SQLConnection  
$conn.ConnectionString = "Data Source=$SQLServerName.database.windows.net;Initial Catalog=$DatabaseName;Connect Timeout=30" 
$conn.AccessToken = $Token 
Write-host "Connect to database and execute SQL script" 
$conn.Open()  
$ddlstmt = "CREATE TABLE Person( PersonId INT IDENTITY PRIMARY KEY, FirstName NVARCHAR(128) NOT NULL)" 
Write-host " " 
Write-host "SQL DDL command" 
$ddlstmt 
$command = New-Object -TypeName System.Data.SqlClient.SqlCommand($ddlstmt, $conn) 
Write-host "results" 
$command.ExecuteNonQuery() 
$conn.Close()

Eseguire la migrazione da account RunAs esistenti all'identità gestita

Automazione di Azure'autenticazione fornita per la gestione delle risorse o delle risorse di Azure Resource Manager distribuite nel modello di distribuzione classica con l'account RunAs. Per passare da un account RunAs a un'identità gestita per l'autenticazione del runbook, seguire questa procedura.

  1. Abilitare un'identità gestita assegnata dal sistema, assegnata dall'utente o entrambi i tipi di identità gestite.

  2. Concedere all'identità gestita gli stessi privilegi alle risorse di Azure corrispondenti all'account RunAs assegnato.

  3. Aggiornare i runbook per l'autenticazione usando l'identità gestita.

  4. Modificare i runbook per usare l'identità gestita. Per il supporto delle identità, usare il cmdlet Az cmdlet Connect-AzAccount . Vedere Connect-AzAccount nelle informazioni di riferimento su PowerShell.

    • Se si usano i moduli AzureRM, eseguire l'aggiornamento AzureRM.Profile alla versione più recente e sostituire usando il Add-AzureRMAccount cmdlet con Connect-AzureRMAccount –Identity.
    • Se si usano i moduli Az, eseguire l'aggiornamento alla versione più recente seguendo la procedura descritta nell'articolo Aggiornare i moduli di Azure PowerShell.

Passaggi successivi