Samouczek: Szyfrowanie i odszyfrowywanie obiektów blob za pomocą usługi Azure Key Vault

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
  • Przekaż zaszyfrowany obiekt blob, a następnie pobierz i odszyfruj obiekt blob

Wymagania wstępne

Przypisywanie roli do użytkownika firmy 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 usługi 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 w zakresie do magazynu kluczy, aby postępować 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.

  1. W witrynie Azure Portal znajdź magazyn kluczy przy użyciu głównego paska wyszukiwania lub nawigacji po lewej stronie.

  2. Na stronie przeglądu magazynu kluczy wybierz pozycję Kontrola dostępu (Zarządzanie dostępem i tożsamościami) z menu po lewej stronie.

  3. Na stronie Kontrola dostępu (Zarządzanie dostępem i tożsamościami) wybierz kartę Przypisania ról.

  4. Wybierz pozycję + Dodaj z górnego menu, a następnie pozycję Dodaj przypisanie roli z wyświetlonego menu rozwijanego.

    A screenshot showing how to assign a role in Azure portal.

  5. Użyj pola wyszukiwania, aby filtrować wyniki do żądanej roli. W tym przykładzie wyszukaj ciąg Crypto Officer usługi Key Vault i wybierz pasujący wynik, a następnie wybierz przycisk Dalej.

  6. W obszarze Przypisz dostęp do wybierz pozycję Użytkownik, grupa lub jednostka usługi, a następnie wybierz pozycję + Wybierz członków.

  7. 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.

  8. Wybierz pozycję Przejrzyj i przypisz , aby przejść do ostatniej strony, a następnie ponownie przejrzyj i przypisz, aby ukończyć proces.

konfigurowanie projektu

  1. W oknie konsoli (takim jak program PowerShell lub powłoka Bash) użyj dotnet new polecenia , 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 BlobEncryptionKeyVault
    
  2. Przejdź do nowo utworzonego katalogu BlobEncryptionKeyVault .

    cd BlobEncryptionKeyVault
    
  3. Otwórz projekt w żądanym edytorze kodu. Aby otworzyć projekt w:

    • Program Visual Studio zlokalizuj i kliknij BlobEncryptionKeyVault.csproj dwukrotnie plik.
    • Program Visual Studio Code uruchom następujące polecenie:
    code .
    

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 System.Configuration projektu.

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> ciąg 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 KeyClient obiekt 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ń rozpoznawania kluczy i kluczy

Następnie użyjemy klucza, który właśnie dodaliśmy do magazynu, aby utworzyć wystąpienia klienta i rozpoznawania kluczy kryptografii. Element CryptographyClient implementuje klucz IKeyEncryptionKey i służy do wykonywania operacji kryptograficznych z kluczami przechowywanymi w usłudze Azure Key Vault. Usługa KeyResolver implementuje klucz IKeyEncryptionResolver i pobiera klucze szyfrowania kluczy z identyfikatora klucza i 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. KluczResolver jest wymagany do operacji pobierania i pobiera prawidłowy klucz szyfrowania klucza, aby odpakować pobrany klucz szyfrowania zawartości. KluczWrapAlgorithm jest wymagany do przekazywania i określa identyfikator algorytmu do użycia podczas zawijania 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 usługi te opcje szyfrowania są przekazywane z klienta usługi do klientów kontenerów oraz z klientów kontenerów do klientów obiektów blob. BlobClient Gdy obiekt wykonuje operację przekazywania lub pobierania, biblioteki klienckie usługi Azure Blob Storage używają szyfrowania kopert do szyfrowania i odszyfrowywania obiektów blob 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 przekazywanie

BlobClient Gdy obiekt wywołuje metodę przekazywania, w celu przeprowadzenia szyfrowania po stronie klienta następuje kilka kroków:

  1. 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.
  2. Dane obiektów blob są szyfrowane przy użyciu klucza CEK.
  3. Klucz CEK jest następnie opakowany (zaszyfrowany) przy użyciu klucza szyfrowania klucza (KEK) określonego 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, po prostu wywołuje algorytm opakowujący klucze udostępniany przez usługę Key Vault.
  4. Zaszyfrowane dane obiektów blob są następnie przekazywane na konto magazynu.

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 przekazaniu obiektu blob można wyświetlić obiekt blob na koncie magazynu, aby zobaczyć zaszyfrowaną zawartość wraz z metadanymi szyfrowania.

Odszyfrowywanie obiektu blob i pobieranie

Biblioteka klienta usługi Azure Storage zakłada, że użytkownik zarządza kluczem KEK lokalnie lub w magazynie kluczy. Użytkownik nie musi znać określonego klucza, który został użyty do szyfrowania. Rozpoznawanie kluczy określone w pliku ClientSideEncryptionOptions będzie używane do rozpoznawania identyfikatorów kluczy podczas pobierania i odszyfrowywania danych obiektu blob.

BlobClient Gdy obiekt wywołuje metodę pobierania, następuje kilka kroków odszyfrowywania zaszyfrowanych danych obiektu blob:

  1. Biblioteka kliencka pobiera zaszyfrowane dane obiektów blob, w tym metadane szyfrowania, z konta magazynu.
  2. 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 rozpaku klucza określony w pliku 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.
  3. Biblioteka klienta używa klucza CEK do odszyfrowania zaszyfrowanych danych obiektu blob.

Dodaj następujący kod, aby pobrać i odszyfrować wcześniej przekazany obiekt blob.

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