Szyfrowanie po stronie klienta dla obiektów blob
Biblioteka klienta usługi Azure Blob Storage dla platformy .NET obsługuje szyfrowanie danych w aplikacjach klienckich przed przekazaniem do usługi Azure Storage i odszyfrowywaniem 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 ochrony 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 usłudze Microsoft Azure Storage przy użyciu usługi Azure Key Vault.
Informacje o szyfrowaniu po stronie klienta
Biblioteka klienta usługi Azure Blob Storage używa standardu Advanced Encryption Standard (AES) do szyfrowania danych użytkownika. W bibliotece klienta są dostępne dwie wersje szyfrowania po stronie klienta:
- Wersja 2 używa trybu Galois/Counter Mode (GCM) z AES.
- Wersja 1 używa trybu łańcucha bloków szyfrowania (CBC) z usługą AES.
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 tak, aby korzystała z wersji 2 i migrowała dane. 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 akcji:
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 korzysta z 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 zaszyfruj je ponownie za pomocą 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 zaszyfruj je ponownie za pomocą 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 pokazano, które wersje bibliotek klienckich dla platform .NET, Java i Python obsługują różne 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 |
Uwaga
Szyfrowanie po stronie klienta w wersji 2.1 jest dostępne w zestawie JAVA SDK dla wersji 12.27.0 i nowszych. Ta wersja umożliwia skonfigurowanie długości regionu na potrzeby szyfrowania uwierzytelnionego z zakresu od 16 bajtów do 1 GiB. Aby uzyskać więcej informacji, zobacz przykład języka Java w temacie Przykład: Szyfrowanie i odszyfrowywanie obiektu blob przy użyciu szyfrowania po stronie klienta w wersji 2.
Jeśli aplikacja korzysta z szyfrowania po stronie klienta z starszą wersją biblioteki klienta .NET, Java lub Python, musisz najpierw uaktualnić kod do wersji obsługującej szyfrowanie po stronie klienta w wersji 2. Następnie należy odszyfrować i ponownie zaszyfrować dane za pomocą 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. Aby zapoznać się z przykładami kodu, zobacz 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 klienta usługi Azure Blob Storage używają szyfrowania kopert do szyfrowania i odszyfrowywania danych po stronie klienta. Szyfrowanie kopert szyfruje klucz przy użyciu co najmniej jednego dodatkowego klucza.
Biblioteki klienckie 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 pomocą techniki koperty
Szyfrowanie za pomocą techniki koperty działa w następujący sposób:
Biblioteka klienta usługi Azure Storage generuje klucz szyfrowania zawartości (CEK), który jest jednorazowym kluczem symetrycznym.
Dane użytkownika są szyfrowane przy użyciu klucza CEK.
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 KEK można zarządzać lokalnie lub przechowywać go w usłudze Azure Key Vault.
Sama biblioteka kliencka usługi Azure Storage nigdy nie ma dostępu do klucza KEK. Biblioteka wywołuje algorytm opakowujący klucze udostępniany przez usługę Key Vault. Użytkownicy mogą w razie potrzeby używać dostawców niestandardowych do opakowywania/rozpakunia kluczy.
Zaszyfrowane dane są następnie przekazywane do usługi Azure Blob Storage. Opakowany klucz wraz z dodatkowymi metadanymi szyfrowania jest przechowywany jako metadane obiektu blob.
Odszyfrowywanie za pomocą techniki koperty działa w następujący sposób:
- 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ć modułu rozpoznawania kluczy, który rozpoznaje różne identyfikatory kluczy.
- Biblioteka kliencka pobiera zaszyfrowane dane wraz z dowolnym materiałem szyfrowania przechowywanym w usłudze Azure Storage.
- 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 rozpakujania usługi Azure Key Vault lub innego magazynu kluczy.
- 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 zakresu. Szyfrowanie po stronie klienta w wersji 2 dzieli dane na 4 buforowane bloki szyfrowania uwierzytelnionego typu MiB, które można przekształcić tylko w całości. Aby dostosować rozmiar fragmentu, upewnij się, że używasz najnowszej wersji zestawu SDK obsługującego szyfrowanie po stronie klienta w wersji 2.1. Długość regionu można skonfigurować z 16 bajtów do 1 GiB.
Podczas szyfrowania biblioteka klienta generuje losowy wektor inicjalizacji (IV) 16 bajtów i losowy klucz CEK 32 bajtów i wykonuje szyfrowanie kopert danych obiektu blob przy użyciu tych informacji. Opakowany klucz szyfrowania 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 rozpakuwany i używany wraz 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
W przypadku edytowania lub przekazywania własnych metadanych dla obiektu blob należy upewnić się, że metadane szyfrowania są zachowywane. Jeśli przekażesz nowe metadane bez zachowania metadanych szyfrowania, to opakowany klucz CEK, IV i inne metadane zostaną utracone i nie będzie można pobrać zawartości obiektu blob. Wywołanie operacji Set Blob Metadata (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 w zaszyfrowanym obiekcie blob może uszkodzić go i uczynić je nieczytelnymi.
Przykład: Szyfrowanie i odszyfrowywanie obiektu blob przy użyciu szyfrowania po stronie klienta w wersji 2
W przykładzie kodu w tej sekcji pokazano, jak szyfrować i odszyfrowywać obiekt blob przy użyciu szyfrowania po stronie klienta w wersji 2.
Ważne
Jeśli masz dane, które zostały wcześniej zaszyfrowane za pomocą 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 dotyczącymi 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 usługi Azure Key Vault wymagane są dwa dodatkowe pakiety na potrzeby szyfrowania po stronie klienta:
Pakiet Azure.Core udostępnia
IKeyEncryptionKey
interfejsy iIKeyEncryptionKeyResolver
. 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 usługi Key Vault i klientów kryptograficznych używanych z szyfrowaniem po stronie klienta. Upewnij 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 została zaprojektowana pod kątem 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 z powodu ograniczania przepustowości, możesz użyć podejścia przedstawionego w tym przykładzie , aby wstrzyknąć warstwę buforowania doAzure.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ę opakowującego i rozpakowującego klucz CEK. Klucz rozpoznawania jest używany do rozpoznawania klucza podczas procesu odszyfrowywania. Program rozpoznawania kluczy definiuje metodę rozpoznawania, która zwraca klucz przy użyciu identyfikatora klucza. Narzędzie rozpoznawania nazw zapewnia użytkownikom możliwość wyboru między wieloma kluczami zarządzanymi w wielu lokalizacjach.
Podczas szyfrowania klucz jest zawsze używany, a brak klucza powoduje wystąpienie błędu.
Podczas odszyfrowywania, jeśli klucz jest określony, a 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 resolver. Jeśli nie określono programu resolver, biblioteka klienta zgłasza błąd. Jeśli określono 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ą elementu SpecializedBlobClientOptions. Nie można ustawić opcji szyfrowania dla poszczególnych interfejsów API. Wszystkie inne elementy są obsługiwane przez bibliotekę klienta wewnętrznie.
// 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);
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 z danym ClientSideEncryptionOptions. Ta metoda rozszerzenia pozwala uniknąć narzutów związanych z 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 używania szyfrowania po stronie klienta w wersji 2 upewnij się, że odszyfrujesz i ponownie szyfrujesz wszystkie istniejące zaszyfrowane dane, zgodnie z opisem w temacie Ponowne szyfrowanie wcześniej zaszyfrowanych danych za pomocą szyfrowania po stronie klienta w wersji 2.
Ponownie szyfruj wcześniej zaszyfrowane dane 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, aby wyeliminować lukę w zabezpieczeniach. Odszyfrowywanie wymaga pobrania danych i ponownego szyfrowania wymaga ponownego załadowania ich do usługi Blob Storage.
Przykładowy projekt pokazujący, jak przeprowadzić migrację danych z szyfrowania po stronie klienta w wersji 1 do wersji 2 i szyfrowania danych przy użyciu 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 związane z 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 zapieszczania kluczy oraz formatować i przekazywać dodatkowe metadane. To obciążenie różni się w zależności od ilości zaszyfrowanych danych. Zalecamy, aby klienci zawsze testowali swoje aplikacje pod kątem wydajności podczas opracowywania.