Szyfrowanie po stronie klienta dla obiektów blob

Biblioteka klienta platformy .NET Azure Blob Storage obsługuje szyfrowanie danych w aplikacjach klienckich przed przekazaniem do usługi Azure Storage oraz odszyfrowywanie danych podczas pobierania do klienta. Biblioteka obsługuje również integrację z usługą Azure Key Vault na potrzeby zarządzania kluczami konta magazynu.

Ważne

Usługa Blob Storage obsługuje zarówno szyfrowanie po stronie usługi, jak i po stronie klienta. W przypadku większości scenariuszy firma Microsoft zaleca korzystanie z funkcji szyfrowania po stronie usługi w celu ułatwienia korzystania z danych. Aby dowiedzieć się więcej na temat szyfrowania po stronie usługi, zobacz Szyfrowanie usługi Azure Storage dla danych magazynowanych.

Aby zapoznać się z samouczkiem krok po kroku, który przeprowadzi Cię przez proces szyfrowania obiektów blob przy użyciu szyfrowania po stronie klienta i usługi Azure Key Vault, zobacz Szyfrowanie i odszyfrowywanie obiektów blob w Microsoft Azure Storage przy użyciu usługi Azure Key Vault.

Informacje o szyfrowaniu po stronie klienta

Biblioteka klienta Azure Blob Storage używa AES do szyfrowania danych użytkownika. W bibliotece klienta są dostępne dwie wersje szyfrowania po stronie klienta:

Ostrzeżenie

Korzystanie z szyfrowania po stronie klienta w wersji 1 nie jest już zalecane z powodu luki w zabezpieczeniach w implementacji trybu CBC biblioteki klienta. Aby uzyskać więcej informacji na temat tej luki w zabezpieczeniach, zobacz Aktualizowanie szyfrowania po stronie klienta w zestawie SDK w usłudze Azure Storage w celu rozwiązania luk w zabezpieczeniach. Jeśli obecnie używasz wersji 1, zalecamy zaktualizowanie aplikacji do korzystania z wersji 2 i przeprowadzenie migracji danych. Aby uzyskać więcej wskazówek, zobacz następującą sekcję : Ograniczanie luk w zabezpieczeniach w aplikacjach.

Eliminowanie luk w zabezpieczeniach w aplikacjach

Ze względu na lukę w zabezpieczeniach wykrytą w implementacji trybu CBC biblioteki klienta usługi Blob Storage firma Microsoft zaleca natychmiastowe wykonanie co najmniej jednej z następujących czynności:

  • Rozważ użycie funkcji szyfrowania po stronie usługi zamiast szyfrowania po stronie klienta. Aby uzyskać więcej informacji na temat funkcji szyfrowania po stronie usługi, zobacz Szyfrowanie usługi Azure Storage dla danych magazynowanych.

  • Jeśli musisz użyć szyfrowania po stronie klienta, przeprowadź migrację aplikacji z szyfrowania po stronie klienta w wersji 1 do szyfrowania po stronie klienta w wersji 2.

Poniższa tabela zawiera podsumowanie czynności, które należy wykonać, jeśli zdecydujesz się przeprowadzić migrację aplikacji do szyfrowania po stronie klienta w wersji 2:

Stan szyfrowania po stronie klienta Zalecane akcje
Aplikacja używa szyfrowania po stronie klienta wersji biblioteki klienta, która obsługuje tylko szyfrowanie po stronie klienta w wersji 1. Zaktualizuj aplikację, aby korzystała z wersji biblioteki klienta obsługującej szyfrowanie po stronie klienta w wersji 2. Zobacz Macierz obsługi zestawu SDK dla szyfrowania po stronie klienta , aby zapoznać się z listą obsługiwanych wersji. Dowiedz się więcej...

Zaktualizuj kod, aby używał szyfrowania po stronie klienta w wersji 2. Dowiedz się więcej...

Pobierz wszystkie zaszyfrowane dane, aby je odszyfrować, a następnie ponownie odszyfruj je przy użyciu szyfrowania po stronie klienta w wersji 2. Dowiedz się więcej...
Aplikacja korzysta z szyfrowania po stronie klienta z wersją biblioteki klienta, która obsługuje szyfrowanie po stronie klienta w wersji 2. Zaktualizuj kod, aby używał szyfrowania po stronie klienta w wersji 2. Dowiedz się więcej...

Pobierz wszystkie zaszyfrowane dane, aby je odszyfrować, a następnie ponownie odszyfruj je przy użyciu szyfrowania po stronie klienta w wersji 2. Dowiedz się więcej...

Ponadto firma Microsoft zaleca wykonanie następujących kroków w celu zabezpieczenia danych:

  • Skonfiguruj konta magazynu tak, aby używały prywatnych punktów końcowych do zabezpieczania całego ruchu między siecią wirtualną a kontem magazynu za pośrednictwem łącza prywatnego. Aby uzyskać więcej informacji, zobacz Używanie prywatnych punktów końcowych dla usługi Azure Storage.
  • Ogranicz dostęp sieciowy tylko do określonych sieci.

Macierz obsługi zestawu SDK dla szyfrowania po stronie klienta

W poniższej tabeli przedstawiono wersje bibliotek klienckich dla platform .NET, Java i Python, które obsługują wersje szyfrowania po stronie klienta:

.NET Java Python
Szyfrowanie po stronie klienta w wersji 2 i 1 Wersje 12.13.0 i nowsze Wersje 12.18.0 i nowsze Wersje 12.13.0 i nowsze
Tylko szyfrowanie po stronie klienta w wersji 1 Wersje 12.12.0 i starsze Wersje 12.17.0 i starsze Wersje 12.12.0 i starsze

Jeśli aplikacja używa szyfrowania po stronie klienta z starszą wersją biblioteki klienta .NET, Java lub Python, należy najpierw uaktualnić kod do wersji obsługującej szyfrowanie po stronie klienta w wersji 2. Następnie należy odszyfrować i ponownie zaszyfrować dane przy użyciu szyfrowania po stronie klienta w wersji 2. W razie potrzeby można użyć wersji biblioteki klienta obsługującej szyfrowanie po stronie klienta w wersji 2 obok wcześniejszej wersji biblioteki klienta podczas migrowania kodu. Przykłady kodu można znaleźć w temacie Example: Encrypting and decrypting a blob with client-side encryption v2 (Przykład: szyfrowanie i odszyfrowywanie obiektu blob przy użyciu szyfrowania po stronie klienta w wersji 2).

Jak działa szyfrowanie po stronie klienta

Biblioteki klienckie Azure Blob Storage używają szyfrowania kopert do szyfrowania i odszyfrowywania danych po stronie klienta. Szyfrowanie koperty szyfruje klucz za pomocą co najmniej jednego dodatkowego klucza.

Biblioteki klienta usługi Blob Storage korzystają z usługi Azure Key Vault w celu ochrony kluczy używanych do szyfrowania po stronie klienta. Aby uzyskać więcej informacji na temat usługi Azure Key Vault, zobacz Co to jest usługa Azure Key Vault?.

Szyfrowanie i odszyfrowywanie za pośrednictwem techniki koperty

Szyfrowanie za pomocą techniki koperty działa w następujący sposób:

  1. Biblioteka klienta usługi Azure Storage generuje klucz szyfrowania zawartości (CEK), który jest jednorazowym kluczem symetrycznym.

  2. Dane użytkownika są szyfrowane przy użyciu klucza CEK.

  3. Klucz CEK jest następnie opakowany (zaszyfrowany) przy użyciu klucza szyfrowania klucza (KEK). Klucz KEK jest identyfikowany przez identyfikator klucza i może być parą kluczy asymetrycznych lub kluczem symetrycznym. Klucz szyfrowania kluczy można zarządzać lokalnie lub przechowywać go w usłudze Azure Key Vault.

    Sama biblioteka klienta usługi Azure Storage nigdy nie ma dostępu do klucza KEK. Biblioteka wywołuje algorytm opakowujący klucze udostępniany przez Key Vault. Użytkownicy mogą w razie potrzeby używać dostawców niestandardowych do opakowywania/rozpakowywania kluczy.

  4. Zaszyfrowane dane są następnie przekazywane do Azure Blob Storage. Opakowany klucz wraz z dodatkowymi metadanymi szyfrowania jest przechowywany jako metadane w obiekcie blob.

Odszyfrowywanie za pośrednictwem techniki koperty działa w następujący sposób:

  1. Biblioteka klienta usługi Azure Storage zakłada, że użytkownik zarządza kluczem KEK lokalnie lub w usłudze Azure Key Vault. Użytkownik nie musi znać określonego klucza, który został użyty do szyfrowania. Zamiast tego można skonfigurować i używać narzędzia rozpoznawania kluczy, który rozpoznaje różne identyfikatory kluczy dla kluczy.
  2. Biblioteka klienta pobiera zaszyfrowane dane wraz z dowolnym materiałem szyfrowania przechowywanym w usłudze Azure Storage.
  3. Opakowany klucz CEK) jest następnie odszyfrowywany (odszyfrowywany) przy użyciu klucza KEK. Biblioteka klienta nie ma dostępu do klucza KEK podczas tego procesu, ale wywołuje tylko algorytm rozpasywania usługi Azure Key Vault lub innego magazynu kluczy.
  4. Biblioteka klienta używa klucza CEK do odszyfrowania zaszyfrowanych danych użytkownika.

Szyfrowanie/odszyfrowywanie podczas przekazywania/pobierania obiektów blob

Biblioteka klienta usługi Blob Storage obsługuje szyfrowanie całych obiektów blob tylko podczas przekazywania. W przypadku pobierania obsługiwane są zarówno pełne pliki, jak i pliki do pobrania w zakresie.

Podczas szyfrowania biblioteka klienta generuje losowy wektor inicjowania (IV) z 16 bajtów i losowy klucz CEK 32 bajtów i wykonuje szyfrowanie kopert danych obiektu blob przy użyciu tych informacji. Opakowany klucz CEK i niektóre dodatkowe metadane szyfrowania są następnie przechowywane jako metadane obiektu blob wraz z zaszyfrowanym obiektem blob.

Gdy klient pobiera cały obiekt blob, opakowany klucz CEK jest niezapisany i używany razem z IV w celu zwrócenia odszyfrowanych danych do klienta.

Pobranie dowolnego zakresu w zaszyfrowanym obiekcie blob polega na dostosowaniu zakresu dostarczonego przez użytkowników w celu uzyskania niewielkiej ilości dodatkowych danych, których można użyć do pomyślnego odszyfrowania żądanego zakresu.

Wszystkie typy obiektów blob (blokowe obiekty blob, stronicowe obiekty blob i uzupełnialne obiekty blob) mogą być szyfrowane/odszyfrowywane przy użyciu tego schematu.

Ostrzeżenie

Jeśli edytujesz lub przekazujesz własne metadane dla obiektu blob, upewnij się, że metadane szyfrowania są zachowywane. Jeśli przekażesz nowe metadane bez zachowania metadanych szyfrowania, wówczas opakowany klucz CEK, IV i inne metadane zostaną utracone i nie będzie można pobrać zawartości obiektu blob. Wywołanie operacji Ustawianie metadanych obiektu blob zawsze zastępuje wszystkie metadane obiektu blob.

Podczas odczytywania lub zapisywania w zaszyfrowanym obiekcie blob użyj całych poleceń przekazywania obiektów blob, takich jak Put Blob, i zakres lub całe polecenia pobierania obiektów blob, takie jak Pobieranie obiektu blob. Unikaj zapisywania w zaszyfrowanym obiekcie blob przy użyciu operacji protokołu, takich jak Put Block, Put Block List, Put Page lub Append Block. Wywołanie tych operacji na zaszyfrowanym obiekcie blob może ją uszkodzić i uczynić go nieczytelnym.

Przykład: szyfrowanie i odszyfrowywanie obiektu blob przy użyciu szyfrowania po stronie klienta w wersji 2

Przykładowy kod w tej sekcji przedstawia sposób szyfrowania po stronie klienta w wersji 2 do szyfrowania i odszyfrowywania obiektu blob.

Ważne

Jeśli masz dane, które zostały wcześniej zaszyfrowane przy użyciu szyfrowania po stronie klienta w wersji 1, musisz odszyfrować te dane i ponownie zaszyfrować je za pomocą szyfrowania po stronie klienta w wersji 2. Zapoznaj się ze wskazówkami i przykładami dla biblioteki klienta poniżej.

Aby użyć szyfrowania po stronie klienta z poziomu kodu platformy .NET, zapoznaj się z biblioteką klienta usługi Blob Storage. Upewnij się, że używasz wersji 12.13.0 lub nowszej. Jeśli musisz przeprowadzić migrację z wersji 11.x do wersji 12.13.0, zobacz Przewodnik migracji.

Do integracji Key Vault platformy Azure wymagane są dwa dodatkowe pakiety na potrzeby szyfrowania po stronie klienta:

  • Pakiet Azure.Core udostępnia IKeyEncryptionKey interfejsy i IKeyEncryptionKeyResolver . Biblioteka klienta usługi Blob Storage dla platformy .NET definiuje już ten zestaw jako zależność.

  • Pakiet Azure.Security.KeyVault.Keys (wersja 4.x lub nowsza) udostępnia klienta REST Key Vault i klientów kryptograficznych używanych z szyfrowaniem po stronie klienta. Musisz upewnić się, że ten pakiet jest przywołyny w projekcie, jeśli używasz usługi Azure Key Vault jako magazynu kluczy.

    Usługa Azure Key Vault jest przeznaczona dla kluczy głównych o wysokiej wartości, a limity ograniczania przepustowości na magazyn kluczy odzwierciedlają ten projekt. Od wersji 4.1.0 usługi Azure.Security.KeyVault.Keys IKeyEncryptionKeyResolver interfejs nie obsługuje buforowania kluczy. Jeśli buforowanie jest konieczne ze względu na ograniczanie przepustowości, można użyć metody przedstawionej w tym przykładzie w celu wstrzyknięcia warstwy buforowania do Azure.Security.KeyVault.Keys.Cryptography.KeyResolver wystąpienia.

Deweloperzy mogą udostępnić klucz, klucz rozpoznawania kluczy lub zarówno klucz, jak i klucz rozpoznawania kluczy. Klucze są identyfikowane przy użyciu identyfikatora klucza, który zapewnia logikę opakowywania i rozpakuj klucz CEK. Klucz rozpoznawania jest używany do rozpoznawania klucza podczas procesu odszyfrowywania. Rozpoznawanie kluczy definiuje metodę rozpoznawania, która zwraca klucz przy użyciu identyfikatora klucza. Narzędzie rozpoznawania zapewnia użytkownikom możliwość wyboru wielu kluczy zarządzanych w wielu lokalizacjach.

W przypadku szyfrowania klucz jest zawsze używany, a brak klucza spowoduje wystąpienie błędu.

Odszyfrowywanie, jeśli klucz jest określony i jego identyfikator jest zgodny z wymaganym identyfikatorem klucza, ten klucz jest używany do odszyfrowywania. W przeciwnym razie biblioteka kliencka próbuje wywołać program rozpoznawania. Jeśli nie określono programu resolver, biblioteka klienta zgłasza błąd. Jeśli zostanie określony program rozpoznawania kluczy, wywoływany jest program rozpoznawania kluczy w celu pobrania klucza. Jeśli program rozpoznawania jest określony, ale nie ma mapowania identyfikatora klucza, biblioteka klienta zgłasza błąd.

Aby użyć szyfrowania po stronie klienta, utwórz obiekt ClientSideEncryptionOptions i ustaw go podczas tworzenia klienta za pomocą polecenia SpecializedBlobClientOptions. Nie można ustawić opcji szyfrowania dla poszczególnych interfejsów API. Wszystkie inne elementy będą obsługiwane wewnętrznie przez bibliotekę klienta.

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

Opcje szyfrowania można zastosować do konstruktorów BlobServiceClient, BlobContainerClient lub BlobClient , które akceptują obiekty BlobClientOptions .

Jeśli obiekt BlobClient już istnieje w kodzie, ale nie ma opcji szyfrowania po stronie klienta, możesz użyć metody rozszerzenia, aby utworzyć kopię tego obiektu przy użyciu danego obiektu ClientSideEncryptionOptions. Ta metoda rozszerzenia pozwala uniknąć nakładu pracy nad konstruowaniem nowego obiektu BlobClient od podstaw.

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 zaktualizowaniu kodu do korzystania z szyfrowania po stronie klienta w wersji 2 upewnij się, że odszyfrujesz i ponownie szyfrujesz wszystkie istniejące zaszyfrowane dane, zgodnie z opisem w temacie Reencrypt poprzednio zaszyfrowane dane za pomocą szyfrowania po stronie klienta w wersji 2.

Ponowne szyfrowanie wcześniej zaszyfrowanych danych przy użyciu szyfrowania po stronie klienta w wersji 2

Wszystkie dane, które zostały wcześniej zaszyfrowane za pomocą szyfrowania po stronie klienta w wersji 1, muszą zostać odszyfrowane, a następnie ponownie zaszyfrowane za pomocą szyfrowania po stronie klienta w wersji 2 w celu ograniczenia luki w zabezpieczeniach. Odszyfrowywanie wymaga pobrania danych i ponownego zaszyfrowania wymaga ponownego załadowania ich do usługi Blob Storage.

Przykładowy projekt przedstawiający sposób migracji danych z szyfrowania po stronie klienta w wersji 1 do wersji 2 oraz sposobu szyfrowania danych za pomocą szyfrowania po stronie klienta w wersji 2 na platformie .NET, zobacz przykładowy projekt migracji szyfrowania.

Szyfrowanie i wydajność po stronie klienta

Należy pamiętać, że szyfrowanie danych magazynu powoduje dodatkowe obciążenie wydajności. W przypadku korzystania z szyfrowania po stronie klienta w aplikacji biblioteka kliencka musi bezpiecznie wygenerować klucz CEK i IV, zaszyfrować samą zawartość, komunikować się z wybranym magazynem kluczy na potrzeby łączenia kluczy oraz formatować i przekazywać dodatkowe metadane. To obciążenie zależy od ilości zaszyfrowanych danych. Zalecamy, aby klienci zawsze testowali swoje aplikacje pod kątem wydajności podczas opracowywania.

Następne kroki