Uso de una identidad administrada asignada por el usuario para una cuenta de Azure Automation
En este artículo, se muestra cómo agregar una identidad administrada asignada por el usuario 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).
Nota:
No es posible usar una identidad administrada asignada por el usuario en una instancia de Hybrid Runbook Worker cuando se ha creado una identidad administrada (asignada por el sistema o por el usuario) para la cuenta de Automation. Si la identidad administrada no se ha asignado a la cuenta de Automation, es posible usar la identidad administrada asignada por el sistema o por el usuario de la máquina virtual en una instancia de Hybrid Runbook Worker que sea una máquina virtual de Azure con las identidades administradas asignadas.
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 identidad administrada asignada por el usuario y los recursos de Azure de destino que administra el runbook con esa identidad pueden estar en diferentes suscripciones de Azure.
La versión más reciente de los módulos de cuenta de Azure. Actualmente, es la versión 2.2.8. (Consulte Az.Accounts para obtener más información sobre esta versión).
Un recurso de Azure al que desea acceder desde el runbook de Automation. Este recurso debe tener un rol definido para la identidad administrada asignada por el usuario, 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.
Para asignar un rol de Azure debe tener permisos
Microsoft.Authorization/roleAssignments/write
, como Administrador de acceso de usuario o Propietario.
Adición de una identidad administrada asignada por el usuario para una cuenta de Azure Automation
Puede agregar una identidad administrada asignada por el usuario 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"
$userAssignedOne = "userAssignedIdentityOne"
$userAssignedTwo = "userAssignedIdentityTwo"
Adición mediante Azure Portal
Lleve a cabo los siguiente pasos:
Inicie sesión en Azure Portal.
En Azure Portal, vaya a su cuenta de Automation.
En Configuración de la cuenta, seleccione Identidad.
Seleccione la pestaña Usuario asignado y, a continuación, seleccione Agregar.
Seleccione la identidad administrada asignada por el usuario existente y, a continuación, seleccione Agregar. A continuación, volverá a la pestaña Usuario asignado.
Incorporación mediante PowerShell
Use el cmdlet de PowerShell Set-AzAutomationAccount para agregar las identidades administradas asignadas por el usuario. En primer lugar, debe tener en cuenta si hay una identidad administrada asignada por el sistema existente. En el ejemplo siguiente, se agregan dos identidades administradas asignadas por el usuario existentes a una cuenta de Automation existente y se deshabilitará una identidad administrada asignada por el sistema si existe una.
$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
Para mantener una identidad administrada asignada por el sistema existente, use lo siguiente:
$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
La salida debe tener una apariencia similar a la siguiente:
Para obtener una salida adicional, ejecute: $output.identity | ConvertTo-Json
.
Adición mediante una API REST
A continuación, se proporcionan los pasos de ejemplo y la sintaxis.
Sintaxis
La sintaxis del cuerpo del ejemplo siguiente habilita una identidad administrada asignada por el sistema si aún no está habilitada y asigna dos identidades administradas asignadas por el usuario existentes a la cuenta de Automation existente.
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 sintaxis de la API es la siguiente:
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
Ejemplo
Lleve a cabo los pasos siguientes.
Revise la sintaxis del cuerpo anterior en un archivo llamado
body_ua.json
. Guarde el archivo en la máquina local o en una cuenta de almacenamiento de Azure.Revise el valor de la variable siguiente y, a continuación, ejecute:
$file = "path\body_ua.json"
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:
{ "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" } } }
Adición mediante una plantilla de ARM
A continuación, se proporcionan los pasos de ejemplo y la sintaxis.
Sintaxis de plantillas
La sintaxis de la plantilla de ejemplo siguiente habilita una identidad administrada asignada por el sistema si aún no está habilitada y asigna dos identidades administradas asignadas por el usuario existentes a la cuenta de Automation existente.
{
"$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": {}
}
}
}
]
}
Ejemplo
Lleve a cabo los pasos siguientes.
Copie y pegue la plantilla en un archivo llamado
template_ua.json
. Guarde el archivo en la máquina local o en una cuenta de almacenamiento de Azure.Revise el valor de la variable siguiente y, a continuación, ejecute:
$templateFile = "path\template_ua.json"
Use el cmdlet de PowerShell New-AzResourceGroupDeployment para implementar la plantilla.
New-AzResourceGroupDeployment ` -Name "UserAssignedDeployment" ` -ResourceGroupName $resourceGroup ` -TemplateFile $templateFile ` -automationAccountName $automationAccount ` -userAssignedOne $userAssignedOne ` -userAssignedTwo $userAssignedTwo
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 usuario
Una cuenta de Automation puede utilizar su identidad administrada asignada por el usuario para obtener tokens para acceder a otros recursos protegidos por Microsoft Entra ID, 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 usuario 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 del almacenamiento de blobs, asigne permisos de solo lectura.
En este ejemplo 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. Como alternativa, puede usar Azure Portal para asignar el rol al recurso de Azure de destino.
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 usuario
Para comprobar un rol en una identidad administrada asignada por el usuario de la cuenta de Automation, siga estos pasos:
Inicie sesión en Azure Portal.
Vaya a su cuenta de Automation.
En Configuración de la cuenta, seleccione Identidad, Usuario asignado.
Haga clic en Nombre de identidad asignado por el usuario.
Si los roles ya están asignados a la identidad administrada asignada por el usuario seleccionada, puede ver una lista de asignaciones de roles. En esta lista se incluyen todas las asignaciones de roles que puede leer.
Para cambiar la suscripción, haga clic en la lista desplegable Suscripción y seleccione la suscripción adecuada.
Haga clic en Agregar asignación de roles (versión preliminar).
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.En la lista desplegable Rol, seleccione un rol como Colaborador de máquina virtual.
Haga clic en Save(Guardar).
Transcurridos unos minutos, se asigna el rol a la identidad administrada en el ámbito seleccionado.
Autenticación del acceso con una identidad administrada asignada por el usuario
Después de habilitar la identidad administrada asignada por el usuario 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 ver la compatibilidad con las identidades, use el 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
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 de un token de acceso para la identidad administrada asignada por el usuario mediante 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
Obtención de un token de acceso para la identidad administrada asignada por el usuario mediante 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 de una identidad administrada asignada por el usuario en 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 de una identidad administrada asignada por el usuario en un runbook de 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)
Pasos siguientes
Si los runbooks no se completan correctamente, revise Solución de problemas de identidad administrada de Azure Automation.
Si necesita deshabilitar una identidad administrada, vea Deshabilitación de la identidad administrada de la cuenta de Azure Automation.
Para información general sobre la seguridad de l cuenta de Azure Automation, consulte Introducción a la autenticación de cuentas de Automation.