Versleuteling aan de clientzijde voor blobs
De Azure Blob Storage-clientbibliotheek voor .NET ondersteunt het versleutelen van gegevens in clienttoepassingen voordat u uploadt 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 opslagaccountsleutelbeheer.
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 Blobs versleutelen en ontsleutelen in Microsoft Azure Storage met behulp van Azure Key Vault voor een stapsgewijze zelfstudie waarmee u blobs versleutelt met behulp van versleuteling aan de clientzijde en Azure Key Vault.
Over versleuteling aan de clientzijde
De Azure Blob Storage-clientbibliotheek maakt gebruik van Advanced Encryption Standard (AES) om gebruikersgegevens te versleutelen. Er zijn twee versies van versleuteling aan de clientzijde beschikbaar in de clientbibliotheek:
- Versie 2 maakt gebruik van de GCM-modus (Galois/Counter Mode) met AES.
- Versie 1 maakt gebruik van de CBC-modus (Cipher Block Chaining) met AES.
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 voor meer informatie over dit beveiligingsprobleem versleuteling aan de clientzijde bijwerken in SDK om beveiligingsproblemen op te lossen. 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:
Overweeg het gebruik van versleutelingsfuncties aan de servicezijde in plaats van versleuteling aan de clientzijde. Zie Azure Storage-versleuteling voor data-at-rest voor meer informatie over versleutelingsfuncties aan de servicezijde.
Als u versleuteling aan de clientzijde wilt gebruiken, migreert u uw toepassingen van versleuteling aan de clientzijde v1 naar versleuteling aan de clientzijde v2.
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 van 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 sdk-ondersteuningsmatrix voor versleuteling aan de clientzijde voor een lijst met ondersteunde versies. Meer informatie... Werk uw code bij voor het gebruik van versleuteling aan de clientzijde v2. 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 voor het gebruik van versleuteling aan de clientzijde v2. 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 voor het gebruik van privé-eindpunten 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 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 verschillende 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 |
Notitie
Versleuteling aan de clientzijde v2.1 is beschikbaar in de Java SDK voor versies 12.27.0 en hoger. Met deze versie kunt u de regiolengte voor geverifieerde versleuteling configureren, van 16 bytes tot 1 GiB. Zie het Java-voorbeeld in voorbeeld: Een blob versleutelen en ontsleutelen met versleuteling aan de clientzijde v2 voor meer informatie.
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 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 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 de 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:
De Azure Storage-clientbibliotheek genereert een CEK (Content Encryption Key), een eenmalige symmetrische sleutel.
Gebruikersgegevens worden versleuteld met behulp van de CEK.
De CEK wordt vervolgens verpakt (versleuteld) met behulp van de versleutelingssleutel voor sleutel (KEK). De KEK wordt geïdentificeerd met 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 ervoor kiezen om aangepaste providers te gebruiken voor sleutelterugloop/uitpakken, indien gewenst.
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:
- 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 die verschillende sleutel-id's voor sleutels oplost, worden ingesteld en gebruikt.
- De clientbibliotheek downloadt de versleutelde gegevens samen met alle versleutelingsmateriaal dat is opgeslagen in Azure Storage.
- 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 uitpakkende algoritme van de Azure Key Vault of een ander sleutelarchief aan.
- 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 uploaden. Voor downloads worden zowel volledige als bereikdownloads ondersteund. Versleuteling aan de clientzijde v2 segmenteert gegevens in 4 gebufferde geverifieerde versleutelingsblokken die alleen geheel kunnen worden getransformeerd. Als u de segmentgrootte wilt aanpassen, moet u ervoor zorgen dat u de meest recente versie van de SDK gebruikt die ondersteuning biedt voor versleuteling aan de clientzijde v2.1. De regiolengte kan worden geconfigureerd van 16 bytes tot 1 GiB.
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 extra 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 verkrijgen 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 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 Metagegevens van instellen blob aanroept, worden altijd alle metagegevens van de blob vervangen.
Wanneer u leest van of schrijft naar een versleutelde blob, gebruikt u opdrachten voor het uploaden van hele blobs, zoals Put Blob en bereik of opdrachten voor het downloaden van hele blobs, 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 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 de clientzijde:
Het Azure.Core-pakket biedt de
IKeyEncryptionKey
enIKeyEncryptionKeyResolver
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. Zorg ervoor dat naar dit pakket wordt verwezen in uw project als u Azure Key Vault als sleutelarchief gebruikt.
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 sleutelcaching. Als caching nodig is vanwege bandbreedtebeperking, kunt u de in dit voorbeeld gedemonstreerde benadering gebruiken om een cachelaag in eenAzure.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 op te lossen tijdens het ontsleutelingsproces. 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 het ontbreken 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 sleutel-resolver 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 versleutelingsopties niet per API instellen. Al het andere 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
(new Uri($"https://{accountName}.blob.core.windows.net"), new DefaultAzureCredential(), 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 de 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 dat de versleuteling opnieuw moet worden geladen 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 voor versleutelingsmigratie.
Versleuteling en prestaties aan de 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 is afhankelijk van de hoeveelheid gegevens die wordt versleuteld. We raden klanten aan hun toepassingen altijd te testen op prestaties tijdens de ontwikkeling.