Didacticiel : Utiliser Azure Key Vault avec une machine virtuelle Windows dans .NETTutorial: Use Azure Key Vault with a Windows virtual machine in .NET

Azure Key Vault vous permet de protéger des secrets tels que les clés API et les chaînes de connexion de base de données nécessaires pour accéder à vos applications, services et ressources.Azure Key Vault helps you to protect secrets such as API keys, the database connection strings you need to access your applications, services, and IT resources.

Dans ce tutoriel, vous allez vous procurer une application console pour lire des informations d’Azure Key Vault.In this tutorial, you learn how to get a console application to read information from Azure Key Vault. Pour ce faire, vous allez utiliser des identités managées pour des ressources Azure.To do so, you use managed identities for Azure resources.

Ce didacticiel explique les procédures suivantes :The tutorial shows you how to:

  • Créez un groupe de ressources.Create a resource group.
  • Création d’un coffre de clésCreate a key vault.
  • Ajoutez un secret au coffre de clés.Add a secret to the key vault.
  • Récupération d’un secret à partir du coffre de clés.Retrieve a secret from the key vault.
  • Créez une machine virtuelle Azure.Create an Azure virtual machine.
  • Activer une identité managée pour la machine virtuelle.Enable a managed identity for the Virtual Machine.
  • Attribuez des autorisations à l’identité de machine virtuelle.Assign permissions to the VM identity.

Avant de continuer, lisez les concepts de base de Key Vault.Before you begin, read Key Vault basic concepts.

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit.If you don’t have an Azure subscription, create a free account.

PrérequisPrerequisites

Pour Windows, Mac et Linux :For Windows, Mac, and Linux:

  • GitGit
  • Ce didacticiel nécessite que vous exécutiez l’interface Azure CLI localement.This tutorial requires that you run the Azure CLI locally. Vous devez avoir installé Azure CLI 2.0.4 ou ultérieure.You must have the Azure CLI version 2.0.4 or later installed. Exécutez az --version pour trouver la version.Run az --version to find the version. Si vous devez installer ou mettre à niveau l’interface CLI, consultez l’article Installation d’Azure CLI 2.0.If you need to install or upgrade the CLI, see Install Azure CLI 2.0.

À propos de Managed Service Identity (MSI)About Managed Service Identity

Azure Key Vault stocke les informations d’identification de manière sécurisée, de façon à ce qu’elles n’apparaissent pas dans votre code.Azure Key Vault stores credentials securely, so they're not displayed in your code. Toutefois, vous devez vous authentifier auprès d’Azure Key Vault pour récupérer vos clés.However, you need to authenticate to Azure Key Vault to retrieve your keys. Pour vous authentifier auprès de Key Vault, vous avez besoin d’informations d’identification.To authenticate to Key Vault, you need a credential. Il s’agit d’un dilemme de démarrage classique.It's a classic bootstrap dilemma. Managed Service Identity (MSI) résout ce problème en fournissant une identité de démarrage.Managed Service Identity (MSI) solves this issue by providing a bootstrap identity that simplifies the process.

Lorsque vous activez MSI pour un service Azure, par exemple, Machines virtuelles Azure, Azure App Service ou Azure Functions, Azure crée un principal de service.When you enable MSI for an Azure service, such as Azure Virtual Machines, Azure App Service, or Azure Functions, Azure creates a service principal. MSI procède ainsi pour l’instance du service dans Azure Active Directory (Azure AD) et injecte les informations d’identification du principal de service dans cette instance.MSI does this for the instance of the service in Azure Active Directory (Azure AD) and injects the service principal credentials into that instance.

MSI

Ensuite, pour obtenir un jeton d’accès, votre code appelle un service de métadonnées local disponible dans la ressource Azure.Next, to get an access token, your code calls a local metadata service that's available on the Azure resource. Pour s’authentifier auprès d’un service Azure Key Vault, votre code utilise alors le jeton qu’il obtient du point de terminaison local MSI_ENDPOINT.To authenticate to an Azure Key Vault service, your code uses the access token that it gets from the local MSI endpoint.

Créer des ressources et affecter des autorisationsCreate resources and assign permissions

Avant de commencer à coder, vous devez créer des ressources, placer une clé secrète dans votre coffre de clés et affecter des autorisations.Before you start coding you need to create some resources, put a secret into your key vault, and assign permissions.

Connexion à AzureSign in to Azure

Pour vous connecter à Azure à l’aide de l’interface CLI Azure, entrez ceci :To sign in to Azure by using the Azure CLI, enter:

az login

Créer un groupe de ressourcesCreate a resource group

Un groupe de ressources Azure est un conteneur logique dans lequel les ressources Azure sont déployées et gérées.An Azure resource group is a logical container into which Azure resources are deployed and managed. Créez un groupe de ressources avec la commande az group create.Create a resource group by using the az group create command.

Cet exemple crée un groupe de ressources dans l’emplacement USA Ouest :This example creates a resource group in the West US location:

# To list locations: az account list-locations --output table
az group create --name "<YourResourceGroupName>" --location "West US"

Vous allez utiliser ce nouveau groupe de ressources tout au long du tutoriel.Your newly created resource group will be used throughout this tutorial.

Créer un coffre de clés et le remplir avec une clé secrèteCreate a key vault and populate it with a secret

Créez un coffre de clés dans votre groupe de ressources en fournissant à la commande az keyvault create avec les informations suivantes :Create a key vault in your resource group by providing the az keyvault create command with the following information:

  • Nom du coffre de clés : chaîne de 3 à 24 caractères qui ne peut contenir que des chiffres (0-9), des lettres (a-z, A-Z) et des traits d’union (-).Key vault name: a string of 3 to 24 characters that can contain only numbers (0-9), letters (a-z, A-Z), and hyphens (-)
  • Nom de groupe ressourcesResource group name
  • Localisation : USA OuestLocation: West US
az keyvault create --name "<YourKeyVaultName>" --resource-group "<YourResourceGroupName>" --location "West US"

À ce stade, votre compte Azure est le seul autorisé à effectuer des opérations sur ce nouveau coffre.At this point, your Azure account is the only one that's authorized to perform operations on this new key vault.

Maintenant, ajoutez une clé secrète à votre coffre de clés à l’aide de la commande az keyvault secret setNow add a secret to your key vault using the az keyvault secret set command

Pour créer un secret dans le coffre de clés appelé AppSecret, tapez la commande suivante :To create a secret in the key vault called AppSecret, enter the following command:

az keyvault secret set --vault-name "<YourKeyVaultName>" --name "AppSecret" --value "MySecret"

Ce secret stocke la valeur MySecret.This secret stores the value MySecret.

Création d'une machine virtuelleCreate a virtual machine

Créez une machine virtuelle à l’aide de l’une des méthodes suivantes :Create a virtual machine by using one of the following methods:

Affecter une identité à la machine virtuelleAssign an identity to the VM

Créez une identité attribuée par le système pour la machine virtuelle avec la commande az vm identity assign :Create a system-assigned identity for the virtual machine with the az vm identity assign command:

az vm identity assign --name <NameOfYourVirtualMachine> --resource-group <YourResourceGroupName>

Notez l’identité affectée par le système qui est affichée dans le code suivant.Note the system-assigned identity that's displayed in the following code. La sortie de la commande ci-dessus doit être la suivante :The output of the preceding command would be:

{
  "systemAssignedIdentity": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "userAssignedIdentities": {}
}

Attribuer des autorisations à l’identité de machine virtuelleAssign permissions to the VM identity

Attribuez les autorisations d’identité créées précédemment pour votre clé de coffres avec la commande az keyvault set-policy :Assign the previously created identity permissions to your key vault with the az keyvault set-policy command:

az keyvault set-policy --name '<YourKeyVaultName>' --object-id <VMSystemAssignedIdentity> --secret-permissions get list

Se connecter à la machine virtuelleSign in to the virtual machine

Pour vous connecter à la machine virtuelle, suivez les instructions de l’article Se connecter à une machine virtuelle Azure exécutant Windows.To sign in to the virtual machine, follow the instructions in Connect and sign in to an Azure virtual machine running Windows.

Modifier l’application consoleSet up the console app

Créez une application de console et installez les packages requis à l’aide de la commande dotnet.Create a console app and install the required packages using the dotnet command.

Installez .NET CoreInstall .NET Core

Pour installer .NET Core, accédez à la page de téléchargements .NET.To install .NET Core, go to the .NET downloads page.

Créer et exécuter l’exemple d’application .NETCreate and run a sample .NET app

Ouvrez une invite de commandes.Open a command prompt.

Vous pouvez envoyer un message « Hello World » à la console en exécutant les commandes suivantes :You can print "Hello World" to the console by running the following commands:

dotnet new console -o helloworldapp
cd helloworldapp
dotnet run

Installer les packagesInstall the packages

À partir de la fenêtre de console, installez les packages .NET requis pour ce guide de démarrage rapide :From the console window, install the .NET packages required for this quickstart:

dotnet add package System.IO;
dotnet add package System.Net;
dotnet add package System.Text;
dotnet add package Newtonsoft.Json;
dotnet add package Newtonsoft.Json.Linq;

Modifier l’application consoleEdit the console app

Ouvrez le fichier Program.cs et ajoutez ces packages :Open the Program.cs file and add these packages:

using System;
using System.IO;
using System.Net;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

Modifiez le fichier de classe pour qu’il contienne le code dans le processus suivant en deux étapes :Edit the class file to contain the code in the following two-step process:

  1. Récupérer un jeton du point de terminaison MSI local sur la machine virtuelle.Fetch a token from the local MSI endpoint on the VM. Cela extrait également un jeton d’Azure AD.Doing so also fetches a token from Azure AD.
  2. Passez le jeton au coffre de clés et récupérez votre secret.Pass the token to your key vault, and then fetch your secret.
 class Program
    {
        static void Main(string[] args)
        {
            // Step 1: Get a token from the local (URI) Managed Service Identity endpoint, which in turn fetches it from Azure AD
            var token = GetToken();

            // Step 2: Fetch the secret value from your key vault
            System.Console.WriteLine(FetchSecretValueFromKeyVault(token));
        }

        static string GetToken()
        {
            WebRequest request = WebRequest.Create("http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net");
            request.Headers.Add("Metadata", "true");
            WebResponse response = request.GetResponse();
            return ParseWebResponse(response, "access_token");
        }

        static string FetchSecretValueFromKeyVault(string token)
        {
            WebRequest kvRequest = WebRequest.Create("https://<YourVaultName>.vault.azure.net/secrets/<YourSecretName>?api-version=2016-10-01");
            kvRequest.Headers.Add("Authorization", "Bearer "+  token);
            WebResponse kvResponse = kvRequest.GetResponse();
            return ParseWebResponse(kvResponse, "value");
        }

        private static string ParseWebResponse(WebResponse response, string tokenName)
        {
            string token = String.Empty;
            using (Stream stream = response.GetResponseStream())
            {
                StreamReader reader = new StreamReader(stream, Encoding.UTF8);
                String responseString = reader.ReadToEnd();

                JObject joResponse = JObject.Parse(responseString);    
                JValue ojObject = (JValue)joResponse[tokenName];             
                token = ojObject.Value.ToString();
            }
            return token;
        }
    }

Le code précédent montre comment effectuer des opérations avec Azure Key Vault dans une machine virtuelle Windows.The preceding code shows you how to do operations with Azure Key Vault in a Windows virtual machine.

Supprimer des ressourcesClean up resources

Quand ils ne sont plus nécessaires, supprimez la machine virtuelle et le coffre de clés.When they are no longer needed, delete the virtual machine and your key vault.

Étapes suivantesNext steps