Šifrování na straně klienta pro objekty blob
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ím 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í objektů blob na straně klienta a služby Azure Key Vault, najdete v tématu Šifrování a dešifrování objektů blob v Microsoft Azure Storage pomocí služby Azure Key Vault.
Informace o šifrování na straně klienta
Klientská knihovna Azure Blob Storage používá k šifrování uživatelských dat standard AES (Advanced Encryption Standard). V klientské knihovně jsou k dispozici dvě verze šifrování na straně klienta:
- Verze 2 používá režim Galois/Counter Mode (GCM) s AES.
- Verze 1 používá režim CBC (Cipher Block Chaining) s AES.
Upozorňující
Použití verze 1 šifrování na straně klienta se už nedoporučuje kvůli ohrožení zabezpečení v implementaci režimu CBC klientské knihovny. 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í. Pokud aktuálně používáte verzi 1, doporučujeme aktualizovat aplikaci tak, aby používala verzi 2 a migrovala data. Další pokyny najdete v následující části: Zmírnění ohrožení zabezpečení v aplikacích.
Zmírnění ohrožení zabezpečení v aplikacích
Vzhledem k ohrožení zabezpečení zjištěnému v implementaci režimu CBC klientské knihovny blob Storage microsoft doporučuje provést jednu nebo více následujících akcí okamžitě:
Místo šifrování na straně klienta zvažte použití funkcí šifrování na straně služby. 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, migrujte aplikace z šifrování na straně klienta v1 na šifrování na straně klienta v2.
Následující tabulka shrnuje kroky, které je potřeba 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 verzi klientské knihovny, která podporuje pouze šifrování na straně klienta verze 1. | Aktualizujte aplikaci tak, aby používala verzi klientské knihovny, která podporuje šifrování na straně klienta verze 2. Seznam podporovaných verzí najdete v matici podpory sady SDK pro šifrování na straně klienta. Další informace.... Aktualizujte kód tak, aby používal šifrování na straně klienta v2. Další informace.... Stáhněte si všechna zašifrovaná data a dešifrujte je a pak je znovu zašifrujte pomocí šifrování na straně klienta v2. Další informace.... |
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. Další informace.... Stáhněte si všechna zašifrovaná data a dešifrujte je a pak je znovu zašifrujte pomocí šifrování na straně klienta v2. Další informace.... |
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 přístup k síti jenom 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í různé 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ší |
Poznámka:
Šifrování na straně klienta verze 2.1 je k dispozici v sadě Java SDK pro verze 12.27.0 a novější. Tato verze umožňuje nakonfigurovat délku oblasti pro ověřené šifrování od 16 bajtů do 1 GiB. Další informace najdete v příkladu Javy v příkladu: Šifrování a dešifrování objektu blob pomocí šifrování na straně klienta v2.
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 v2. V případě potřeby můžete při migraci kódu použít verzi klientské knihovny, která podporuje šifrování na straně klienta verze 2 vedle starší verze 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
Klientské knihovny Azure Blob Storage používají šifrování obálek k šifrování a dešifrování dat na straně klienta. Šifrování obálek šifruje klíč jedním nebo více dalšími klíči.
Klientské knihovny služby Blob Storage využívají službu Azure Key Vault k ochraně klíčů používaných k šifrování na straně klienta. Další informace o službě Azure Key Vault najdete v tématu Co je Azure Key Vault?
Šifrování a dešifrování prostřednictvím techniky obálky
Šifrování prostřednictvím techniky obálky funguje takto:
Klientská knihovna Azure Storage generuje šifrovací klíč obsahu (CEK), což je jednorázový symetrický klíč.
Uživatelská data se šifrují pomocí klíče CEK.
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 být buď asymetrickým párem klíče, nebo symetrickým klíčem. Klíč KEK můžete spravovat místně nebo ho uložit ve službě Azure Key Vault.
Samotná klientská knihovna Azure Storage nemá přístup k klíči KEK. Knihovna vyvolá algoritmus obtékání klíčů, který poskytuje služba Key Vault. V případě potřeby se uživatelé můžou rozhodnout použít vlastní zprostředkovatele pro zabalení nebo rozbalení klíčů.
Šifrovaná data se pak nahrají do služby Azure Blob Storage. Zabalený klíč společně s některými dalšími metadaty šifrování se uloží jako metadata v objektu blob.
Dešifrování prostřednictvím techniky obálky funguje takto:
- Klientská knihovna Azure Storage předpokládá, že uživatel spravuje klíč KEK místně nebo ve službě Azure Key Vault. Uživatel nemusí znát konkrétní klíč, který se použil 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.
- Klientská knihovna stáhne šifrovaná data spolu s veškerým šifrovacím materiálem uloženým ve službě Azure Storage.
- 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í služby Azure Key Vault nebo jiného úložiště klíčů.
- Klientská knihovna používá CEK k dešifrování šifrovaných uživatelských dat.
Šifrování/ dešifrování při nahrání nebo stažení objektu blob
Klientská knihovna Blob Storage podporuje šifrování celých objektů blob pouze při nahrávání. U stahování se podporují kompletní i rozsahy stahování. Šifrování na straně klienta v2 data do 4 bloků šifrování MiB uloží do vyrovnávací paměti ověřené bloky šifrování, které je možné transformovat pouze jako celek. Pokud chcete upravit velikost bloku dat, ujistěte se, že používáte nejnovější verzi sady SDK, která podporuje šifrování na straně klienta verze 2.1. Délka oblasti je konfigurovatelná od 16 bajtů až do 1 GiB.
Během šifrování klientská knihovna generuje vektor náhodné inicializace (IV) 16 bajtů a náhodný klíč CEK 32 bajtů a pomocí těchto informací provádí šifrování dat objektů blob obálky. Zabalené CEK a další metadata šifrování se pak ukládají jako metadata objektů blob spolu s š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é oblasti v zašifrovaném objektu blob zahrnuje úpravu rozsahu poskytovaného uživateli, aby získali malé množství dalších dat, která je možné použít k úspěšnému dešifrování požadovaného rozsahu.
Pomocí tohoto schématu je možné zašifrovat nebo dešifrovat všechny typy objektů blob (objekty blob bloku, objekty blob stránky a doplňovací objekty blob).
Upozorňující
Pokud upravujete nebo nahráváte vlastní metadata objektu blob, musíte zajistit zachování metadat šifrování. Pokud nahrajete nová metadata bez zachování metadat šifrování, ztratí se zabalená metadata CEK, IV a další metadata a nebudete moct načíst obsah objektu blob. Volání operace Set Blob Metadata vždy nahrazuje všechna metadata objektu blob.
Při čtení z šifrovaného objektu blob nebo zápisu do šifrovaného objektu blob použijte příkazy pro nahrání celého objektu blob, jako je Put Blob, a příkazy pro stažení celého objektu blob, jako je Get Blob. Nepoužívejte zápis 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í u šifrovaného objektu blob může poškodit a znepřístupnit ho.
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 použít šifrování na straně klienta v2 k šifrování a dešifrování objektu blob.
Důležité
Pokud máte data, která byla dříve šifrovaná pomocí šifrování na straně klienta v1, budete muset tato data dešifrovat a znovu je zašifrovat pomocí šifrování na straně klienta v2. Pokyny a ukázky pro klientskou knihovnu najdete níže.
Pokud chcete použít šifrování na straně klienta z kódu .NET, nastavte odkaz na klientskou knihovnu služby 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, přečtěte si průvodce migrací.
Pro integraci služby Azure Key Vault pro šifrování na straně klienta se vyžadují dva další balíčky:
Balíček Azure.Core poskytuje
IKeyEncryptionKey
rozhraní aIKeyEncryptionKeyResolver
rozhraní. 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 klienta REST služby Key Vault a kryptografické klienty, které se používají s šifrováním na straně klienta. Pokud jako úložiště klíčů používáte Azure Key Vault, ujistěte se, že se na tento balíček odkazuje ve vašem projektu.
Služba Azure Key Vault je navržená pro hlavní klíče s vysokou hodnotou a omezení omezení pro každý trezor klíčů odráží tento návrh. 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é kvůli omezování, můžete použít přístup, který je ukázaný v této ukázce , a vložit vrstvuAzure.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 překladu, která vrátí klíč s daným identifikátorem 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íč vždy používá a absence klíče způsobí chybu.
Při dešifrování platí, že pokud je klíč zadaný 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č, klientská knihovna vyvolá chybu. Pokud je zadaný překladač, vyvolá se překladač klíčů, aby získal klíč. Pokud je zadaný překladač, ale nemá mapování identifikátoru klíče, klientská knihovna vyvolá 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í zpracovává 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
(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);
Možnosti šifrování můžete použít u konstruktorů BlobServiceClient, BlobContainerClient nebo BlobClient, které přijímají objekty BlobClientOptions.
Pokud objekt BlobClient již ve vašem kódu existuje, ale nemá možnosti šifrování na straně klienta, můžete pomocí metody rozšíření vytvořit kopii tohoto objektu s danou clientSideEncryptionOptions. Tato metoda rozšíření zabraňuje 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, ujistěte se, že dešifrujete a znovu zašifrujete 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 šifrovaná pomocí šifrování na straně klienta v1, musí být dešifrována a znovu zašifrována pomocí šifrování na straně klienta v2, aby se zmírnit ohrožení zabezpečení. Dešifrování vyžaduje stažení dat a opětovné šifrování vyžaduje opětovné načtení dat do služby Blob Storage.
Ukázkový projekt, který ukazuje, jak migrovat data z šifrování na straně klienta v1 na verzi 2 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ě vede k dalším režijním nákladům na výkon. Pokud 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 s vybraným úložištěm klíčů pro vytváření klíčů a formátovat a nahrávat další metadata. Tato režie se liší v závislosti na množství šifrovaných dat. Zákazníkům doporučujeme, aby během vývoje vždy testovali své aplikace na výkon.