Provisionar chaves habilitadas para enclave
Aplica-se a: SQL Server 2019 (15.x) e posterior - somente Windows Banco de Dados SQL do Azure
Este artigo descreve como provisionar chaves com suporte a enclave que suportam processamentos dentro de enclaves seguros no lado do servidor usados para Always Encrypted com o uso de enclaves seguros.
As diretrizes e processos gerais para o gerenciamento de chaves Always Encrypted aplicam-se quando se provisionam chaves habilitadas por enclave. Este artigo aborda detalhes específicos do Always Encrypted com enclaves seguros.
Para provisionar uma chave mestra de coluna habilitada para enclave usando o SQL Server Management Studio ou o PowerShell, verifique se a nova chave oferece suporte a cálculos de enclave. Isso fará com que a ferramenta (SSMS ou PowerShell) gere a instrução CREATE COLUMN MASTER KEY
que define o ENCLAVE_COMPUTATIONS
nos metadados da chave mestra das colunas no banco de dados. Para obter mais informações, consulte CREATE COLUMN MASTER KEY (Transact-SQL).
A ferramenta também assinará digitalmente as propriedades mestras da coluna com a chave mestra da coluna e armazenará a assinatura nos metadados do banco de dados. A assinatura impede a adulteração maliciosa da configuração ENCLAVE_COMPUTATIONS
. Os drivers do cliente SQL verificam as assinaturas antes de permitir o uso do enclave. Isso fornece aos administradores de segurança controle sobre quais dados de coluna podem ser computados dentro do enclave.
O ENCLAVE_COMPUTATIONS
é imutável, ou seja, você não pode alterá-lo depois de definir a chave mestra da coluna nos metadados. Para ativar cálculos de enclave usando uma chave de criptografia de coluna, que uma chave mestra de coluna específica criptografa, é necessário substituir a chave mestra de coluna por uma chave mestra de coluna habilitada para enclave. Consulte Girar chaves habilitadas para enclave.
Observação
Atualmente, o SSMS e o PowerShell oferecem suporte a chaves mestras de coluna com suporte a enclave, armazenadas no Cofre de Chaves do Azure ou no Armazém de Certificados do Windows. Módulos de segurança de hardware (usando CNG ou CAPI) não são suportados.
Para criar uma chave de criptografia de coluna com suporte a enclave, é necessário garantir a seleção de uma chave mestra de coluna com suporte a enclave para criptografar a nova chave.
As seções a seguir fornecem mais detalhes sobre como provisionar chaves habilitadas para enclave usando o SSMS e o PowerShell.
Provisionar chaves com suporte para enclave usando o SQL Server Management Studio
No SQL Server Management Studio, você pode provisionar:
- Uma chave mestra de coluna ativada para enclave usando o diálogo Nova Chave Mestra de Coluna.
- Uma chave de criptografia de coluna habilitada para enclave usando a caixa de diálogo Nova Chave de Criptografia de Coluna.
O Assistente Always Encrypted também permite criar uma chave mestra de coluna com suporte a enclave e uma chave de criptografia de coluna correspondente.
Verifique se você instalou a versão mais recente de disponibilidade geral (GA) do SQL Server Management Studio (SSMS).
Configurar chaves mestras de coluna que sejam habilitadas para enclave na caixa de diálogo Nova Chave Mestra de Coluna
Para provisionar uma chave mestra de coluna com suporte para enclave, siga os passos em Provisionar Chaves Mestras de Coluna com a caixa de diálogo Nova Chave Mestra de Coluna. Certifique-se de selecionar Permitir cálculos de enclave. Veja a captura de tela abaixo:
Observação
A caixa de seleção Permitir cálculos de enclave aparecerá somente se um enclave seguro estiver configurado para seu banco de dados. Se você estiver usando o SQL Server, consulte Configurar o enclave seguro no SQL Server. Se estiver a utilizar a Base de Dados SQL do Azure, consulte Ativar Always Encrypted com enclaves seguros para a sua Base de Dados SQL do Azure.
Dica
Para verificar se uma chave mestra de coluna é compatível com enclave, clique com o botão direito sobre ela no Explorador de Objetos e selecione Propriedades. Se a chave estiver habilitada para enclave, Enclave Computations: Allowed aparecerá na janela que mostra as propriedades da chave. Como alternativa, você pode usar o sys.column_master_keys (Transact-SQL) visualização.
Prover chaves de criptografia de coluna habilitadas para enclave com a caixa de diálogo Nova Chave de Criptografia de Coluna
Para configurar uma chave de criptografia de coluna com suporte para enclave, siga as etapas em Configurar chaves de criptografia de coluna com a caixa de diálogo Nova chave de criptografia de coluna. Ao selecionar uma chave mestra de coluna, certifique-se de que ela esteja ativada para o enclave.
Dica
Para verificar se uma chave de criptografia de coluna está ativada para enclave, clique com o botão direito do mouse nela no Explorador de Objetos e selecione Propriedades. Se a chave estiver ativada para enclaves, Enclave Computations: Allowed aparecerá na janela que mostra as propriedades da chave.
Configurar chaves ativadas pelo enclave utilizando PowerShell
Para provisionar chaves habilitadas para enclave usando o PowerShell, você precisa do módulo SqlServer PowerShell versão 22 ou superior.
Em geral, os fluxos de trabalho de provisionamento de chaves do PowerShell (com e sem separação de funções) para Always Encrypted, descritos em Provisionar chaves Always Encrypted usando o PowerShell, também se aplicam a chaves com suporte a enclave. Esta seção descreve detalhes específicos relativas a chaves habilitadas para enclave.
O módulo SqlServer PowerShell estende os cmdlets New-SqlCertificateStoreColumnMasterKeySettings e New-SqlAzureKeyVaultColumnMasterKeySettings com o parâmetro -AllowEnclaveComputations
, permitindo-lhe especificar uma chave mestra de coluna que esteja habilitada para enclave durante o processo de provisionamento. O cmdlet cria um objeto local contendo propriedades de uma chave mestra de coluna (armazenada no Cofre de Chaves do Azure ou no Repositório de Certificados do Windows). Se especificado, a propriedade -AllowEnclaveComputations
marca a chave como habilitada para enclave no objeto local. Ele também faz com que o cmdlet acesse a chave mestra da coluna referenciada (no Cofre de Chaves do Azure ou no Windows Certificate Store) para assinar digitalmente as propriedades da chave. Depois de criar um objeto de configurações para uma nova chave mestra de coluna habilitada para enclave, pode utilizá-lo numa invocação subsequente do cmdlet New-SqlColumnMasterKey para criar um objeto de metadados que descreva a nova chave no banco de dados.
O provisionamento de chaves de criptografia de coluna habilitadas para enclave não é diferente do provisionamento de chaves de criptografia de coluna que não são habilitadas para enclave. Você só precisa ter certeza de que uma chave mestra de coluna usada para criptografar a nova chave de criptografia de coluna é compatível com enclave.
Observação
Atualmente, o módulo SqlServer PowerShell não oferece suporte ao provisionamento de chaves habilitadas para enclave armazenadas em módulos de segurança de hardware (usando CNG ou CAPI).
Exemplo - configurar chaves compatíveis com enclave usando o Repositório de Certificados do Windows
O exemplo de ponta a ponta abaixo mostra como provisionar chaves com suporte para enclave, armazenando a chave mestra de coluna no Windows Certificate Store. O script é baseado no exemplo em Repositório de Certificados do Windows sem Separação de Funções (Exemplo). Importante observar o uso do parâmetro
# Create a column master key in Windows Certificate Store.
$cert = New-SelfSignedCertificate -Subject "AlwaysEncryptedCert" -CertStoreLocation Cert:CurrentUser\My -KeyExportPolicy Exportable -Type DocumentEncryptionCert -KeyUsage DataEncipherment -KeySpec KeyExchange
# Import the SqlServer module.
Import-Module "SqlServer" -MinimumVersion 22.0.50
# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True"
$database = Get-SqlDatabase -ConnectionString $connStr
# Create a SqlColumnMasterKeySettings object for your column master key
# using the -AllowEnclaveComputations parameter.
$cmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation "CurrentUser" -Thumbprint $cert.Thumbprint -AllowEnclaveComputations
# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings
# Generate a column encryption key, encrypt it with the column master key and create column encryption key metadata in the database.
$cekName = "CEK1"
New-SqlColumnEncryptionKey -Name $cekName -InputObject $database -ColumnMasterKey $cmkName
Exemplo - provisionar chaves habilitadas para enclave usando o Azure Key Vault
O exemplo completo abaixo mostra como provisionar chaves com suporte para enclave, armazenando a chave mestra de coluna em um Cofre de Chaves no Cofre de Chaves do Azure. O script baseia-se no exemplo em Azure Key Vault sem separação de funções (Exemplo). É importante observar duas diferenças entre o fluxo de trabalho para chaves com suporte a enclave e as chaves que não têm suporte a enclave.
- No script abaixo, o New-SqlCertificateStoreColumnMasterKeySettings usa o parâmetro
-AllowEnclaveComputations
para habilitar a nova chave mestra de coluna para enclave. - O script abaixo usa o cmdlet Get-AzAccessToken para obter um token de acesso para cofres de chaves. Isso é necessário porque o New-SqlAzureKeyVaultColumnMasterKeySettings precisa ter acesso ao Cofre de Chaves do Azure para assinar as propriedades da chave-mestra da coluna.
# Create a column master key in Azure Key Vault.
Import-Module "SqlServer" -MinimumVersion 22.0.50
Import-Module Az.Accounts -MinimumVersion 2.2.0
Connect-AzAccount
$SubscriptionId = "<Azure SubscriptionId>"
$resourceGroup = "<resource group name>"
$azureLocation = "<datacenter location>"
$akvName = "<key vault name>"
$akvKeyName = "<key name>"
$azureCtx = Set-AzConteXt -SubscriptionId $SubscriptionId # Sets the context for the below cmdlets to the specified subscription.
New-AzResourceGroup -Name $resourceGroup -Location $azureLocation # Creates a new resource group - skip, if your desired group already exists.
New-AzKeyVault -VaultName $akvName -ResourceGroupName $resourceGroup -Location $azureLocation # Creates a new key vault - skip if your vault already exists.
Set-AzKeyVaultAccessPolicy -VaultName $akvName -ResourceGroupName $resourceGroup -PermissionsToKeys get, create, delete, list, wrapKey,unwrapKey, sign, verify -UserPrincipalName $azureCtx.Account
$akvKey = Add-AzKeyVaultKey -VaultName $akvName -Name $akvKeyName -Destination "Software"
# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True"
$database = Get-SqlDatabase -ConnectionString $connStr
# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token
# Create a SqlColumnMasterKeySettings object for your column master key.
$cmkSettings = New-SqlAzureKeyVaultColumnMasterKeySettings -KeyURL $akvKey.ID -AllowEnclaveComputations -KeyVaultAccessToken $keyVaultAccessToken
# Create column master key metadata in the database.
$cmkName = "CMK1"
New-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings
# Generate a column encryption key, encrypt it with the column master key and create column encryption key metadata in the database.
$cekName = "CEK1"
New-SqlColumnEncryptionKey -Name $cekName -InputObject $database -ColumnMasterKey $cmkName -KeyVaultAccessToken $keyVaultAccessToken
Próximos passos
- Executar instruções Transact-SQL usando enclaves seguros
- Configure a criptografia de coluna no local utilizando Always Encrypted com enclaves seguros
- Ative a funcionalidade Always Encrypted com enclaves seguros para colunas criptografadas existentes
- Desenvolver aplicações usando Always Encrypted com enclaves seguros