Criptografia do lado do cliente para blobs

A biblioteca de cliente do Armazenamento de Blobs do Azure para .NET dá suporte à criptografia de dados em aplicativos cliente antes de carregar no Armazenamento do Azure e descriptografar dados durante o download para o cliente. A biblioteca também oferece suporte à integração com o Azure Key Vault para gerenciamento de chaves de conta de armazenamento.

Importante

O Armazenamento de Blobs suporta criptografia do lado do serviço e do lado do cliente. Para a maioria dos cenários, a Microsoft recomenda o uso de recursos de criptografia do lado do serviço para facilitar o uso na proteção de seus dados. Para saber mais sobre a criptografia do lado do serviço, consulte Criptografia do Armazenamento do Azure para dados em repouso.

Para obter um tutorial passo a passo que o orienta pelo processo de criptografia de blobs usando a criptografia do lado do cliente e o Cofre da Chave do Azure, consulte Criptografar e descriptografar blobs no Armazenamento do Microsoft Azure usando o Cofre da Chave do Azure.

Sobre a criptografia do lado do cliente

A biblioteca de cliente do Armazenamento de Blobs do Azure usa AES (Advanced Encryption Standard) para criptografar dados do usuário. Há duas versões de criptografia do lado do cliente disponíveis na biblioteca do cliente:

Aviso

O uso da versão 1 da criptografia do lado do cliente não é mais recomendado devido a uma vulnerabilidade de segurança na implementação do modo CBC da biblioteca do cliente. Para obter mais informações sobre esta vulnerabilidade de segurança, consulte Armazenamento do Azure atualizando a criptografia do lado do cliente no SDK para resolver a vulnerabilidade de segurança. Se você estiver usando a versão 1, recomendamos que atualize seu aplicativo para usar a versão 2 e migrar seus dados. Consulte a seção a seguir, Mitigar a vulnerabilidade de segurança em seus aplicativos, para obter mais orientações.

Reduza a vulnerabilidade de segurança em seus aplicativos

Devido a uma vulnerabilidade de segurança descoberta na implementação do modo CBC da biblioteca de cliente de Armazenamento de Blobs, a Microsoft recomenda que você execute uma ou mais das seguintes ações imediatamente:

  • Considere o uso de recursos de criptografia do lado do serviço em vez da criptografia do lado do cliente. Para obter mais informações sobre recursos de criptografia do lado do serviço, consulte Criptografia do Armazenamento do Azure para dados em repouso.

  • Se você precisar usar a criptografia do lado do cliente, migre seus aplicativos da criptografia do lado do cliente v1 para a criptografia do lado do cliente v2.

A tabela a seguir resume as etapas a serem seguidas se você optar por migrar seus aplicativos para a criptografia do lado do cliente v2:

Status de criptografia do lado do cliente Ações recomendadas
O aplicativo está usando a criptografia do lado do cliente, uma versão da biblioteca do cliente que suporta apenas a criptografia do lado do cliente v1. Atualize seu aplicativo para usar uma versão da biblioteca de cliente que ofereça suporte à criptografia do lado do cliente v2. Consulte Matriz de suporte do SDK para criptografia do lado do cliente para obter uma lista de versões suportadas. Saiba mais...

Atualize seu código para usar a criptografia do lado do cliente v2. Saiba mais...

Transfira todos os dados encriptados para os desencriptar e, em seguida, volte a encriptar com a encriptação do lado do cliente v2. Saiba mais...
O aplicativo está usando a criptografia do lado do cliente com uma versão da biblioteca do cliente que oferece suporte à criptografia do lado do cliente v2. Atualize seu código para usar a criptografia do lado do cliente v2. Saiba mais...

Transfira todos os dados encriptados para os desencriptar e, em seguida, volte a encriptar com a encriptação do lado do cliente v2. Saiba mais...

Além disso, a Microsoft recomenda que você siga as seguintes etapas para ajudar a proteger seus dados:

  • Configure suas contas de armazenamento para usar pontos de extremidade privados para proteger todo o tráfego entre sua rede virtual (VNet) e sua conta de armazenamento por meio de um link privado. Para obter mais informações, consulte Usar pontos de extremidade privados para o Armazenamento do Azure.
  • Limite o acesso à rede apenas a redes específicas.

Matriz de suporte do SDK para criptografia do lado do cliente

A tabela a seguir mostra quais versões das bibliotecas de cliente para .NET, Java e Python suportam diferentes versões de criptografia do lado do cliente:

.NET Java Python
Criptografia do lado do cliente v2 e v1 Versões 12.13.0 e posteriores Versões 12.18.0 e posteriores Versões 12.13.0 e posteriores
Criptografia do lado do cliente v1 somente Versões 12.12.0 e anteriores Versões 12.17.0 e anteriores Versões 12.12.0 e anteriores

Nota

A criptografia do lado do cliente v2.1 está disponível no Java SDK para as versões 12.27.0 e posteriores. Esta versão permite configurar o comprimento da região para encriptação autenticada, de 16 bytes a 1 GiB. Para obter mais informações, consulte o exemplo Java em Exemplo: Criptografando e descriptografando um blob com criptografia do lado do cliente v2.

Se seu aplicativo estiver usando criptografia do lado do cliente com uma versão anterior da biblioteca de cliente .NET, Java ou Python, você deve primeiro atualizar seu código para uma versão que ofereça suporte à criptografia do lado do cliente v2. Em seguida, você deve descriptografar e criptografar novamente seus dados com a criptografia do lado do cliente v2. Se necessário, você pode usar uma versão da biblioteca de cliente que ofereça suporte à criptografia do lado do cliente v2 lado a lado com uma versão anterior da biblioteca do cliente enquanto estiver migrando seu código. Para obter exemplos de código, consulte Exemplo: Criptografando e descriptografando um blob com criptografia do lado do cliente v2.

Como funciona a criptografia do lado do cliente

As bibliotecas de cliente do Armazenamento de Blobs do Azure usam criptografia de envelope para criptografar e descriptografar seus dados no lado do cliente. A criptografia de envelope criptografa uma chave com uma ou mais chaves adicionais.

As bibliotecas de cliente do Armazenamento de Blob dependem do Cofre da Chave do Azure para proteger as chaves usadas para criptografia do lado do cliente. Para obter mais informações sobre o Azure Key Vault, consulte O que é o Azure Key Vault?.

Encriptação e desencriptação através da técnica de envelope

A encriptação através da técnica de envelope funciona da seguinte forma:

  1. A biblioteca de cliente do Armazenamento do Azure gera uma chave de criptografia de conteúdo (CEK), que é uma chave simétrica de uso único.

  2. Os dados do usuário são criptografados usando o CEK.

  3. O CEK é então encapsulado (criptografado) usando a chave de criptografia de chave (KEK). O KEK é identificado por um identificador de chave e pode ser um par de chaves assimétricas ou uma chave simétrica. Você pode gerenciar o KEK localmente ou armazená-lo em um Cofre de Chaves do Azure.

    A própria biblioteca de cliente do Armazenamento do Azure nunca tem acesso ao KEK. A biblioteca invoca o algoritmo de encapsulamento de chaves fornecido pelo Cofre de Chaves. Os usuários podem optar por usar provedores personalizados para empacotamento/desempacotamento de chaves, se desejarem.

  4. Os dados criptografados são então carregados no Armazenamento de Blobs do Azure. A chave encapsulada, juntamente com alguns metadados de criptografia adicionais, é armazenada como metadados no blob.

A desencriptação através da técnica de envelope funciona da seguinte forma:

  1. A biblioteca de cliente do Armazenamento do Azure pressupõe que o usuário esteja gerenciando o KEK localmente ou em um Cofre de Chaves do Azure. O usuário não precisa saber a chave específica que foi usada para criptografia. Em vez disso, um resolvedor de chaves que resolve diferentes identificadores de chave para chaves pode ser configurado e usado.
  2. A biblioteca de cliente baixa os dados criptografados junto com qualquer material de criptografia armazenado no Armazenamento do Azure.
  3. O CEK encapsulado é então desembrulhado (desencriptado) usando o KEK. A biblioteca de cliente não tem acesso ao KEK durante esse processo, mas apenas invoca o algoritmo de desempacotamento do Cofre de Chaves do Azure ou outro armazenamento de chaves.
  4. A biblioteca de cliente usa o CEK para descriptografar os dados criptografados do usuário.

Encriptação/desencriptação no upload/download de blob

A biblioteca de cliente de Armazenamento de Blobs suporta criptografia de blobs inteiros somente no upload. Para downloads, são suportados downloads completos e intervalos. A criptografia do lado do cliente v2 fragmenta os dados em 4 blocos de criptografia autenticados em buffer de 4 MiB que só podem ser transformados inteiros. Para ajustar o tamanho do bloco, verifique se você está usando a versão mais recente do SDK que oferece suporte à criptografia do lado do cliente v2.1. O comprimento da região é configurável de 16 bytes até 1 GiB.

Durante a criptografia, a biblioteca do cliente gera um vetor de inicialização aleatório (IV) de 16 bytes e um CEK aleatório de 32 bytes e executa a criptografia de envelope dos dados de blob usando essas informações. O CEK encapsulado e alguns metadados de criptografia adicionais são então armazenados como metadados de blob junto com o blob criptografado.

Quando um cliente baixa um blob inteiro, o CEK encapsulado é desempacotado e usado junto com o IV para retornar os dados descriptografados ao cliente.

Baixar um intervalo arbitrário no blob criptografado envolve ajustar o intervalo fornecido pelos usuários para obter uma pequena quantidade de dados adicionais que podem ser usados para descriptografar com êxito o intervalo solicitado.

Todos os tipos de blob (blobs de bloco, blobs de página e blobs de acréscimo) podem ser criptografados/descriptografados usando esse esquema.

Aviso

Se você estiver editando ou carregando seus próprios metadados para o blob, deverá garantir que os metadados de criptografia sejam preservados. Se você carregar novos metadados sem também preservar os metadados de criptografia, os metadados CEK, IV e outros encapsulados serão perdidos e você não poderá recuperar o conteúdo do blob. Chamar a operação Definir metadados de blob sempre substitui todos os metadados de blob.

Ao ler ou gravar em um blob criptografado, use comandos de upload de blob inteiro, como Put Blob, e comandos de download de blob range ou inteiro, como Get Blob. Evite gravar em um blob criptografado usando operações de protocolo como Put Block, Put Block List, Put Page ou Append Block. Chamar essas operações em um blob criptografado pode corrompê-lo e torná-lo ilegível.

Exemplo: Criptografando e descriptografando um blob com criptografia do lado do cliente v2

O exemplo de código nesta seção mostra como usar a criptografia do lado do cliente v2 para criptografar e descriptografar um blob.

Importante

Se você tiver dados que foram previamente criptografados com criptografia do lado do cliente v1, precisará descriptografar esses dados e criptografá-los novamente com a criptografia do lado do cliente v2. Consulte a orientação e o exemplo para sua biblioteca de cliente abaixo.

Para usar a criptografia do lado do cliente do seu código .NET, consulte a biblioteca de cliente de Armazenamento de Blob. Certifique-se de que está a utilizar a versão 12.13.0 ou posterior. Se você precisar migrar da versão 11.x para a versão 12.13.0, consulte o Guia de migração.

Dois pacotes adicionais são necessários para a integração do Azure Key Vault para criptografia do lado do cliente:

  • O pacote Azure.Core fornece as IKeyEncryptionKey interfaces e IKeyEncryptionKeyResolver . A biblioteca de cliente de Armazenamento de Blob para .NET já define esse assembly como uma dependência.

  • O pacote Azure.Security.KeyVault.Keys (versão 4.x e posterior) fornece o cliente REST do Cofre da Chave e os clientes criptográficos usados com criptografia do lado do cliente. Certifique-se de que este pacote é referenciado em seu projeto se você estiver usando o Azure Key Vault como seu armazenamento de chaves.

    O Azure Key Vault foi projetado para chaves mestras de alto valor e os limites de limitação por cofre de chaves refletem esse design. A partir da versão 4.1.0 do Azure.Security.KeyVault.Keys, a IKeyEncryptionKeyResolver interface não suporta cache de chaves. Se o cache for necessário devido à limitação, você pode usar a abordagem demonstrada neste exemplo para injetar uma camada de cache em uma Azure.Security.KeyVault.Keys.Cryptography.KeyResolver instância.

Os desenvolvedores podem fornecer uma chave, um resolvedor de chaves ou ambos uma chave e um resolvedor de chaves. As chaves são identificadas usando um identificador de chave que fornece a lógica para encapsular e desembrulhar o CEK. Um resolvedor de chave é usado para resolver uma chave durante o processo de desencriptação. O resolvedor de chaves define um método de resolução que retorna uma chave dada um identificador de chave. O resolvedor oferece aos usuários a capacidade de escolher entre várias chaves que são gerenciadas em vários locais.

Na encriptação, a chave é sempre usada e a ausência de uma chave resulta num erro.

Na desencriptação, se a chave for especificada e o seu identificador corresponder ao identificador de chave necessário, essa chave é usada para desencriptação. Caso contrário, a biblioteca de cliente tentará chamar o resolvedor. Se não houver nenhum resolvedor especificado, a biblioteca do cliente lançará um erro. Se um resolvedor for especificado, o resolvedor de chave será invocado para obter a chave. Se o resolvedor for especificado, mas não tiver um mapeamento para o identificador de chave, a biblioteca do cliente lançará um erro.

Para usar a criptografia do lado do cliente, crie um objeto ClientSideEncryptionOptions e defina-o na criação do cliente com SpecializedBlobClientOptions. Não é possível definir opções de criptografia por API. Todo o resto é tratado pela biblioteca do cliente internamente.

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

Você pode aplicar opções de criptografia a um construtor BlobServiceClient, BlobContainerClient ou BlobClient que aceitam objetos BlobClientOptions .

Se um objeto BlobClient já existir em seu código, mas não tiver opções de criptografia do lado do cliente, você poderá usar um método de extensão para criar uma cópia desse objeto com ClientSideEncryptionOptions fornecido. Esse método de extensão evita a sobrecarga de construir um novo objeto BlobClient do zero.

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

Depois de atualizar seu código para usar a criptografia do lado do cliente v2, certifique-se de descriptografar e criptografar novamente todos os dados criptografados existentes, conforme descrito em Criptografar novamente dados criptografados anteriormente com criptografia do lado do cliente v2.

Criptografe novamente dados criptografados anteriormente com criptografia do lado do cliente v2

Todos os dados que foram anteriormente criptografados com a criptografia do lado do cliente v1 devem ser descriptografados e, em seguida, criptografados novamente com a criptografia do lado do cliente v2 para reduzir a vulnerabilidade de segurança. A desencriptação requer o descarregamento dos dados e a nova encriptação requer o recarregamento para o Armazenamento de Blobs.

Para obter um projeto de exemplo que mostra como migrar dados da criptografia do lado do cliente v1 para v2 e como criptografar dados com criptografia do lado do cliente v2 no .NET, consulte o projeto de exemplo de migração de criptografia.

Criptografia e desempenho do lado do cliente

Lembre-se de que criptografar seus dados de armazenamento resulta em sobrecarga de desempenho adicional. Quando você usa a criptografia do lado do cliente em seu aplicativo, a biblioteca do cliente deve gerar com segurança o CEK e o IV, criptografar o próprio conteúdo, se comunicar com o armazenamento de chaves escolhido para o envelopamento de chaves e formatar e carregar metadados adicionais. Essa sobrecarga varia dependendo da quantidade de dados que estão sendo criptografados. Recomendamos que os clientes sempre testem o desempenho de seus aplicativos durante o desenvolvimento.

Próximos passos