Zelfstudie: blobs versleutelen en ontsleutelen met Azure Key Vault

In deze zelfstudie leert u hoe u versleuteling aan de clientzijde gebruikt om blobs te versleutelen en ontsleutelen met behulp van een sleutel die is opgeslagen met Azure Key Vault.

Azure Blob Storage ondersteunt zowel versleuteling aan de servicezijde als aan de clientzijde. Voor de meeste scenario's raadt Microsoft aan om versleutelingsfuncties aan de servicezijde te gebruiken voor gebruiksgemak bij het beveiligen van uw gegevens. Zie Azure Storage-versleuteling voor data-at-rest voor meer informatie over versleuteling aan de servicezijde.

De Azure Blob Storage-clientbibliotheek voor .NET ondersteunt gegevensversleuteling aan de clientzijde binnen toepassingen voordat u uploadt naar Azure Storage en gegevens ontsleutelt tijdens het downloaden naar de client. De bibliotheek biedt ook ondersteuning voor integratie met Azure Key Vault voor sleutelbeheer.

In deze handleiding ontdekt u hoe u:

  • Machtigingen configureren voor een Azure Key Vault-resource
  • Een consoletoepassing maken voor interactie met resources met behulp van .NET-clientbibliotheken
  • Een sleutel toevoegen aan een sleutelkluis
  • Versleutelingsopties aan de clientzijde configureren met behulp van een sleutel die is opgeslagen in een sleutelkluis
  • Een blobserviceclientobject maken waarvoor versleuteling aan de clientzijde is ingeschakeld
  • Upload een versleutelde blob en download en ontsleutel de blob

Vereisten

Een rol toewijzen aan uw Microsoft Entra-gebruiker

Wanneer u lokaal ontwikkelt, moet u ervoor zorgen dat het gebruikersaccount dat toegang heeft tot de sleutelkluis de juiste machtigingen heeft. U hebt de rol Crypto Officer van Key Vault nodig om een sleutel te maken en acties uit te voeren op sleutels in een sleutelkluis. U kunt Azure RBAC-rollen toewijzen aan een gebruiker met behulp van Azure Portal, Azure CLI of Azure PowerShell. Meer informatie over de beschikbare bereiken voor roltoewijzingen vindt u op de overzichtspagina van het bereik.

In dit scenario wijst u machtigingen toe aan uw gebruikersaccount, gericht op de sleutelkluis, om het principe van minimale bevoegdheden te volgen. Deze procedure biedt gebruikers alleen de minimale machtigingen die nodig zijn en maakt veiligere productieomgevingen.

In het volgende voorbeeld ziet u hoe u de rol Key Vault Crypto Officer toewijst aan uw gebruikersaccount. Dit biedt de toegang die u nodig hebt om deze zelfstudie te voltooien.

Belangrijk

In de meeste gevallen duurt het een of twee minuten voordat de roltoewijzing is doorgegeven in Azure, maar in zeldzame gevallen kan het maximaal acht minuten duren. Als u verificatiefouten ontvangt wanneer u de code voor het eerst uitvoert, wacht u even en probeert u het opnieuw.

  1. Zoek in Azure Portal uw sleutelkluis met behulp van de hoofdzoekbalk of linkernavigatiebalk.

  2. Selecteer op de overzichtspagina van key vault toegangsbeheer (IAM) in het menu aan de linkerkant.

  3. Selecteer op de pagina Toegangsbeheer (IAM) het tabblad Roltoewijzingen .

  4. Selecteer + Toevoegen in het bovenste menu en voeg vervolgens roltoewijzing toe in de resulterende vervolgkeuzelijst.

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

  5. Gebruik het zoekvak om de resultaten te filteren op de gewenste rol. Zoek voor dit voorbeeld naar Key Vault Crypto Officer en selecteer het overeenkomende resultaat en kies vervolgens Volgende.

  6. Selecteer onder Toegang toewijzen de optie Gebruiker, groep of service-principal en kies vervolgens + Leden selecteren.

  7. Zoek in het dialoogvenster naar uw Microsoft Entra-gebruikersnaam (meestal uw user@domain e-mailadres) en kies Vervolgens onderaan het dialoogvenster Selecteren .

  8. Selecteer Beoordelen + toewijzen om naar de laatste pagina te gaan en vervolgens opnieuw beoordelen en toewijzen om het proces te voltooien.

Uw project instellen

  1. Gebruik in een consolevenster (zoals PowerShell of Bash) de dotnet new opdracht om een nieuwe console-app te maken met de naam BlobEncryptionKeyVault. Met deze opdracht maakt u een eenvoudig C#-project Hallo wereld met één bronbestand: Program.cs.

    dotnet new console -n BlobEncryptionKeyVault
    
  2. Schakel over naar de zojuist gemaakte BlobEncryptionKeyVault-map .

    cd BlobEncryptionKeyVault
    
  3. Open het project in de gewenste code-editor. Het project openen in:

    • Visual Studio, zoek het BlobEncryptionKeyVault.csproj bestand en dubbelklik erop.
    • Voer de volgende opdracht uit in Visual Studio Code:
    code .
    

Als u in dit voorbeeld wilt communiceren met Azure-services, installeert u de volgende clientbibliotheken met behulp van dotnet add package.

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

Voeg de volgende using instructies toe en zorg ervoor dat u een verwijzing naar System.Configuration het project toevoegt.

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;

Omgevingsvariabele instellen

Deze toepassing zoekt naar een omgevingsvariabele die wordt aangeroepen KEY_VAULT_NAME om de naam van uw sleutelkluis op te halen. Als u de omgevingsvariabele wilt instellen, opent u een consolevenster en volgt u de instructies voor uw besturingssysteem. Vervang <your-key-vault-name> door de naam van uw sleutelkluis.

Windows:

U kunt omgevingsvariabelen voor Windows instellen vanaf de opdrachtregel. Wanneer u deze methode gebruikt, zijn de waarden echter toegankelijk voor alle toepassingen die op dat besturingssysteem worden uitgevoerd en kunnen conflicten veroorzaken als u niet voorzichtig bent. Omgevingsvariabelen kunnen worden ingesteld op gebruikers- of systeemniveau:

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

Nadat u de omgevingsvariabele in Windows hebt toegevoegd, moet u een nieuw exemplaar van het opdrachtvenster starten. Als u Visual Studio in Windows gebruikt, moet u Visual Studio mogelijk opnieuw starten nadat u de omgevingsvariabele hebt gemaakt om de wijziging te kunnen detecteren.

Linux:

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

Een sleutel toevoegen in Azure Key Vault

In dit voorbeeld maken we een sleutel en voegen we deze toe aan de sleutelkluis met behulp van de Azure Key Vault-clientbibliotheek. U kunt ook een sleutel maken en toevoegen aan een sleutelkluis met behulp van Azure CLI, Azure Portal of PowerShell.

In het onderstaande voorbeeld maken we een KeyClient-object voor de opgegeven kluis. Het KeyClient object wordt vervolgens gebruikt om een nieuwe RSA-sleutel te maken in de opgegeven kluis.

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);

Sleutel- en sleutel-resolver-exemplaren maken

Vervolgens gebruiken we de sleutel die we zojuist hebben toegevoegd aan de kluis om de cryptografieclient- en sleutel-resolver-exemplaren te maken. CryptographyClient implementeert IKeyEncryptionKey en wordt gebruikt om cryptografische bewerkingen uit te voeren met sleutels die zijn opgeslagen in Azure Key Vault. KeyResolver implementeert IKeyEncryptionResolver en haalt sleutelversleutelingssleutels op uit de sleutel-id en lost de sleutel op.

// 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);

Als u een bestaande sleutel in de kluis hebt waarmee u wilt versleutelen, kunt u de sleutel- en sleutel-resolver-exemplaren maken door de URI door te geven:

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

Versleutelingsopties configureren

Nu moeten we de versleutelingsopties configureren die moeten worden gebruikt voor het uploaden en downloaden van blobs. Als u versleuteling aan de clientzijde wilt gebruiken, maken we eerst een ClientSideEncryptionOptions object en stellen we dit in bij het maken van de client met SpecializedBlobClientOptions.

De klasse ClientSideEncryptionOptions biedt de clientconfiguratieopties voor het maken van verbinding met Blob Storage met behulp van versleuteling aan de clientzijde. KeyEncryptionKey is vereist voor uploadbewerkingen en wordt gebruikt om de gegenereerde versleutelingssleutel voor inhoud te verpakken. KeyResolver is vereist voor downloadbewerkingen en haalt de juiste sleutelversleutelingssleutel op om de gedownloade inhoudsversleutelingssleutel uit te pakken. KeyWrapAlgorithm is vereist voor uploads en geeft de algoritme-id op die moet worden gebruikt bij het verpakken van de versleutelingssleutel voor inhoud.

Belangrijk

Vanwege een beveiligingsprobleem in versie 1 is het raadzaam om het ClientSideEncryptionOptions object te maken met behulp van ClientSideEncryptionVersion.V2_0 de versieparameter. Zie Het beveiligingsprobleem in uw toepassingen beperken voor meer informatie over het beperken van het beveiligingsprobleem in uw apps. Zie Azure Storage voor meer informatie over dit beveiligingsprobleem versleuteling aan de clientzijde bijwerken in SDK om beveiligingsproblemen op te lossen.

// 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 };

Clientobject configureren voor het gebruik van versleuteling aan de clientzijde

In dit voorbeeld passen we de versleutelingsconfiguratieopties aan de clientzijde toe op een BlobServiceClient object. Wanneer deze versleutelingsopties worden toegepast op serviceclientniveau, worden deze versleutelingsopties van de serviceclient doorgegeven aan containerclients en van containerclients tot blobclients. Wanneer het BlobClient object een upload- of downloadbewerking uitvoert, gebruiken de Azure Blob Storage-clientbibliotheken envelopversleuteling om blobs aan de clientzijde te versleutelen en ontsleutelen. Envelopversleuteling versleutelt een sleutel met een of meer extra sleutels.

// 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");

Blob versleutelen en uploaden

Wanneer het BlobClient object een uploadmethode aanroept, treden er verschillende stappen op om de versleuteling aan de clientzijde uit te voeren:

  1. De Azure Storage-clientbibliotheek genereert een willekeurige initialisatievector (IV) van 16 bytes en een willekeurige inhoudsversleutelingssleutel (CEK) van 32 bytes en voert envelopversleuteling van de blobgegevens uit met behulp van deze informatie.
  2. Blobgegevens worden versleuteld met behulp van de CEK.
  3. De CEK wordt vervolgens verpakt (versleuteld) met behulp van de sleutelversleutelingssleutel (KEK) die we hebben opgegeven in ClientSideEncryptionOptions. In dit voorbeeld is de KEK een asymmetrisch sleutelpaar dat is opgeslagen in de opgegeven Azure Key Vault-resource. De blobclient zelf heeft nooit toegang tot de KEK, maar roept alleen het sleutelterugloop-algoritme aan dat wordt geleverd door Key Vault.
  4. De versleutelde blobgegevens worden vervolgens geüpload naar het opslagaccount.

Voeg de volgende code toe om een blob te versleutelen en te uploaden naar uw Azure-opslagaccount:

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

Zodra de blob is geüpload, kunt u de blob in uw opslagaccount weergeven om de versleutelde inhoud samen met de versleutelingsmetagegevens weer te geven.

Blob ontsleutelen en downloaden

In de Azure Storage-clientbibliotheek wordt ervan uitgegaan dat de gebruiker de KEK lokaal of in een sleutelkluis beheert. De gebruiker hoeft niet te weten welke specifieke sleutel is gebruikt voor versleuteling. De sleuteloplosser die is opgegeven, ClientSideEncryptionOptions wordt gebruikt om sleutel-id's op te lossen wanneer blobgegevens worden gedownload en ontsleuteld.

Wanneer het BlobClient object een downloadmethode aanroept, treden er verschillende stappen op om de versleutelde blobgegevens te ontsleutelen:

  1. De clientbibliotheek downloadt de versleutelde blobgegevens, inclusief versleutelingsmetagegevens, uit het opslagaccount.
  2. De verpakte CEK wordt vervolgens uitgepakt (ontsleuteld) met behulp van de KEK. De clientbibliotheek heeft tijdens dit proces geen toegang tot de KEK, maar roept alleen het uitpakken van de sleutel aan die is opgegeven in ClientSideEncryptionOptions. De persoonlijke sleutel van het RSA-sleutelpaar blijft in de sleutelkluis staan, dus de versleutelde sleutel uit de blobmetagegevens die de CEK bevat, wordt verzonden naar de sleutelkluis voor ontsleuteling.
  3. De clientbibliotheek gebruikt de CEK om de versleutelde blobgegevens te ontsleutelen.

Voeg de volgende code toe om de blob te downloaden en te ontsleutelen die u eerder hebt geüpload.

// 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());

Volgende stappen

In deze zelfstudie hebt u geleerd hoe u .NET-clientbibliotheken gebruikt om versleuteling aan de clientzijde uit te voeren voor het uploaden en downloaden van blobbewerkingen.

Zie Versleuteling aan de clientzijde voor blobs voor een breed overzicht van versleuteling aan de clientzijde, inclusief instructies voor het migreren van versleutelde gegevens naar versie 2.

Zie de overzichtspagina van Azure Key Vault voor meer informatie over Azure Key Vault