Applicazione gestita di Azure con identità gestita

Nota

Il supporto delle identità gestite per le applicazioni gestite di Azure è attualmente in anteprima. Usare la versione api 2018-09-01-preview per usare l'identità gestita.

Informazioni su come configurare un'applicazione gestita per contenere un'identità gestita. È possibile usare un'identità gestita per consentire al cliente di concedere all'applicazione gestita l'accesso alle risorse esistenti. La piattaforma Azure gestisce l'identità e non richiede il provisioning o la rotazione di segreti. Per altre informazioni sulle identità gestite in Microsoft Entra ID, vedere Identità gestite per le risorse di Azure.

All'applicazione possono essere concessi due tipi di identità:

  • Un'identità gestita assegnata dal sistema è associata all'applicazione e viene eliminata se l'app viene eliminata. Un'app può avere solo un'identità gestita assegnata dal sistema.
  • Un'identità gestita assegnata dall'utente è una risorsa di Azure autonoma che può essere assegnata all'app. Un'app può avere più identità gestite assegnate dall'utente.

Come usare l'identità gestita

L'identità gestita consente molti scenari per le applicazioni gestite. Alcuni scenari comuni che possono essere risolti sono:

  • Distribuzione di un'applicazione gestita collegata alle risorse di Azure esistenti. Un esempio è la distribuzione di una macchina virtuale (VM) di Azure all'interno dell'applicazione gestita collegata a un'interfaccia di rete esistente.
  • Concessione dell'applicazione gestita e dell'autore all'accesso alle risorse di Azure all'esterno del gruppo di risorse gestite.
  • Fornire un'identità operativa delle applicazioni gestite per il log attività e altri servizi all'interno di Azure.

Aggiunta di un'identità gestita

La creazione di un'applicazione gestita con un'identità gestita richiede l'impostazione di un'altra proprietà nella risorsa di Azure. L'esempio seguente mostra una proprietà identity di esempio:

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

Esistono due modi comuni per creare un'applicazione gestita con identity: createUiDefinition.json e modelli di Azure Resource Manager. Per scenari di creazione singola semplici, è consigliabile usare createUiDefinition per abilitare l'identità gestita, perché offre un'esperienza più completa. Tuttavia, quando si gestiscono sistemi avanzati o complessi che richiedono distribuzioni automatizzate o più applicazioni gestite, è possibile usare i modelli.

Uso di createUiDefinition

Un'applicazione gestita può essere configurata con l'identità gestita tramite createUiDefinition.json. Nella sezione output è possibile usare la chiave managedIdentity per eseguire l'override della proprietà Identity del modello di applicazione gestita. L'esempio seguente abilita un'identità gestita assegnata dal sistema nell'applicazione gestita. È possibile creare oggetti Identity più complessi usando gli elementi createUiDefinition per richiedere input al consumer. Questi input possono essere usati per costruire applicazioni gestite con identità gestita assegnata dall'utente.

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

Quando usare createUiDefinition per l'identità gestita

Di seguito sono riportati alcuni consigli su quando usare createUiDefinition per abilitare un'identità gestita nelle applicazioni gestite.

  • La creazione dell'applicazione gestita passa attraverso il portale di Azure o Azure Marketplace.
  • L'identità gestita richiede un input consumer complesso.
  • L'identità gestita è necessaria alla creazione dell'applicazione gestita.

Controllo Di identità gestita createUiDefinition

CreateUiDefinition.json supporta un controllo identità gestito predefinito.

{
  "$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 di modelli di Azure Resource Manager

Nota

I modelli di applicazione gestiti dal Marketplace vengono generati automaticamente per i clienti che passano attraverso l'esperienza di creazione portale di Azure. Per questi scenari, è necessario usare la managedIdentity chiave di output in createUiDefinition per abilitare l'identità.

L'identità gestita può essere abilitata anche tramite i modelli di Azure Resource Manager. L'esempio seguente abilita un'identità gestita assegnata dal sistema nell'applicazione gestita. È possibile creare oggetti Identity più complessi usando i parametri del modello di Azure Resource Manager per fornire input. Questi input possono essere usati per costruire applicazioni gestite con identità gestita assegnata dall'utente.

Quando usare i modelli di Azure Resource Manager per l'identità gestita

Di seguito sono riportati alcuni consigli su quando usare i modelli di Azure Resource Manager per abilitare l'identità gestita nelle applicazioni gestite.

  • Le applicazioni gestite possono essere distribuite a livello di codice in base a un modello.
  • Per effettuare il provisioning dell'applicazione gestita sono necessarie assegnazioni di ruolo personalizzate per l'identità gestita.
  • L'applicazione gestita non richiede il flusso di creazione di portale di Azure e Marketplace.

Modello SystemAssigned

Modello di Azure Resource Manager di base che distribuisce un'applicazione gestita con identità gestita assegnata dal 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": { }
    }
  }
]

Modello UserAssigned

Modello di Azure Resource Manager di base che distribuisce un'applicazione gestita con un'identità gestita assegnata dall'utente.

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

Concessione dell'accesso alle risorse di Azure

Una volta concessa un'identità a un'applicazione gestita, è possibile concedere l'accesso alle risorse di Azure esistenti creando un'assegnazione di ruolo.

A tale scopo, cercare e selezionare il nome dell'applicazione gestita o dell'identità gestita assegnata dall'utente e quindi selezionare Controllo di accesso (IAM). Per la procedura dettagliata, vedere Assegnare ruoli di Azure usando il portale di Azure.

Collegamento di risorse di Azure esistenti

Nota

Prima di distribuire l'applicazione gestita, è necessario configurare un'identità gestita assegnata dall'utente. Inoltre, la distribuzione di risorse collegate delle applicazioni gestite è supportata solo per il tipo marketplace .

L'identità gestita può essere usata anche per distribuire un'applicazione gestita che richiede l'accesso alle risorse esistenti durante la distribuzione. Quando il cliente effettua il provisioning dell'applicazione gestita, è possibile aggiungere identità gestite assegnate dall'utente per fornire più autorizzazioni alla distribuzione mainTemplate .

Creazione di createUiDefinition con una risorsa collegata

Quando si collega la distribuzione dell'applicazione gestita alle risorse esistenti, è necessario fornire sia la risorsa di Azure esistente che un'identità gestita assegnata dall'utente con l'assegnazione di ruolo applicabile per tale risorsa.

Esempio di createUiDefinition.json che richiede due input: un ID risorsa dell'interfaccia di rete e un ID risorsa identità gestita assegnata dall'utente.

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

Questo createUiDefinition.json genera un'esperienza utente di creazione con due campi. Il primo campo consente all'utente di immettere l'ID risorsa di Azure per la risorsa collegata alla distribuzione dell'applicazione gestita. Il secondo consiste nell'immettere l'ID risorsa di Azure dell'identità gestita assegnata dall'utente, che ha accesso alla risorsa di Azure collegata. L'esperienza generata sarà simile alla seguente:

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

Creazione del mainTemplate con una risorsa collegata

Oltre ad aggiornare createUiDefinition, è necessario aggiornare anche il modello principale per accettare l'ID risorsa collegato passato. Il modello principale può essere aggiornato per accettare il nuovo output aggiungendo un nuovo parametro. Poiché l'output esegue l'override managedIdentity del valore nel modello di applicazione gestita generato, non viene passato al modello principale e non deve essere incluso nella sezione parametri.

Modello principale di esempio che imposta il profilo di rete su un'interfaccia di rete esistente fornita da 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')]"
            }
          ]
        }
      }
    }
  ]
}

Utilizzo dell'applicazione gestita con una risorsa collegata

Dopo aver creato il pacchetto dell'applicazione gestita, l'applicazione gestita può essere usata tramite il portale di Azure. Prima di poter essere utilizzata, esistono diversi passaggi prerequisiti.

  • È necessario creare un'istanza della risorsa di Azure collegata richiesta.
  • L'identità gestita assegnata dall'utente deve essere creata e assegnata a assegnazioni di ruolo alla risorsa collegata.
  • L'ID risorsa collegato esistente e l'ID identità gestita assegnata dall'utente vengono forniti a createUiDefinition.

Accesso al token di identità gestita

È ora possibile accedere al token dell'applicazione gestita tramite l'API listTokens dal tenant del server di pubblicazione. Una richiesta di esempio potrebbe essere simile alla seguente:

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

Parametri del corpo della richiesta:

Parametro Richiesto Descrizione
authorizationAudience no URI ID app della risorsa di destinazione. È anche l'attestazione aud (gruppo di destinatari) del token rilasciato. Il valore predefinito è "https://management.azure.com/"
userAssignedIdentities no Elenco di identità gestite assegnate dall'utente per cui recuperare un token. Se non specificato, listTokens restituisce il token per l'identità gestita assegnata dal sistema.

Una risposta di esempio potrebbe essere simile alla seguente:

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 risposta contiene una matrice di token nella value proprietà :

Parametro Descrizione
access_token Token di accesso richiesto.
expires_in Numero di secondi in cui il token di accesso è valido.
expires_on Intervallo di tempo in cui il token di accesso scade. Questo valore è rappresentato come numero di secondi dall'epoca.
not_before Intervallo di tempo in cui il token di accesso diventa effettivo. Questo valore è rappresentato come numero di secondi dall'epoca.
authorizationAudience Il aud (gruppo di destinatari) per cui è stato richiesto il token di accesso. Questo valore è uguale a quello fornito nella listTokens richiesta.
resourceId ID risorsa di Azure per il token rilasciato. Questo valore è l'ID applicazione gestita o l'ID identità gestita assegnata dall'utente.
token_type Tipo di token.

Passaggi successivi