Kurz: Šifrování a dešifrování objektů blob pomocí Azure Key Vaultu

V tomto kurzu se naučíte používat šifrování na straně klienta k šifrování a dešifrování objektů blob pomocí klíče uloženého ve službě Azure Key Vault.

Azure Blob Storage podporuje šifrování na straně služby i na straně klienta. Pro většinu scénářů microsoft doporučuje používat funkce šifrování na straně služby, které usnadňují ochranu vašich dat. Další informace o šifrování na straně služby najdete v tématu Šifrování neaktivních uložených dat ve službě Azure Storage.

Klientská knihovna Azure Blob Storage pro .NET podporuje šifrování dat na straně klienta v aplikacích před nahráním do služby Azure Storage a dešifrováním dat při stahování do klienta. Knihovna také podporuje integraci se službou Azure Key Vault pro správu klíčů.

V tomto kurzu získáte informace o následujících postupech:

  • Konfigurace oprávnění pro prostředek služby Azure Key Vault
  • Vytvoření konzolové aplikace pro interakci s prostředky pomocí klientských knihoven .NET
  • Přidání klíče do trezoru klíčů
  • Konfigurace možností šifrování na straně klienta pomocí klíče uloženého v trezoru klíčů
  • Vytvoření objektu klienta služby Blob Service s povoleným šifrováním na straně klienta
  • Nahrání šifrovaného objektu blob a následné stažení a dešifrování objektu blob

Předpoklady

Přiřazení role uživateli Microsoft Entra

Při místním vývoji se ujistěte, že uživatelský účet, který přistupuje k trezoru klíčů, má správná oprávnění. K vytvoření klíče a provádění akcí s klíči v trezoru klíčů budete potřebovat roli kryptografického důstojníka služby Key Vault. Role Azure RBAC můžete uživateli přiřadit pomocí webu Azure Portal, Azure CLI nebo Azure PowerShellu. Další informace o dostupných oborech pro přiřazení rolí najdete na stránce přehledu oboru.

V tomto scénáři přiřadíte oprávnění k uživatelskému účtu s vymezeným trezorem klíčů, abyste mohli dodržovat zásadu nejnižších oprávnění. Tento postup poskytuje uživatelům jenom minimální potřebná oprávnění a vytváří bezpečnější produkční prostředí.

Následující příklad ukazuje, jak přiřadit roli kryptografického důstojníka služby Key Vault k vašemu uživatelskému účtu, který poskytuje přístup, který budete potřebovat k dokončení tohoto kurzu.

Důležité

Ve většině případů bude trvat minutu nebo dvě, než se přiřazení role rozšíří v Azure, ale ve výjimečných případech může trvat až osm minut. Pokud při prvním spuštění kódu dojde k chybám ověřování, chvíli počkejte a zkuste to znovu.

  1. Na webu Azure Portal vyhledejte trezor klíčů pomocí hlavního panelu hledání nebo levé navigace.

  2. Na stránce přehledu trezoru klíčů v nabídce vlevo vyberte Řízení přístupu (IAM ).

  3. Na stránce Řízení přístupu (IAM) vyberte kartu Přiřazení rolí.

  4. V horní nabídce vyberte + Přidat a potom přidejte přiřazení role z výsledné rozevírací nabídky.

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

  5. Pomocí vyhledávacího pole vyfiltrujte výsledky podle požadované role. V tomto příkladu vyhledejte kryptografický důstojník služby Key Vault a vyberte odpovídající výsledek a pak zvolte Další.

  6. V části Přiřadit přístup vyberte Uživatel, skupina nebo instanční objekt a pak zvolte + Vybrat členy.

  7. V dialogovém okně vyhledejte své uživatelské jméno Microsoft Entra (obvykle vaše user@domain e-mailová adresa) a pak v dolní části dialogového okna zvolte Vybrat .

  8. Vyberte Zkontrolovat a přiřadit přejděte na poslední stránku a pak proces dokončete opětovnou kontrolou a přiřazením .

Nastavení projektu

  1. V okně konzoly (například PowerShell nebo Bash) pomocí dotnet new příkazu vytvořte novou konzolovou aplikaci s názvem BlobEncryptionKeyVault. Tento příkaz vytvoří jednoduchý projekt "Hello World" C# s jedním zdrojovým souborem: Program.cs.

    dotnet new console -n BlobEncryptionKeyVault
    
  2. Přepněte do nově vytvořeného adresáře BlobEncryptionKeyVault .

    cd BlobEncryptionKeyVault
    
  3. Otevřete projekt v požadovaném editoru kódu. Otevření projektu v:

    • Visual Studio vyhledejte a poklikejte na BlobEncryptionKeyVault.csproj soubor.
    • Visual Studio Code spusťte následující příkaz:
    code .
    

Pokud chcete v tomto příkladu pracovat se službami Azure, nainstalujte následující klientské knihovny pomocí dotnet add package.

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

Přidejte následující using direktivy a nezapomeňte do System.Configuration projektu přidat odkaz.

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;

Nastavení proměnné prostředí

Tato aplikace hledá proměnnou prostředí volanou KEY_VAULT_NAME k načtení názvu trezoru klíčů. Pokud chcete nastavit proměnnou prostředí, otevřete okno konzoly a postupujte podle pokynů pro váš operační systém. Nahraďte <your-key-vault-name> názvem trezoru klíčů.

Windows:

Proměnné prostředí pro Windows můžete nastavit z příkazového řádku. Při použití tohoto přístupu jsou však hodnoty přístupné pro všechny aplikace spuštěné v tomto operačním systému a můžou způsobit konflikty, pokud nejste opatrní. Proměnné prostředí je možné nastavit na úrovni uživatele nebo systému:

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

Po přidání proměnné prostředí ve Windows musíte spustit novou instanci příkazového okna. Pokud používáte Visual Studio ve Windows, možná budete muset po vytvoření proměnné prostředí znovu otevřít Visual Studio, aby se změna zjistila.

Linux:

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

Přidání klíče ve službě Azure Key Vault

V tomto příkladu vytvoříme klíč a přidáme ho do trezoru klíčů pomocí klientské knihovny služby Azure Key Vault. Můžete také vytvořit a přidat klíč do trezoru klíčů pomocí Azure CLI, webu Azure Portal nebo PowerShellu.

V následující ukázce vytvoříme objekt KeyClient pro zadaný trezor. Objekt KeyClient se pak použije k vytvoření nového klíče RSA v zadaném trezoru.

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

Vytvoření instancí překladače klíčů a klíčů

Dále použijeme klíč, který jsme právě přidali do trezoru, abychom vytvořili instance klienta kryptografie a překladače klíčů. CryptographyClient implementuje IKeyEncryptionKey a slouží k provádění kryptografických operací s klíči uloženými ve službě Azure Key Vault. KeyResolver implementuje IKeyEncryptionResolver a načte šifrovací klíče klíče z identifikátoru klíče a přeloží klíč.

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

Pokud máte v trezoru existující klíč, pomocí kterého chcete šifrovat, můžete vytvořit instance překladače klíčů a klíčů předáním identifikátoru URI:

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

Konfigurace možností šifrování

Teď musíme nakonfigurovat možnosti šifrování, které se použijí pro nahrávání a stahování objektů blob. Abychom mohli použít šifrování na straně klienta, nejprve vytvoříme ClientSideEncryptionOptions objekt a nastavíme ho při vytváření klienta pomocí SpecializedBlobClientOptions.

Třída ClientSideEncryptionOptions poskytuje možnosti konfigurace klienta pro připojení ke službě Blob Storage pomocí šifrování na straně klienta. KeyEncryptionKey se vyžaduje pro operace nahrávání a slouží k zabalení vygenerovaného šifrovacího klíče obsahu. KeyResolver se vyžaduje pro operace stahování a načte správný šifrovací klíč klíče k rozbalení staženého šifrovacího klíče obsahu. KeyWrapAlgorithm se vyžaduje pro nahrání a určuje identifikátor algoritmu, který se má použít při zabalení šifrovacího klíče obsahu.

Důležité

Kvůli ohrožení zabezpečení ve verzi 1 se doporučuje sestavit ClientSideEncryptionOptions objekt pomocí ClientSideEncryptionVersion.V2_0 parametru verze. Další informace o zmírnění ohrožení zabezpečení v aplikacích najdete v tématu Zmírnění ohrožení zabezpečení v aplikacích. Další informace o tomto ohrožení zabezpečení najdete v tématu Aktualizace šifrování na straně klienta v sadě SDK, aby se vyřešilo ohrožení zabezpečení.

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

Konfigurace klientského objektu pro použití šifrování na straně klienta

V tomto příkladu použijeme možnosti konfigurace šifrování na straně klienta u objektu BlobServiceClient . Při použití na úrovni klienta služby se tyto možnosti šifrování předávají z klienta služby klientům kontejneru a z klientů kontejnerů do klientů objektů blob. BlobClient Když objekt provede operaci nahrávání nebo stahování, klientské knihovny Azure Blob Storage používají šifrování obálek k šifrování a dešifrování objektů blob na straně klienta. Šifrování obálek šifruje klíč jedním nebo více dalšími klíči.

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

Šifrování objektu blob a nahrání

BlobClient Když objekt volá metodu nahrávání, dojde k několika krokům pro provedení šifrování na straně klienta:

  1. Klientská knihovna Azure Storage generuje vektor náhodné inicializace (IV) 16 bajtů a šifrovací klíč náhodného obsahu (CEK) 32 bajtů a pomocí těchto informací provádí šifrování dat objektů blob obálky.
  2. Data objektu blob se šifrují pomocí klíče CEK.
  3. Klíč CEK se pak zabalí (zašifruje) pomocí šifrovacího klíče klíče (KEK), který jsme zadali v ClientSideEncryptionOptions. V tomto příkladu je klíč KEK asymetrický pár uložený v zadaném prostředku služby Azure Key Vault. Samotný klient objektu blob nemá přístup k klíči KEK, pouze vyvolá algoritmus zabalení klíče, který poskytuje Služba Key Vault.
  4. Šifrovaná data objektů blob se pak nahrají do účtu úložiště.

Přidejte následující kód, který zašifruje objekt blob a nahraje ho do účtu úložiště Azure:

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

Po nahrání objektu blob můžete zobrazit objekt blob v účtu úložiště a zobrazit šifrovaný obsah spolu s metadaty šifrování.

Dešifrování objektu blob a stažení

Klientská knihovna Azure Storage předpokládá, že uživatel spravuje klíč KEK místně nebo v trezoru klíčů. Uživatel nemusí znát konkrétní klíč, který se použil k šifrování. Překladač klíčů zadaný v ClientSideEncryptionOptions se použije k překladu identifikátorů klíčů při stažení a dešifrování dat objektů blob.

BlobClient Když objekt volá metodu stahování, dojde k několika krokům k dešifrování šifrovaných dat objektů blob:

  1. Klientská knihovna stáhne šifrovaná data objektů blob, včetně metadat šifrování, z účtu úložiště.
  2. Zabalený klíč CEK se pak rozbalí (dešifruje) pomocí klíče KEK. Klientská knihovna nemá během tohoto procesu přístup k klíči KEK, ale vyvolá pouze algoritmus rozbalení klíče zadaný v ClientSideEncryptionOptions. Privátní klíč klíče RSA zůstává v trezoru klíčů, takže šifrovaný klíč z metadat objektů blob, která obsahuje klíč CEK, se odešle do trezoru klíčů k dešifrování.
  3. Klientská knihovna používá klíč CEK k dešifrování šifrovaných dat objektů blob.

Přidejte následující kód pro stažení a dešifrování objektu blob, který jste nahráli dříve.

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

Další kroky

V tomto kurzu jste zjistili, jak pomocí klientských knihoven .NET provádět šifrování na straně klienta pro operace nahrávání a stahování objektů blob.

Obecný přehled šifrování na straně klienta pro objekty blob, včetně pokynů pro migraci šifrovaných dat na verzi 2, najdete v tématu Šifrování na straně klienta pro objekty blob.

Další informace o službě Azure Key Vault najdete na stránce přehledu služby Azure Key Vault.