Cómo utilizar una identidad administrada con Azure Container Instances

Utilice identidades administradas para recursos de Azure si quiere ejecutar código en Azure Container Instances que interactúe con otros servicios de Azure, sin mantener secretos ni credenciales en el código. La característica facilita una implementación de Azure Container Instances con una identidad administrada automáticamente en Microsoft Entra ID.

En este artículo, conocerá mejor las identidades administradas de Azure Container Instances y aprenderá a realizar las siguientes tareas:

  • Habilitación de una identidad asignada por el usuario o asignada por el sistema en un grupo de contenedores
  • Concesión de acceso a la identidad a una instancia de Azure Key Vault
  • Uso de la identidad administrada para acceder a un almacén de claves desde un contenedor en ejecución

Adaptación de los ejemplos para habilitar y utilizar las identidades en Azure Container Instances para tener acceso a otros servicios de Azure. Estos ejemplos son interactivos. Aunque, en la práctica, las imágenes de contenedor ejecutarían el código para tener acceso a servicios de Azure.

¿Por qué usar una identidad administrada?

Utilice una identidad administrada en un contenedor en ejecución para autenticarse en cualquier servicio que admita la autenticación de Microsoft Entra sin tener que administrar credenciales en el código del contenedor. En el caso de servicios que no son compatibles con la autenticación de Azure AD, puede almacenar secretos en Azure Key Vault y usar la identidad administrada para acceder al almacén de claves y recuperar las credenciales. Para más información sobre las identidades administradas, vea ¿Qué es Managed Identities for Azure Resources?

Habilitación de una entidad administrada

Al crear un grupo de contenedores, habilite una o varias identidades administradas estableciendo una propiedad ContainerGroupIdentity. También puede habilitar o actualizar las identidades administradas después de que se ejecute un grupo de contenedores; cualquiera de estas acciones hace que el grupo de contenedores se reinicie. Para establecer las identidades en un grupo de contenedores nuevo o existente, use la CLI de Azure, una plantilla de Resource Manager, un archivo YAML u otra herramienta de Azure.

Azure Container Instances admite ambos tipos de identidades administradas de Azure: asignada por el usuario y asignada por el sistema. En un grupo de contenedores, puede habilitar una identidad asignada por el sistema y una o más identidades asignadas por el usuario. Si no está familiarizado con las identidades administradas de los recursos de Azure, consulte la introducción.

Uso de una identidad administrada

Para usar una identidad administrada, la identidad debe tener acceso a uno o más recursos de servicio de Azure (por ejemplo, una aplicación web, un almacén de claves o una cuenta de almacenamiento) en la suscripción. El uso de una identidad administrada en un contenedor en ejecución es parecido a usar una identidad en una máquina virtual (VM) de Azure. Vea las instrucciones de la máquina virtual sobre el uso de un token, la CLI de Azure o de Azure PowerShell o los SDK de Azure.

Requisitos previos

  • En este artículo se necesita la versión 2.0.49 de la CLI de Azure, o cualquier versión posterior. Si usa Azure Cloud Shell, ya está instalada la versión más reciente.

Creación de una instancia de Azure Key Vault

En los ejemplos de este artículo se usa una identidad administrada de Azure Container Instances para acceder a un secreto de Azure Key Vault.

En primer lugar, cree un grupo de recursos denominado myResourceGroup en la ubicación eastus con el comando az group create siguiente:

az group create --name myResourceGroup --location eastus

Use el comando az keyvault create para crear un almacén de claves. Asegúrese de especificar un nombre de almacén de claves único.

az keyvault create \
  --name mykeyvault \
  --resource-group myResourceGroup \
  --location eastus

Almacene un secreto de ejemplo en el almacén de claves con el comando az keyvault secret set:

az keyvault secret set \
  --name SampleSecret \
  --value "Hello Container Instances" \
  --description ACIsecret --vault-name mykeyvault

Continúe con los siguientes ejemplos para acceder al almacén de claves mediante una identidad administrada asignada por el usuario o asignada por el sistema en Azure Container Instances.

Ejemplo 1: Uso de una identidad asignada por el usuario para acceder a Azure Key Vault

Creación de una identidad

En primer lugar, cree una identidad en la suscripción con el comando az identity create. Puede usar el mismo grupo de recursos empleado para crear el almacén de claves o uno diferente.

az identity create \
  --resource-group myResourceGroup \
  --name myACIId

Para utilizar la identidad en los pasos siguientes, use el comando az identity show para almacenar en variables los identificadores de la entidad de servicio y del recurso de la identidad.

# Get service principal ID of the user-assigned identity
SP_ID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACIId \
  --query principalId --output tsv)

# Get resource ID of the user-assigned identity
RESOURCE_ID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACIId \
  --query id --output tsv)

Concesión de acceso a la identidad asignada por el usuario al almacén de claves

Ejecute el comando az keyvault set-policy siguiente para establecer una directiva de acceso en el almacén de claves. En el ejemplo siguiente se permite que la identidad asignada por el usuario obtenga secretos del almacén de claves:

 az keyvault set-policy \
    --name mykeyvault \
    --resource-group myResourceGroup \
    --object-id $SP_ID \
    --secret-permissions get

Habilitación de una identidad asignada por el usuario en un grupo de contenedores

Ejecute el siguiente comando az container create para crear una instancia de contenedor basada en la imagen azure-cli de Microsoft. En este ejemplo se proporciona un solo grupo de contenedores que puede usarse para ejecutar de forma interactiva la CLI de Azure con el fin de acceder a otros servicios de Azure. En esta sección, solo se usa el sistema operativo base. Puede encontrar un ejemplo de cómo usar la CLI de Azure en el contenedor en Habilitación de la identidad asignada por el sistema en un grupo de contenedores.

El parámetro --assign-identity pasa la identidad administrada asignada por el usuario al grupo. El comando de ejecución prolongada mantiene el contenedor en ejecución. En este ejemplo se usa el mismo grupo de recursos empleado para crear el almacén de claves, pero puede especificarse otro distinto.

az container create \
  --resource-group myResourceGroup \
  --name mycontainer \
  --image mcr.microsoft.com/azure-cli \
  --assign-identity $RESOURCE_ID \
  --command-line "tail -f /dev/null"

En unos segundos, debería recibir una respuesta de la CLI de Azure que indica que la implementación finalizó. Compruebe su estado con el comando az container show.

az container show \
  --resource-group myResourceGroup \
  --name mycontainer

La sección identity de la salida tiene un aspecto similar al siguiente, que muestra que la identidad está establecida en el grupo de contenedores. El elemento principalID de userAssignedIdentities es la entidad de servicio de la identidad que creó en Microsoft Entra ID:

[...]
"identity": {
    "principalId": "null",
    "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
    "type": "UserAssigned",
    "userAssignedIdentities": {
      "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/danlep1018/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {
        "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
        "principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222"
      }
    }
  },
[...]

Uso de la identidad asignada por el usuario para obtener un secreto del almacén de claves

Ahora puede usar la identidad administrada para acceder al almacén de claves de la instancia de contenedor en ejecución. Inicie primero un shell de Bash en el contenedor:

az container exec \
  --resource-group myResourceGroup \
  --name mycontainer \
  --exec-command "/bin/bash"

Ejecute los siguientes comandos del shell de Bash en el contenedor. Para obtener un token de acceso para usar Microsoft Entra ID para autenticarse en el almacén de claves, ejecute el siguiente comando:

client_id="00001111-aaaa-2222-bbbb-3333cccc4444"
curl "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net&client_id=$client_id" -H Metadata:true -s

Salida:

{"access_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Imk2bEdrM0ZaenhSY1ViMkMzbkVRN3N5SEpsWSIsImtpZCI6Imk2bEdrM0ZaenhSY1ViMkMzbkVRN3N5SEpsWSJ9......xxxxxxxxxxxxxxxxx","refresh_token":"","expires_in":"28799","expires_on":"1539927532","not_before":"1539898432","resource":"https://vault.azure.net/","token_type":"Bearer"}

Para almacenar el token de acceso en una variable para usar en los siguientes comandos para autenticarse, ejecute el siguiente comando:

TOKEN=$(curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net' -H Metadata:true | jq -r '.access_token')

Ahora puede usar el token de acceso para autenticarse en el almacén de claves y leer un secreto. No olvide sustituir el nombre del almacén de claves en la dirección URL (https://mykeyvault.vault.azure.net/...):

curl https://mykeyvault.vault.azure.net/secrets/SampleSecret/?api-version=7.4 -H "Authorization: Bearer $TOKEN"

La respuesta será similar a la siguiente, que muestra el secreto. En el código, podría analizar esta salida para obtener el secreto. Utilice luego el secreto en una operación posterior para tener acceso a otro recurso de Azure.

{"value":"Hello Container Instances","contentType":"ACIsecret","id":"https://mykeyvault.vault.azure.net/secrets/SampleSecret/xxxxxxxxxxxxxxxxxxxx","attributes":{"enabled":true,"created":1539965967,"updated":1539965967,"recoveryLevel":"Purgeable"},"tags":{"file-encoding":"utf-8"}}

Ejemplo 2: Uso de una identidad asignada por el sistema para acceder a Azure Key Vault

Habilitación de una identidad asignada por el sistema en un grupo de contenedores

Ejecute el siguiente comando az container create para crear una instancia de contenedor basada en la imagen azure-cli de Microsoft. En este ejemplo se proporciona un solo grupo de contenedores que puede usarse para ejecutar de forma interactiva la CLI de Azure con el fin de acceder a otros servicios de Azure.

El parámetro --assign-identity sin ningún valor adicional habilita una identidad administrada asignada por el sistema en el grupo. El ámbito de la identidad es el grupo de recursos del grupo de contenedores. El comando de ejecución prolongada mantiene el contenedor en ejecución. En este ejemplo se usa el mismo grupo de recursos empleado para crear el almacén de claves, que se encuentra en el ámbito de la identidad.

# Get the resource ID of the resource group
RG_ID=$(az group show --name myResourceGroup --query id --output tsv)

# Create container group with system-managed identity
az container create \
  --resource-group myResourceGroup \
  --name mycontainer \
  --image mcr.microsoft.com/azure-cli \
  --assign-identity --scope $RG_ID \
  --command-line "tail -f /dev/null"

En unos segundos, debería recibir una respuesta de la CLI de Azure que indica que la implementación finalizó. Compruebe su estado con el comando az container show.

az container show \
  --resource-group myResourceGroup \
  --name mycontainer

La sección identity de la salida tiene un aspecto similar al siguiente, que muestra que se crea una identidad asignada por el sistema en Microsoft Entra ID:

[...]
"identity": {
    "principalId": "bbbbbbbb-cccc-dddd-2222-333333333333",
    "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
    "type": "SystemAssigned",
    "userAssignedIdentities": null
},
[...]

Establezca una variable en el valor de principalId (identificador de la entidad de servicio) de la identidad para su uso en pasos posteriores.

SP_ID=$(az container show \
  --resource-group myResourceGroup \
  --name mycontainer \
  --query identity.principalId --out tsv)

Concesión de acceso al grupo de contenedores al almacén de claves

Ejecute el comando az keyvault set-policy siguiente para establecer una directiva de acceso en el almacén de claves. En el ejemplo siguiente se permite que la identidad administrada asignada por el sistema obtenga secretos del almacén de claves:

 az keyvault set-policy \
   --name mykeyvault \
   --resource-group myResourceGroup \
   --object-id $SP_ID \
   --secret-permissions get

Uso de la identidad del grupo de contenedores para obtener un secreto del almacén de claves

Ahora puede usar la identidad administrada para acceder al almacén de claves de la instancia de contenedor en ejecución. Inicie primero un shell de Bash en el contenedor:

az container exec \
  --resource-group myResourceGroup \
  --name mycontainer \
  --exec-command "/bin/bash"

Ejecute los siguientes comandos del shell de Bash en el contenedor. En primer lugar, inicie sesión en la CLI de Azure mediante la identidad administrada:

az login --identity

En el contenedor en ejecución, recupere el secreto del almacén de claves:

az keyvault secret show \
  --name SampleSecret \
  --vault-name mykeyvault --query value

Se recupera el valor del secreto:

"Hello Container Instances"

Habilitación de la identidad administrada con una plantilla de Resource Manager

Para habilitar una identidad administrada en un grupo de contenedores con una plantilla de Resource Manager, establezca la propiedad identity del objeto Microsoft.ContainerInstance/containerGroups con un objeto ContainerGroupIdentity. Los siguientes fragmentos de código muestran la propiedad identity configurada para diferentes escenarios. Vea Referencia de plantilla de Resource Manager. Especifique un valor mínimo de apiVersion de 2018-10-01.

Identidad asignada por el usuario

Una identidad asignada por el usuario es un identificador de recurso del formulario:

"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}"

Puede habilitar una o más identidades asignadas por el usuario.

"identity": {
    "type": "UserAssigned",
    "userAssignedIdentities": {
        "myResourceID1": {
            }
        }
    }

Identidad asignada por el sistema

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

Identidades asignadas por el sistema y por el usuario

En un grupo de contenedores, puede habilitar una identidad asignada por el sistema y una o más identidades asignadas por el usuario.

"identity": {
    "type": "SystemAssigned, UserAssigned",
    "userAssignedIdentities": {
        "myResourceID1": {
            }
        }
    }
...

Habilitación de una identidad administrada con un archivo YAML

Para habilitar una identidad administrada en un grupo de contenedores implementados con un archivo YAML, incluya el siguiente código YAML. Especifique un valor mínimo de apiVersion de 2018-10-01.

Identidad asignada por el usuario

Una identidad asignada por el usuario es un identificador de recurso del formulario.

'/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}'

Puede habilitar una o más identidades asignadas por el usuario.

identity:
  type: UserAssigned
  userAssignedIdentities:
    {'myResourceID1':{}}

Identidad asignada por el sistema

identity:
  type: SystemAssigned

Identidades asignadas por el sistema y por el usuario

En un grupo de contenedores, puede habilitar una identidad asignada por el sistema y una o más identidades asignadas por el usuario.

identity:
  type: SystemAssigned, UserAssigned
  userAssignedIdentities:
   {'myResourceID1':{}}

Identidad administrada en contenedores de Windows

La identidad administrada en grupos de contenedores de Windows funciona de forma diferente a como funciona en los grupos de contenedores de Linux. En el caso de los contenedores de Windows, el servidor de metadatos (169.254.169.254) no está disponible para obtener el token de Microsoft Entra ID. Los clientes pueden seguir un patrón diferente para obtener el token de acceso en contenedores de Windows. El patrón implica el envío de una solicitud de token a IDENTITY_ENDPOINT junto con información adicional, como el identificador de entidad de seguridad y el secreto, como se muestra a continuación. IDENTITY_ENDPOINT y IDENTITY_HEADER se insertan como variable de entorno en el contenedor.

curl -G -v %IDENTITY_ENDPOINT% --data-urlencode resource=https://vault.azure.net --data-urlencode principalId=<principal id> -H secret:%IDENTITY_HEADER%

Script de PowerShell de ejemplo

identityEndpoint = $env:IDENTITY_ENDPOINT
$identityHeader = $env:IDENTITY_HEADER
$resource = "https://vault.azure.net"
$principalId = "b2ee9347-623c-4794-85af-2d5261356f67"
 
Invoke-RestMethod -Uri "$identityEndpoint" `
    -Method Get `
    -Headers @{secret = $identityHeader} `
    -Body @{resource = $resource; principalId = $principalId} `
    -ContentType "application/x-www-form-urlencoded"

El módulo Az Login y otras bibliotecas cliente que dependen del servidor de metadatos (169.254.169.254) no funcionarán en un contenedor de Windows. Además, los contenedores de Windows de la red virtual no podrán conectarse al punto de conexión; Por lo tanto, no se puede generar un token de identidad administrada en un contenedor de red virtual de Windows.

Pasos siguientes

En este artículo, ha conocido las identidades administradas de Azure Container Instances y ha aprendido a realizar las siguientes tareas:

  • Habilitación de una identidad asignada por el usuario o asignada por el sistema en un grupo de contenedores
  • Concesión de acceso a la identidad a una instancia de Azure Key Vault
  • Uso de la identidad administrada para acceder a un almacén de claves desde un contenedor en ejecución