Utilización de una identidad administrada asignada por el sistema para la cuenta de Azure Automation

En este artículo, se muestra cómo agregar una identidad administrada asignada por el sistema para una cuenta de Azure Automation y cómo usarla para acceder a otros recursos. Para más información sobre cómo funcionan las identidades administradas con Azure Automation, consulte Identidades administradas (versión preliminar).

Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

Requisitos previos

  • Una cuenta de Azure Automation Para obtener instrucciones, consulte Creación de una cuenta de Azure Automation.

  • La versión más reciente de los módulos Az de PowerShell: Az.Accounts, Az.Resources, Az.Automation, Az.KeyVault.

  • Un recurso de Azure al que desea acceder desde el runbook de Automation. Este recurso debe tener un rol definido para la identidad administrada, lo que ayuda al runbook de Automation a autenticar el acceso al recurso. Para agregar roles, debe ser propietario del recurso en el inquilino de Microsoft Entra correspondiente.

  • Si desea ejecutar trabajos híbridos mediante una identidad administrada, actualice Hybrid Runbook Worker basado en agente a la versión más reciente. No hay ningún requisito de versión mínima para Hybrid Runbook Worker basado en extensiones, y todas las versiones funcionarán. Las versiones mínimas necesarias para Hybrid Worker basado en agente son:

    • Hybrid Runbook Worker de Windows: versión 7.3.1125.0
    • Hybrid Runbook Worker de Linux: versión 1.7.4.0

    Para comprobar las versiones:

    • Hybrid Runbook Worker de Windows: vaya a la ruta de instalación C:\ProgramFiles\Microsoft Monitoring Agent\Agent\AzureAutomation\., y la carpeta Azure Automation incluirá una subcarpeta con el número de versión como nombre de la subcarpeta.
    • Hybrid Runbook Worker de Linux: vaya a la ruta de acceso vi/opt/microsoft/omsconfig/modules/nxOMSAutomationWorker/VERSION., y el archivo VERSION tendrá el número de versión de Hybrid Worker.
  • Para asignar un rol de Azure debe tener un permiso Microsoft.Authorization/roleAssignments/write, como Administrador de acceso de usuario o Propietario.

Habilitación de una identidad administrada asignada por el sistema para la cuenta de Azure Automation

Una vez habilitada, las siguientes propiedades se asignarán a la identidad administrada asignada por el sistema.

Propiedad (JSON) Value Descripción
principalid <principal-ID> Identificador único global (GUID) del objeto de entidad de servicio para la identidad administrada por el sistema que representa la cuenta de Automation en el inquilino de Microsoft Entra. Este GUID aparece a veces como "Id. de objeto" u objectID.
tenantid <Azure-AD-tenant-ID> Identificador único global (GUID) que representa el inquilino de Microsoft Entra del que es ahora miembro la cuenta de Automation. Dentro del inquilino de Microsoft Entra, la entidad de servicio tiene el mismo nombre que la cuenta de Automation.

Puede agregar una identidad administrada asignada por el sistema para una cuenta de Azure Automation mediante Azure Portal, PowerShell, la API REST de Azure o una plantilla de ARM. Para los ejemplos que implican PowerShell, inicie sesión primero en Azure de forma interactiva con el cmdlet Connect-AzAccount y siga las instrucciones.

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

A continuación, inicialice un conjunto de variables que se usarán a lo largo de los ejemplos. Revise los valores siguientes y, a continuación, ejecute.

$subscriptionID = "subscriptionID"
$resourceGroup = "resourceGroupName"
$automationAccount = "automationAccountName"

Importante

La nueva identidad de nivel de cuenta de Automation invalida las identidades asignadas por el sistema de nivel de máquina virtual anteriores que se describen en Uso de la autenticación de runbook con identidades administradas. Si ejecuta trabajos híbridos en máquinas virtuales de Azure que usan la identidad asignada por el sistema de la máquina virtual para acceder a los recursos del runbook, la identidad de la cuenta de Automation se usará para los trabajos híbridos. Esto significa que la ejecución del trabajo existente puede verse afectada si ha estado usando la característica Claves administradas de cliente (CMK) de la cuenta de Automation.

Si desea seguir usando la identidad administrada de la máquina virtual, no debe habilitar la identidad de nivel de cuenta de Automation. Si ya la ha habilitado, puede deshabilitar la identidad administrada por el sistema de la cuenta de Automation. Consulte Deshabilitación de la identidad administrada de la cuenta de Azure Automation.

Habilitación de Azure Portal

Lleve a cabo los siguiente pasos:

  1. Inicie sesión en Azure Portal.

  2. En Azure Portal, vaya a su cuenta de Automation.

  3. En Configuración de la cuenta, seleccione Identidad.

  4. Establezca la opción Asignado por el sistema en Activado y presione Guardar. Cuando se le solicite confirmación, seleccione .

    Enabling system-assigned identity in Azure portal.

    La cuenta de Automation ahora podrá usar la identidad asignada por el sistema, registrada con Microsoft Entra ID y representada mediante un identificador de objeto.

    Managed identity object ID.

Habilitar mediante PowerShell

Use el cmdlet de PowerShell Set-AzAutomationAccount para agregar las identidades administradas asignadas por el sistema.

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

$output

La salida debe tener una apariencia similar a la siguiente:

Output from set-azautomationaccount command.

Para obtener una salida adicional, modifique el ejemplo para especificar: $output.identity | ConvertTo-Json.

Habilitación mediante una API REST

A continuación, se proporcionan los pasos de ejemplo y la sintaxis.

Sintaxis

La sintaxis del cuerpo siguiente permite una identidad administrada asignada por el sistema en una cuenta de Automation mediante el método HTTP PATCH. Sin embargo, esta sintaxis quitará las identidades administradas asignadas por el sistema existentes asociadas a la cuenta de Automation.

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

Si hay varias identidades asignadas por el usuario definidas, para conservarlas y quitar solo la identidad asignada por el sistema, debe especificar cada identidad asignada por el usuario mediante una lista delimitada por comas. En el ejemplo siguiente, se usa el método 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 sintaxis de la API es la siguiente:

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

Ejemplo

Lleve a cabo los pasos siguientes.

  1. Copie y pegue la sintaxis del cuerpo en un archivo denominado body_sa.json. Guarde el archivo en la máquina local o en una cuenta de almacenamiento de Azure.

  2. Actualice el valor de variable siguiente y, a continuación, ejecútelo.

    $file = "path\body_sa.json"
    
  3. Este ejemplo usa el cmdlet de PowerShell Invoke-RestMethod para enviar una solicitud PATCH a la cuenta de Automation.

    # 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
    

    La salida debe tener una apariencia similar a la siguiente:

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

Habilitación mediante una plantilla de ARM

A continuación, se proporcionan los pasos de ejemplo y la sintaxis.

Sintaxis de plantillas

La sintaxis de plantilla de ejemplo siguiente permite una identidad administrada asignada por el sistema en la cuenta de Automation. Sin embargo, esta sintaxis quitará las identidades administradas asignadas por el sistema existentes asociadas a la cuenta de Automation.

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

Ejemplo

Lleve a cabo los pasos siguientes.

  1. Revise la sintaxis de la plantilla anterior para usar la cuenta de Automation y guárdela en un archivo denominado template_sa.json.

  2. Actualice el valor de variable siguiente y, a continuación, ejecútelo.

    $templateFile = "path\template_sa.json"
    
  3. Use el cmdlet de PowerShell New-AzResourceGroupDeployment para implementar la plantilla.

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

    El comando no producirá ninguna salida; sin embargo, puede usar el código siguiente para comprobarlo:

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

    La salida tendrá un aspecto similar al que se muestra en el ejemplo anterior de la API REST.

Asignación de un rol a una identidad administrada asignada por el sistema

Una cuenta de Automation puede utilizar su identidad administrada asignada por el sistema para obtener tokens para acceder a otros recursos protegidos por Microsoft Entra D, como Azure Key Vault. Estos tokens no representan a ningún usuario específico de la aplicación, sino que representan la aplicación que accede al recurso. En este caso, por ejemplo, el token representa una cuenta de Automation.

Para poder usar la identidad administrada asignada por el sistema para la autenticación, configure el acceso para esa identidad en el recurso de Azure en el que planea usar la identidad. Para completar esta tarea, asigne el rol adecuado a esa identidad en el recurso de Azure de destino.

Siga la entidad de seguridad con menos privilegios y asigne cuidadosamente solo los permisos necesarios para ejecutar el runbook. Por ejemplo, si la cuenta de Automation solo es necesaria para iniciar o detener una VM de Azure, los permisos asignados a la cuenta de ejecución o a la identidad administrada solo deben ser para iniciar o detener la VM. De manera similar, si un runbook lee el almacenamiento de blobs, asigne permisos de solo lectura.

En el ejemplo siguiente se usa Azure PowerShell para mostrar cómo asignar el rol Colaborador en la suscripción al recurso de Azure de destino. El rol Colaborador se usa como ejemplo y puede ser necesario o no en su caso.

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

Comprobación de la asignación de roles a una identidad administrada por el sistema

Para comprobar un rol en una identidad administrada asignada por el sistema de la cuenta de Automation, siga estos pasos:

  1. Inicie sesión en Azure Portal.

  2. Vaya a su cuenta de Automation.

  3. En Configuración de la cuenta, seleccione Identidad.

    Assigning role in system-assigned identity in Azure portal.

  4. En Permisos, haga clic en Asignaciones de roles de Azure.

    Si los roles ya están asignados a la identidad administrada asignada por el sistema seleccionada, puede ver una lista de asignaciones de roles. En esta lista se incluyen todas las asignaciones de roles que puede leer.

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

  5. Para cambiar la suscripción, haga clic en la lista desplegable Suscripción y seleccione la suscripción adecuada.

  6. Haga clic en Agregar asignación de roles (versión preliminar).

  7. En la lista desplegable, seleccione el conjunto de recursos al que se aplica la asignación de roles: Suscripción, Grupo de recursos, Rol y Ámbito.
    Si no tiene la asignación de roles, puede ver los permisos de escritura del ámbito seleccionado como mensaje insertado.

  8. En la lista desplegable Rol, seleccione un rol como Colaborador de máquina virtual.

  9. Haga clic en Save(Guardar).

    Add a role assignment in Azure portal.

Transcurridos unos minutos, se asigna el rol a la identidad administrada en el ámbito seleccionado.

Autenticación del acceso con identidad administrada asignada por el sistema

Después de habilitar la identidad administrada para la cuenta de Automation y de conceder acceso a una identidad al recurso de destino, puede especificar esa identidad en los runbooks para los recursos que admiten la identidad administrada. Para compatibilidad con las identidades, use el cmdlet Connect-AzAccount. Consulte Connect-AzAccount en la referencia de 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:

Si su organización sigue usando los cmdlets de AzureRM en desuso, puede usar Connect-AzureRMAccount -Identity.

Generación de un token de acceso sin usar cmdlets de Azure

Para los puntos de conexión HTTP, asegúrese de lo siguiente.

  • El encabezado de metadatos debe estar presente y establecido en "true".
  • Se debe pasar un recurso junto con la solicitud, como parámetro de consulta para una solicitud GET y como datos de formulario para una solicitud POST.
  • Establezca el valor de la variable de entorno IDENTITY_HEADER en X-IDENTITY-HEADER.
  • El tipo de contenido de la solicitud Post debe ser "application/x-www-form-urlencoded".

Obtención del token de acceso para la identidad administrada asignada por el sistema mediante 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

Obtención del token de acceso para la identidad asignada por el sistema mediante 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 de identidades administradas asignadas por el sistema para acceder a Azure Key Vault en Azure PowerShell

Para obtener más información, consulte 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 de una identidad administrada asignada por el sistema en un runbook de 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 de una identidad administrada asignada por el sistema para acceder a SQL Database

Para más información sobre el aprovisionamiento del acceso a una base de datos de Azure SQL, consulte Aprovisionamiento del administrador de Microsoft Entra (SQL Database).

$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()

Migración de cuentas de ejecución existentes a identidad administrada

Azure Automation proporcionaba la autenticación para administrar los recursos de Azure Resource Manager o los recursos implementados en el modelo de implementación clásica con la cuenta de ejecución. Para cambiar de una cuenta de ejecución a una identidad administrada para la autenticación del runbook, siga estos pasos.

  1. Habilite una identidad administrada asignada por el sistema, una identidad administrada asignada por el usuario o ambos tipos de identidades administradas.

  2. Conceda a la identidad administrada los privilegios para los recursos de Azure que coincidan con los que se asignaron a la cuenta de ejecución.

  3. Actualice los runbooks para autenticarse mediante la identidad administrada.

  4. Modifique los runbooks para usar la identidad administrada. Para compatibilidad con las identidades, use el cmdlet Connect-AzAccount. Consulte Connect-AzAccount en la referencia de PowerShell.

    • Si usa módulos de AzureRM, actualice AzureRM.Profile a la versión más reciente y reemplace mediante el cmdlet Add-AzureRMAccount por Connect-AzureRMAccount –Identity.
    • Si usa módulos Az, actualice a la versión más reciente siguiendo los pasos descritos en el artículo Actualización de los módulos de Azure PowerShell.

Pasos siguientes