Oktatóanyag: Blobok titkosítása és visszafejtése az Azure Key Vaulttal

Ebben az oktatóanyagban megtudhatja, hogyan használhat ügyféloldali titkosítást a blobok titkosítására és visszafejtésére az Azure Key Vaultban tárolt kulccsal.

Az Azure Blob Storage szolgáltatásoldali és ügyféloldali titkosítást is támogat. A legtöbb forgatókönyv esetében a Microsoft szolgáltatásoldali titkosítási funkciók használatát javasolja az adatok védelme érdekében. A szolgáltatásoldali titkosítással kapcsolatos további információkért tekintse meg az Inaktív adatok Azure Storage-titkosítását.

A .NET-hez készült Azure Blob Storage ügyfélkódtár támogatja az alkalmazások ügyféloldali adattitkosítását, mielőtt feltöltené az Azure Storage-ba, és visszafejtené az adatokat az ügyfélre való letöltés során. A kódtár az Azure Key Vaulttal való integrációt is támogatja a kulcskezeléshez.

Ez az oktatóanyag a következőket mutatja be:

  • Azure Key Vault-erőforrás engedélyeinek konfigurálása
  • Konzolalkalmazás létrehozása az erőforrások .NET-ügyfélkódtárak használatával történő használatához
  • Kulcs hozzáadása kulcstartóhoz
  • Ügyféloldali titkosítási beállítások konfigurálása kulcstartóban tárolt kulccsal
  • Blobszolgáltatás-ügyfélobjektum létrehozása az ügyféloldali titkosítás engedélyezésével
  • Titkosított blob feltöltése, majd a blob letöltése és visszafejtése

Előfeltételek

Szerepkör hozzárendelése a Microsoft Entra-felhasználóhoz

Helyi fejlesztéskor győződjön meg arról, hogy a kulcstartóhoz hozzáférő felhasználói fiók rendelkezik a megfelelő engedélyekkel. Kulcs létrehozásához és a kulcstartó kulcsainak végrehajtásához a Key Vault crypto officer szerepkörre lesz szüksége. Azure RBAC-szerepköröket rendelhet egy felhasználóhoz az Azure Portal, az Azure CLI vagy az Azure PowerShell használatával. A szerepkör-hozzárendelések elérhető hatóköreiről a hatókör áttekintési oldalán tudhat meg többet.

Ebben a forgatókönyvben engedélyeket rendel a felhasználói fiókjához, amely a kulcstartóra terjed ki, hogy kövesse a minimális jogosultság elvét. Ez a gyakorlat csak a minimálisan szükséges engedélyeket biztosítja a felhasználóknak, és biztonságosabb éles környezeteket hoz létre.

Az alábbi példa bemutatja, hogyan rendelheti hozzá a Key Vault crypto officer szerepkört a felhasználói fiókjához, amely biztosítja az oktatóanyag elvégzéséhez szükséges hozzáférést.

Fontos

A szerepkör-hozzárendelés propagálása a legtöbb esetben egy-két percet vesz igénybe az Azure-ban, de ritkán akár nyolc percet is igénybe vehet. Ha hitelesítési hibákat kap a kód első futtatásakor, várjon néhány percet, és próbálkozzon újra.

  1. Az Azure Portalon keresse meg a kulcstartót a fő keresősávon vagy a bal oldali navigációs sávon.

  2. A Key Vault áttekintési oldalán válassza a Hozzáférés-vezérlés (IAM) lehetőséget a bal oldali menüben.

  3. A Hozzáférés-vezérlés (IAM) lapon válassza a Szerepkör-hozzárendelések lapot.

  4. Válassza a +Hozzáadás lehetőséget a felső menüből, majd a szerepkör-hozzárendelés hozzáadása lehetőséget az eredményül kapott legördülő menüből.

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

  5. A keresőmezővel szűrheti az eredményeket a kívánt szerepkörre. Ebben a példában keresse meg a Key Vault titkosítási tisztjét, és válassza ki a megfelelő eredményt, majd válassza a Tovább gombot.

  6. A Hozzáférés hozzárendelése területen válassza a Felhasználó, csoport vagy szolgáltatásnév lehetőséget, majd válassza a + Tagok kijelölése lehetőséget.

  7. A párbeszédpanelen keresse meg a Microsoft Entra-felhasználónevet (általában a user@domain e-mail-címét), majd válassza a Párbeszédpanel alján található Kiválasztás lehetőséget.

  8. Válassza a Véleményezés + hozzárendelés lehetőséget a végső lapra való ugráshoz, majd a folyamat befejezéséhez a Véleményezés + hozzárendelés lehetőséget.

A projekt beállítása

  1. Egy konzolablakban (például a PowerShellben vagy a Bashben) a dotnet new paranccsal hozzon létre egy új, BlobEncryptionKeyVault nevű konzolalkalmazást. Ez a parancs létrehoz egy egyszerű ""Helló világ!" alkalmazás" C#-projektet egyetlen forrásfájllal: Program.cs.

    dotnet new console -n BlobEncryptionKeyVault
    
  2. Váltson az újonnan létrehozott BlobEncryptionKeyVault könyvtárra .

    cd BlobEncryptionKeyVault
    
  3. Nyissa meg a projektet a kívánt kódszerkesztőben. A projekt megnyitása a következő helyen:

    • Visual Studio, keresse meg és kattintson duplán a BlobEncryptionKeyVault.csproj fájlra.
    • A Visual Studio Code futtassa a következő parancsot:
    code .
    

Az Azure-szolgáltatások ebben a példában való használatához telepítse a következő ügyfélkódtárakat a következő használatával dotnet add package.

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

Adja hozzá a következő using irányelveket, és mindenképpen adjon hozzá egy hivatkozást a projekthez System.Configuration .

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;

Környezeti változó beállítása

Ez az alkalmazás egy környezeti változót keres, amely lekéri KEY_VAULT_NAME a kulcstartó nevét. A környezeti változó beállításához nyisson meg egy konzolablakot, és kövesse az operációs rendszer utasításait. Cserélje le <your-key-vault-name> a kulcstartó nevére.

Windows:

A windowsos környezeti változókat a parancssorból állíthatja be. Ha azonban ezt a megközelítést használja, az értékek az adott operációs rendszeren futó összes alkalmazás számára elérhetők, és ütközéseket okozhatnak, ha nem körültekintő. A környezeti változók felhasználói vagy rendszerszinten állíthatók be:

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

Miután hozzáadta a környezeti változót a Windowsban, el kell indítania a parancsablak új példányát. Ha Windows rendszeren használja a Visual Studiót, előfordulhat, hogy újra kell indítania a Visual Studiót, miután létrehozta a környezeti változót a változás észleléséhez.

Linux:

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

Kulcs hozzáadása az Azure Key Vaultban

Ebben a példában létrehozunk egy kulcsot, és hozzáadjuk a kulcstartóhoz az Azure Key Vault ügyfélkódtár használatával. Kulcsokat az Azure CLI, az Azure Portal vagy a PowerShell használatával is létrehozhat és hozzáadhat egy kulcstartóhoz.

Az alábbi mintában létrehozunk egy KeyClient-objektumot a megadott tárolóhoz. Az KeyClient objektum ezután egy új RSA-kulcs létrehozására szolgál a megadott tárolóban.

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

Kulcs- és kulcsfeloldópéldányok létrehozása

Ezután a tárolóhoz most hozzáadott kulccsal hozzuk létre a titkosítási ügyfél- és kulcsfeloldópéldányokat. A CryptographyClient implementálja az IKeyEncryptionKey-t , és az Azure Key Vaultban tárolt kulcsokkal végzett titkosítási műveletek végrehajtására szolgál. A KeyResolver implementálja az IKeyEncryptionResolvert , és lekéri a kulcstitkosítási kulcsokat a kulcsazonosítóból, és feloldja a kulcsot.

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

Ha rendelkezik egy meglévő kulccsal a tárolóban, amellyel titkosítani szeretné, a kulcs- és kulcsfeloldó példányokat az URI-ban való átadással hozhatja létre:

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

Titkosítási beállítások konfigurálása

Most konfigurálnunk kell a blobfeltöltéshez és -letöltéshez használandó titkosítási beállításokat. Az ügyféloldali titkosítás használatához először létrehozunk egy ClientSideEncryptionOptions objektumot, és beállítjuk az ügyféllétrehozáshoz a következővel SpecializedBlobClientOptions: .

A ClientSideEncryptionOptions osztály biztosítja az ügyfélkonfigurációs beállításokat a Blob Storage-hoz ügyféloldali titkosítással való csatlakozáshoz. A KeyEncryptionKey a feltöltési műveletekhez szükséges, és a létrehozott tartalomtitkosítási kulcs körbefuttatására szolgál. A KeyResolver szükséges a letöltési műveletekhez, és lekéri a megfelelő kulcstitkosítási kulcsot a letöltött tartalomtitkosítási kulcs feloldásához. A KeyWrapAlgorithm a feltöltésekhez szükséges, és megadja a tartalomtitkosítási kulcs burkolásakor használni kívánt algoritmus-azonosítót.

Fontos

Az 1-es verzió biztonsági rése miatt ajánlott az objektumot a ClientSideEncryptionOptions verzióparaméter használatával ClientSideEncryptionVersion.V2_0 létrehozni. Ha többet szeretne megtudni az alkalmazások biztonsági résének csökkentéséről, olvassa el az alkalmazások biztonsági résének enyhítése című témakört. A biztonsági résről további információt az Azure Storage ügyféloldali titkosításának frissítése az SDK-ban a biztonsági rés kezelése érdekében című témakörben talál.

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

Ügyfélobjektum konfigurálása ügyféloldali titkosítás használatára

Ebben a példában az ügyféloldali titkosítás konfigurációs beállításait alkalmazzuk egy BlobServiceClient objektumra. A szolgáltatásügyfél szintjén alkalmazva ezek a titkosítási beállítások a szolgáltatásügyféltől a tárolóügyfeleknek, valamint a tárolóügyfelektől a blobügyfeleknek lesznek átadva. Amikor az BlobClient objektum feltöltési vagy letöltési műveletet hajt végre, az Azure Blob Storage ügyfélkódtárai borítéktitkosítással titkosítják és visszafejtik a blobokat az ügyféloldalon. A borítéktitkosítás egy kulcsot egy vagy több további kulcssal titkosít.

// 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 titkosítása és feltöltése

Amikor az BlobClient objektum egy feltöltési módszert hív meg, az ügyféloldali titkosítás végrehajtása több lépésben történik:

  1. Az Azure Storage-ügyfélkódtár egy véletlenszerű inicializálási vektort (IV) hoz létre 16 bájtból és egy 32 bájtból álló véletlenszerű tartalomtitkosítási kulcsot (CEK), és ezen információk használatával elvégzi a blobadatok borítéktitkosítását.
  2. A blobadatok titkosítása a CEK használatával történik.
  3. A CEK ezután be van csomagolva (titkosítva) a megadott ClientSideEncryptionOptionskulcstitkosítási kulccsal (KEK). Ebben a példában a KEK egy aszimmetrikus kulcspár, amely a megadott Azure Key Vault-erőforrásban van tárolva. Maga a blobügyfél soha nem fér hozzá a KEK-hez, csak meghívja a Key Vault által biztosított kulcsburkoló algoritmust.
  4. A titkosított blobadatok ezután fel lesznek töltve a tárfiókba.

Adja hozzá a következő kódot egy blob titkosításához és az Azure Storage-fiókba való feltöltéséhez:

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

A blob feltöltése után megtekintheti a blobot a tárfiókban, és megtekintheti a titkosított tartalmakat a titkosítási metaadatokkal együtt.

Blob visszafejtése és letöltése

Az Azure Storage-ügyfélkódtár feltételezi, hogy a felhasználó helyileg vagy egy kulcstartóban kezeli a KEK-t. A felhasználónak nem kell tudnia a titkosításhoz használt konkrét kulcsot. A blobadatok letöltése és visszafejtése során a rendszer a megadott ClientSideEncryptionOptions kulcsfeloldóval oldja fel a kulcsazonosítókat.

Amikor az BlobClient objektum letöltő metódust hív meg, a titkosított blobadatok visszafejtése több lépésben történik:

  1. Az ügyfélkódtár letölti a titkosított blobadatokat, beleértve a titkosítási metaadatokat is a tárfiókból.
  2. A becsomagolt CEK ezután le van bontva (visszafejtve) a KEK használatával. Az ügyfélkódtár nem fér hozzá a KEK-hez a folyamat során, de csak a megadott ClientSideEncryptionOptionskulcs-feloldási algoritmust hívja meg. Az RSA-kulcspár titkos kulcsa a kulcstartóban marad, így a CEK-et tartalmazó blob metaadataiból származó titkosított kulcsot a rendszer elküldi a kulcstartóba a visszafejtéshez.
  3. Az ügyfélkódtár a CEK használatával fejti vissza a titkosított blobadatokat.

Adja hozzá a következő kódot a korábban feltöltött blob letöltéséhez és visszafejtéséhez.

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

Következő lépések

Ebben az oktatóanyagban megtanulta, hogyan használhatja a .NET-ügyfélkódtárakat a blobfeltöltési és -letöltési műveletek ügyféloldali titkosítására.

A blobok ügyféloldali titkosításának széles körű áttekintéséért, beleértve a titkosított adatok 2. verzióra való migrálásának utasításait, tekintse meg a blobok ügyféloldali titkosítását.

Az Azure Key Vaultról további információt az Azure Key Vault áttekintési oldalán talál.