Partilhar via


Provisionar chaves habilitadas para enclave

Aplica-se a: SQL Server 2019 (15.x) e versões posteriores (somente para Windows) Banco de Dados SQL do Azure

Este artigo descreve como provisionar chaves habilitadas para enclave compatíveis com cálculos dentro dos enclaves seguros no servidor usados para Always Encrypted com enclaves seguros.

As diretrizes e os processos gerais para gerenciar chaves de Always Encrypted se aplicam quando você provisiona chaves habilitadas para 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 é compatível com as computações 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 de colunas no banco de dados. Para obter mais informações, veja CREATE COLUMN MASTER KEY (Transact-SQL).

A ferramenta também assinará digitalmente as propriedades mestras de coluna com a chave mestra de coluna e armazenará a assinatura nos metadados do banco de dados. A assinatura evita a violação mal-intencionada da configuração ENCLAVE_COMPUTATIONS. Os drivers do cliente SQL verificam as assinaturas antes de permitir o uso do enclave. Isso proporciona aos administradores da segurança o controle de quais dados da coluna podem ser calculados dentro de enclave.

O ENCLAVE_COMPUTATIONS é imutável, ou seja, você não pode alterá-lo depois de definir a chave mestra de coluna nos metadados. Para habilitar computações de enclave usando uma chave de criptografia de coluna, que uma determinada chave mestra de coluna criptografa, você precisará girar a chave mestra de coluna e substituí-la por uma chave mestra de coluna habilitada para enclave. Confira Girar chaves habilitadas para enclave.

Observação

Atualmente, o SSMS e o PowerShell são compatíveis com chaves mestras de coluna habilitadas para enclave armazenadas no Azure Key Vault ou no repositório de certificados do Windows. Não há compatibilidade com módulos de segurança de hardware (usando CNG ou CAPI).

Para criar uma chave de criptografia de coluna habilitada para enclave, você precisará selecionar uma chave mestra de coluna habilitada para 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 habilitadas para enclave usando o SQL Server Management Studio

No SQL Server Management Studio, você pode provisionar:

  • Uma chave mestra de coluna habilitada para enclave usando o diálogo Nova chave mestra de coluna.
  • Uma chave de criptografia de coluna habilitada para enclave usando o diálogo Nova chave de criptografia de coluna.

O Assistente Always Encrypted também permite que você crie uma chave mestra de coluna habilitada para enclave e uma chave de criptografia de coluna habilitada para enclave.

Verifique se você instalou a versão de disponibilidade geral (GA) mais recente do SQL Server Management Studio (SSMS).

Provisionar chaves mestras de coluna habilitadas para enclave com o diálogo Nova chave mestra de coluna

Para provisionar uma chave mestra de coluna habilitada para enclave, siga as etapas em Provisionar chaves mestras de coluna com o diálogo Nova chave mestra de coluna. Certifique-se de selecionar Permitir computações de enclave. Veja a captura de tela abaixo:

Permitir computações de enclave

Observação

A caixa de seleção Permitir computações de enclave só será exibida se um enclave seguro estiver configurado para o banco de dados. Se você estiver usando o SQL Server, confira Configurar o enclave seguro no SQL Server. Se você está usando o Banco de Dados SQL do Azure, confira Habilitar Always Encrypted com enclaves seguros no Banco de Dados SQL do Azure.

Dica

Para verificar se uma chave mestra de coluna está habilitada para enclave, clique com o botão direito do mouse nela no Pesquisador de Objetos e selecione Propriedades. Se a chave estiver habilitada para enclave, Cálculos de Enclave: Permitidos aparecerá na janela mostrando as propriedades da chave. Como alternativa, você pode usar a exibição sys.column_master_keys (Transact-SQL).

Provisionar chaves de criptografia de coluna habilitadas para enclave usando o diálogo Nova chave de criptografia de coluna

Para provisionar uma chave de criptografia de coluna habilitada para enclave, siga as etapas em Provisionar chaves de criptografia de coluna com o diálogo Nova chave de criptografia de coluna. Ao selecionar uma chave mestra de coluna, verifique se ela está habilitada para enclave.

Dica

Para verificar se uma chave de criptografia de coluna está habilitada para enclave, clique com o botão direito do mouse nela no Pesquisador de Objetos e selecione Propriedades. Se a chave estiver habilitada para enclave, Cálculos de Enclave: Permitidos aparecerá na janela mostrando as propriedades da chave.

Provisionar chaves habilitadas para enclave usando o PowerShell

Para provisionar chaves habilitadas para enclave usando o PowerShell, você precisará ter o módulo SqlServer PowerShell versão 22 ou superior.

Em geral, os fluxos de trabalho de provisionamento de chave do PowerShell (com e sem separação de função) para Always Encrypted, descritos em Provisionar chaves Always Encrypted usando o PowerShell também se aplicam a chaves habilitadas para enclave. Esta seção descreve detalhes específicos de chaves habilitadas para enclave.

O módulo SqlServer do PowerShell estende os cmdlets New-SqlCertificateStoreColumnMasterKeySettings e New-SqlAzureKeyVaultColumnMasterKeySettings com o parâmetro -AllowEnclaveComputations para permitir que você especifique uma chave mestra de coluna habilitada para enclave durante o processo de provisionamento. Um cmdlet cria um objeto local que contém as propriedades de uma chave mestra de coluna (armazenada no Azure Key Vault ou no repositório de certificados do Windows). Se especificada, a propriedade -AllowEnclaveComputations marcará a chave como habilitada para enclave no objeto local. Ela também faz com que o cmdlet acesse a chave mestra de coluna referenciada (no Azure Key Vault ou no repositório de certificados do Windows) 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, você pode usá-lo em uma invocação subsequente do cmdlet New-SqlColumnMasterKey para criar um objeto de metadados que descreve 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 certificar-se de que uma chave mestra de coluna usada para criptografar a nova chave de criptografia de coluna esteja habilitada para enclave.

Observação

O módulo SqlServer PowerShell atualmente não é compatível com o provisionamento de chaves habilitadas para enclave armazenadas em módulos de segurança de hardware (usando CNG ou CAPI).

Exemplo – Provisionamento de chaves habilitadas para enclave usando o repositório de certificados do Windows

O exemplo de ponta a ponta abaixo mostra como provisionar chaves habilitadas para enclave, armazenando a chave mestra de coluna armazenada no repositório de certificados do Windows. Esse 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 -AllowEnclaveComputations no cmdlet New-SqlCertificateStoreColumnMasterKeySettings, que é a única diferença entre os fluxos de trabalho nos dois exemplos.

# 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 – Provisionamento de chaves habilitadas para enclave usando o Azure Key Vault

O exemplo de ponta a ponta a seguir mostra como provisionar chaves habilitadas para enclave, armazenando a chave mestra de coluna em um cofre de chaves no Azure Key Vault. O script é baseado 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 habilitadas para enclave em comparação com as chaves que não são habilitadas para enclave.

  • No script abaixo, o New-SqlCertificateStoreColumnMasterKeySettings usa o parâmetro -AllowEnclaveComputations para tornar a nova chave mestra de coluna habilitada para enclave.
  • O script abaixo usa o cmdlet Get-AzAccessToken para obter um token de acesso para cofres de chaves. Isso é necessário porque New-SqlAzureKeyVaultColumnMasterKeySettings precisa ter acesso ao Azure Key Vault 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óximas etapas

Confira também