Esercitazione: Creare un'app per le funzioni che si connette ai servizi di Azure usando identità anziché segreti
Questa esercitazione illustra come configurare un'app per le funzioni usando identità di Microsoft Entra anziché segreti o stringhe di connessione, laddove possibile. L'uso delle identità consente di evitare la perdita accidentale di segreti sensibili e di offrire una migliore visibilità sul modo in cui si accede ai dati. Per altre informazioni sulle connessioni basate sull'identità, vedere Configurare una connessione basata su identità.
Anche se le procedure illustrate funzionano in genere per tutti i linguaggi, questa esercitazione supporta attualmente le funzioni della libreria di classi C# in Windows in modo specifico.
In questa esercitazione apprenderai a:
- Creare un'app per le funzioni in Azure usando un modello di Resource Manager
- Abilitare le identità gestite assegnate dal sistema e quelle assegnate dall'utente
- Creare assegnazioni di ruolo che concedono autorizzazioni ad altre risorse
- Spostare i segreti che non possono essere sostituiti con identità in Azure Key Vault
- Configurare un'app per connettersi all'archiviazione host predefinito usando l'identità gestita
Dopo aver completato questa esercitazione, è necessario completare l'esercitazione seguente che illustra come usare le connessioni basate su identità anziché i segreti con trigger e associazioni.
Prerequisiti
Un account Azure con una sottoscrizione attiva. Creare un account gratuitamente.
Azure Functions Core Tools versione 4.x.
Perché usare l'identità?
La gestione di segreti e credenziali è una sfida comune per i team di tutte le dimensioni. I segreti devono essere protetti dal furto o dalla divulgazione accidentale e potrebbero dover essere spostati periodicamente. Molti servizi di Azure consentono invece di usare un'identità in Microsoft Entra ID per autenticare i client e verificare le autorizzazioni, che possono essere modificate e revocate rapidamente. In questo modo è possibile avere un maggiore controllo sulla sicurezza delle applicazioni con un sovraccarico operativo inferiore. Un'identità può essere un utente umano, ad esempio lo sviluppatore di un'applicazione o un'applicazione in esecuzione in Azure con un'identità gestita.
Poiché alcuni servizi non supportano l'autenticazione di Microsoft Entra, le applicazioni potrebbero comunque richiedere segreti in determinati casi. Tuttavia, questi segreti possono essere archiviati in Azure Key Vault, che semplifica il ciclo di vita di gestione per i segreti. L'accesso a un insieme di credenziali delle chiavi è controllato anche con le identità.
Comprendere come usare le identità anziché i segreti quando è possibile e usare Key Vault quando non è possibile, riduce il rischio, il sovraccarico operativo e, in genere, migliora la postura di sicurezza per le applicazioni.
Creare un'app per le funzioni che usa Key Vault per i segreti necessari
File di Azure è un esempio di servizio che non supporta ancora l'autenticazione di Microsoft Entra per le condivisioni file SMB (Server Message Block). File di Azure è il file system predefinito per le distribuzioni di Windows nei piani Premium e A consumo. Anche se è possibile rimuovere completamente File di Azure, in questo modo vengono introdotte limitazioni che potrebbero non essere desiderate. Si sposta invece la stringa di connessione File di Azure in Azure Key Vault. In questo modo viene gestita centralmente, con l'accesso controllato dall'identità.
Creare un Azure Key Vault
In primo luogo, è necessario un insieme di credenziali delle chiavi per archiviare i segreti. Configurarlo per l'uso del controllo degli accessi in base al ruolo di Azure per determinare chi può leggere i segreti dall'insieme di credenziali.
Nel portale di Azure scegliere Crea una risorsa (+).
Nella pagina Crea una risorsa selezionare Sicurezza>Insieme di credenziali delle chiavi.
Nella pagina Dati principali usare la tabella seguente per configurare l'insieme di credenziali delle chiavi.
Opzione Valore suggerito Descrizione Abbonamento Sottoscrizione in uso Sottoscrizione in cui viene creata questa nuova app per le funzioni. Gruppo di risorse myResourceGroup Il nome del nuovo gruppo di risorse in cui viene creata l'app per le funzioni. Nome dell'insieme di credenziali delle chiavi Nome globalmente univoco Nome che identifica il nuovo insieme di credenziali delle chiavi. Il nome dell'insieme di credenziali deve contenere solo caratteri alfanumerici e trattini e non può iniziare con un numero. Piano tariffario Standard Opzioni per la fatturazione. Il livello standard è sufficiente per l'esercitazione. Area Area preferita Scegliere un'area nelle vicinanze o vicino ad altri servizi a cui accedono le funzioni. Usare le selezioni predefinite per le sezioni "Opzioni di ripristino".
Prendere nota del nome usato per poterlo usare in un secondo momento.
Selezionare Avanti: Criteri di accesso per passare alla scheda Criteri di accesso.
In Modello di autorizzazione scegliere Controllo degli accessi in base al ruolo di Azure
Selezionare Rivedi e crea. Controllare la configurazione e quindi selezionare Crea.
Configurare un'identità e le autorizzazioni per l'app
Per usare Azure Key Vault, l'app deve avere un'identità a cui è possibile concedere l'autorizzazione per leggere i segreti. Questa app usa un'identità assegnata dall'utente in modo che le autorizzazioni possano essere configurate prima della creazione dell'app. Per altre informazioni sulle identità gestite per Funzioni di Azure, vedere Come usare le identità gestite in Funzioni di Azure.
Nel portale di Azure scegliere Crea una risorsa (+).
Nella pagina Crea una risorsa selezionare Identità>Identità gestita assegnata dall'utente.
Nella pagina Dati principali usare la tabella seguente per configurare l'identità.
Opzione Valore suggerito Descrizione Abbonamento Sottoscrizione in uso Sottoscrizione in cui viene creata questa nuova app per le funzioni. Gruppo di risorse myResourceGroup Il nome del nuovo gruppo di risorse in cui viene creata l'app per le funzioni. Area Area preferita Scegliere un'area nelle vicinanze o vicino ad altri servizi a cui accedono le funzioni. Nome Nome globalmente univoco Nome che identifica la nuova identità assegnata dall'utente. Selezionare Rivedi e crea. Controllare la configurazione e quindi selezionare Crea.
Quando viene creata l'identità, aprirla nel portale. Selezionare Proprietàe prendere nota dell'ID della risorsa da usare in un secondo momento.
Selezionare Assegnazioni di ruolo di Azure, quindi Aggiungi assegnazione di ruolo (anteprima).
Nella pagina Aggiungi assegnazione di ruolo (anteprima) usare le opzioni come illustrato nella tabella seguente.
Opzione Valore suggerito Descrizione Scope Key Vault L'ambito è un set di risorse a cui si applica l'assegnazione di ruolo. L'ambito ha livelli ereditati a livelli inferiori. Ad esempio, se si seleziona un ambito di sottoscrizione, l'assegnazione di ruolo si applica a tutti i gruppi di risorse e le risorse nella sottoscrizione. Abbonamento Sottoscrizione in uso Sottoscrizione in cui viene creata questa nuova app per le funzioni. Conto risorse Il tuo insieme di credenziali delle chiavi Nome dell'insieme di credenziali delle chiavi creato in precedenza. Ruolo Utente dei segreti di Key Vault Un ruolo è una raccolta di autorizzazioni che vengono concesse. L'utente dei segreti di Key Vault concede all'identità l'autorizzazione per leggere i valori dei segreti dall'insieme di credenziali. Seleziona Salva. La visualizzazione del ruolo potrebbe richiedere un minuto o due quando si aggiorna l'elenco delle assegnazioni di ruolo per l'identità.
L'identità è ora in grado di leggere i segreti archiviati nell'insieme di credenziali delle chiavi. Più avanti nell'esercitazione si aggiungono altre assegnazioni di ruolo per scopi diversi.
Generare un modello per la creazione di un'app per le funzioni
Poiché l'esperienza del portale per la creazione di un'app per le funzioni non interagisce con Azure Key Vault, è necessario generare e modificare un modello di Azure Resource Manager. È quindi possibile usare questo modello per creare l'app per le funzioni che fa riferimento alla stringa di connessione File di Azure dall'insieme di credenziali delle chiavi.
Importante
Non creare l'app per le funzioni fino a quando non si modifica il modello di Resource Manager. La configurazione di File di Azure deve essere eseguita al momento della creazione dell'app.
Nel portale di Azure scegliere Crea una risorsa (+).
Nella pagina Crea una risorsa selezionare Calcolo>App per le funzioni.
Nella pagina Dati principali usare la tabella seguente per configurare l'app per le funzioni.
Opzione Valore suggerito Descrizione Abbonamento Sottoscrizione in uso Sottoscrizione in cui viene creata questa nuova app per le funzioni. Gruppo di risorse myResourceGroup Il nome del nuovo gruppo di risorse in cui viene creata l'app per le funzioni. Nome dell'app per le funzioni Nome globalmente univoco Nome che identifica la nuova app per le funzioni. I caratteri validi sono a-z
(senza distinzione tra maiuscole e minuscole),0-9
e-
.Pubblicazione Codice Scegliere di pubblicare file di codice o un contenitore Docker. Stack di runtime .NET In questa esercitazione viene usato .NET. Area Area preferita Scegliere un'area nelle vicinanze o vicino ad altri servizi a cui accedono le funzioni. Selezionare Rivedi e crea. L'app usa i valori predefiniti nella pagina Hosting e Monitoraggio. Esaminare le opzioni predefinite, incluse nel modello di Resource Manager generato.
Anziché creare l'app per le funzioni qui, scegliere Scaricare un modello per l'automazione a destra del pulsante Avanti.
Nella pagina del modello selezionare Distribuisci, quindi nella pagina Distribuzione personalizzata selezionare Modifica modello.
Modificare il modello
È ora possibile modificare il modello per archiviare la stringa di connessione File di Azure in Key Vault e consentire all'app per le funzioni di farvi riferimento. Prima di procedere, assicurarsi di avere i valori seguenti delle sezioni precedenti:
- L'ID della risorsa dell'identità assegnata dall'utente
- il nome dell'istanza di Key Vault
Nota
Se si desidera creare un modello completo per l'automazione, è consigliabile includere definizioni per le risorse di assegnazione di identità e ruolo, con le clausole dependsOn
appropriate. In questo modo verranno sostituiti i passaggi precedenti usati dal portale. Consultare il materiale sussidiario Azure Resource Manager e la documentazione per ogni servizio.
Nell'editor trovare dove inizia la matrice
resources
. Prima della definizione dell'app per le funzioni, aggiungere la sezione seguente, che inserisce la stringa di connessione File di Azure in Key Vault. Sostituire "VAULT_NAME" con il nome dell'insieme di credenziali delle chiavi.{ "type": "Microsoft.KeyVault/vaults/secrets", "apiVersion": "2016-10-01", "name": "VAULT_NAME/azurefilesconnectionstring", "properties": { "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('storageAccountName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2019-06-01').keys[0].value,';EndpointSuffix=','core.windows.net')]" }, "dependsOn": [ "[concat('Microsoft.Storage/storageAccounts/', parameters('storageAccountName'))]" ] },
Nella definizione per la risorsa dell'app per le funzioni (che ha
type
impostato suMicrosoft.Web/sites
), aggiungereMicrosoft.KeyVault/vaults/VAULT_NAME/secrets/azurefilesconnectionstring
alla matricedependsOn
. Sostituire di nuovo "VAULT_NAME" con il nome dell'insieme di credenziali delle chiavi. In questo modo si impedisce la creazione dell'app prima della definizione del segreto. La matricedependsOn
dovrebbe essere simile alla seguente:{ "type": "Microsoft.Web/sites", "apiVersion": "2018-11-01", "name": "[parameters('name')]", "location": "[parameters('location')]", "tags": null, "dependsOn": [ "microsoft.insights/components/idcxntut", "Microsoft.KeyVault/vaults/VAULT_NAME/secrets/azurefilesconnectionstring", "[concat('Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]", "[concat('Microsoft.Storage/storageAccounts/', parameters('storageAccountName'))]" ], // ... }
Aggiungere il blocco
identity
dall'esempio seguente nella definizione per la risorsa dell'app per le funzioni. Sostituire "IDENTITY_RESOURCE_ID" per l'ID della risorsa dell'identità assegnata dall'utente.{ "apiVersion": "2018-11-01", "name": "[parameters('name')]", "type": "Microsoft.Web/sites", "kind": "functionapp", "location": "[parameters('location')]", "identity": { "type": "SystemAssigned,UserAssigned", "userAssignedIdentities": { "IDENTITY_RESOURCE_ID": {} } }, "tags": null, // ... }
Questo blocco
identity
configura anche un'identità assegnata dal sistema, che verrà usata più avanti in questa esercitazione.Aggiungere la proprietà
keyVaultReferenceIdentity
all'oggettoproperties
per l'app per le funzioni, come nell'esempio seguente. Sostituire "IDENTITY_RESOURCE_ID" per l'ID della risorsa dell'identità assegnata dall'utente.{ // ... "properties": { "name": "[parameters('name')]", "keyVaultReferenceIdentity": "IDENTITY_RESOURCE_ID", // ... } }
Questa configurazione è necessaria perché un'app potrebbe avere più identità assegnate dall'utente configurate. Ogni volta che si vuole usare un'identità assegnata dall'utente, è necessario specificarla con un ID. Le identità assegnate dal sistema non devono essere specificate in questo modo, perché un'app può avere una sola identità. Molte funzionalità che usano l'identità gestita presuppongono che debbano usare quella assegnata dal sistema per impostazione predefinita.
Trovare gli oggetti JSON che definiscono l'impostazione dell'applicazione
WEBSITE_CONTENTAZUREFILECONNECTIONSTRING
, che dovrebbe essere simile all'esempio seguente:{ "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING", "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('storageAccountName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageAccountName')), '2019-06-01').keys[0].value,';EndpointSuffix=','core.windows.net')]" },
Sostituire il campo
value
con un riferimento al segreto, come illustrato nell'esempio seguente. Sostituire "VAULT_NAME" con il nome dell'insieme di credenziali delle chiavi.{ "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING", "value": "[concat('@Microsoft.KeyVault(SecretUri=', reference(resourceId('Microsoft.KeyVault/vaults/secrets', 'VAULT_NAME', 'azurefilesconnectionstring')).secretUri, ')')]" },
Selezionare Salva per salvare il modello di ARM aggiornato.
Distribuire il modello modificato
Assicurarsi che le opzioni di creazione, tra cui Gruppo di risorse, siano ancora corrette e selezionare Rivedi e crea.
Dopo la convalida del modello, prendere nota del Nome dell'account di archiviazione, perché questo account verrà usato in un secondo momento. Infine, selezionare Crea per creare le risorse di Azure e distribuire il codice nell'app per le funzioni.
Al termine della distribuzione, selezionare Vai al gruppo di risorse e quindi selezionare la nuova app per le funzioni.
Complimenti. L'app per le funzioni è stata creata correttamente per fare riferimento alla stringa di connessione File di Azure da Azure Key Vault.
Ogni volta che l'app deve aggiungere un riferimento a un segreto, è sufficiente definire una nuova impostazione dell'applicazione che punta al valore archiviato in Key Vault. Per altre informazioni, vedere Riferimenti a Key Vault per Funzioni di Azure.
Suggerimento
La stringa di connessione di Application Insights e la relativa chiave di strumentazione inclusa non sono considerate segreti e possono essere recuperate da App Insights usando le autorizzazioni di Lettore. Non è necessario spostarli in Key Vault, anche se è certamente possibile.
Usare l'identità gestita per AzureWebJobsStorage
Successivamente, si usa l'identità assegnata dal sistema configurata nei passaggi precedenti per la connessione AzureWebJobsStorage
. AzureWebJobsStorage
viene usato dal runtime di Funzioni e da diversi trigger e associazioni per coordinare più istanze in esecuzione. È necessario che l'app per le funzioni sia eseguibile e che, come File di Azure, sia configurata con una stringa di connessione per impostazione predefinita quando si crea una nuova app per le funzioni.
Concedere all'identità gestita assegnata dal sistema l'accesso all'account di archiviazione
Analogamente ai passaggi seguiti in precedenza con l'identità assegnata dall'utente e l'insieme di credenziali delle chiavi, si crea ora un'assegnazione di ruolo che concede all'identità assegnata dal sistema l'accesso all'account di archiviazione.
Nel portale di Azure passare all'account di archiviazione creato in precedenza con l'app per le funzioni.
Seleziona Controllo di accesso (IAM). Questa pagina consente di visualizzare e configurare chi può accedere alla risorsa.
Selezionare Aggiungi e selezionare Aggiungi assegnazione di ruolo.
Cercare Proprietario dei dati BLOB di archiviazione, selezionarlo e selezionare Avanti
Nella scheda Membri trovare Assegna l'accesso a e scegliere l'opzione Identità gestita
Selezionare Seleziona i membri per aprire il pannello Seleziona le identità gestite.
Verificare che la Sottoscrizione sia quella in cui sono state create le risorse in precedenza.
Nel selettore Identità gestita scegliere App per le funzioni nella categoria Identità gestita assegnata dal sistema. L'etichetta App per le funzioni potrebbe avere un numero tra parentesi accanto, che indica il numero di app nella sottoscrizione con identità assegnate dal sistema.
L'app dovrebbe essere visualizzata in un elenco sotto i campi di input. Se non viene visualizzata, puoi usare la casella Seleziona per filtrare i risultati con il nome dell'app.
Selezionare l'applicazione. Verrà spostato verso il basso nella sezione Membri selezionati. Scegli Seleziona.
Selezionare Rivedi e assegna nella schermata Aggiungi assegnazione di ruolo. Rivedere la configurazione, quindi selezionare Rivedi e assegna.
Suggerimento
Se si intende usare l'app per le funzioni per una funzione attivata da BLOB, è necessario ripetere questi passaggi per i ruoli Collaboratore account di archiviazione e Collaboratore ai dati della coda di archiviazione sull'account usato da AzureWebJobsStorage. Per altre informazioni, vedere Connessioni basate sull'identità trigger BLOB.
Modificare la configurazione di AzureWebJobsStorage
Aggiornare l'app per le funzioni per usare l'identità assegnata dal sistema quando usa il servizio BLOB per l'archiviazione host.
Importante
La configurazione AzureWebJobsStorage
viene usata da alcuni trigger e associazioni e queste estensioni devono essere in grado di usare anche connessioni basate su identità. Le app che usano trigger BLOB o trigger dell'hub eventi potrebbero dover aggiornare tali estensioni. Poiché non sono state definite funzioni per questa app, non esiste ancora un problema. Per altre informazioni su questo requisito, vedere Connessione all'archiviazione host con un'identità.
Analogamente, AzureWebJobsStorage
viene usato per gli artefatti di distribuzione quando si usa la compilazione lato server a consumo per Linux. Quando si abilitano le connessioni basate sull'identità per AzureWebJobsStorage
a consumo per Linux, sarà necessario eseguire la distribuzione tramite un pacchetto di distribuzione esterno.
Nel portale di Azure passare all'app per le funzioni.
Nell'app per le funzioni, espandere Impostazionie selezionare Variabili di ambiente.
Nella scheda Impostazioni dell'app selezionare l'impostazione AzureWebJobsStorage e modificarla in base alla tabella seguente:
Opzione Valore suggerito Description Nome AzureWebJobsStorage__accountName Modificare il nome da AzureWebJobsStorage al nome esatto AzureWebJobsStorage__accountName
. Questa impostazione indica all'host di usare l'identità anziché cercare un segreto archiviato. La nuova impostazione usa un doppio carattere di sottolineatura (__
), che è un carattere speciale nelle impostazioni dell'applicazione.valore Nome dell'account Aggiornare il nome dalla stringa di connessione al StorageAccountName. Questa configurazione indica al sistema di usare un'identità per connettersi alla risorsa.
Selezionare Applica, quindi Applica e Conferma per salvare l'impostazione e riavviare l'app per le funzioni.
È stato rimosso il requisito della stringa di connessione di archiviazione per AzureWebJobsStorage configurando l'app per connettersi ai BLOB usando identità gestite.
Nota
La sintassi __accountName
è univoca per la connessione AzureWebJobsStorage e non può essere usata per altre connessioni di archiviazione. Per informazioni su come definire altre connessioni, controllare i riferimenti per ogni trigger e associazione usati dall'app.
Passaggi successivi
Questa esercitazione ha illustrato come creare un'app per le funzioni senza archiviare segreti nella sua configurazione.
Passare all'esercitazione successiva per informazioni su come usare le identità nelle connessioni di trigger e di associazione.