Criar e armazenar chaves mestras de coluna para Always Encrypted

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do Azure

Chaves mestras de coluna são chaves de proteção de chave usadas no Always Encrypted para criptografar chaves de criptografia de coluna. As chaves mestras de coluna devem ser armazenadas em um armazenamento de chaves confiável, e as chaves precisam estar acessíveis aos aplicativos que precisam criptografar ou descriptografar dados e às ferramentas para configurar o Always Encrypted e gerenciar suas chaves.

Este artigo fornece detalhes sobre como selecionar um repositório de chaves e criar chaves mestras de coluna para o Always Encrypted. Para obter uma visão detalhada, confira Overview of Key Management for Always Encrypted(Visão geral do gerenciamento de chaves do Sempre Criptografado).

Selecionar um repositório de chaves para sua chave mestra de coluna

O Always Encrypted dá suporte a vários repositórios de chaves para armazenar chaves mestras de coluna do Always Encrypted. Os repositórios de chaves com suporte variam de acordo com o driver e a versão utilizada.

Há duas categorias de alto nível de repositórios de chaves a serem consideradas – Repositórios de Chaves Locaise Repositórios de Chaves Centralizados.

Repositório de Chaves Local ou Centralizado?

  • Repositórios de Chaves Locais – só podem ser usados por aplicativos em computadores que contêm o repositório de chaves local. Em outras palavras, você precisa replicar o repositório de chaves e a chave em cada computador que executa o aplicativo. Um exemplo de um repositório de chaves local é o Repositório de Certificados do Windows. Ao usar um repositório de chaves local, você precisa verificar se o repositório de chaves existe em todos os computadores que hospedam o aplicativo e se o computador contém as chaves mestras de coluna que o aplicativo precisa para acessar os dados protegidos usando o Sempre Criptografado. Quando você provisiona uma chave mestra de coluna pela primeira vez ou quando altera (gira) a chave, é necessário verificar se a chave é implantada em todos os computadores que hospedam o(s) aplicativo(s).

  • Repositórios de Chaves Centralizados – atende a aplicativos em vários computadores. Um exemplo de um repositório de chaves centralizado é o Cofre de Chaves do Azure. Normalmente, um repositório de chaves centralizado facilita o gerenciamento de chaves, pois não é necessário manter várias cópias das chaves mestras de coluna em vários computadores. Verifique se os aplicativos estão configurados para se conectarem ao repositório de chaves centralizado.

Quais repositórios de chaves são compatíveis com drivers cliente com Always Encrypted habilitado?

Drivers de cliente habilitados para Sempre Criptografado são drivers de cliente do SQL Server que têm suporte interno para incorporar o Sempre Criptografado nos aplicativos cliente. Os drivers com Always Encrypted habilitado incluem alguns provedores internos para armazenamentos de chaves populares. Alguns drivers também permitem implementar e registrar um provedor personalizado de repositórios de chaves mestras de coluna, para que você possa usar qualquer repositório de chaves, mesmo se não houver nenhum provedor interno para ele. Ao decidir entre um provedor interno e um provedor personalizado, considere que o uso de um provedor interno, normalmente, significa menos alterações em seus aplicativos (em alguns casos, é necessária apenas a alteração de uma cadeia de conexão de banco de dados).

Os provedores internos disponíveis dependem do driver, da versão do driver e do sistema operacional selecionados. Confira a documentação do Always Encrypted de seu driver específico para determinar quais repositórios de chaves têm suporte pronto para uso e se o driver dá suporte a provedores personalizados de repositórios de chaves – Desenvolver aplicativos usando o Always Encrypted.

Quais repositórios de chaves têm suporte nas ferramentas SQL?

O SQL Server Management Studio, a extensão MSSQL para Visual Studio Code e o módulo sqlServer PowerShell dão suporte a chaves mestras de coluna armazenadas em:

  • Cofres de chaves e HSMs gerenciados no Azure Key Vault.

    Observação

    Os HSMs gerenciados exigem o SSMS 18.9 ou posterior e o módulo sqlServer PowerShell versão 21.1.18235 ou posterior. No momento, o Visual Studio Code não dá suporte a HSMs gerenciados.

  • Repositório de Certificados do Windows.

  • Repositórios de chaves, como módulos de segurança de hardware, que oferecem a API CNG (Cryptography Next Generation) ou a API CAPI (Cryptography API).

Criando chaves mestras de coluna no Repositório de Certificados do Windows

Uma chave mestra de coluna pode ser um certificado armazenado no Repositório de Certificados do Windows. Um driver habilitado para Always Encrypted não verifica uma data de validade nem uma cadeia de autoridade de certificado. Um certificado é usado apenas como um par de chaves consistindo em uma chave pública e uma chave privada.

Para ser uma chave mestra de coluna válida, um certificado deve:

  • ser um certificado X.509.
  • ser armazenado em uma das duas localizações de repositório de certificados: computador local ou usuário atual. (Para criar um certificado no local repositório de certificados do computador local, é necessário ser um administrador no computador de destino.)
  • conter uma chave privada (o tamanho recomendado das chaves no certificado é de 2.048 bits ou superior).
  • ser criado para a troca de chaves.

Há várias maneiras de criar um certificado que seja uma column master key válida, mas a opção mais simples é criar um certificado autoassinado.

Criar um certificado autoassinado usando o PowerShell

Use o cmdlet New-SelfSignedCertificate para criar um certificado autoassinado. O exemplo a seguir mostra como gerar um certificado que pode ser usado como chave mestra de coluna para o Always Encrypted.

# New-SelfSignedCertificate is a Windows PowerShell cmdlet that creates a self-signed certificate. The below examples show how to generate a certificate that can be used as a column master key for Always Encrypted.
$cert = New-SelfSignedCertificate -Subject "AlwaysEncryptedCert" -CertStoreLocation Cert:CurrentUser\My -KeyExportPolicy Exportable -Type DocumentEncryptionCert -KeyUsage KeyEncipherment -KeySpec KeyExchange -KeyLength 2048 

# To create a certificate in the local machine certificate store location you need to run the cmdlet as an administrator.
$cert = New-SelfSignedCertificate -Subject "AlwaysEncryptedCert" -CertStoreLocation Cert:LocalMachine\My -KeyExportPolicy Exportable -Type DocumentEncryptionCert -KeyUsage KeyEncipherment -KeySpec KeyExchange -KeyLength 2048

Criar um certificado autoassinado usando o SSMS (SQL Server Management Studio)

Para obter detalhes, confira Provisionar chaves Always Encrypted usando o SQL Server Management Studio. Para obter um tutorial passo a passo que usa o SSMS e armazena as chaves do Always Encrypted no Repositório de Certificados do Windows, consulte Tutorial do Assistente do Always Encrypted (Repositório de Certificados do Windows).

Disponibilizando certificados para aplicativos e usuários

Se a chave mestra de coluna for um certificado armazenado na localização do repositório de certificados do computador local , você precisará exportar o certificado com a chave privada e importá-lo para todos os computadores que hospedam aplicativos que devem criptografar ou descriptografar dados armazenados em colunas criptografadas ou ferramentas para a configuração do Always Encrypted e o gerenciamento das chaves do Always Encrypted. Além disso, cada usuário deve receber permissão de leitura para o certificado armazenado no repositório de certificados do computador local para poder usá-lo como chave mestra de coluna.

Se a chave mestra de coluna for um certificado armazenado no repositório de certificados do usuário atual, você precisará exportar o certificado com a chave privada e importá-lo para o repositório de certificados do usuário atual de todas as contas de usuário que executam aplicativos que devem criptografar ou descriptografar dados armazenados em colunas criptografadas, ou ferramentas para configurar o Always Encrypted e gerenciar as chaves do Always Encrypted (em todos os computadores que contêm esses aplicativos ou ferramentas). Nenhuma configuração de permissão é necessária – depois de fazer logon em um computador, um usuário pode acessar todos os certificados em sua localização do repositório de certificados do usuário atual.

Usando o PowerShell

Use os cmdlets Import-PfxCertificate e Export-PfxCertificate para importar e exportar um certificado.

Usando o Console de Gerenciamento Microsoft

Para conceder a um usuário a permissão Leitura para um certificado armazenado na localização do repositório de certificados do computador local, siga estas etapas:

  1. Abra um prompt de comando e digite mmc.
  2. No console do MMC, no menu Arquivo , clique em Adicionar/Remover Snap-in.
  3. Na caixa de diálogo Adicionar/Remover Snap-in , clique em Adicionar.
  4. Na caixa de diálogo Adicionar Snap-in Independente, clique em Certificados e, em seguida, em Adicionar.
  5. Na caixa de diálogo do snap-in Certificados, clique em Conta do computador e, em seguida, clique em Concluir.
  6. Na caixa de diálogo Adicionar Snap-in Autônomo , clique em Fechar.
  7. Na caixa de diálogo Adicionar/Remover Snap-in , clique em OK.
  8. No snap-in de Certificados, localize o certificado na pasta Certificados > Pessoal, clique com o botão direito do mouse no Certificado, aponte para Todas as Tarefas e clique em Gerenciar Chaves Privadas.
  9. Na caixa de diálogo Segurança , adicione permissões de leitura para uma conta de usuário, se necessário.

Criando chaves mestras de coluna no Cofre de Chaves do Azure

O Azure Key Vault ajuda a proteger segredos e chaves de criptografia, é uma opção conveniente para armazenar chaves mestras de coluna do Always Encrypted, especialmente se seus aplicativos estiverem hospedados no Azure. Para criar uma chave no Cofre de Chaves do Azure, é necessário ter uma assinatura do Azure e um Cofre de Chaves do Azure. Uma chave pode ser armazenada em um cofre de chaves ou em um HSM gerenciado. Para ser uma chave mestra de coluna válida, a chave gerenciada no Azure Key Vault deve ser uma chave RSA.

Usando a CLI do Azure, o Portal do Azure ou o Azure PowerShell

Saiba mais sobre como criar uma chave em um cofre de chaves, confira:

Saiba mais sobre como criar uma chave em um HSM gerenciado, confira:

SQL Server Management Studio (SSMS)

Para obter detalhes sobre como criar uma chave mestra de coluna em um cofre de chaves ou em um HSM gerenciado do Azure Key Vault usando o SSMS, consulte Provisionar chaves do Always Encrypted usando o SQL Server Management Studio. Para ver um tutorial passo a passo que usa o SSMS e armazena as chaves Always Encrypted em um cofre de chaves, veja o Tutorial do Assistente do Always Encrypted (Azure Key Vault).

Disponibilizando as chaves do Cofre de Chaves do Azure para aplicativos e usuários

Para acessar uma coluna criptografada, seu aplicativo precisa ser capaz de acessar o Azure Key Vault e também precisa de permissões específicas na chave mestra da coluna para descriptografar a chave de criptografia da coluna que a protege.

Para gerenciar chaves do Always Encrypted, você precisa de permissões para listar e criar chaves mestras de coluna no Azure Key Vault e executar operações criptográficas usando as chaves.

Key Vaults

Se você armazenar as chaves mestras de coluna em um cofre de chaves e estiver usando permissões de função para autorização:

  • A identidade da sua aplicação precisa ser membro de funções que permitam as seguintes ações do plano de dados no cofre de chaves:

    • Microsoft.KeyVault/vaults/keys/decrypt/action
    • Microsoft.KeyVault/vaults/keys/read
    • Microsoft.KeyVault/vaults/keys/verify/action

    A maneira mais fácil de conceder ao aplicativo a permissão necessária é adicionar a identidade dele à função Usuário de Criptografia do Cofre de Chaves. Você também pode criar uma função personalizada com as permissões necessárias.

  • Um usuário que gerencia chaves para o Always Encrypted precisa ser membro de funções que concedam as seguintes ações de plano de dados no cofre de chaves:

    • Microsoft.KeyVault/vaults/keys/create/action
    • Microsoft.KeyVault/vaults/keys/decrypt/action
    • Microsoft.KeyVault/vaults/keys/encrypt/action
    • Microsoft.KeyVault/vaults/keys/read
    • Microsoft.KeyVault/vaults/keys/sign/action
    • Microsoft.KeyVault/vaults/keys/verify/action

    A maneira mais fácil de conceder ao usuário a permissão necessária é adicionar o usuário à função de Usuário de Criptografia do Cofre de Chaves. Você também pode criar uma função personalizada com as permissões necessárias.

Se você armazenar as chaves mestras de coluna em um cofre de chaves e estiver usando políticas de acesso para autorização:

  • A identidade do aplicativo precisa das seguintes permissões de política de acesso no cofre de chaves: get, unwrapKey e verify.
  • Um usuário que gerencia chaves do Always Encrypted precisa das seguintes permissões de política de acesso no cofre de chaves: create, get, list, sign, unwrapKey, wrapKey, verify.

Para obter informações gerais sobre como configurar a autenticação e a autorização para cofres de chaves, confira Autorizar uma entidade de segurança para acessar o Key Vault.

HSMs gerenciados

A identidade do seu aplicativo precisa ser membro de funções que permitam as seguintes ações no plano de dados do seu HSM gerenciado:

  • Microsoft.KeyVault/managedHsm/keys/decrypt/action
  • Microsoft.KeyVault/managedHsm/keys/read/action
  • Microsoft.KeyVault/managedHsm/keys/verify/action

A Microsoft recomenda que você crie uma função personalizada contendo apenas as permissões acima.

Um usuário que gerencia chaves do Always Encrypted precisa ser um membro de funções que permitem as seguintes ações do plano de dados sobre a chave:

  • Microsoft.KeyVault/managedHsm/keys/create/action
  • Microsoft.KeyVault/managedHsm/keys/decrypt/action
  • Microsoft.KeyVault/managedHsm/keys/encrypt/action
  • Microsoft.KeyVault/managedHsm/keys/read
  • Microsoft.KeyVault/managedHsm/keys/sign/ação
  • Microsoft.KeyVault/managedHsm/keys/verify/action

A maneira mais fácil de conceder ao usuário as permissões acima é adicionar o usuário à função de Usuário de Criptografia do HSM Gerenciado. Você também pode criar uma função personalizada com as permissões necessárias.

Saiba mais sobre o controle de acesso a HSMs gerenciados, confira:

Criando chaves mestras de coluna em módulos de segurança de hardware usando o CNG

Uma chave mestra de coluna do Always Encrypted pode ser armazenada em um repositório de chaves que implementa a API CNG (Cryptography Next Generation). Normalmente, esse tipo de repositório é um HSM (módulo de segurança de hardware). Um HSM é um dispositivo físico que protege e gerencia chaves digitais e fornece processamento de criptografia. Tradicionalmente, os HSMs são fornecidos na forma de um cartão plug-in ou um dispositivo externo que é anexado diretamente a um computador (HSMs locais) ou a um servidor de rede.

Para disponibilizar um HSM para aplicativos em determinado computador, um KSP (Provedor de Armazenamento de Chaves), que implementa o CNG, deve ser instalado e configurado no computador. Um driver cliente do Always Encrypted (um provedor de repositório da chave mestra de coluna dentro do driver) usa o KSP para criptografar e descriptografar chaves de criptografia de coluna, protegidas pela chave mestra de coluna armazenada no repositório de chaves.

O Windows inclui o Provedor de Armazenamento de Chaves do Software Microsoft – um KSP baseado em software, que pode ser usado para fins de teste. Veja CNG Key Storage Providers(Provedores de Armazenamento de Chaves do CNG).

Criando chaves mestras de coluna em um repositório de chaves usando o CNG/KSP

Uma chave mestra de coluna deve ser uma chave assimétrica (um par de chaves pública/privada), que usa o algoritmo RSA. O tamanho de chave recomendado é de 2.048 ou maior.

Usando ferramentas específicas do HSM

Consulte a documentação do seu HSM.

Usando o PowerShell

Você pode usar as APIs do .NET para criar uma chave em um repositório de chaves usando o CNG no PowerShell.

$cngProviderName = "Microsoft Software Key Storage Provider" # If you have an HSM, you can use a KSP for your HSM instead of a Microsoft KSP
$cngAlgorithmName = "RSA"
$cngKeySize = 2048 # Recommended key size for Always Encrypted column master keys
$cngKeyName = "AlwaysEncryptedKey" # Name identifying your new key in the KSP
$cngProvider = New-Object System.Security.Cryptography.CngProvider($cngProviderName)
$cngKeyParams = New-Object System.Security.Cryptography.CngKeyCreationParameters
$cngKeyParams.provider = $cngProvider
$cngKeyParams.KeyCreationOptions = [System.Security.Cryptography.CngKeyCreationOptions]::OverwriteExistingKey
$keySizeProperty = New-Object System.Security.Cryptography.CngProperty("Length", [System.BitConverter]::GetBytes($cngKeySize), [System.Security.Cryptography.CngPropertyOptions]::None);
$cngKeyParams.Parameters.Add($keySizeProperty)
$cngAlgorithm = New-Object System.Security.Cryptography.CngAlgorithm($cngAlgorithmName)
$cngKey = [System.Security.Cryptography.CngKey]::Create($cngAlgorithm, $cngKeyName, $cngKeyParams)

Como usar o SQL Server Management Studio.

Consulte Provisionar chaves do Always Encrypted usando o SQL Server Management Studio.

Disponibilizando chaves do CNG para aplicativos e usuários

Confira a documentação do HSM e do KSP para saber como configurar o KSP em um computador e conceder acesso ao HSM a aplicativos e usuários.

Criando chaves mestras de coluna em módulos de segurança de hardware usando a CAPI

Uma chave mestra de coluna do Always Encrypted pode ser armazenada em um armazenamento de chaves que implementa a API de Criptografia (CAPI). Normalmente, um repositório desse tipo é um HSM (módulo de segurança de hardware) – um dispositivo físico que protege e gerencia chaves digitais e fornece processamento de criptografia. Tradicionalmente, os HSMs são fornecidos na forma de um cartão plug-in ou um dispositivo externo que é anexado diretamente a um computador (HSMs locais) ou a um servidor de rede.

Para disponibilizar um HSM para aplicativos em determinado computador, um CSP (Provedor de Serviços de Criptografia), que implementa a CAPI, deve ser instalado e configurado no computador. Um driver cliente do Always Encrypted (um provedor de armazenamento de chaves mestras de coluna dentro do driver) usa o CSP para criptografar e descriptografar chaves de criptografia de coluna, protegidas por uma chave mestra de coluna armazenada no repositório de chaves.

Observação

A CAPI é uma API herdada e preterida. Se houver um KSP disponível para o seu HSM, você deve usá-lo em vez de um CSP/CAPI.

Um CSP deve oferecer suporte ao algoritmo RSA para uso com o Always Encrypted.

O Windows inclui os seguintes CSPs baseados em software (não apoiados por um HSM) que dão suporte ao RSA e que podem ser usados para fins de teste: Microsoft Enhanced RSA e AES Cryptographic Provider.

Criando chaves mestras de coluna em um repositório de chaves usando a CAPI ou o CSP

Uma chave mestra de coluna deve ser uma chave assimétrica (um par de chaves pública/privada), que usa o algoritmo RSA. O tamanho de chave recomendado é de 2.048 ou maior.

Usando ferramentas específicas do HSM

Consulte a documentação do seu HSM.

Usando o SSMS (SQL Server Management Studio)

Consulte Provisionar chaves do Always Encrypted usando o SQL Server Management Studio.

Disponibilizando chaves do CNG para aplicativos e usuários

Confira a documentação do HSM e do CSP para saber como configurar o CSP em um computador e conceder acesso ao HSM a aplicativos e usuários.