Esercitazione: Usare Azure Key Vault con una macchina virtuale in .NET
Azure Key Vault facilita la protezione di segreti come le chiavi API, le stringhe di connessione di database necessarie per accedere alle applicazioni, i servizi e le risorse IT.
In questa esercitazione viene descritto come configurare un'applicazione console per leggere un segreto da Azure Key Vault. L'applicazione userà l'identità gestita della macchina virtuale per l'autenticazione con Key Vault.
L'esercitazione illustra come:
- Crea un gruppo di risorse.
- Creare un insieme di credenziali delle chiavi.
- Aggiungere un segreto all'insieme di credenziali delle chiavi.
- Recuperare un segreto dall'insieme di credenziali delle chiavi.
- Creare una macchina virtuale di Azure.
- Abilitare un'identità gestita per la macchina virtuale.
- Assegnare autorizzazioni per l'identità della macchina virtuale.
Prima di iniziare, leggere i concetti di base di Key Vault.
Se non hai una sottoscrizione di Azure, crea un account gratuito.
Prerequisiti
Per Windows, Mac e Linux:
- Git
- .NET Core 3.1 SDK o versione successiva.
- Interfaccia della riga di comando di Azure o Azure PowerShell
Creare le risorse e assegnare le autorizzazioni
Prima di iniziare a scrivere il codice, è necessario creare alcune risorse, inserire un segreto nell'insieme di credenziali delle chiavi e assegnare le autorizzazioni.
Accedere ad Azure
Per accedere ad Azure usando il comando seguente:
Creare un gruppo di risorse e un insieme di credenziali delle chiavi
In questo avvio rapido si usa un'istanza creata in precedenza di Azure Key Vault. È possibile creare un insieme di credenziali delle chiavi seguendo la procedura descritta negli argomenti di avvio rapido per l'interfaccia della riga di comando di Azure, Azure PowerShell o il portale di Azure.
In alternativa, è possibile eseguire i comandi dell'interfaccia della riga di comando di Azure o di Azure PowerShell.
Importante
Ogni insieme di credenziali delle chiavi deve avere un nome univoco. Negli esempi seguenti sostituire <your-unique-keyvault-name> con il nome dell'insieme di credenziali delle chiavi in uso.
az group create --name "myResourceGroup" -l "EastUS"
az keyvault create --name "<your-unique-keyvault-name>" -g "myResourceGroup" --enable-rbac-authorization
Popolare l'insieme di credenziali delle chiavi con un segreto
Creare un segreto denominato mySecret, con un valore Success!. Un segreto può essere una password, una stringa di connessione SQL o qualsiasi altra informazione che è necessario conservare in modo sicuro e rendere allo stesso tempo disponibile per l'applicazione.
Per aggiungere un segreto all'insieme di credenziali delle chiavi appena creato, usare il seguente comando:
az keyvault secret set --vault-name "<your-unique-keyvault-name>" --name "mySecret" --value "Success!"
Creare una macchina virtuale
Creare una macchina virtuale Windows o Linux con uno dei metodi seguenti:
Windows | Linux |
---|---|
Interfaccia della riga di comando di Azure | Interfaccia della riga di comando di Azure |
PowerShell | PowerShell |
Azure portal | Azure portal |
Assegnare un'identità alla macchina virtuale
Creare un'identità assegnata dal sistema per la macchina virtuale con il seguente esempio:
az vm identity assign --name <NameOfYourVirtualMachine> --resource-group <YourResourceGroupName>
Annotare l'identità assegnata dal sistema che viene visualizzata nel codice seguente. L'output del comando precedente sarà:
{
"systemAssignedIdentity": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"userAssignedIdentities": {}
}
Assegnare autorizzazioni per l'identità della macchina virtuale
Per concedere all'applicazione le autorizzazioni per l'insieme di credenziali delle chiavi tramite il controllo degli accessi in base al ruolo, assegnare un ruolo con il comando az role assignment create dell'interfaccia della riga di comando di Azure.
az role assignment create --role "Key Vault Secrets User" --assignee "<app-id>" --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<your-unique-keyvault-name>"
Sostituire <app-id>
, <subscription-id>
, <resource-group-name>
e <your-unique-keyvault-name>
con i valori effettivi. <app-id>
è l'ID applicazione (client) della propria applicazione registrata in Microsoft Entra.
Accedere alla macchina virtuale
Per accedere alla macchina virtuale, seguire le istruzioni riportate in Connettersi e accedere a una macchina virtuale Windows di Azure oppure Connettersi e accedere a una macchina virtuale Linux di Azure.
Impostare l'app console
Creare un'app console e installare i pacchetti necessari usando il comando dotnet
.
Installare .NET Core
Per installare .NET Core, visitare la pagina dei download di .NET.
Creare ed eseguire un'app .NET di esempio
Apri un prompt dei comandi.
È possibile stampare sulla console "Hello World" eseguendo i comandi seguenti:
dotnet new console -n keyvault-console-app
cd keyvault-console-app
dotnet run
Installare il pacchetto
Nella finestra della console installare la libreria client dei segreti di Azure Key Vault per .NET:
dotnet add package Azure.Security.KeyVault.Secrets
Per questo argomento di avvio rapido, è necessario installare il pacchetto di identità seguente per eseguire l'autenticazione con Azure Key Vault:
dotnet add package Azure.Identity
Modificare l'app console
Aprire il file Program.cs e aggiungere questi pacchetti:
using System;
using Azure.Core;
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
Aggiungere queste righe per aggiornare l'URI in modo che rispecchi il valore vaultUri
dell'insieme di credenziali delle chiavi. Il codice seguente usa 'DefaultAzureCredential()' per l'autenticazione all'insieme di credenziali delle chiavi, che usa il token dell'identità gestita dell'applicazione per l'autenticazione. Viene anche usato il backoff esponenziale per la ripetizione dei tentativi in caso di limitazione dell'insieme di credenziali delle chiavi.
class Program
{
static void Main(string[] args)
{
string secretName = "mySecret";
string keyVaultName = "<your-key-vault-name>";
var kvUri = "https://<your-key-vault-name>.vault.azure.net";
SecretClientOptions options = new SecretClientOptions()
{
Retry =
{
Delay= TimeSpan.FromSeconds(2),
MaxDelay = TimeSpan.FromSeconds(16),
MaxRetries = 5,
Mode = RetryMode.Exponential
}
};
var client = new SecretClient(new Uri(kvUri), new DefaultAzureCredential(),options);
Console.Write("Input the value of your secret > ");
string secretValue = Console.ReadLine();
Console.Write("Creating a secret in " + keyVaultName + " called '" + secretName + "' with the value '" + secretValue + "' ...");
client.SetSecret(secretName, secretValue);
Console.WriteLine(" done.");
Console.WriteLine("Forgetting your secret.");
secretValue = "";
Console.WriteLine("Your secret is '" + secretValue + "'.");
Console.WriteLine("Retrieving your secret from " + keyVaultName + ".");
KeyVaultSecret secret = client.GetSecret(secretName);
Console.WriteLine("Your secret is '" + secret.Value + "'.");
Console.Write("Deleting your secret from " + keyVaultName + " ...");
client.StartDeleteSecret(secretName);
System.Threading.Thread.Sleep(5000);
Console.WriteLine(" done.");
}
}
Pulire le risorse
Quando non servono più, è possibile eliminare la macchina virtuale e l'insieme di credenziali delle chiavi.