Självstudier: Kryptera och dekryptera blobar med Azure Key Vault

I den här självstudien lär du dig hur du använder kryptering på klientsidan för att kryptera och dekryptera blobar med hjälp av en nyckel som lagras med Azure Key Vault.

Azure Blob Storage stöder både kryptering på tjänstsidan och på klientsidan. I de flesta scenarier rekommenderar Microsoft att du använder krypteringsfunktioner på tjänstsidan för enkel användning för att skydda dina data. Mer information om kryptering på tjänstsidan finns i Azure Storage-kryptering för vilande data.

Azure Blob Storage-klientbiblioteket för .NET stöder datakryptering på klientsidan i program innan de laddas upp till Azure Storage och dekrypterar data vid nedladdning till klienten. Biblioteket stöder även integrering med Azure Key Vault för nyckelhantering.

I den här självstudiekursen lär du dig att:

  • Konfigurera behörigheter för en Azure Key Vault-resurs
  • Skapa ett konsolprogram för att interagera med resurser med hjälp av .NET-klientbibliotek
  • Lägga till en nyckel i ett nyckelvalv
  • Konfigurera krypteringsalternativ på klientsidan med hjälp av en nyckel som lagras i ett nyckelvalv
  • Skapa ett blobtjänstklientobjekt med kryptering på klientsidan aktiverat
  • Ladda upp en krypterad blob och ladda sedan ned och dekryptera bloben

Förutsättningar

Tilldela en roll till din Microsoft Entra-användare

När du utvecklar lokalt kontrollerar du att det användarkonto som har åtkomst till nyckelvalvet har rätt behörigheter. Du behöver rollen Key Vault Crypto Officer för att skapa en nyckel och utföra åtgärder på nycklar i ett nyckelvalv. Du kan tilldela Azure RBAC-roller till en användare med hjälp av Azure-portalen, Azure CLI eller Azure PowerShell. Du kan lära dig mer om tillgängliga omfång för rolltilldelningar på översiktssidan för omfång .

I det här scenariot tilldelar du behörigheter till ditt användarkonto, begränsat till nyckelvalvet, för att följa principen om minsta behörighet. Den här metoden ger användarna endast de minsta behörigheter som krävs och skapar säkrare produktionsmiljöer.

I följande exempel visas hur du tilldelar key vault crypto officer-rollen till ditt användarkonto, vilket ger den åtkomst du behöver för att slutföra den här självstudien.

Viktigt!

I de flesta fall tar det en minut eller två för rolltilldelningen att spridas i Azure, men i sällsynta fall kan det ta upp till åtta minuter. Om du får autentiseringsfel när du först kör koden väntar du en stund och försöker igen.

  1. Leta reda på ditt nyckelvalv i Azure-portalen med hjälp av huvudsökfältet eller det vänstra navigeringsfältet.

  2. På översiktssidan för nyckelvalvet väljer du Åtkomstkontroll (IAM) på den vänstra menyn.

  3. På sidan Åtkomstkontroll (IAM) väljer du fliken Rolltilldelningar .

  4. Välj + Lägg till på den översta menyn och sedan Lägg till rolltilldelning från den resulterande nedrullningsbara menyn.

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

  5. Använd sökrutan för att filtrera resultatet till önskad roll. I det här exemplet söker du efter Key Vault Crypto Officer och väljer matchande resultat och väljer sedan Nästa.

  6. Under Tilldela åtkomst till väljer du Användare, grupp eller tjänstens huvudnamn och sedan + Välj medlemmar.

  7. I dialogrutan söker du efter ditt Microsoft Entra-användarnamn (vanligtvis din user@domain e-postadress) och väljer sedan Välj längst ned i dialogrutan.

  8. Välj Granska + tilldela för att gå till den sista sidan och sedan Granska + tilldela igen för att slutföra processen.

Konfigurera projektet

  1. I ett konsolfönster (till exempel PowerShell eller Bash) använder du dotnet new kommandot för att skapa en ny konsolapp med namnet BlobEncryptionKeyVault. Det här kommandot skapar ett enkelt "Hello World" C#-projekt med en enda källfil: Program.cs.

    dotnet new console -n BlobEncryptionKeyVault
    
  2. Växla till den nyligen skapade katalogen BlobEncryptionKeyVault .

    cd BlobEncryptionKeyVault
    
  3. Öppna projektet i önskad kodredigerare. Så här öppnar du projektet i:

    • Visual Studio, leta upp och dubbelklicka på BlobEncryptionKeyVault.csproj filen.
    • Visual Studio Code kör du följande kommando:
    code .
    

Om du vill interagera med Azure-tjänster i det här exemplet installerar du följande klientbibliotek med .dotnet add package

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

Lägg till följande using direktiv och se till att lägga till en referens till System.Configuration projektet.

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;

Ange miljövariabel

Det här programmet letar efter en miljövariabel som heter KEY_VAULT_NAME för att hämta namnet på ditt nyckelvalv. Om du vill ange miljövariabeln öppnar du ett konsolfönster och följer anvisningarna för operativsystemet. Ersätt <your-key-vault-name> med namnet på ditt nyckelvalv.

Windows:

Du kan ange miljövariabler för Windows från kommandoraden. Men när du använder den här metoden är värdena tillgängliga för alla program som körs på operativsystemet och kan orsaka konflikter om du inte är försiktig. Miljövariabler kan anges på användar- eller systemnivå:

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

När du har lagt till miljövariabeln i Windows måste du starta en ny instans av kommandofönstret. Om du använder Visual Studio i Windows kan du behöva starta om Visual Studio när du har skapat miljövariabeln för att ändringen ska identifieras.

Linux:

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

Lägga till en nyckel i Azure Key Vault

I det här exemplet skapar vi en nyckel och lägger till den i nyckelvalvet med hjälp av Azure Key Vault-klientbiblioteket. Du kan också skapa och lägga till en nyckel i ett nyckelvalv med hjälp av Azure CLI, Azure Portal eller PowerShell.

I exemplet nedan skapar vi ett KeyClient-objekt för det angivna valvet. Objektet KeyClient används sedan för att skapa en ny RSA-nyckel i det angivna valvet.

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

Skapa nyckel- och nyckellösarinstanser

Sedan använder vi nyckeln som vi precis lade till i valvet för att skapa kryptografiklienten och nyckellösarinstanserna. CryptographyClient implementerar IKeyEncryptionKey och används för att utföra kryptografiska åtgärder med nycklar som lagras i Azure Key Vault. KeyResolver implementerar IKeyEncryptionResolver och hämtar nyckelkrypteringsnycklar från nyckelidentifieraren och löser nyckeln.

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

Om du har en befintlig nyckel i valvet som du vill kryptera med kan du skapa nyckel- och nyckellösarinstanserna genom att skicka in URI:n:

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

Konfigurera krypteringsalternativ

Nu måste vi konfigurera krypteringsalternativen som ska användas för blobuppladdning och nedladdning. Om du vill använda kryptering på klientsidan skapar vi först ett ClientSideEncryptionOptions objekt och ställer in det när klienten skapas med SpecializedBlobClientOptions.

Klassen ClientSideEncryptionOptions innehåller klientkonfigurationsalternativen för att ansluta till Blob Storage med hjälp av kryptering på klientsidan. KeyEncryptionKey krävs för uppladdningsåtgärder och används för att omsluta den genererade innehållskrypteringsnyckeln. KeyResolver krävs för nedladdningsåtgärder och hämtar rätt nyckelkrypteringsnyckel för att packa upp den nedladdade innehållskrypteringsnyckeln. KeyWrapAlgorithm krävs för uppladdningar och anger den algoritmidentifierare som ska användas när innehållskrypteringsnyckeln omsluts.

Viktigt!

På grund av en säkerhetsrisk i version 1 rekommenderar vi att du skapar ClientSideEncryptionOptions objektet med hjälp av ClientSideEncryptionVersion.V2_0 för versionsparametern. Mer information om hur du minimerar sårbarheten i dina appar finns i Åtgärda säkerhetsrisken i dina program. Mer information om den här säkerhetsrisken finns i Azure Storage som uppdaterar kryptering på klientsidan i SDK för att åtgärda säkerhetsrisker.

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

Konfigurera klientobjekt att använda kryptering på klientsidan

I det här exemplet tillämpar vi konfigurationsalternativen för kryptering på klientsidan på ett BlobServiceClient objekt. När de tillämpas på tjänstklientnivå skickas dessa krypteringsalternativ från tjänstklienten till containerklienter och från containerklienter till blobklienter. BlobClient När objektet utför en uppladdnings- eller nedladdningsåtgärd använder Azure Blob Storage-klientbiblioteken kuvertkryptering för att kryptera och dekryptera blobar på klientsidan. Kuvertkryptering krypterar en nyckel med en eller flera ytterligare nycklar.

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

Kryptera blob och ladda upp

När objektet BlobClient anropar en uppladdningsmetod utförs flera steg för att utföra kryptering på klientsidan:

  1. Azure Storage-klientbiblioteket genererar en slumpmässig initieringsvektor (IV) på 16 byte och en krypteringsnyckel för slumpmässigt innehåll (CEK) på 32 byte och utför kuvertkryptering av blobdata med hjälp av den här informationen.
  2. Blobdata krypteras med hjälp av CEK.
  3. CEK omsluts sedan (krypteras) med nyckelkrypteringsnyckeln (KEK) som vi angav i ClientSideEncryptionOptions. I det här exemplet är KEK ett asymmetriskt nyckelpar som lagras i den angivna Azure Key Vault-resursen. Själva blobklienten har aldrig åtkomst till KEK. Den anropar bara nyckelomslutningsalgoritmen som tillhandahålls av Key Vault.
  4. Krypterade blobdata laddas sedan upp till lagringskontot.

Lägg till följande kod för att kryptera en blob och ladda upp den till ditt Azure Storage-konto:

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

När bloben har laddats upp kan du visa bloben i ditt lagringskonto för att se det krypterade innehållet tillsammans med krypteringsmetadata.

Dekryptera blob och ladda ned

Azure Storage-klientbiblioteket förutsätter att användaren hanterar KEK antingen lokalt eller i ett nyckelvalv. Användaren behöver inte känna till den specifika nyckel som användes för kryptering. Nyckellösaren som anges i ClientSideEncryptionOptions används för att matcha nyckelidentifierare när blobdata laddas ned och dekrypteras.

När objektet BlobClient anropar en nedladdningsmetod utförs flera steg för att dekryptera krypterade blobdata:

  1. Klientbiblioteket laddar ned krypterade blobdata, inklusive krypteringsmetadata, från lagringskontot.
  2. Den omslutna CEK:en packas sedan upp (dekrypteras) med hjälp av KEK. Klientbiblioteket har inte åtkomst till KEK under den här processen, men anropar bara algoritmen för att packa upp nyckeln som anges i ClientSideEncryptionOptions. Den privata nyckeln för RSA-nyckelparet finns kvar i nyckelvalvet, så den krypterade nyckeln från blobmetadata som innehåller CEK skickas till nyckelvalvet för dekryptering.
  3. Klientbiblioteket använder CEK för att dekryptera krypterade blobdata.

Lägg till följande kod för att ladda ned och dekryptera den blob som du laddade upp tidigare.

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

Nästa steg

I den här självstudien har du lärt dig hur du använder .NET-klientbibliotek för att utföra kryptering på klientsidan för åtgärder för blobuppladdning och nedladdning.

En bred översikt över kryptering på klientsidan för blobar, inklusive instruktioner för att migrera krypterade data till version 2, finns i Kryptering på klientsidan för blobar.

Mer information om Azure Key Vault finns på översiktssidan för Azure Key Vault