Versleuteling aan clientzijde voor blobs

De Azure Blob Storage-clientbibliotheek voor .NET ondersteunt het versleutelen van gegevens in clienttoepassingen voordat ze worden geüpload naar Azure Storage en het ontsleutelen van gegevens tijdens het downloaden naar de client. De bibliotheek ondersteunt ook integratie met Azure Key Vault voor sleutelbeheer van opslagaccounts.

Belangrijk

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

Zie Blobs versleutelen en ontsleutelen met Behulp van Azure Key Vault voor een stapsgewijze zelfstudie die u begeleidt bij het versleutelen van blo Microsoft Azure Storage bs met behulp van versleuteling aan de clientzijde en Azure Key Vault.

Over versleuteling aan de clientzijde

De Azure Blob Storage-clientbibliotheek maakt gebruik van AES om gebruikersgegevens te versleutelen. Er zijn twee versies van versleuteling aan de clientzijde beschikbaar in de clientbibliotheek:

Waarschuwing

Het gebruik van versie 1 van versleuteling aan de clientzijde wordt niet meer aanbevolen vanwege een beveiligingsprobleem in de implementatie van de CBC-modus van de clientbibliotheek. Zie Azure Storage update client-side encryption in SDK to address security vulnerability (Versleuteling aan de clientzijde bijwerken in SDK om beveiligingsproblemen op te lossen) voor meer informatie over dit beveiligingsprobleem. Als u momenteel versie 1 gebruikt, raden we u aan uw toepassing bij te werken om versie 2 te gebruiken en uw gegevens te migreren. Zie de volgende sectie , Het beveiligingsprobleem in uw toepassingen beperken, voor verdere hulp.

Het beveiligingsprobleem in uw toepassingen beperken

Vanwege een beveiligingsprobleem dat is gedetecteerd in de implementatie van de CBC-modus van de Blob Storage-clientbibliotheek, raadt Microsoft u aan om onmiddellijk een of meer van de volgende acties uit te voeren:

De volgende tabel bevat een overzicht van de stappen die u moet uitvoeren als u ervoor kiest om uw toepassingen te migreren naar versleuteling aan de clientzijde v2:

Versleutelingsstatus aan clientzijde Aanbevolen acties
De toepassing maakt gebruik van versleuteling aan de clientzijde, een versie van de clientbibliotheek die alleen versleuteling aan de clientzijde v1 ondersteunt. Werk uw toepassing bij om een versie van de clientbibliotheek te gebruiken die ondersteuning biedt voor versleuteling aan de clientzijde v2. Zie SDK-ondersteuningsmatrix voor versleuteling aan clientzijde voor een lijst met ondersteunde versies. Meer informatie...

Werk uw code bij om versleuteling aan de clientzijde v2 te gebruiken. Meer informatie...

Download alle versleutelde gegevens om deze te ontsleutelen en versleutel deze vervolgens opnieuw met versleuteling aan de clientzijde v2. Meer informatie...
De toepassing gebruikt versleuteling aan de clientzijde met een versie van de clientbibliotheek die versleuteling aan de clientzijde v2 ondersteunt. Werk uw code bij om versleuteling aan de clientzijde v2 te gebruiken. Meer informatie...

Download alle versleutelde gegevens om deze te ontsleutelen en versleutel deze vervolgens opnieuw met versleuteling aan de clientzijde v2. Meer informatie...

Daarnaast raadt Microsoft u aan de volgende stappen uit te voeren om uw gegevens te beveiligen:

  • Configureer uw opslagaccounts voor het gebruik van privé-eindpunten om al het verkeer tussen uw virtuele netwerk (VNet) en uw opslagaccount via een privékoppeling te beveiligen. Zie Privé-eindpunten gebruiken voor Azure Storage voor meer informatie.
  • Beperk de netwerktoegang tot alleen specifieke netwerken.

SDK-ondersteuningsmatrix voor versleuteling aan clientzijde

In de volgende tabel ziet u welke versies van de clientbibliotheken voor .NET, Java en Python welke versies van versleuteling aan de clientzijde ondersteunen:

.NET Java Python
Versleuteling aan clientzijde v2 en v1 Versies 12.13.0 en hoger Versies 12.18.0 en hoger Versies 12.13.0 en hoger
Alleen versleuteling aan clientzijde v1 Versies 12.12.0 en eerder Versies 12.17.0 en eerder Versies 12.12.0 en eerder

Als uw toepassing versleuteling aan de clientzijde gebruikt met een eerdere versie van de .NET-, Java- of Python-clientbibliotheek, moet u eerst uw code upgraden naar een versie die versleuteling aan clientzijde v2 ondersteunt. Vervolgens moet u uw gegevens ontsleutelen en opnieuw versleutelen met versleuteling aan de clientzijde v2. Indien nodig kunt u een versie van de clientbibliotheek gebruiken die versleuteling aan de clientzijde v2 naast een eerdere versie van de clientbibliotheek ondersteunt terwijl u uw code migreert. Zie Voorbeeld: een blob versleutelen en ontsleutelen met versleuteling aan de clientzijde v2 voor codevoorbeelden.

Hoe versleuteling aan clientzijde werkt

De Azure Blob Storage clientbibliotheken gebruiken envelopversleuteling om uw gegevens aan de clientzijde te versleutelen en te ontsleutelen. Envelopversleuteling versleutelt een sleutel met een of meer extra sleutels.

De Blob Storage-clientbibliotheken zijn afhankelijk van Azure Key Vault om de sleutels te beveiligen die worden gebruikt voor versleuteling aan de clientzijde. Zie Wat is Azure Key Vault? voor meer informatie over Azure Key Vault.

Versleuteling en ontsleuteling via de enveloptechniek

Versleuteling via de enveloptechniek werkt als volgt:

  1. De Azure Storage-clientbibliotheek genereert een inhoudsversleutelingssleutel (CEK), een symmetrische sleutel voor eenmalig gebruik.

  2. Gebruikersgegevens worden versleuteld met behulp van de CEK.

  3. De CEK wordt vervolgens verpakt (versleuteld) met behulp van de versleutelingssleutel voor sleutel (KEK). De KEK wordt geïdentificeerd door een sleutel-id en kan een asymmetrisch sleutelpaar of een symmetrische sleutel zijn. U kunt de KEK lokaal beheren of opslaan in een Azure-Key Vault.

    De Azure Storage-clientbibliotheek zelf heeft nooit toegang tot KEK. De bibliotheek roept het sleutelterugloop-algoritme aan dat wordt geleverd door Key Vault. Gebruikers kunnen desgewenst aangepaste providers gebruiken voor sleutelterugloop/uitpakken.

  4. De versleutelde gegevens worden vervolgens geüpload naar Azure Blob Storage. De verpakte sleutel wordt samen met enkele extra versleutelingsmetagegevens opgeslagen als metagegevens op de blob.

Ontsleuteling via de enveloptechniek werkt als volgt:

  1. In de Azure Storage-clientbibliotheek wordt ervan uitgegaan dat de gebruiker de KEK lokaal of in een Azure-Key Vault beheert. De gebruiker hoeft niet te weten welke specifieke sleutel is gebruikt voor versleuteling. In plaats daarvan kan een sleutel-resolver worden ingesteld en gebruikt die verschillende sleutel-id's naar sleutels omzet.
  2. De clientbibliotheek downloadt de versleutelde gegevens samen met het versleutelingsmateriaal dat is opgeslagen in Azure Storage.
  3. 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 algoritme uitpakken van de Azure Key Vault of een ander sleutelarchief aan.
  4. De clientbibliotheek gebruikt de CEK om de versleutelde gebruikersgegevens te ontsleutelen.

Versleuteling/ontsleuteling bij het uploaden/downloaden van blob

De Blob Storage-clientbibliotheek ondersteunt alleen versleuteling van hele blobs bij uploaden. Voor downloads worden zowel volledige downloads als bereikdownloads ondersteund.

Tijdens de versleuteling genereert de clientbibliotheek een willekeurige initialisatievector (IV) van 16 bytes en een willekeurige CEK van 32 bytes en voert de envelopversleuteling van de blobgegevens uit met behulp van deze informatie. De verpakte CEK en enkele aanvullende versleutelingsmetagegevens worden vervolgens opgeslagen als blobmetagegevens, samen met de versleutelde blob.

Wanneer een client een volledige blob downloadt, wordt de verpakte CEK uitgepakt en samen met de IV gebruikt om de ontsleutelde gegevens naar de client te retourneren.

Bij het downloaden van een willekeurig bereik in de versleutelde blob moet het bereik van gebruikers worden aangepast om een kleine hoeveelheid extra gegevens te krijgen die kunnen worden gebruikt om het aangevraagde bereik te ontsleutelen.

Alle blobtypen (blok-blobs, pagina-blobs en toevoeg-blobs) kunnen met dit schema worden versleuteld/ontsleuteld.

Waarschuwing

Als u uw eigen metagegevens voor de blob bewerkt of uploadt, moet u ervoor zorgen dat de metagegevens van de versleuteling behouden blijven. Als u nieuwe metagegevens uploadt zonder ook de versleutelingsmetagegevens te behouden, gaan de verpakte CEK, IV en andere metagegevens verloren en kunt u de inhoud van de blob niet ophalen. Het aanroepen van de bewerking Set Blob Metadata vervangt altijd alle blobmetagegevens.

Gebruik bij het lezen van of schrijven naar een versleutelde blob opdrachten voor het uploaden van hele blob, zoals Put Blob, en downloadopdrachten voor bereik of hele blob, zoals Blob ophalen. Schrijf niet naar een versleutelde blob met behulp van protocolbewerkingen zoals Put Block, Put Block List, Put Page of Append Block. Het aanroepen van deze bewerkingen op een versleutelde blob kan deze beschadigen en onleesbaar maken.

Voorbeeld: een blob versleutelen en ontsleutelen met versleuteling aan de clientzijde v2

In het codevoorbeeld in deze sectie ziet u hoe u versleuteling aan de clientzijde v2 gebruikt om een blob te versleutelen en te ontsleutelen.

Belangrijk

Als u gegevens hebt die eerder zijn versleuteld met versleuteling aan de clientzijde v1, moet u die gegevens ontsleutelen en opnieuw versleutelen met versleuteling aan de clientzijde v2. Zie de richtlijnen en het voorbeeld voor uw clientbibliotheek hieronder.

Als u versleuteling aan de clientzijde van uw .NET-code wilt gebruiken, raadpleegt u de Blob Storage-clientbibliotheek. Zorg ervoor dat u versie 12.13.0 of hoger gebruikt. Als u wilt migreren van versie 11.x naar versie 12.13.0, raadpleegt u de migratiehandleiding.

Er zijn twee extra pakketten vereist voor Azure Key Vault-integratie voor versleuteling aan de clientzijde:

  • Het Azure.Core-pakket biedt de IKeyEncryptionKey interfaces en IKeyEncryptionKeyResolver . De Blob Storage-clientbibliotheek voor .NET definieert deze assembly al als een afhankelijkheid.

  • Het pakket Azure.Security.KeyVault.Keys (versie 4.x en hoger) biedt de Key Vault REST-client en de cryptografische clients die worden gebruikt met versleuteling aan de clientzijde. U moet ervoor zorgen dat naar dit pakket wordt verwezen in uw project als u Azure Key Vault gebruikt als uw sleutelarchief.

    Azure Key Vault is ontworpen voor hoogwaardige hoofdsleutels, en beperkingslimieten per sleutelkluis weerspiegelen dit ontwerp. Vanaf versie 4.1.0 van Azure.Security.KeyVault.Keys biedt de IKeyEncryptionKeyResolver interface geen ondersteuning voor het opslaan van sleutels in cache. Als caching nodig is vanwege beperking, kunt u de methode in dit voorbeeld gebruiken om een cachelaag in een Azure.Security.KeyVault.Keys.Cryptography.KeyResolver exemplaar te injecteren.

Ontwikkelaars kunnen een sleutel, een sleutel-resolver of zowel een sleutel als een sleutel-resolver bieden. Sleutels worden geïdentificeerd met behulp van een sleutel-id die de logica biedt voor het verpakken en uitpakken van de CEK. Een sleutelosser wordt gebruikt om een sleutel op te lossen tijdens het ontsleutelingsproces. De sleutelosser definieert een methode voor oplossen die een sleutel retourneert met een sleutel-id. De resolver biedt gebruikers de mogelijkheid om te kiezen tussen meerdere sleutels die op meerdere locaties worden beheerd.

Bij versleuteling wordt de sleutel altijd gebruikt en de afwezigheid van een sleutel resulteert in een fout.

Als bij ontsleuteling de sleutel is opgegeven en de id overeenkomt met de vereiste sleutel-id, wordt die sleutel gebruikt voor ontsleuteling. Anders probeert de clientbibliotheek de resolver aan te roepen. Als er geen resolver is opgegeven, genereert de clientbibliotheek een fout. Als er een resolver is opgegeven, wordt de sleutelosser aangeroepen om de sleutel op te halen. Als de resolver is opgegeven, maar geen toewijzing voor de sleutel-id heeft, genereert de clientbibliotheek een fout.

Als u versleuteling aan de clientzijde wilt gebruiken, maakt u een ClientSideEncryptionOptions-object en stelt u dit in bij het maken van de client met SpecializedBlobClientOptions. U kunt geen versleutelingsopties per API instellen. De rest wordt intern afgehandeld door de clientbibliotheek.

// Your key and key resolver instances, either through Azure Key Vault SDK or an external implementation.
IKeyEncryptionKey key;
IKeyEncryptionKeyResolver keyResolver;

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

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

// Create blob client with client-side encryption enabled.
// Client-side encryption options are passed from service clients to container clients, 
// and from container clients to blob clients.
// 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.
BlobClient blob = new BlobServiceClient(connectionString, options).GetBlobContainerClient("my-container").GetBlobClient("myBlob");

// Upload the encrypted contents to the blob.
blob.Upload(stream);

// Download and decrypt the encrypted contents from the blob.
MemoryStream outputStream = new MemoryStream();
blob.DownloadTo(outputStream);

U kunt versleutelingsopties toepassen op een BlobServiceClient-, BlobContainerClient- of BlobClient-constructors die BlobClientOptions-objecten accepteren.

Als er al een BlobClient-object in uw code bestaat, maar geen versleutelingsopties aan de clientzijde bevat, kunt u een extensiemethode gebruiken om een kopie van dat object te maken met de opgegeven ClientSideEncryptionOptions. Met deze extensiemethode voorkomt u de overhead van het maken van een nieuw BlobClient-object .

using Azure.Storage.Blobs.Specialized;

// An existing BlobClient instance and encryption options.
BlobClient plaintextBlob;
ClientSideEncryptionOptions encryptionOptions;

// Get a copy of the blob that uses client-side encryption.
BlobClient clientSideEncryptionBlob = plaintextBlob.WithClientSideEncryptionOptions(encryptionOptions);

Nadat u uw code hebt bijgewerkt om versleuteling aan de clientzijde v2 te gebruiken, moet u ervoor zorgen dat u bestaande versleutelde gegevens ontsleutelt en opnieuw versleutelt, zoals beschreven in Eerder versleutelde gegevens opnieuw versleutelen met versleuteling aan de clientzijde v2.

Eerder versleutelde gegevens opnieuw versleutelen met versleuteling aan clientzijde v2

Alle gegevens die eerder zijn versleuteld met versleuteling aan de clientzijde v1, moeten worden ontsleuteld en vervolgens opnieuw worden versleuteld met versleuteling aan de clientzijde v2 om het beveiligingsprobleem te verhelpen. Voor ontsleuteling moeten de gegevens worden gedownload en voor hercodering moet deze opnieuw worden geladen naar Blob Storage.

Zie het voorbeeldproject versleutelingsmigratie voor een voorbeeldproject dat laat zien hoe u gegevens migreert van versleuteling aan de clientzijde v1 naar v2 en hoe u gegevens versleutelt met versleuteling aan de clientzijde v2 in .NET.

Versleuteling en prestaties aan clientzijde

Houd er rekening mee dat het versleutelen van uw opslaggegevens leidt tot extra overhead voor prestaties. Wanneer u versleuteling aan de clientzijde in uw toepassing gebruikt, moet de clientbibliotheek de CEK en IV veilig genereren, de inhoud zelf versleutelen, communiceren met het door u gekozen sleutelarchief voor sleutel-omhulling, en aanvullende metagegevens opmaken en uploaden. Deze overhead is afhankelijk van de hoeveelheid gegevens die wordt versleuteld. We raden klanten aan hun toepassingen altijd te testen op prestaties tijdens de ontwikkeling.

Volgende stappen