Šifrování objektů blob na straně klienta

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

Důležité

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.

Podrobný kurz, který vás provede procesem šifrování objektů blob pomocí šifrování na straně klienta a azure Key Vault, najdete v tématu Šifrování a dešifrování objektů blob v Microsoft Azure Storage pomocí Azure Key Vault.

Šifrování na straně klienta

Klientská knihovna Azure Blob Storage používá K šifrování uživatelských dat službu AES. V klientské knihovně jsou k dispozici dvě verze šifrování na straně klienta:

Upozornění

Použití šifrování na straně klienta verze 1 se už nedoporučuje kvůli ohrožení zabezpečení v implementaci režimu CBC klientské knihovny. Další informace o této chybě zabezpečení najdete v tématu Věnovaném aktualizaci šifrování na straně klienta v sadě SDK za účelem řešení ohrožení zabezpečení. Pokud aktuálně používáte verzi 1, doporučujeme aktualizovat aplikaci tak, aby používala verzi 2, a migrovat data. Další pokyny najdete v následující části Věnované zmírnění ohrožení zabezpečení ve vašich aplikacích.

Zmírnění ohrožení zabezpečení ve vašich aplikacích

Kvůli ohrožení zabezpečení zjištěnému v implementaci režimu CBC klientské knihovny služby Blob Storage microsoft doporučuje okamžitě provést jednu nebo více následujících akcí:

  • Zvažte použití funkcí šifrování na straně služby místo šifrování na straně klienta. Další informace o funkcích šifrování na straně služby najdete v tématu Šifrování neaktivních uložených dat ve službě Azure Storage.

  • Pokud potřebujete použít šifrování na straně klienta, proveďte migraci aplikací z šifrování na straně klienta v1 na šifrování na straně klienta v2.

Následující tabulka shrnuje kroky, které budete muset provést, pokud se rozhodnete migrovat aplikace na šifrování na straně klienta v2:

Stav šifrování na straně klienta Doporučené akce
Aplikace používá šifrování na straně klienta ve verzi klientské knihovny, která podporuje pouze šifrování na straně klienta v1. Aktualizujte aplikaci tak, aby používala verzi klientské knihovny, která podporuje šifrování na straně klienta v2. Seznam podporovaných verzí najdete v matici podpory sady SDK pro šifrování na straně klienta . Víc se uč...

Aktualizujte kód tak, aby používal šifrování na straně klienta v2. Víc se uč...

Stáhněte si všechna zašifrovaná data, abyste je dešifrovali, a pak je znovu zašifrujte pomocí šifrování na straně klienta v2. Víc se uč...
Aplikace používá šifrování na straně klienta s verzí klientské knihovny, která podporuje šifrování na straně klienta v2. Aktualizujte kód tak, aby používal šifrování na straně klienta v2. Víc se uč...

Stáhněte si všechna zašifrovaná data, abyste je dešifrovali, a pak je znovu zašifrujte pomocí šifrování na straně klienta v2. Víc se uč...

Společnost Microsoft navíc doporučuje, abyste podnikli následující kroky, které vám pomůžou zabezpečit vaše data:

  • Nakonfigurujte účty úložiště tak, aby používaly privátní koncové body k zabezpečení veškerého provozu mezi virtuální sítí (VNet) a účtem úložiště přes privátní propojení. Další informace najdete v tématu Použití privátních koncových bodů pro Azure Storage.
  • Omezte síťový přístup pouze na konkrétní sítě.

Matice podpory sady SDK pro šifrování na straně klienta

Následující tabulka ukazuje, které verze klientských knihoven pro .NET, Javu a Python podporují, které verze šifrování na straně klienta:

.NET Java Python
Šifrování na straně klienta v2 a v1 Verze 12.13.0 a novější Verze 12.18.0 a novější Verze 12.13.0 a novější
Pouze šifrování na straně klienta v1 Verze 12.12.0 a starší Verze 12.17.0 a starší Verze 12.12.0 a starší

Pokud vaše aplikace používá šifrování na straně klienta se starší verzí klientské knihovny .NET, Javy nebo Pythonu, musíte nejprve upgradovat kód na verzi, která podporuje šifrování na straně klienta v2. Dále musíte data dešifrovat a znovu zašifrovat pomocí šifrování na straně klienta verze 2. V případě potřeby můžete při migraci kódu použít verzi klientské knihovny, která podporuje šifrování na straně klienta v2 se starší verzí klientské knihovny. Příklady kódu najdete v tématu Příklad: Šifrování a dešifrování objektu blob pomocí šifrování na straně klienta v2.

Jak funguje šifrování na straně klienta

Azure Blob Storage klientské knihovny používají šifrování obálky k šifrování a dešifrování dat na straně klienta. Šifrování obálky šifruje klíč pomocí jednoho nebo více dalších klíčů.

Klientské knihovny služby Blob Storage spoléhají na Azure Key Vault k ochraně klíčů, které se používají k šifrování na straně klienta. Další informace o azure Key Vault najdete v tématu Co je Azure Key Vault?.

Šifrování a dešifrování pomocí techniky obálky

Šifrování prostřednictvím techniky obálky funguje takto:

  1. Klientská knihovna Azure Storage vygeneruje šifrovací klíč obsahu (CEK), což je symetrický klíč pro jednorázové použití.

  2. Uživatelská data se šifrují pomocí CEK.

  3. Klíč CEK se pak zabalí (zašifruje) pomocí šifrovacího klíče klíče (KEK). Klíč KEK je identifikován identifikátorem klíče a může to být asymetrický pár klíčů nebo symetrický klíč. Klíč KEK můžete spravovat místně nebo ho uložit do Key Vault Azure.

    Samotná klientská knihovna Azure Storage nikdy nemá přístup ke klíči KEK. Knihovna vyvolá algoritmus obtékání klíčů, který poskytuje Key Vault. Uživatelé se můžou rozhodnout, že k zabalení nebo rozbalení klíčů použijí vlastní zprostředkovatele, pokud je to potřeba.

  4. Šifrovaná data se pak nahrají do Azure Blob Storage. Zabalený klíč spolu s dalšími metadaty šifrování se uloží jako metadata v objektu blob.

Dešifrování pomocí techniky obálky funguje takto:

  1. Klientská knihovna Azure Storage předpokládá, že uživatel spravuje klíč KEK buď místně, nebo v azure Key Vault. Uživatel nemusí znát konkrétní klíč, který byl použit k šifrování. Místo toho je možné nastavit a použít překladač klíčů, který překládá různé identifikátory klíčů na klíče.
  2. Klientská knihovna stáhne šifrovaná data spolu s veškerým šifrovacím materiálem uloženým ve službě Azure Storage.
  3. Zabalený klíč CEK) se pak rozbalí (dešifruje) pomocí KEK. Klientská knihovna nemá během tohoto procesu přístup ke klíči KEK, ale vyvolá pouze algoritmus pro rozbalování Key Vault Azure nebo jiného úložiště klíčů.
  4. Klientská knihovna používá klíč CEK k dešifrování zašifrovaných uživatelských dat.

Šifrování/dešifrování při nahrávání/stahování objektů blob

Klientská knihovna Blob Storage podporuje šifrování celých objektů blob pouze při nahrání. Pro stahování se podporuje úplné stahování i stahování rozsahu.

Během šifrování vygeneruje klientská knihovna náhodný inicializační vektor (IV) 16 bajtů a náhodný klíč CEK 32 bajtů a pomocí těchto informací provede šifrování obálek dat objektů blob. Zabalený klíč CEK a některá další metadata šifrování se pak uloží jako metadata objektů blob společně se šifrovaným objektem blob.

Když klient stáhne celý objekt blob, zabalený klíč CEK se rozbalí a použije se společně s iv k vrácení dešifrovaných dat klientovi.

Stažení libovolného rozsahu v zašifrovaném objektu blob zahrnuje úpravu rozsahu poskytovaného uživateli, aby se získalo malé množství dalších dat, která lze použít k úspěšnému dešifrování požadovaného rozsahu.

Pomocí tohoto schématu je možné šifrovat nebo dešifrovat všechny typy objektů blob (objekty blob bloku, objekty blob stránky a doplňovací objekty blob).

Upozornění

Pokud upravujete nebo nahráváte vlastní metadata objektu blob, musíte zajistit, aby se metadata šifrování zachovala. Pokud nahrajete nová metadata, aniž byste zachovali metadata šifrování, dojde ke ztrátě zabalených CEK, IV a dalších metadat a nebudete moct načíst obsah objektu blob. Volání operace Set Blob Metadata vždy nahradí všechna metadata objektů blob.

Při čtení ze šifrovaného objektu blob nebo zápisu do zašifrovaného objektu blob používejte celé příkazy pro nahrání objektů blob, jako je Například Vložit objekt blob, a příkazy pro stažení rozsahu nebo celého objektu blob, například Získat objekt blob. Vyhněte se zápisu do šifrovaného objektu blob pomocí operací protokolu, jako jsou Put Block, Put Block List, Put Page nebo Append Block. Volání těchto operací se šifrovaným objektem blob ho může poškodit a znečišťovat.

Příklad: Šifrování a dešifrování objektu blob pomocí šifrování na straně klienta v2

Příklad kódu v této části ukazuje, jak pomocí šifrování na straně klienta v2 zašifrovat a dešifrovat objekt blob.

Důležité

Pokud máte data, která byla dříve zašifrována šifrováním na straně klienta v1, budete je muset dešifrovat a znovu je zašifrovat pomocí šifrování na straně klienta v2. Projděte si doprovodné materiály a ukázku pro klientskou knihovnu níže.

Pokud chcete použít šifrování na straně klienta z kódu .NET, odkažte se na klientskou knihovnu Blob Storage. Ujistěte se, že používáte verzi 12.13.0 nebo novější. Pokud potřebujete migrovat z verze 11.x na verzi 12.13.0, projděte si průvodce migrací.

Pro integraci Azure Key Vault pro šifrování na straně klienta jsou potřeba dva další balíčky:

  • Balíček Azure.Core poskytuje IKeyEncryptionKey rozhraní a IKeyEncryptionKeyResolver . Klientská knihovna Blob Storage pro .NET už toto sestavení definuje jako závislost.

  • Balíček Azure.Security.KeyVault.Keys (verze 4.x a novější) poskytuje Key Vault klienta REST a kryptografické klienty, kteří se používají s šifrováním na straně klienta. Pokud jako úložiště klíčů používáte Azure Key Vault, musíte zajistit, aby se na tento balíček ve vašem projektu odkazoval.

    Služba Azure Key Vault je navržená pro hlavní klíče s vysokou hodnotou a tento návrh odrážejí limity omezování na trezor klíčů. Od verze 4.1.0 azure.Security.KeyVault.Keys IKeyEncryptionKeyResolver rozhraní nepodporuje ukládání klíčů do mezipaměti. Pokud je ukládání do mezipaměti nezbytné z důvodu omezování, můžete použít přístup, který je ukázaný v této ukázce , a vložit vrstvu Azure.Security.KeyVault.Keys.Cryptography.KeyResolver ukládání do mezipaměti do instance.

Vývojáři můžou poskytnout klíč, překladač klíčů nebo klíč i překladač klíčů. Klíče se identifikují pomocí identifikátoru klíče, který poskytuje logiku pro zabalení a rozbalení klíče CEK. Překladač klíčů se používá k překladu klíče během procesu dešifrování. Překladač klíčů definuje metodu resolve, která vrací klíč zadaný identifikátor klíče. Překladač poskytuje uživatelům možnost výběru mezi několika klíči spravovanými ve více umístěních.

Při šifrování se klíč používá vždy a absence klíče způsobí chybu.

Pokud je při dešifrování zadaný klíč a jeho identifikátor odpovídá požadovanému identifikátoru klíče, použije se tento klíč k dešifrování. V opačném případě se klientská knihovna pokusí volat překladač. Pokud není zadaný žádný překladač, vyvolá klientská knihovna chybu. Pokud je zadán překladač, vyvolá se za účelem získání klíče překladač klíčů. Pokud je překladač zadaný, ale nemá mapování identifikátoru klíče, vyvolá klientská knihovna chybu.

Pokud chcete použít šifrování na straně klienta, vytvořte objekt ClientSideEncryptionOptions a nastavte ho při vytváření klienta pomocí SpecializedBlobClientOptions. Možnosti šifrování nemůžete nastavit pro jednotlivá rozhraní API. Všechno ostatní bude zpracovávat klientská knihovna interně.

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

Možnosti šifrování můžete použít na konstruktory BlobServiceClient, BlobContainerClient nebo BlobClient , které přijímají objekty BlobClientOptions .

Pokud objekt BlobClient už ve vašem kódu existuje, ale nemá možnosti šifrování na straně klienta, můžete pomocí rozšiřující metody vytvořit kopii tohoto objektu s danou hodnotou ClientSideEncryptionOptions. Tato rozšiřující metoda se vyhne režii při vytváření nového objektu BlobClient od začátku.

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

Po aktualizaci kódu tak, aby používal šifrování na straně klienta v2, nezapomeňte deenšifrovat a znovu zašifrovat všechna existující šifrovaná data, jak je popsáno v tématu Opětovné šifrování dříve šifrovaných dat pomocí šifrování na straně klienta v2.

Opětovné šifrování dříve šifrovaných dat pomocí šifrování na straně klienta v2

Všechna data, která byla dříve zašifrovaná šifrováním na straně klienta verze 1, musí být dešifrována a následně znovu zašifrována pomocí šifrování na straně klienta v2, aby se tato chyba zabezpečení zmírnila. Dešifrování vyžaduje stažení dat a opětovné šifrování vyžaduje jejich opětovné načtení do služby Blob Storage.

Ukázkový projekt, který ukazuje, jak migrovat data z šifrování na straně klienta v1 na v2 a jak šifrovat data pomocí šifrování na straně klienta v2 v .NET, najdete v ukázkovém projektu migrace šifrování.

Šifrování a výkon na straně klienta

Mějte na paměti, že šifrování dat úložiště má za následek další režijní náklady na výkon. Když ve své aplikaci používáte šifrování na straně klienta, musí klientská knihovna bezpečně vygenerovat klíče CEK a IV, šifrovat samotný obsah, komunikovat se zvoleným úložištěm klíčů pro zavírání klíčů a formátovat a nahrávat další metadata. Tato režie se liší v závislosti na množství šifrovaných dat. Doporučujeme, aby zákazníci během vývoje vždy testovali výkon svých aplikací.

Další kroky