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 biedt ook ondersteuning voor integratie met Azure Key Vault voor sleutelbeheer voor opslagaccounts.

Belangrijk

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.

Zie Versleutelen en ontsleutelen van blobs in Microsoft Azure Storage met behulp van Azure Key Vault voor een stapsgewijze zelfstudie waarin u blobs versleutelt met behulp van versleuteling aan de clientzijde en Azure Key Vault.

Over versleuteling aan clientzijde

De Azure Blob Storage-clientbibliotheek gebruikt 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-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, Beperk het beveiligingsprobleem in uw toepassingen voor meer informatie.

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 een of meer van de volgende acties onmiddellijk 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 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 de SDK-ondersteuningsmatrix voor versleuteling aan clientzijde voor een lijst met ondersteunde versies. Meer informatie...

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

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

Download 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 om privé-eindpunten te gebruiken om al het verkeer tussen uw virtuele netwerk (VNet) en uw opslagaccount te beveiligen via een privékoppeling. Zie Privé-eindpunten gebruiken voor Azure Storage voor meer informatie.
  • Beperk alleen de netwerktoegang tot specifieke netwerken.

SDK-ondersteuningsmatrix voor versleuteling aan clientzijde

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

.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 gebruikmaakt van versleuteling aan de clientzijde met een eerdere versie van de .NET-, Java- of Python-clientbibliotheek, moet u eerst uw code upgraden naar een versie die versleuteling aan de clientzijde ondersteunt v2. 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 ondersteuning biedt voor versleuteling aan de clientzijde v2 naast een eerdere versie van de clientbibliotheek terwijl u uw code migreert. Zie voorbeeld voor codevoorbeelden: een blob versleutelen en ontsleutelen met versleuteling aan de clientzijde v2.

Hoe versleuteling aan clientzijde werkt

De Azure Blob Storage clientbibliotheken gebruiken envelopversleuteling om uw gegevens aan de clientzijde te versleutelen en 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 CEK (Content Encryption Key), een eenmalige symmetrische sleutel.

  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 er desgewenst voor kiezen om aangepaste providers te gebruiken voor sleutelterugloop/uitpakken.

  4. De versleutelde gegevens worden vervolgens geüpload naar Azure Blob Storage. De verpakte sleutel samen met enkele extra versleutelingsmetagegevens wordt 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 waarmee verschillende sleutel-id's aan sleutels worden omgezet, worden ingesteld en gebruikt.
  2. De clientbibliotheek downloadt de versleutelde gegevens samen met elk 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 uitgepakte algoritme 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 blobs

De Blob Storage-clientbibliotheek ondersteunt alleen versleuteling van hele blobs bij het uploaden. Voor downloads worden zowel volledige 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 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.

Het downloaden van een willekeurig bereik in de versleutelde blob omvat het aanpassen van het bereik van gebruikers om een kleine hoeveelheid extra gegevens te krijgen die kan worden gebruikt om het aangevraagde bereik te ontsleutelen.

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

Waarschuwing

Als u uw eigen metagegevens voor de blob bewerkt of uploadt, moet u ervoor zorgen dat de versleutelingsmetagegevens 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. Als u de bewerking Blobmetagegevens instellen aanroept, worden altijd alle blobmetagegevens vervangen.

Bij het lezen van of schrijven naar een versleutelde blob gebruikt u opdrachten voor het uploaden van hele blobs, zoals Put Blob, en bereik- of hele blobdownloadopdrachten, zoals Get Blob. Vermijd schrijven naar een versleutelde blob met behulp van protocolbewerkingen zoals Put Block, Put Block List, Put Page of Append Block. Als u deze bewerkingen aanroept op een versleutelde blob, kan deze beschadigd raken en kan deze onleesbaar worden.

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 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 voorbeelden 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 clientzijde:

  • Het Azure.Core-pakket biedt de IKeyEncryptionKey en IKeyEncryptionKeyResolver interfaces. 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 dit pakket wordt verwezen in uw project als u Azure Key Vault als sleutelarchief gebruikt.

    Azure Key Vault is ontworpen voor hoofdsleutels met hoge waarde en beperkingslimieten per sleutelkluis weerspiegelen dit ontwerp. Vanaf versie 4.1.0 van Azure.Security.KeyVault.Keys biedt de IKeyEncryptionKeyResolver interface geen ondersteuning voor sleutelcaching. Als caching nodig is vanwege bandbreedtebeperking, kunt u de benadering 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 sleutel-resolver wordt gebruikt om een sleutel tijdens het ontsleutelingsproces op te lossen. De sleutel resolver definieert een oplossingsmethode die een sleutel retourneert op basis van 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 resulteert het ontbreken van een sleutel in een fout.

Bij ontsleuteling, als 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 sleutel-resolver aangeroepen om de sleutel op te halen. Als de resolver is opgegeven, maar geen toewijzing heeft voor de sleutel-id, 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 versleutelingsopties niet per API instellen. Alle andere items worden intern verwerkt 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. Deze extensiemethode voorkomt 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 voor het gebruik van versleuteling aan de clientzijde v2, 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 beperken. Voor ontsleuteling moeten de gegevens worden gedownload en moet opnieuw worden versleuteld naar Blob Storage.

Voor een voorbeeldproject waarin wordt getoond 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, raadpleegt u het voorbeeldproject versleutelingsmigratie.

Versleuteling en prestaties aan clientzijde

Houd er rekening mee dat het versleutelen van uw opslaggegevens leidt tot extra overhead op het gebied van 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 uw gekozen sleutelarchief voor sleutel-enveloppen en extra metagegevens opmaken en uploaden. Deze overhead varieert afhankelijk van de hoeveelheid gegevens die wordt versleuteld. We raden klanten aan hun toepassingen altijd te testen op prestaties tijdens de ontwikkeling.

Volgende stappen