Applicazione gestita di Azure con identità gestita

Nota

Il supporto delle identità gestite per Applicazioni gestite di Azure è attualmente disponibile in anteprima. Usare la versione dell'API 2018-09-01-preview per usare l'identità gestita.

Informazioni su come configurare un'applicazione gestita in modo che contenga un'identità gestita. È possibile usare un'identità gestita per consentire al cliente di concedere all'applicazione gestita l'accesso alle risorse esistenti. La piattaforma di 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 viene associata all'applicazione e viene eliminata in caso di eliminazione dell'app. A un'app può essere associata una sola 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 di Azure all'interno dell'applicazione gestita collegata a un'interfaccia di rete esistente.
  • Concessione dell'accesso alle risorse di Azure all'applicazione gestita e all'autore all'esterno del gruppo di risorse gestite.
  • Possibilità di 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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/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ù distribuzioni di applicazioni gestite, è possibile usare i modelli.

Uso di createUiDefinition

Un'applicazione gestita può essere configurata con l'identità gestita tramite createUiDefinition.json. Nella sezione outputs la chiave managedIdentity può essere usata 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 elementi di 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 createUiDefinition dell'identità gestita

Il file createUiDefinition.json supporta un controllo delle identità gestite 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 delle impostazioni dell'applicazione per l'identità gestita assegnata dal sistema e l'identità gestita assegnata dall'utente

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 del portale di Azure. Per questi scenari la chiave di output managedIdentity in createUiDefinition deve essere usata 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 del portale di Azure e del 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 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

Dopo avere concesso 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, 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

Un'identità gestita assegnata dall'utente deve essere configurata prima della distribuzione dell'applicazione gestita. 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 altre 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.

File createUiDefinition.json di esempio 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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/testRG/providers/Microsoft.Network/networkInterfaces/existingnetworkinterface",
            "toolTip": "Must represent the identity as an Azure Resource Manager resource identifier 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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/testRG/providers/Microsoft.ManagedIdentity/userassignedidentites/myuserassignedidentity",
            "toolTip": "Must represent the identity as an Azure Resource Manager resource identifier 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 file 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 consente al consumer di '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 di un file createUiDefinition.json di esempio con due input: un ID risorsa dell'interfaccia di rete e un ID risorsa dell'identità gestita assegnata dall'utente.

Creazione di 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 managedIdentity esegue l'override del valore nel modello di applicazione gestita generato, non viene passato al modello principale e non deve essere incluso nella sezione parameters.

Modello principale di esempio che imposta il profilo di rete su un'interfaccia di rete esistente fornita dal file 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 la creazione del pacchetto dell'applicazione gestita, l'applicazione gestita può essere utilizzata tramite il portale di Azure. Prima che possa 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 con assegnazioni di ruolo per la risorsa collegata.
  • L'ID risorsa collegato esistente e l'ID dell'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 dell'ID app della risorsa di destinazione. Corrisponde anche all'attestazione aud (destinatari) del token emesso. 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 proprietà value:

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 dal periodo.
not_before Intervallo di tempo in cui il token di accesso viene applicato. Questo valore è rappresentato come numero di secondi dal periodo.
authorizationAudience aud (destinatari) per cui è stato richiesto il token di accesso. Questo valore è uguale a quello fornito nella richiesta listTokens.
resourceId ID risorsa di Azure per il token rilasciato. Questo valore è l'ID dell'applicazione gestita o l'ID dell'identità gestita assegnata dall'utente.
token_type Tipo di token.

Passaggi successivi