Application managée Azure avec identité managée

Notes

La prise en charge d’une identité managée pour des applications managées Azure est actuellement en préversion. Utilisez la version d’API 2018-09-01-préversion pour utiliser une identité managée.

Découvrez comment configurer une application managée pour contenir une identité managée. Une identité managée peut être utilisée pour permettre au client d’octroyer à l’application managée l’accès à des ressources existantes. La plateforme Azure gère l’identité et ne requiert pas de votre part de provisionner des secrets ou d’en effectuer la rotation. Pour plus d’informations sur les identités managées dans Microsoft Entra ID, consultez Identités managées pour les ressources Azure.

Deux types d’identité peuvent être accordés à votre application :

  • Une identité managée attribuée par le système est liée à votre application et est supprimée si votre application est supprimée. Une application ne peut avoir qu’une seule identité managée attribuée par le système.
  • Une identité managée attribuée par l’utilisateur est une ressource Azure autonome qui peut être attribuée à votre application. Une application peut avoir plusieurs identités managées attribuées par l’utilisateur.

Comment utiliser une identité managée

L’identité managée permet de nombreux scénarios pour des applications managées. Quelques scénarios courants qui peuvent être résolus sont :

  • Déploiement d’une application managée liée à des ressources Azure existantes. Le déploiement d’une machine virtuelle (VM) Azure dans l’application managée qui est attachée à une interface réseau existante peut être un exemple.
  • Octroi de l’accès aux ressources Azure en dehors du groupe de ressources managé à l’application managée et à l’éditeur.
  • Fourniture d’une identité opérationnelle des applications managées au journal d’activité et d’autres services dans Azure.

Ajout d’une identité managée

La création d’une application managée avec une identité managée nécessite la définition d’une autre propriété sur la ressource Azure. L’exemple suivant illustre un exemple de propriété identity :

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

Il existe deux manières courantes de créer une application managée avec identity : CreateUIDefinition.json et les modèles Azure Resource Manager. Pour des scénarios de création uniques et simples, createUiDefinition doit être utilisé pour activer l’identité managée, car il propose une expérience plus riche. Toutefois, quand vous utilisez des systèmes avancés ou complexes qui nécessitent des déploiements automatisés ou multiples d’applications managées, des modèles peuvent être utilisés.

Utilisation de createUiDefinition

Une application managée peut être configurée avec une identité managée via createUiDefinition.json. Dans la section des sorties, la clé managedIdentity peut être utilisée pour remplacer la propriété d’identité du modèle d’application managée. L’exemple suivant active une identité managée attribuée par le système sur l’application managée. Des objets d’identité plus complexes peuvent être formés à l’aide des éléments createUiDefinitionpour demander des entrées au contrôle serveur consommateur. Ces entrées peuvent être utilisées pour construire des applications managées avec une identité managée attribuée par l’utilisateur.

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

Quand utiliser createUiDefinition pour une identité managée

Voici quelques recommandations permettant de déterminer quand utiliser createUiDefinition pour activer une identité managée sur des applications managées.

  • La création d’une application managée passe par le portail Azure ou la Place de marché Azure.
  • L’identité managée nécessite une entrée du contrôle serveur consommateur complexe.
  • L’identité managée est nécessaire lors de la création de l’application managée.

Contrôle createUiDefinition d’une identité managée

Le fichier createUiDefinition.json prend en charge un contrôle d’identité managée intégré.

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

Utilisation de modèles Azure Resource Manager

Notes

Les modèles d’application managée de la Place de marché sont automatiquement générés pour les clients qui passent par l’expérience de création du portail Azure. Dans ces scénarios, la clé de sortie managedIdentity sur createUiDefinition doit être utilisée pour activer une identité.

L’identité managée peut également être activée via des modèles Azure Resource Manager. L’exemple suivant active une identité managée attribuée par le système sur l’application managée. Des objets d’identité plus complexes peuvent être formés à l’aide des paramètres de modèle Azure Resource Manager pour fournir des entrées. Ces entrées peuvent être utilisées pour construire des applications managées avec une identité managée attribuée par l’utilisateur.

Quand utiliser des modèles Azure Resource Manager pour une identité managée

Voici quelques recommandations permettant de déterminer quand utiliser des modèles Azure Resource Manager pour activer une identité managée sur des applications managées.

  • Les applications managées peuvent être déployées programmatiquement selon un modèle.
  • Des attributions de rôles personnalisées pour l’identité managée sont nécessaires pour approvisionner l’application managée.
  • L’application managée n’a pas besoin du flux de création du portail ni de la Place de marché Azure.

Modèle SystemAssigned

Modèle Azure Resource Manager de base qui déploie une application managée avec une identité managée attribuée par le système.

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

Modèle UserAssigned

Modèle Azure Resource Manager de base qui déploie une application managée avec une identité managée attribuée par l’utilisateur.

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

Octroi de l’accès aux ressources Azure

Lorsqu’une identité a été octroyée à une application managée, l’accès aux ressources Azure existantes peut lui être octroyé par la création d’une attribution de rôle.

Pour ce faire, recherchez et sélectionnez le nom de l’application managée ou l’identité managée attribuée par l’utilisateur, puis sélectionnez Contrôle d’accès (IAM). Pour connaître les étapes détaillées, consultez Attribuer des rôles Azure à l’aide du portail Azure.

Liaison des ressources Azure existantes

Notes

Une identité managée attribuée par l’utilisateur doit être configurée avant le déploiement de l’application managée. De plus, le déploiement des ressources liées des applications managées est uniquement pris en charge pour le type Place de marché.

L’identité managée peut également être utilisée pour déployer une application managée qui nécessite un accès à des ressources existantes lors de son déploiement. Quand le client approvisionne l’application managée, des identités managées attribuées par l’utilisateur peuvent être ajoutées pour fournir des autorisations supplémentaires au déploiement de mainTemplate.

Création de createUiDefinition avec une ressource liée

Lorsque vous liez le déploiement de l’application managée à des ressources existantes, la ressource Azure existante et une identité managée affectée par l’utilisateur avec l’attribution de rôle applicable à cette ressource doivent toutes deux être fournies.

Exemple de fichier createUiDefinition.jsonqui nécessite deux entrées : un ID de ressource d’interface réseau et un ID de ressource d’identité managée attribuée par l’utilisateur.

{
  "$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),':{}}}'))]"
    }
  }
}

Ce fichier createUiDefinition.json génère une expérience de création d’utilisateur qui comporte deux champs. Le premier champ permet à l’utilisateur d’entrer l’ID de ressource Azure pour la ressource liée au déploiement de l’application managée. Le deuxième champ permet à un contrôle serveur consommateur d’entrer l’ID de ressource Azure de l’identité managée attribuée par l’utilisateur, qui a accès à la ressource Azure liée. L’expérience générée peut se présenter comme suit :

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

Création de mainTemplate avec une ressource liée

En plus de la mise à jour de createUiDefinition, le modèle principal doit également être mis à jour pour accepter l’ID de ressource liée transmis. Le modèle principal peut être mis à jour pour accepter la nouvelle sortie en ajoutant un nouveau paramètre. Dans la mesure où la sortie managedIdentity remplace la valeur sur le modèle d’application managée généré, elle n’est pas transmise au modèle principal et ne doit pas être incluse dans la section des paramètres.

Exemple de modèle principal qui définit le profil réseau sur une interface réseau existante fournie par le fichier 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')]"
            }
          ]
        }
      }
    }
  ]
}

Utilisation de l’application managée avec une ressource liée

Une fois le package d’application managée créé, l’application managée peut être utilisée via le portail Azure. Avant de pouvoir être utilisée, plusieurs étapes préalables doivent être suivies.

  • Une instance de la ressource Azure liée requise doit être créée.
  • L’identité managée attribuée par l’utilisateur doit être créée et se voir attribuer des rôles sur la ressource liée.
  • L’ID de la ressource liée existante et l’ID de l’identité managée attribuée par l’utilisateur sont fournis à createUiDefinition.

Accès au jeton de l’identité managée

Le jeton de l’application managée est désormais accessible via l’listTokensapi du locataire de l’éditeur. Voici un exemple de demande :

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

Paramètres du corps de la demande :

Paramètre Obligatoire Description
authorizationAudience non URI ID d’application de la ressource cible. Il s’agit également de la revendication aud (audience) du jeton émis. La valeur par défaut est « https://management.azure.com/" ».
userAssignedIdentities non Liste des identités managées attribuées par l’utilisateur pour lesquelles récupérer un jeton. Si ce paramètre n’est pas spécifié, listTokens retourne le jeton pour l’identité managée attribuée par le système.

Voici un exemple de réponse :

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 réponse contient un tableau de jetons sous la propriété value :

Paramètre Description
access_token Le jeton d’accès demandé.
expires_in Nombre de secondes pendant lesquelles le jeton d’accès est valide.
expires_on L’intervalle de temps lorsque le jeton d’accès expire. Cette valeur est exprimée en nombre de secondes depuis l’epoch.
not_before Intervalle de temps pendant lequel le jeton d’accès prend effet. Cette valeur est exprimée en nombre de secondes depuis l’epoch.
authorizationAudience Valeur aud (audience) pour laquelle le jeton d’accès a été demandé. Cette valeur est la même valeur que celle fournie par la requête listTokens.
resourceId ID de ressource Azure pour le jeton émis. Cette valeur est celle de l’ID de l’application managée ou de l’ID de l’identité managée attribuée par l’utilisateur.
token_type Type du jeton.

Étapes suivantes