Encriptação do lado do cliente para blobs

O Armazenamento de Blobs do Azure biblioteca de cliente para .NET suporta a encriptação de dados em aplicações cliente antes de carregar para o Armazenamento do Azure e desencriptar dados durante a transferência para o cliente. A biblioteca também suporta a integração com o Azure Key Vault para a gestão de chaves da conta de armazenamento.

Importante

O Armazenamento de Blobs suporta encriptação do lado do serviço e do lado do cliente. Para a maioria dos cenários, a Microsoft recomenda a utilização de funcionalidades de encriptação do lado do serviço para facilitar a utilização na proteção dos seus dados. Para saber mais sobre a encriptação do lado do serviço, veja Encriptação do Armazenamento do Azure para dados inativos.

Para obter um tutorial passo a passo que o conduz ao longo do processo de encriptação de blobs com encriptação do lado do cliente e Key Vault do Azure, veja Encriptar e desencriptar blobs no Armazenamento do Microsoft Azure com o Azure Key Vault.

Acerca da encriptação do lado do cliente

A biblioteca de cliente Armazenamento de Blobs do Azure utiliza a AES para encriptar os dados dos utilizadores. Existem duas versões de encriptação do lado do cliente disponíveis na biblioteca de cliente:

Aviso

A utilização da versão 1 da encriptação do lado do cliente já não é recomendada devido a uma vulnerabilidade de segurança na implementação do modo CBC da biblioteca de cliente. Para obter mais informações sobre esta vulnerabilidade de segurança, veja Armazenamento do Azure a atualizar a encriptação do lado do cliente no SDK para resolver vulnerabilidades de segurança. Se estiver a utilizar a versão 1, recomendamos que atualize a sua aplicação para utilizar a versão 2 e migrar os seus dados. Veja a secção seguinte, Mitigar a vulnerabilidade de segurança nas suas aplicações, para obter mais orientações.

Mitigar a vulnerabilidade de segurança nas suas aplicações

Devido a uma vulnerabilidade de segurança detetada na implementação do modo CBC pela biblioteca de cliente do Armazenamento de Blobs, a Microsoft recomenda que realize imediatamente uma ou mais das seguintes ações:

  • Considere utilizar funcionalidades de encriptação do lado do serviço em vez de encriptação do lado do cliente. Para obter mais informações sobre as funcionalidades de encriptação do lado do serviço, veja Encriptação do Armazenamento do Azure para dados inativos.

  • Se precisar de utilizar a encriptação do lado do cliente, migre as aplicações da encriptação do lado do cliente v1 para a encriptação do lado do cliente v2.

A tabela seguinte resume os passos que terá de seguir se optar por migrar as suas aplicações para a encriptação do lado do cliente v2:

Estado de encriptação do lado do cliente Ações recomendadas
A aplicação está a utilizar a encriptação do lado do cliente numa versão da biblioteca de cliente que suporta apenas encriptação do lado do cliente v1. Atualize a aplicação para utilizar uma versão da biblioteca de cliente que suporte encriptação do lado do cliente v2. Veja Matriz de suporte do SDK para encriptação do lado do cliente para obter uma lista de versões suportadas. Saiba mais...

Atualize o código para utilizar a encriptação do lado do cliente v2. Saiba mais...

Transfira quaisquer dados encriptados para os desencriptar e, em seguida, volte a criptá-lo com encriptação do lado do cliente v2. Saiba mais...
A aplicação está a utilizar a encriptação do lado do cliente com uma versão da biblioteca de cliente que suporta encriptação do lado do cliente v2. Atualize o código para utilizar a encriptação do lado do cliente v2. Saiba mais...

Transfira quaisquer dados encriptados para os desencriptar e, em seguida, volte a criptá-lo com encriptação do lado do cliente v2. Saiba mais...

Além disso, a Microsoft recomenda que siga os seguintes passos para ajudar a proteger os seus dados:

  • Configure as suas contas de armazenamento para utilizar pontos finais privados para proteger todo o tráfego entre a sua rede virtual (VNet) e a sua conta de armazenamento através de uma ligação privada. Para obter mais informações, veja Utilizar pontos finais privados para o Armazenamento do Azure.
  • Limitar o acesso de rede apenas a redes específicas.

Matriz de suporte do SDK para encriptação do lado do cliente

A tabela seguinte mostra que versões das bibliotecas de cliente para .NET, Java e Python suportam as versões da encriptação do lado do cliente:

.NET Java Python
Encriptação do lado do cliente v2 e v1 Versões 12.13.0 e posterior Versões 12.18.0 e posterior Versões 12.13.0 e posterior
Encriptação do lado do cliente apenas v1 Versões 12.12.0 e anterior Versões 12.17.0 e anterior Versões 12.12.0 e anterior

Se a sua aplicação estiver a utilizar a encriptação do lado do cliente com uma versão anterior da biblioteca de cliente .NET, Java ou Python, primeiro tem de atualizar o código para uma versão que suporte encriptação do lado do cliente v2. Em seguida, tem de desencriptar e voltar a encriptar os seus dados com encriptação do lado do cliente v2. Se necessário, pode utilizar uma versão da biblioteca de cliente que suporte encriptação do lado do cliente v2 lado a lado com uma versão anterior da biblioteca de cliente enquanto está a migrar o código. Para obter exemplos de código, veja Exemplo: Encriptar e desencriptar um blob com encriptação do lado do cliente v2.

Como funciona a encriptação do lado do cliente

As bibliotecas de cliente Armazenamento de Blobs do Azure utilizam a encriptação de envelopes para encriptar e desencriptar os seus dados do lado do cliente. A encriptação de envelope encripta uma chave com uma ou mais chaves adicionais.

As bibliotecas de cliente do Armazenamento de Blobs dependem do Azure Key Vault para proteger as chaves que são utilizadas para a encriptação 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 encriptação de conteúdo (CEK), que é uma chave simétrica de utilização única.

  2. Os dados do utilizador são encriptados com o CEK.

  3. Em seguida, o CEK é moldado (encriptado) com a chave de encriptação de chaves (KEK). O KEK é identificado por um identificador de chave e pode ser um par de chaves assimétricas ou uma chave simétrica. Pode gerir o KEK localmente ou armazená-lo num Key Vault do Azure.

    A biblioteca de cliente do Armazenamento do Azure nunca tem acesso ao KEK. A biblioteca invoca o algoritmo de encapsulamento de chaves fornecido pelo Key Vault. Se pretender, os utilizadores podem optar por utilizar fornecedores personalizados para encapsulamento/desembrulhação de chaves.

  4. Em seguida, os dados encriptados são carregados para Armazenamento de Blobs do Azure. A chave encapsulada juntamente com alguns metadados de encriptação 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 utilizador está a gerir o KEK localmente ou num Key Vault do Azure. O utilizador não precisa de saber a chave específica que foi utilizada para encriptação. Em vez disso, pode ser configurada e utilizada uma resolução de chaves que resolve diferentes identificadores de chaves.
  2. A biblioteca de cliente transfere os dados encriptados juntamente com qualquer material de encriptação armazenado no Armazenamento do Azure.
  3. Em seguida, o CEK moldado é desembrulhado (desencriptado) com o KEK. A biblioteca de cliente não tem acesso à KEK durante este processo, mas invoca apenas o algoritmo de desembrulhação do Key Vault do Azure ou de outro arquivo de chaves.
  4. A biblioteca de cliente utiliza o CEK para desencriptar os dados de utilizador encriptados.

Encriptação/desencriptação no carregamento/transferência de blobs

A biblioteca de cliente do Armazenamento de Blobs suporta a encriptação de blobs inteiros apenas no carregamento. Para transferências, são suportadas transferências completas e de intervalo.

Durante a encriptação, a biblioteca de cliente gera um vetor de inicialização aleatória (IV) de 16 bytes e um CEK aleatório de 32 bytes e executa a encriptação de envelopes dos dados de blobs com estas informações. O CEK encapsulado e alguns metadados de encriptação adicionais são armazenados como metadados de blobs juntamente com o blob encriptado.

Quando um cliente transfere um blob inteiro, o CEK encapsulado é desembrulhado e utilizado em conjunto com o IV para devolver os dados desencriptados ao cliente.

Transferir um intervalo arbitrário no blob encriptado envolve ajustar o intervalo fornecido pelos utilizadores para obter uma pequena quantidade de dados adicionais que podem ser utilizados para desencriptar com êxito o intervalo pedido.

Todos os tipos de blobs (blobs de blocos, blobs de páginas e blobs de acréscimo) podem ser encriptados/desencriptados com este esquema.

Aviso

Se estiver a editar ou a carregar os seus próprios metadados para o blob, tem de garantir que os metadados de encriptação são preservados. Se carregar novos metadados sem preservar também os metadados de encriptação, o CEK, IV e outros metadados moldados serão perdidos e não poderá obter o conteúdo do blob. Chamar a operação Definir Metadados de Blobs substitui sempre todos os metadados de blobs.

Ao ler ou escrever num blob encriptado, utilize comandos de carregamento de blobs inteiros, como Colocar Blob, e comandos de transferência de blobs inteiros ou intervalos, como Obter Blob. Evite escrever num blob encriptado através de operações de protocolo, como Colocar Bloco, Colocar Lista de Blocos, Colocar Página ou Bloco de Acréscimo. Chamar estas operações num blob encriptado pode corrompê-lo e torná-lo ilegível.

Exemplo: Encriptar e desencriptar um blob com encriptação do lado do cliente v2

O exemplo de código nesta secção mostra como utilizar a encriptação do lado do cliente v2 para encriptar e desencriptar um blob.

Importante

Se tiver dados que tenham sido encriptados anteriormente com encriptação do lado do cliente v1, terá de desencriptar esses dados e reencriptá-lo com encriptação do lado do cliente v2. Veja a documentação de orientação e o exemplo da biblioteca de cliente abaixo.

Para utilizar a encriptação do lado do cliente a partir do código .NET, faça referência à biblioteca de cliente do Armazenamento de Blobs. Certifique-se de que está a utilizar a versão 12.13.0 ou posterior. Se precisar de migrar da versão 11.x para a versão 12.13.0, consulte o Guia de migração.

São necessários dois pacotes adicionais para a integração do Azure Key Vault para encriptação do lado do cliente:

  • O pacote Azure.Core fornece as IKeyEncryptionKey interfaces e IKeyEncryptionKeyResolver . A biblioteca de cliente do Armazenamento de Blobs para .NET já define esta assemblagem como uma dependência.

  • O pacote Azure.Security.KeyVault.Keys (versão 4.x e posterior) fornece o cliente REST Key Vault e os clientes criptográficos que são utilizados com a encriptação do lado do cliente. Terá de garantir que este pacote é referenciado no seu projeto se estiver a utilizar o Azure Key Vault como arquivo de chaves.

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

Os programadores podem fornecer uma chave, uma resolução de chaves ou uma chave e uma resolução de chaves. As chaves são identificadas com um identificador de chave que fornece a lógica para encapsular e desembrulhar o CEK. É utilizada uma resolução de chaves para resolver uma chave durante o processo de desencriptação. A resolução de chaves define um método de resolução que devolve uma chave com um identificador de chave. A resolução proporciona aos utilizadores a capacidade de escolher entre várias chaves que são geridas em várias localizações.

Na encriptação, a chave é sempre utilizada e a ausência de uma chave resultará num erro.

Na desencriptação, se a chave for especificada e o respetivo identificador corresponder ao identificador de chave necessário, essa chave é utilizada para desencriptação. Caso contrário, a biblioteca de cliente tenta chamar a resolução. Se não existir nenhuma resolução especificada, a biblioteca de cliente gera um erro. Se for especificada uma resolução, a resolução de chaves é invocada para obter a chave. Se a resolução for especificada, mas não tiver um mapeamento para o identificador de chave, a biblioteca de cliente gera um erro.

Para utilizar a encriptação do lado do cliente, crie um objeto ClientSideEncryptionOptions e defina-o na criação do cliente com SpecializedBlobClientOptions. Não pode definir opções de encriptação por API. Todo o resto será processado pela biblioteca de 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(connectionString, 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);

Pode aplicar opções de encriptação a construtores BlobServiceClient, BlobContainerClient ou BlobClient que aceitem objetos BlobClientOptions .

Se já existir um objeto BlobClient no seu código, mas não tiver opções de encriptação do lado do cliente, pode utilizar um método de extensão para criar uma cópia desse objeto com o ClientSideEncryptionOptions especificado. Este método de extensão evita a sobrecarga da construção de 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 o código para utilizar a encriptação do lado do cliente v2, certifique-se de que desencripta e reencripta quaisquer dados encriptados existentes, conforme descrito em Reencriptar dados encriptados anteriormente com encriptação do lado do cliente v2.

Reencriptar dados encriptados anteriormente com encriptação do lado do cliente v2

Todos os dados que foram anteriormente encriptados com encriptação do lado do cliente v1 têm de ser desencriptados e, em seguida, reencriptados com encriptação do lado do cliente v2 para mitigar a vulnerabilidade de segurança. A desencriptação requer a transferência dos dados e a reencriptação requer o recarregamento dos mesmos para o Armazenamento de Blobs.

Para um projeto de exemplo que mostra como migrar dados da encriptação do lado do cliente v1 para v2 e como encriptar dados com a encriptação do lado do cliente v2 no .NET, veja o projeto de exemplo de migração de encriptação.

Encriptação e desempenho do lado do cliente

Tenha em atenção que a encriptação dos dados de armazenamento resulta numa sobrecarga de desempenho adicional. Quando utiliza a encriptação do lado do cliente na sua aplicação, a biblioteca de cliente tem de gerar de forma segura o CEK e o IV, encriptar o conteúdo propriamente dito, comunicar com o seu keystore escolhido para obter informações sobre a chave e formatar e carregar metadados adicionais. Esta sobrecarga varia consoante a quantidade de dados que estão a ser encriptados. Recomendamos que os clientes testem sempre as aplicações para desempenho durante o desenvolvimento.

Passos seguintes