Didacticiel : Chiffrement et déchiffrement d’objets blob à l’aide d’Azure Key Vault

Dans ce tutoriel, vous allez découvrir comment utiliser le chiffrement côté client pour chiffrer et déchiffrer des objets blob à l’aide d’une clé stockée avec Azure Key Vault.

Le Stockage Blob Azure prend en charge le chiffrement côté service et côté client. Pour la plupart des scénarios, Microsoft recommande d’utiliser des fonctionnalités de chiffrement côté service pour faciliter l’utilisation de vos données. Pour plus d’informations sur le chiffrement côté service, consultez Chiffrement du Stockage Azure pour les données au repos.

La bibliothèque de client de Stockage Blob Azure pour .NET prend en charge le chiffrement des données côté client au sein des applications avant le chargement vers Stockage Azure, ainsi que le déchiffrement des données pendant leur téléchargement vers le client. La bibliothèque prend également en charge l’intégration à Azure Key Vault pour la gestion des clés.

Ce didacticiel vous explique les procédures suivantes :

  • Configurer les autorisations pour une ressource Azure Key Vault
  • Créer une application console pour interagir avec des ressources à l’aide de bibliothèques de client .NET
  • Ajouter une clé à un coffre de clés
  • Configurer les options de chiffrement côté client à l’aide d’une clé stockée dans un coffre de clés
  • Créer un objet client de service blob avec le chiffrement côté client activé
  • Charger un objet blob chiffré, puis télécharger et déchiffrer l’objet blob

Prérequis

Attribuer un rôle à votre utilisateur Microsoft Entra

En cas de développement local, assurez-vous que le compte d’utilisateur qui accède au coffre de clés dispose des autorisations appropriées. Vous avez besoin du rôle Responsable du chiffrement Key Vault pour créer une clé et effectuer des actions sur les clés contenues dans un coffre de clés. Vous pouvez attribuer des rôles RBAC Azure à un utilisateur à l’aide du Portail Azure, Azure CLI ou Azure PowerShell. Vous pouvez en savoir plus sur les étendues disponibles pour les attributions de rôles dans la page vue d’ensemble de l’étendue .

Dans ce scénario, vous allez attribuer des autorisations limitées au compte de stockage à votre compte d’utilisateur, conformément au Principe des privilèges minimum. Cette pratique offre aux utilisateurs uniquement les autorisations minimales nécessaires et crée des environnements de production plus sécurisés.

L’exemple suivant montre comment attribuer le rôle Responsable de chiffrement Key Vault à votre compte d’utilisateur, ce qui fournit l’accès nécessaire pour suivre ce tutoriel.

Important

Dans la plupart des cas, la propagation de l’attribution de rôle dans Azure peut prendre une ou deux minutes, mais dans de rares cas, cela peut prendre jusqu’à huit minutes. Si vous recevez des erreurs d’authentification lorsque vous exécutez votre code pour la première fois, patientez quelques instants et réessayez.

  1. Dans le portail Azure, recherchez votre coffre de clés à l’aide de la barre de recherche principale ou de la navigation à gauche.

  2. Dans la page Vue d’ensemble du coffre de clés, sélectionnez Contrôle d’accès (IAM) dans le menu de gauche.

  3. Sur la page Contrôle d’accès (IAM), sélectionnez l’onglet Attributions de rôles.

  4. Sélectionnez + Ajouter dans le menu supérieur, puis Ajouter une attribution de rôle dans le menu déroulant résultant.

    A screenshot showing how to assign a role in Azure portal.

  5. Utilisez la zone de recherche pour filtrer les résultats sur le rôle souhaité. Pour cet exemple, recherchez Responsable de chiffrement Key Vault et sélectionnez le résultat correspondant, puis choisissez Suivant.

  6. Sous Attribuer l’accès à, sélectionnez Utilisateur, groupe ou principal de service, puis sélectionnez + Sélectionner des membres.

  7. Dans la boîte de dialogue, recherchez votre nom d’utilisateur Microsoft Entra (généralement votre adresse e-mail user@domain), puis choisissez Sélectionner en bas de la boîte de dialogue.

  8. Sélectionnez Vérifier + affecter pour accéder à la page finale, puis Vérifier + attribuer à nouveau pour terminer le processus.

Configuration de votre projet

  1. Dans une fenêtre de console (comme PowerShell ou Bash), utilisez la commande dotnet new pour créer une application console portant le nom BlobEncryptionKeyVault. Cette commande crée un projet C# « Hello World » simple avec un seul fichier source : Program.cs.

    dotnet new console -n BlobEncryptionKeyVault
    
  2. Basculez vers le répertoire BlobEncryptionKeyVault qui vient d’être créé.

    cd BlobEncryptionKeyVault
    
  3. Ouvrez le projet dans l’éditeur de code souhaité. Pour ouvrir le projet dans :

    • Visual Studio, recherchez et double-cliquez sur le fichier BlobEncryptionKeyVault.csproj.
    • Visual Studio Code, exécutez la commande suivante :
    code .
    

Pour interagir avec les services Azure dans cet exemple, installez les bibliothèques de client suivantes à l’aide de dotnet add package.

dotnet add package Azure.Identity
dotnet add package Azure.Security.KeyVault.Keys
dotnet add package Azure.Storage.Blobs

Ajoutez les directives using suivantes et assurez-vous d’ajouter une référence à System.Configuration vers le projet.

using Azure;
using Azure.Core;
using Azure.Identity;
using Azure.Security.KeyVault.Keys;
using Azure.Security.KeyVault.Keys.Cryptography;
using Azure.Storage;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;

Définir une variable d’environnement

Cette application recherche une variable d’environnement appelée KEY_VAULT_NAME pour récupérer le nom de votre coffre de clés. Pour définir la variable d’environnement, ouvrez une fenêtre de console et suivez les instructions pour votre système d’exploitation. Remplacez <your-key-vault-name> par le nom de votre coffre de clés.

Windows :

Vous pouvez définir des variables d’environnement pour Windows à partir de la ligne de commande. Toutefois, quand vous utilisez cette approche, les valeurs sont accessibles à toutes les applications s’exécutant sur ce système d’exploitation. Cela peut entraîner des conflits si vous n’êtes pas prudent. Les variables d’environnement peuvent être définies au niveau de l’utilisateur ou du système :

setx KEY_VAULT_NAME "<your-key-vault-name>"

Après avoir ajouté la variable d’environnement dans Windows, vous devez démarrer une nouvelle instance de la fenêtre de commande. Si vous utilisez Visual Studio sur Windows, vous devrez peut-être relancer Visual Studio après avoir créé la variable d’environnement pour que la modification soit détectée.

Linux :

export KEY_VAULT_NAME=<your-key-vault-name>

Ajouter une clé dans Azure Key Vault

Dans cet exemple, nous créons une clé et nous l’ajoutons au coffre de clés à l’aide de la bibliothèque de client Azure Key Vault. Vous pouvez également créer et ajouter une clé à un coffre de clés à l’aide de l’interface Azure CLI, du portail Azure ou de PowerShell.

Dans l’exemple ci-dessous, nous créons un objet KeyClient pour le coffre spécifié. L’objet KeyClient est ensuite utilisé pour créer une clé RSA dans le coffre spécifié.

var keyName = "testRSAKey";
var keyVaultName = Environment.GetEnvironmentVariable("KEY_VAULT_NAME");

// URI for the key vault resource
var keyVaultUri = $"https://{keyVaultName}.vault.azure.net";

TokenCredential tokenCredential = new DefaultAzureCredential();

// Create a KeyClient object
var keyClient = new KeyClient(new Uri(keyVaultUri), tokenCredential);

// Add a key to the key vault
var key = await keyClient.CreateKeyAsync(keyName, KeyType.Rsa);

Créer une clé et des instances de programme de résolution de clé

Nous allons ensuite utiliser la clé que nous venons d’ajouter au coffre pour créer le client de chiffrement et les instances du programme de résolution de clé. CryptographyClient implémente IKeyEncryptionKey et est utilisé pour effectuer des opérations de chiffrement avec des clés stockées dans Azure Key Vault. KeyResolver implémente IKeyEncryptionResolver et récupère les clés de chiffrement de clé à partir de l’identificateur de la clé et résout la clé.

// Cryptography client and key resolver instances using Azure Key Vault client library
CryptographyClient cryptoClient = keyClient.GetCryptographyClient(key.Value.Name, key.Value.Properties.Version);
KeyResolver keyResolver = new (tokenCredential);

Si le coffre contient une clé existante que vous souhaitez utiliser pour le chiffrement, vous pouvez créer la clé et les instances de programme de résolution en transmettant l’URI :

var keyVaultKeyUri = $"https://{keyVaultName}.vault.azure.net/keys/{keyName}";
CryptographyClient cryptoClient = new CryptographyClient(new Uri(keyVaultKeyUri), tokenCredential);

Configurer les options de chiffrement

Nous devons ensuite configurer les options de chiffrement à utiliser pour le chargement et le téléchargement d’objets blob. Pour utiliser le chiffrement côté client, nous commençons par créer un objet ClientSideEncryptionOptions que nous définissons sur la création du client avec SpecializedBlobClientOptions.

La classe ClientSideEncryptionOptions fournit les options de configuration du client pour la connexion au Stockage Blob à l’aide du chiffrement côté client. KeyEncryptionKey est nécessaire pour les opérations de chargement et est utilisé pour envelopper la clé de chiffrement de contenu générée. KeyResolver est nécessaire pour les opérations de téléchargement et extrait la clé de chiffrement principale appropriée pour désenvelopper la clé de chiffrement de contenu téléchargée. KeyWrapAlgorithm est nécessaire pour les chargements et spécifie l’identificateur d’algorithme à utiliser pour envelopper la clé de chiffrement de contenu.

Important

En raison d’une vulnérabilité de sécurité dans la version 1, il est recommandé de construire l’objet ClientSideEncryptionOptions à l’aide de ClientSideEncryptionVersion.V2_0 pour le paramètre de version. Pour en savoir plus sur l’atténuation de la vulnérabilité dans vos applications, consultez Atténuer la vulnérabilité de sécurité dans vos applications. Pour plus d’informations à ce sujet, consultez Stockage Azure mettant à jour le chiffrement côté client dans le Kit de développement logiciel (SDK) pour résoudre la vulnérabilité de sécurité.

// Configure the encryption options to be used for upload and download
ClientSideEncryptionOptions encryptionOptions = new (ClientSideEncryptionVersion.V2_0)
{
    KeyEncryptionKey = cryptoClient,
    KeyResolver = keyResolver,
    // String value that the client library will use when calling IKeyEncryptionKey.WrapKey()
    KeyWrapAlgorithm = "RSA-OAEP"
};

// Set the encryption options on the client options.
BlobClientOptions options = new SpecializedBlobClientOptions() { ClientSideEncryption = encryptionOptions };

Configurer l’objet client pour utiliser le chiffrement côté client

Dans cet exemple, nous appliquons les options de configuration de chiffrement côté client à un objet BlobServiceClient. Quand ces options de chiffrement s’appliquent au niveau du client de service, elles sont transmises du client de service aux clients conteneur et des clients conteneur aux clients d’objets blob. Quand l’objet BlobClient effectue une opération de chargement ou de téléchargement, les bibliothèques de client Stockage Blob Azure utilisent le chiffrement d’enveloppe pour chiffrer et déchiffrer les objets blob côté client. Un chiffrement d’enveloppe chiffre une clé avec une ou plusieurs clés supplémentaires.

// Create a blob client with client-side encryption enabled.
// Attempting to construct a BlockBlobClient, PageBlobClient, or AppendBlobClient from a BlobContainerClient
// with client-side encryption options present will throw, as this functionality is only supported with BlobClient.
Uri blobUri = new (string.Format($"https://{accountName}.blob.core.windows.net"));
BlobClient blob = new BlobServiceClient(blobUri, tokenCredential, options).GetBlobContainerClient("test-container").GetBlobClient("testBlob");

Chiffrement et téléchargement d’objets blob

Quand l’objet BlobClient appelle une méthode de chargement, plusieurs étapes se produisent pour effectuer le chiffrement côté client :

  1. La bibliothèque de client Stockage Azure génère un vecteur d’initialisation aléatoire de 16 octets avec une clé de chiffrement de contenu (CEK) aléatoire de 32 octets, puis effectue un chiffrement d’enveloppe des données du blob en utilisant ces informations.
  2. Les données d’objet blob sont chiffrées à l’aide de la clé CEK.
  3. La clé CEK est ensuite enveloppée (chiffrée) à l’aide de la clé de chiffrement de clés (KEK) spécifiée dans ClientSideEncryptionOptions. Dans cet exemple, la clé KEK est une paire de clés asymétriques stockée dans la ressource Azure Key Vault spécifiée. Le client d’objet blob lui-même n’a jamais accès à la clé KEK. Il appelle simplement l’algorithme d’enveloppement de clé fourni par Key Vault.
  4. Les données d’objet blob chiffrées sont ensuite chargées sur le compte de stockage.

Ajoutez le code suivant pour chiffrer un objet blob et le charger sur votre compte de stockage Azure :

// Upload the encrypted contents to the blob
Stream blobContent = BinaryData.FromString("Ready for encryption, Captain.").ToStream();
await blob.UploadAsync(blobContent);

Une fois l’objet blob chargé, vous pouvez afficher l’objet blob dans votre compte de stockage pour voir le contenu chiffré ainsi que les métadonnées de chiffrement.

Déchiffrement et téléchargement d’objets blob

La bibliothèque de client de Stockage Azure suppose que l’utilisateur gère la clé KEK soit localement, soit dans un coffre de clés. L’utilisateur n’a pas besoin de connaître la clé spécifique qui a été utilisée pour le chiffrement. Le programme de résolution de clé spécifié dans ClientSideEncryptionOptions est utilisé pour résoudre les identificateurs de clé quand les données d’objet blob sont téléchargées et déchiffrées.

Quand l’objet BlobClient appelle une méthode de téléchargement, plusieurs étapes se produisent pour déchiffrer les données d’objet blob chiffrées :

  1. La bibliothèque de client télécharge les données blob chiffrées, notamment les métadonnées de chiffrement, à partir du compte de stockage.
  2. La clé CEK enveloppée est ensuite désenveloppée (déchiffrée) à l’aide de la clé KEK. La bibliothèque de client n’a pas accès à la clé KEK pendant ce processus, mais appelle uniquement l’algorithme de désenveloppement de clés spécifié dans ClientSideEncryptionOptions. La clé privée d’une paire de clés RSA reste dans le coffre de clés. Ainsi, la clé chiffrée des métadonnées d’objets blob qui contient la clé CEK est envoyée au coffre de clés à des fins de déchiffrement.
  3. La bibliothèque de client utilise la clé CEK pour déchiffrer les données d’objet blob chiffrées.

Ajoutez le code suivant pour télécharger et déchiffrer l’objet blob que vous avez chargé auparavant.

// Download and decrypt the encrypted contents from the blob
Response<BlobDownloadInfo>  response = await blob.DownloadAsync();
BlobDownloadInfo downloadInfo = response.Value;
Console.WriteLine((await BinaryData.FromStreamAsync(downloadInfo.Content)).ToString());

Étapes suivantes

Dans ce tutoriel, vous avez découvert comment utiliser des bibliothèques de client .NET pour effectuer le chiffrement côté client pour les opérations de chargement et de téléchargement d’objets blob.

Pour obtenir une vue d’ensemble du chiffrement côté client pour les objets blob, notamment les instructions pour la migration des données chiffrées vers la version 2, consultez Chiffrement côté client des objets blob.

Pour plus d’informations sur Azure Key Vault, consultez la page Vue d’ensemble d’Azure Key Vault