Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Z tego samouczka dowiesz się, jak szyfrować i odszyfrowywać obiekty blob po stronie klienta przy użyciu klucza przechowywanego w usłudze Azure Key Vault.
Usługa Azure Blob Storage obsługuje szyfrowanie po stronie usługi 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.
Biblioteka klienta usługi Azure Blob Storage dla platformy .NET obsługuje szyfrowanie danych po stronie klienta w aplikacjach 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.
Ten samouczek przedstawia sposób wykonania następujących czynności:
- Konfigurowanie uprawnień dla zasobu usługi Azure Key Vault
- Tworzenie aplikacji konsolowej do interakcji z zasobami przy użyciu bibliotek klienckich platformy .NET
- Dodawanie klucza do magazynu kluczy
- Konfigurowanie opcji szyfrowania po stronie klienta przy użyciu klucza przechowywanego w magazynie kluczy
- Tworzenie obiektu klienta usługi blob z włączonym szyfrowaniem po stronie klienta
- Prześlij zaszyfrowany blob, a następnie pobierz go i odszyfruj.
Wymagania wstępne
- Subskrypcja platformy Azure — bezpłatne tworzenie konta
- Konto usługi Azure Storage — utwórz konto przechowywania
- Magazyn kluczy — tworzenie go przy użyciu witryny Azure Portal, interfejsu wiersza polecenia platformy Azure lub programu PowerShell
- Zainstalowany program Visual Studio 2022
Przypisz rolę swojemu użytkownikowi Microsoft Entra
Podczas tworzenia aplikacji lokalnie upewnij się, że konto użytkownika, które uzyskuje dostęp do magazynu kluczy, ma odpowiednie uprawnienia. Aby utworzyć klucz i wykonać akcje na kluczach w magazynie kluczy, musisz mieć rolę Crypto Officer w usłudze Key Vault. Role RBAC platformy Azure można przypisać użytkownikowi przy użyciu witryny Azure Portal, interfejsu wiersza polecenia platformy Azure lub programu Azure PowerShell. Więcej informacji na temat dostępnych zakresów przypisań ról można znaleźć na stronie przeglądu zakresu.
W tym scenariuszu przypiszesz uprawnienia do konta użytkownika ograniczone do magazynu kluczy, zgodnie z zasadą najniższych uprawnień. Ta praktyka zapewnia użytkownikom tylko minimalne wymagane uprawnienia i tworzy bezpieczniejsze środowiska produkcyjne.
W poniższym przykładzie pokazano, jak przypisać rolę administratora kryptograficznego usługi Key Vault do konta użytkownika, co zapewnia dostęp potrzebny do ukończenia tego samouczka.
Ważne
W większości przypadków propagacja przypisania roli na platformie Azure potrwa minutę lub dwie, ale w rzadkich przypadkach może upłynąć do ośmiu minut. Jeśli podczas pierwszego uruchomienia kodu wystąpią błędy uwierzytelniania, zaczekaj chwilę i spróbuj ponownie.
W witrynie Azure Portal znajdź magazyn kluczy przy użyciu głównego paska wyszukiwania lub nawigacji po lewej stronie.
Na stronie przeglądu magazynu kluczy wybierz pozycję Kontrola dostępu (Zarządzanie dostępem i tożsamościami) z menu po lewej stronie.
Na stronie Kontrola dostępu (Zarządzanie dostępem i tożsamościami) wybierz kartę Przypisanie ról.
Wybierz + Dodaj z górnego menu, a następnie Dodaj przypisanie roli z wyświetlonego menu rozwijanego.
Użyj pola wyszukiwania, aby filtrować wyniki do żądanej roli. W tym przykładzie wyszukaj Key Vault Crypto Officer i wybierz pasujący wynik, a następnie kliknij Dalej.
W obszarze Przypisz dostęp do wybierz Użytkownik, grupa lub jednostka usługi, a następnie wybierz + Wybierz członków.
W oknie dialogowym wyszukaj nazwę użytkownika firmy Microsoft Entra (zazwyczaj adres e-mail user@domain ), a następnie wybierz pozycję Wybierz w dolnej części okna dialogowego.
Wybierz pozycję Przejrzyj i przypisz , aby przejść do ostatniej strony, a następnie ponownie przejrzyj i przypisz, aby ukończyć proces.
konfigurowanie projektu
W oknie konsoli (na przykład PowerShell lub Bash) użyj polecenia
dotnet new, aby utworzyć nową aplikację konsolową o nazwie BlobEncryptionKeyVault. To polecenie tworzy prosty projekt języka C# "Hello World" z jednym plikiem źródłowym: Program.cs.dotnet new console -n BlobEncryptionKeyVaultPrzejdź do nowo utworzonego katalogu BlobEncryptionKeyVault .
cd BlobEncryptionKeyVaultOtwórz projekt w żądanym edytorze kodu. Aby otworzyć projekt w:
- W programie Visual Studio zlokalizuj plik
BlobEncryptionKeyVault.csproji następnie kliknij go dwukrotnie. - Program Visual Studio Code uruchom następujące polecenie:
code .- W programie Visual Studio zlokalizuj plik
Aby wchodzić w interakcje z usługami platformy Azure w tym przykładzie, zainstaluj następujące biblioteki klienckie przy użyciu programu dotnet add package.
dotnet add package Azure.Identity
dotnet add package Azure.Security.KeyVault.Keys
dotnet add package Azure.Storage.Blobs
Dodaj następujące using dyrektywy i pamiętaj, aby dodać odwołanie do projektu System.Configuration.
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;
Ustawianie zmiennej środowiskowej
Ta aplikacja szuka zmiennej środowiskowej o nazwie KEY_VAULT_NAME w celu pobrania nazwy magazynu kluczy. Aby ustawić zmienną środowiskową, otwórz okno konsoli i postępuj zgodnie z instrukcjami dotyczącymi systemu operacyjnego. Zastąp <your-key-vault-name> nazwą magazynu kluczy.
Windows:
Zmienne środowiskowe systemu Windows można ustawić z poziomu wiersza polecenia. Jednak w przypadku korzystania z tego podejścia wartości są dostępne dla wszystkich aplikacji działających w tym systemie operacyjnym i mogą powodować konflikty, jeśli nie jesteś ostrożny. Zmienne środowiskowe można ustawić na poziomie użytkownika lub systemu:
setx KEY_VAULT_NAME "<your-key-vault-name>"
Po dodaniu zmiennej środowiskowej w systemie Windows należy uruchomić nowe wystąpienie okna poleceń. Jeśli używasz programu Visual Studio w systemie Windows, może być konieczne ponowne utworzenie programu Visual Studio po utworzeniu zmiennej środowiskowej w celu wykrycia zmiany.
Linux:
export KEY_VAULT_NAME=<your-key-vault-name>
Dodawanie klucza w usłudze Azure Key Vault
W tym przykładzie utworzymy klucz i dodamy go do magazynu kluczy przy użyciu biblioteki klienta usługi Azure Key Vault. Możesz również utworzyć i dodać klucz do magazynu kluczy przy użyciu interfejsu wiersza polecenia platformy Azure, witryny Azure Portal lub programu PowerShell.
W poniższym przykładzie utworzymy obiekt KeyClient dla określonego magazynu. Następnie obiekt KeyClient jest używany do tworzenia nowego klucza RSA w określonym magazynie.
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);
Tworzenie wystąpień kluczy i modułu rozwiązywania kluczy
Następnie użyjemy klucza, który właśnie dodaliśmy do magazynu, aby utworzyć wystąpienia klienta kryptografii i rozwiązującego klucz. Element CryptographyClient implementuje klucz IKeyEncryptionKey i służy do wykonywania operacji kryptograficznych z kluczami przechowywanymi w usłudze Azure Key Vault. KeyResolver implementuje IKeyEncryptionResolver i pobiera klucze szyfrowania z identyfikatora klucza oraz rozpoznaje klucz.
// 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);
Jeśli masz istniejący klucz w magazynie, za pomocą którego chcesz zaszyfrować, możesz utworzyć wystąpienia rozpoznawania kluczy i kluczy, przekazując identyfikator URI:
var keyVaultKeyUri = $"https://{keyVaultName}.vault.azure.net/keys/{keyName}";
CryptographyClient cryptoClient = new CryptographyClient(new Uri(keyVaultKeyUri), tokenCredential);
Konfigurowanie opcji szyfrowania
Teraz musimy skonfigurować opcje szyfrowania do użycia na potrzeby przekazywania i pobierania obiektów blob. Aby użyć szyfrowania po stronie klienta, najpierw utworzymy ClientSideEncryptionOptions obiekt i ustawimy go podczas tworzenia klienta za pomocą polecenia SpecializedBlobClientOptions.
Klasa ClientSideEncryptionOptions udostępnia opcje konfiguracji klienta służące do nawiązywania połączenia z usługą Blob Storage przy użyciu szyfrowania po stronie klienta. Klucz KeyEncryptionKey jest wymagany do operacji przekazywania i służy do zawijania wygenerowanego klucza szyfrowania zawartości. KeyResolver jest wymagany do operacji pobierania i pobiera odpowiedni klucz szyfrujący, aby rozpakować pobrany klucz szyfrowania zawartości. KeyWrapAlgorithm jest wymagany do przesyłania i określa identyfikator algorytmu do użycia przy owijaniu klucza szyfrowania zawartości.
Ważne
Ze względu na lukę w zabezpieczeniach w wersji 1 zaleca się skonstruowanie ClientSideEncryptionOptions obiektu przy użyciu ClientSideEncryptionVersion.V2_0 parametru wersji. Aby dowiedzieć się więcej na temat ograniczania luk w zabezpieczeniach w aplikacjach, zobacz Ograniczanie luk w zabezpieczeniach w aplikacjach. 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.
// 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 };
Konfigurowanie obiektu klienta do używania szyfrowania po stronie klienta
W tym przykładzie stosujemy opcje konfiguracji szyfrowania po stronie klienta do BlobServiceClient obiektu. Po zastosowaniu na poziomie klienta serwisowego, te opcje szyfrowania są przekazywane z klienta serwisowego do klientów kontenerów oraz z klientów kontenerów do klientów blobów.
BlobClient Gdy obiekt wykonuje operację wysyłania lub pobierania, biblioteki klienckie usługi Azure Blob Storage używają szyfrowania kopertowego do szyfrowania i odszyfrowywania blobów po stronie klienta. Szyfrowanie kopert szyfruje klucz przy użyciu co najmniej jednego dodatkowego klucza.
// 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");
Szyfrowanie obiektu blob i przesyłanie
BlobClient Gdy obiekt wywołuje metodę przekazywania, w celu przeprowadzenia szyfrowania po stronie klienta następuje kilka kroków:
- Biblioteka klienta usługi Azure Storage generuje losowy wektor inicjowania (IV) 16 bajtów i losowy klucz szyfrowania zawartości (CEK) 32 bajtów i wykonuje szyfrowanie kopert danych obiektu blob przy użyciu tych informacji.
- Dane obiektów blob są szyfrowane przy użyciu klucza CEK.
- Klucz CEK jest następnie opakowany (zaszyfrowany) przy użyciu określonego przez nas klucza szyfrowania klucza (KEK) w
ClientSideEncryptionOptions. W tym przykładzie klucz KEK jest asymetryczną parą kluczy przechowywaną w określonym zasobie usługi Azure Key Vault. Sam klient obiektu blob nigdy nie ma dostępu do klucza KEK (Key Encryption Key), jedynie wywołuje algorytm opakowujący klucze, udostępniany przez Key Vault. - Zaszyfrowane dane obiektów blob są następnie przesyłane na konto magazynowe.
Dodaj następujący kod, aby zaszyfrować obiekt blob i przekazać go na konto usługi Azure Storage:
// Upload the encrypted contents to the blob
Stream blobContent = BinaryData.FromString("Ready for encryption, Captain.").ToStream();
await blob.UploadAsync(blobContent);
Po przesłaniu blobu można wyświetlić blob w swoim koncie przechowywania, aby zobaczyć zaszyfrowaną zawartość wraz z metadanymi szyfrowania.
Odszyfruj blob i pobierz
Biblioteka klienta usługi Azure Storage zakłada, że użytkownik zarządza KEK-iem lokalnie lub w magazynie kluczy. Użytkownik nie musi znać określonego klucza, który został użyty do szyfrowania. Mechanizm rozpoznawania kluczy określony w ClientSideEncryptionOptions będzie używany do rozwiązywania identyfikatorów kluczy, gdy dane obiektu blob są pobierane i odszyfrowywane.
BlobClient Gdy obiekt wywołuje metodę pobierania, następuje kilka kroków odszyfrowywania zaszyfrowanych danych obiektu blob:
- Biblioteka kliencka pobiera zaszyfrowane dane blobów, w tym metadane szyfrowania, z konta magazynu danych.
- Opakowany klucz CEK jest następnie odszyfrowywany przy użyciu klucza deszyfrującego KEK. Biblioteka klienta nie ma dostępu do KEK podczas tego procesu, ale wywołuje tylko algorytm rozpakowywania klucza określony w
ClientSideEncryptionOptions. Klucz prywatny pary kluczy RSA pozostaje w magazynie kluczy, więc zaszyfrowany klucz z metadanych obiektu blob zawierający klucz CEK jest wysyłany do magazynu kluczy na potrzeby odszyfrowywania. - Biblioteka klienta używa klucza CEK do odszyfrowania zaszyfrowanych danych typu blob.
Dodaj następujący kod, aby pobrać i odszyfrować obiekt "blob", który wcześniej przesłałeś.
// 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());
Następne kroki
W tym samouczku przedstawiono sposób używania bibliotek klienckich platformy .NET do wykonywania szyfrowania po stronie klienta na potrzeby operacji przekazywania i pobierania obiektów blob.
Aby zapoznać się z szerokim omówieniem szyfrowania po stronie klienta dla obiektów blob, w tym instrukcjami dotyczącymi migrowania zaszyfrowanych danych do wersji 2, zobacz Szyfrowanie po stronie klienta dla obiektów blob.
Aby uzyskać więcej informacji na temat usługi Azure Key Vault, zobacz stronę przeglądu usługi Azure Key Vault