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