Aplicación administrada por Azure con identidad administrada

Nota:

La compatibilidad de identidad administrada para Azure Managed Applications está actualmente en versión preliminar. Use la versión de api 2018-09-01-preview para usar la identidad administrada.

Obtenga información sobre cómo configurar una aplicación administrada para contener una identidad administrada. Se puede usar una identidad administrada para permitir que el cliente conceda a la aplicación administrada acceso a los recursos existentes. La plataforma de Azure administra la identidad y no requiere que aprovisione ni gire ningún secreto. Para obtener más información sobre las identidades administradas en Microsoft Entra ID, consulte Identidades administradas para recursos de Azure.

La aplicación puede tener dos tipos de identidades:

  • Una identidad administrada asignada por el sistema está asociada a la aplicación y se elimina si se elimina la aplicación. Una aplicación solo puede tener una identidad administrada asignada por el sistema.
  • Una identidad administrada asignada por el usuario es un recurso de Azure independiente que puede asignarse a la aplicación. Una aplicación puede tener varias identidades administradas asignadas por el usuario.

Cómo usar la identidad administrada

La identidad administrada facilita muchos escenarios para aplicaciones administradas. Algunos escenarios comunes que pueden resolverse son:

  • Implementar una aplicación administrada vinculada a recursos de Azure existentes. Un ejemplo es implementar una máquina virtual (VM) de Azure dentro de la aplicación administrada que se conecta a una interfaz de red existente.
  • Conceder acceso a la aplicación administrada y al editor a los recursos de Azure fuera del grupo de recursos administrado.
  • Proporcionar una identidad operativa de aplicaciones administradas para el registro de actividad y otros servicios dentro de Azure.

Agregar la identidad administrada

La creación de una aplicación administrada con una identidad administrada requiere que se establezca otra propiedad en el recurso de Azure. A continuación se muestra una propiedad identity de ejemplo:

{
  "identity": {
    "type": "SystemAssigned, UserAssigned",
    "userAssignedIdentities": {
      "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testRG/providers/Microsoft.ManagedIdentity/userassignedidentites/myuserassignedidentity": {}
    }
  }
}

Hay dos maneras comunes de crear una aplicación administrada con identity: createUIDefinition.json y plantillas de Azure Resource Manager. Para escenarios simples de creación única, debe usarse createUIDefinition para habilitar la identidad administrada, ya que proporciona una experiencia enriquecida. Sin embargo, cuando se trabaja con sistemas avanzados o complejos que requieren implementaciones automatizadas o múltiples de aplicación administrada, pueden usarse plantillas.

Uso de createUIDefinition

Se puede configurar una aplicación administrada con identidad administrada a través de createUIDefinition.json. En la sección Salidas, la clave managedIdentity puede usarse para reemplazar la propiedad identity de la plantilla de aplicación administrada. En el ejemplo siguiente, se habilita una identidad administrada asignada por el sistema en la aplicación administrada. Para formar objetos de identidad más complejos, use elementos createUIDefinition para pedir entradas al consumidor. Estas entradas se pueden usar para construir aplicaciones administradas con una identidad administrada asignada por el usuario.

"outputs": {
  "managedIdentity": { "Type": "SystemAssigned" }
}

Cuándo usar createUIDefinition para identidad administrada

A continuación, se muestran algunas recomendaciones sobre cuándo usar createUIDefinition para habilitar una identidad administrada en aplicaciones administradas.

  • La creación de aplicaciones administradas se realiza a través de Azure Portal o Azure Marketplace.
  • La identidad administrada requiere una intervención compleja del consumidor.
  • La identidad administrada es necesaria en la creación de la aplicación administrada.

Control de createUIDefinition de la identidad administrada

createUiDefinition.json admite un control de identidad administrada integrado.

{
  "$schema": "https://schema.management.azure.com/schemas/0.1.2-preview/CreateUIDefinition.MultiVm.json#",
  "handler": "Microsoft.Azure.CreateUIDef",
  "version": "0.1.2-preview",
  "parameters": {
    "basics": [],
    "steps": [
      {
        "name": "applicationSettings",
        "label": "Application Settings",
        "subLabel": {
          "preValidation": "Configure your application settings",
          "postValidation": "Done"
        },
        "bladeTitle": "Application Settings",
        "elements": [
          {
            "name": "appName",
            "type": "Microsoft.Common.TextBox",
            "label": "Managed application Name",
            "toolTip": "Managed application instance name",
            "visible": true
          },
          {
            "name": "appIdentity",
            "type": "Microsoft.ManagedIdentity.IdentitySelector",
            "label": "Managed Identity Configuration",
            "toolTip": {
              "systemAssignedIdentity": "Enable system assigned identity to grant the managed application access to additional existing resources.",
              "userAssignedIdentity": "Add user assigned identities to grant the managed application access to additional existing resources."
            },
            "defaultValue": {
              "systemAssignedIdentity": "Off"
            },
            "options": {
              "hideSystemAssignedIdentity": false,
              "hideUserAssignedIdentity": false,
              "readOnlySystemAssignedIdentity": false
            },
            "visible": true
          }
        ]
      }
    ],
    "outputs": {
      "applicationResourceName": "[steps('applicationSettings').appName]",
      "location": "[location()]",
      "managedIdentity": "[steps('applicationSettings').appIdentity]"
    }
  }
}

Screenshot of the application settings for system-assigned managed identity and user-assigned managed identity

Uso de plantillas del Administrador de recursos de Azure

Nota:

Las plantillas de aplicación administrada de Marketplace se generan automáticamente para los clientes que siguen la experiencia de creación de Azure Portal. Para estos escenarios, la clave de salida managedIdentity en createUIDefinition debe usarse para la identidad habilitada.

Además, la identidad administrada puede habilitarse con plantillas de Azure Resource Manager. En el ejemplo siguiente, se habilita una identidad administrada asignada por el sistema en la aplicación administrada. Los objetos de identidad más complejos se pueden formar mediante los parámetros de plantillas de Azure Resource Manager para proporcionar entradas. Estas entradas se pueden usar para construir aplicaciones administradas con una identidad administrada asignada por el usuario.

Cuándo usar plantillas de Azure Resource Manager para la identidad administrada

A continuación, se muestran algunas recomendaciones sobre cuándo usar plantillas de Azure Resource Manager para habilitar la identidad administrada en aplicaciones administradas.

  • Las aplicaciones administradas se pueden implementar mediante programación basada en una plantilla.
  • Se necesitan asignaciones de roles personalizados para la identidad administrada a fin de aprovisionar la aplicación administrada.
  • La aplicación administrada no necesita el flujo de creación de Azure Portal ni Marketplace.

Plantilla SystemAssigned

Una plantilla básica de Azure Resource Manager que implementa una aplicación administrada con la identidad administrada asignada por el sistema.

"resources": [
  {
    "type": "Microsoft.Solutions/applications",
    "name": "[parameters('applicationName')]",
    "apiVersion": "2018-09-01-preview",
    "location": "[parameters('location')]",
    "identity": {
        "type": "SystemAssigned"
    },
    "properties": {
        "ManagedResourceGroupId": "[parameters('managedByResourceGroupId')]",
        "parameters": { }
    }
  }
]

Plantilla UserAssigned

Una plantilla básica de Azure Resource Manager que implementa una aplicación administrada con la identidad administrada asignada por el usuario.

"resources": [
  {
    "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
    "name": "[parameters('managedIdentityName')]",
    "apiVersion": "2018-11-30",
    "location": "[parameters('location')]"
  },
  {
    "type": "Microsoft.Solutions/applications",
    "name": "[parameters('applicationName')]",
    "apiVersion": "2018-09-01-preview",
    "location": "[parameters('location')]",
    "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
            "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',parameters('managedIdentityName'))]": {}
        }
    },
    "properties": {
        "ManagedResourceGroupId": "[parameters('managedByResourceGroupId')]",
        "parameters": { }
    }
  }
]

Conceder acceso a los recursos de Azure

Una vez que se concede una identidad a una aplicación administrada, se le puede conceder acceso a recursos de Azure existentes al crear una asignación de roles.

Para ello, busque y seleccione el nombre de la aplicación administrada o identidad administrada asignada por el usuario y, luego, seleccione Control de acceso (IAM). Para asignar roles, consulte Asignación de roles de Azure mediante Azure Portal.

Vincular recursos de Azure existentes

Nota:

Una identidad administrada asignada por el usuario debe configurarse antes de implementar la aplicación administrada. Además, la implementación de recursos vinculados de las aplicaciones administradas solo se admite para el tipo Marketplace.

La identidad administrada también puede usarse para implementar una aplicación administrada que requiera acceso a los recursos existentes durante su implementación. Cuando el cliente aprovisiona la aplicación administrada, las identidades administradas asignadas por el usuario se pueden agregar para proporcionar más autorizaciones en la implementación mainTemplate.

Creación de createUIDefinition con un recurso vinculado

Al vincular la implementación de la aplicación administrada a los recursos existentes, se deben proporcionar tanto el recurso de Azure existente como una identidad administrada asignada por el usuario con la asignación de roles aplicable en dicho recurso.

Ejemplo de createUIDefinition que requiere dos entradas: un identificador de recurso de interfaz de red y un identificador de recurso de identidad administrada asignada por el usuario.

{
  "$schema": "https://schema.management.azure.com/schemas/0.1.2-preview/CreateUIDefinition.MultiVm.json#",
  "handler": "Microsoft.Azure.CreateUIDef",
  "version": "0.1.2-preview",
  "parameters": {
    "basics": [
      {}
    ],
    "steps": [
      {
        "name": "managedApplicationSetting",
        "label": "Managed Application Settings",
        "subLabel": {
          "preValidation": "Managed Application Settings",
          "postValidation": "Done"
        },
        "bladeTitle": "Managed Application Settings",
        "elements": [
          {
            "name": "networkInterfaceId",
            "type": "Microsoft.Common.TextBox",
            "label": "Network interface resource ID",
            "defaultValue": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testRG/providers/Microsoft.Network/networkInterfaces/existingnetworkinterface",
            "toolTip": "Must represent the identity as an Azure Resource Manager resource identifer format ex. /subscriptions/sub1/resourcegroups/myGroup/providers/Microsoft.Network/networkInterfaces/networkinterface1",
            "visible": true
          },
          {
            "name": "userAssignedId",
            "type": "Microsoft.Common.TextBox",
            "label": "User-assigned managed identity resource ID",
            "defaultValue": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testRG/providers/Microsoft.ManagedIdentity/userassignedidentites/myuserassignedidentity",
            "toolTip": "Must represent the identity as an Azure Resource Manager resource identifer format ex. /subscriptions/sub1/resourcegroups/myGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/identity1",
            "visible": true
          }
        ]
      }
    ],
    "outputs": {
      "existingNetworkInterfaceId": "[steps('managedApplicationSetting').networkInterfaceId]",
      "managedIdentity": "[parse(concat('{\"Type\":\"UserAssigned\",\"UserAssignedIdentities\":{',string(steps('managedApplicationSetting').userAssignedId),':{}}}'))]"
    }
  }
}

Este archivo createUIDefinition.json genera una experiencia de creación de usuario que tiene dos campos. El primer campo permite al usuario escribir en el identificador de recurso de Azure para el recurso que se está vinculando con la implementación de la aplicación administrada. El segundo es para que un consumidor escriba el identificador de recursos de Azure de la identidad administrada asignada por el usuario, que tiene acceso al recurso de Azure vinculado. La experiencia generada tendría el aspecto siguiente:

Screenshot of a sample createUiDefinition.json with two inputs: a network interface resource ID and a user-assigned managed identity resource ID.

Creación de mainTemplate con un recurso vinculado

Además de actualizar la instancia de createUIDefinition, la plantilla principal también debe actualizarse para aceptar el identificador de recurso vinculado que se ha pasado. La plantilla principal puede actualizarse para aceptar la nueva salida si se agrega un nuevo parámetro. Puesto que la salida managedIdentity invalida el valor en la plantilla de la aplicación administrada generada, no se pasa a la plantilla principal y no deben incluirse en la sección de parámetros.

Plantilla principal de ejemplo que establece el perfil de red a una interfaz de red existente proporcionada por createUiDefinition.json.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "existingNetworkInterfaceId": { "type": "string" }
  },
  "variables": {
  },
  "resources": [
    {
      "apiVersion": "2016-04-30-preview",
      "type": "Microsoft.Compute/virtualMachines",
      "name": "myLinkedResourceVM",
      "location": "[resourceGroup().location]",
      "properties": {
        …,
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[parameters('existingNetworkInterfaceId')]"
            }
          ]
        }
      }
    }
  ]
}

Consumir la aplicación administrada con un recurso vinculado

Una vez creado el paquete de la aplicación administrada, esta se puede consumir a través de Azure Portal. Antes de que pueda consumirse, hay varios requisitos previos.

  • Debe crearse una instancia del recurso de Azure vinculado necesario.
  • La identidad administrada asignada por el usuario debe crearse y recibir las asignaciones de roles al recurso vinculado.
  • El id. del recurso vinculado existente y el id. de la identidad administrada asignada por el usuario se proporcionan a createUIDefinition.

Acceder al token de identidad administrada

Ahora se puede acceder al token de la aplicación administrada mediante la API listTokens desde el inquilino del editor. Un ejemplo de solicitud puede tener el siguiente aspecto:

POST https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Solutions/applications/{applicationName}/listTokens?api-version=2018-09-01-preview HTTP/1.1

{
  "authorizationAudience": "https://management.azure.com/",
  "userAssignedIdentities": [
      "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{userAssignedIdentityName}"
  ]
}

Parámetros del cuerpo de la solicitud:

Parámetro Obligatorio Descripción
authorizationAudience no El URI del id. de la aplicación del recurso de destino. También es la notificación aud (audiencia) del token emitido. El valor predeterminado es "https://management.azure.com/"
userAssignedIdentities no La lista de identidades administradas asignadas por el usuario para las cuales recuperar un token. Si no se especifica, listTokens devuelve el token para la identidad administrada asignada por el sistema.

Una respuesta de ejemplo puede tener el siguiente aspecto:

HTTP/1.1 200 OK
Content-Type: application/json

{
  "value": [
    {
      "access_token": "eyJ0eXAi…",
      "expires_in": "2…",
      "expires_on": "1557…",
      "not_before": "1557…",
      "authorizationAudience": "https://management.azure.com/",
      "resourceId": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Solutions/applications/{applicationName}",
      "token_type": "Bearer"
    }
  ]
}

La respuesta contiene una matriz de tókenes en la propiedad value:

Parámetro Descripción
access_token El token de acceso solicitado.
expires_in El número de segundos que es válido el token de acceso.
expires_on La hora a la que expira el token de acceso. Este valor se representa como el número de segundos desde el tiempo Unix.
not_before El intervalo de tiempo en que el token de acceso surte efecto. Este valor se representa como el número de segundos desde el tiempo Unix.
authorizationAudience La aud (audiencia) para la cual se solicitó el token de acceso. Este valor es igual al que se ha proporcionado en la solicitud listTokens.
resourceId El identificador de recursos de Azure para el token emitido. Este valor es el id. de la aplicación administrada o el id. de la identidad administrada asignada por el usuario.
token_type Tipo de token.

Pasos siguientes