Поделиться через


Учебник. Шифрование и расшифровка больших двоичных объектов с помощью хранилища ключей Azure

В этом руководстве вы узнаете, как использовать шифрование на стороне клиента для шифрования и расшифровки BLOB-объектов с помощью ключа, хранящегося в Azure Key Vault.

Хранилище BLOB-объектов Azure поддерживает шифрование на стороне службы и на стороне клиента. Для большинства сценариев корпорация Майкрософт рекомендует использовать функции шифрования на стороне службы, чтобы упростить защиту данных. Дополнительные сведения о шифровании на стороне службы см. в статье Шифрование Службы хранилища Azure для неактивных данных.

Клиентская библиотека для .NET Blob Storage Azure поддерживает шифрование данных на стороне клиента в приложениях перед отправкой в службу хранилища Azure и расшифровку данных при скачивании на клиент. Библиотека также поддерживает интеграцию с Azure Key Vault для управления ключами.

В этом учебнике описаны следующие процедуры.

  • Настройка разрешений для ресурса Azure Key Vault
  • Создание консольного приложения для взаимодействия с ресурсами с помощью клиентских библиотек .NET
  • Добавление ключа в хранилище ключей
  • Настройка параметров шифрования на стороне клиента с помощью ключа, хранящегося в хранилище ключей
  • Создание клиентского объекта службы BLOB-объектов с включенным шифрованием на стороне клиента
  • Отправка зашифрованного большого двоичного объекта, а затем скачивание и расшифровка большого двоичного объекта

Предварительные условия

Назначение роли пользователю Microsoft Entra

При локальной разработке убедитесь, что учетная запись пользователя, доступ к хранилищу ключей, имеет правильные разрешения. Вам потребуется роль офицера шифрования Key Vault, чтобы создать ключ и выполнить действия по ключам в хранилище ключей. Роли Azure RBAC можно назначить пользователю с помощью портала Azure, Azure CLI или Azure PowerShell. Дополнительные сведения о доступных областях назначения ролей можно узнать на странице обзора области.

В этом сценарии вы назначите разрешения вашей учетной записи пользователя в пределах хранилища ключей, чтобы следовать принципу наименьших привилегий. В рамках этой практики пользователям предоставляются только минимальные необходимые разрешения, что позволяет создавать более защищенные рабочие среды.

В следующем примере показано, как назначить роль офицера по криптографии Key Vault вашей учетной записи пользователя, что обеспечит доступ, необходимый для выполнения этого руководства.

Внимание

В большинстве случаев для распространения назначения ролей в Azure потребуется минута или две, но в редких случаях может потребоваться до восьми минут. Если при первом запуске кода возникают ошибки аутентификации, подождите несколько минут и повторите попытку.

  1. В портале Azure найдите хранилище ключей с помощью основной строки поиска или левого меню навигации.

  2. На странице обзора хранилища ключей выберите элемент управления доступом (IAM) в меню слева.

  3. На странице Контроль доступа (IAM) откройте вкладку Назначения ролей.

  4. Выберите + Добавить в верхнем меню, а затем выберите Добавить назначение роли в появившемся раскрывающемся меню.

    Снимок экрана, показывающий, как назначить роль в портале Azure.

  5. Используйте поле поиска, чтобы отфильтровать результаты для отображения нужной роли. В этом примере найдите сотрудника по шифрованию Key Vault и выберите соответствующий результат, а затем нажмите кнопку "Далее".

  6. В разделе Назначение доступа для выберите Пользователь, группа или объект службы и + Выбрать участников.

  7. В диалоговом окне найдите имя пользователя Microsoft Entra (обычно ваш адрес электронной почты user@domain), а затем выберите Выбрать в нижней части диалогового окна.

  8. Нажмите кнопку Проверить и назначить, чтобы перейти на последнюю страницу, а затем еще раз Проверить и назначить, чтобы завершить процесс.

Настройка проекта

  1. В окне консоли (например, PowerShell или Bash) используйте dotnet new команду для создания консольного приложения с именем BlobEncryptionKeyVault. Эта команда создает простой проект "Hello World" на языке C# с одним файлом исходного кода Program.cs.

    dotnet new console -n BlobEncryptionKeyVault
    
  2. Перейдите в вновь созданный каталог BlobEncryptionKeyVault.

    cd BlobEncryptionKeyVault
    
  3. Откройте проект в нужном редакторе кода. Чтобы открыть проект в:

    • Visual Studio, найдите и дважды щелкните файл BlobEncryptionKeyVault.csproj.
    • Visual Studio Code, выполните эту команду:
    code .
    

Чтобы взаимодействовать со службами Azure в этом примере, установите следующие клиентские библиотеки с помощью dotnet add package.

dotnet add package Azure.Identity
dotnet add package Azure.Security.KeyVault.Keys
dotnet add package Azure.Storage.Blobs

Добавьте следующие using директивы и добавьте ссылку на 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;

Настройка переменных среды

Это приложение ищет переменную среды под названием KEY_VAULT_NAME для получения имени хранилища ключей. Чтобы задать переменную среды, откройте окно консоли и следуйте инструкциям операционной системы. Замените <your-key-vault-name> именем своего хранилища ключей.

Windows:

Переменные среды для Windows можно задать из командной строки. Однако при использовании этого подхода значения доступны всем приложениям, работающим в этой операционной системе, и могут привести к конфликтам, если вы не осторожны. Переменные среды можно задать на уровне пользователя или системы:

setx KEY_VAULT_NAME "<your-key-vault-name>"

После добавления переменной среды в Windows вам необходимо запустить новый экземпляр командного окна. Если вы используете Visual Studio в Windows, может потребоваться повторно запустить Visual Studio после создания переменной среды для обнаружения изменения.

Linux:

export KEY_VAULT_NAME=<your-key-vault-name>

Добавление ключа в Azure Key Vault

В этом примере мы создадим ключ и добавим его в хранилище ключей с помощью клиентской библиотеки Azure Key Vault. Вы также можете создать и добавить ключ в хранилище ключей с помощью Azure CLI, портал Azure или PowerShell.

В приведенном ниже примере мы создадим объект KeyClient для указанного хранилища. Затем KeyClient объект используется для создания нового ключа RSA в указанном хранилище.

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

Создание экземпляров ключей и резольвера ключей

Затем мы будем использовать ключ, который мы только что добавили в хранилище, чтобы создать экземпляры клиента криптографии и решателя ключей. CryptographyClient реализует IKeyEncryptionKey и используется для выполнения криптографических операций с ключами, хранящимися в Azure Key Vault. KeyResolver реализует IKeyEncryptionResolver и извлекает ключи шифрования ключей из идентификатора ключа и разрешает ключ.

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

Если у вас в хранилище уже есть ключ, которым вы хотите зашифровать, вы можете создать экземпляры ключа и резолвера ключей, передав URI:

var keyVaultKeyUri = $"https://{keyVaultName}.vault.azure.net/keys/{keyName}";
CryptographyClient cryptoClient = new CryptographyClient(new Uri(keyVaultKeyUri), tokenCredential);

Настройка параметров шифрования

Теперь необходимо настроить параметры шифрования, которые будут использоваться для отправки и скачивания BLOB-объектов. Чтобы использовать шифрование на стороне клиента, сначала создаем объект ClientSideEncryptionOptions и устанавливаем его при создании клиента с помощью SpecializedBlobClientOptions.

Класс ClientSideEncryptionOptions предоставляет параметры конфигурации клиента для подключения к хранилищу BLOB-объектов с помощью шифрования на стороне клиента. KeyEncryptionKey требуется для операций отправки и используется для упаковки созданного ключа шифрования содержимого. KeyResolver требуется для операций загрузки и находит правильный ключ шифрования ключей, чтобы расшифровать скачанный ключ шифрования содержимого. KeyWrapAlgorithm требуется для отправки и указывает идентификатор алгоритма, используемый при оболочке ключа шифрования содержимого.

Внимание

Из-за уязвимости безопасности в версии 1 рекомендуется создать ClientSideEncryptionOptions объект, использующий ClientSideEncryptionVersion.V2_0 параметр версии. Дополнительные сведения об устранении уязвимости в приложениях см. в статье "Устранение уязвимостей безопасности в приложениях". Дополнительные сведения об этой уязвимости системы безопасности приведены в статье Обновление функции шифрования на стороне клиента в пакете SDK Службы хранилища Azure для устранения уязвимости системы безопасности.

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

Настройка клиентского объекта для использования шифрования на стороне клиента

В этом примере мы применяем параметры конфигурации шифрования на стороне клиента к объекту BlobServiceClient . При применении на уровне клиента службы эти параметры шифрования передаются от клиентов службы к клиентам контейнеров и от клиентов контейнеров к клиентам блобов. BlobClient Когда объект выполняет операцию загрузки или скачивания, клиентские библиотеки Azure Blob Storage используют конвертное шифрование для шифрования и расшифровки BLOB-объектов на стороне клиента. При использовании метода конверта ключ шифруется с помощью одного или нескольких дополнительных ключей.

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

Шифрование BLOB-объекта и его загрузка

BlobClient Когда объект вызывает метод отправки, выполняется несколько шагов для шифрования на стороне клиента:

  1. Клиентская библиотека хранилища Azure создает вектор случайной инициализации (IV) из 16 байт и случайный ключ шифрования содержимого (CEK) из 32 байт и выполняет оболочечное шифрование данных BLOB-объектов с помощью этой информации.
  2. Данные BLOB шифруются с помощью CEK.
  3. Затем CEK упаковывается (шифруется) с помощью ключа шифрования ключей (KEK), указанного в ClientSideEncryptionOptions. В этом примере KEK — это асимметричная пара ключей, хранящейся в указанном ресурсе Azure Key Vault. Клиент объектов хранения никогда не имеет доступа к KEK, он просто вызывает алгоритм обёртывания ключей, предоставленный Key Vault.
  4. Затем зашифрованные BLOB-данные загружаются в учетную запись хранения.

Добавьте следующий код, чтобы зашифровать большой двоичный объект и отправить его в учетную запись хранения Azure:

// Upload the encrypted contents to the blob
Stream blobContent = BinaryData.FromString("Ready for encryption, Captain.").ToStream();
await blob.UploadAsync(blobContent);

После загрузки блоба вы можете открыть его в своей учетной записи хранения, чтобы увидеть зашифрованное содержимое вместе с метаданными шифрования.

Расшифруйте BLOB-объект и загрузите его

Клиентская библиотека Azure Storage предполагает, что пользователь управляет KEK локально или в замке ключей. Пользователь может не знать, какой именно ключ использовался для шифрования. Сопоставитель ключей, указанный в ClientSideEncryptionOptions, будет использоваться для разрешения идентификаторов ключей при загрузке и расшифровке данных BLOB.

Когда объект BlobClient вызывает метод скачивания, выполняются несколько шагов для расшифровки зашифрованных данных BLOB.

  1. Клиентская библиотека загружает зашифрованные данные объектов BLOB, включая метаданные шифрования, из учетной записи хранения.
  2. Затем упакованный CEK расшифровывается с использованием KEK. Клиентская библиотека не имеет доступа к KEK во время этого процесса, но вызывает только алгоритм распаковки ключа, указанный в ClientSideEncryptionOptions. Закрытый ключ пары ключей RSA остается в хранилище ключей, поэтому зашифрованный ключ из метаданных BLOB-объектов, содержащих CEK, отправляется в хранилище ключей для расшифровки.
  3. Клиентская библиотека использует CEK для дешифровки зашифрованных данных 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());

Следующие шаги

В этом руководстве вы узнали, как использовать клиентские библиотеки .NET для выполнения шифрования на стороне клиента для операций отправки и скачивания BLOB-объектов.

Общие сведения о шифровании на стороне клиента для больших двоичных объектов, включая инструкции по переносу зашифрованных данных в версию 2, см. в разделе "Шифрование на стороне клиента" для больших двоичных объектов.

Дополнительные сведения о Azure Key Vault см. на странице обзора Azure Key Vault