Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a: SQL Server 2019 (15.x) e versões posteriores no Windows
Base 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 mais informações, vejaCREATE 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 dá aos administradores de segurança o controle sobre quais dados de coluna podem ser processados dentro do enclave.
Depois de definir a chave mestra da coluna nos metadados, a ENCLAVE_COMPUTATIONS propriedade é imutável e não pode alterá-la. Para permitir os cálculos do enclave usando uma chave de encriptação de coluna que uma chave mestra de coluna existente encripta, rode a chave mestra da coluna e substitua-a por uma chave mestra de coluna habilitada pelo enclave. Consulte Rodar chaves com suporte a 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 com enclave usando o diálogo Nova Chave Mestra de Coluna.
- Uma chave de encriptação de coluna habilitada para enclave, utilizando a caixa de diálogo Nova Chave de Encriptação 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 com suporte a enclave.
Instale a versão mais recente do SQL Server Management Studio (SSMS).
Configurar chaves mestras de coluna habilitadas para enclaves na caixa de diálogo Nova Chave Mestra de Coluna
Para provisionar uma chave mestra de coluna compatível com enclave, siga os passos descritos 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.
Provisionar 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, verifique se ela está com suporte a 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 habilitada para enclave, Enclave Computations: Allowed aparecerá na janela que mostra as propriedades da chave.
Provisionar chaves compatíveis com enclave utilizando PowerShell
Para provisionar chaves habilitadas para enclave usando o PowerShell, você precisa do módulo SqlServer PowerShell versão 22 ou superior.
Observação
A Microsoft recomenda usar o PowerShell 7 ou versões posteriores ao executar scripts Always Encrypted PowerShell. O PowerShell 7 oferece suporte melhorado multiplataforma, melhor desempenho e a mais recente compatibilidade com o módulo SqlServer (v22+), que é necessário para muitos cenários Always Crypted.
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 relativos a chaves com suporte 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 aprovisionamento de chaves de criptografia de coluna habilitadas para o enclave não é diferente do aprovisionamento de chaves de criptografia de coluna que não são habilitadas para o 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 -AllowEnclaveComputations no cmdlet New-SqlCertificateStoreColumnMasterKeySettings, que é a única diferença entre os fluxos de trabalho nos dois exemplos.
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[string]$DatabaseName = '<database name>',
[Parameter(Mandatory = $false)]
[string]$ServerName = "<server name>",
[Parameter(Mandatory = $false)]
[string]$CertificateSubject = "AlwaysEncryptedCert",
[Parameter(Mandatory = $false)]
[string]$CmkName = "CMK",
[Parameter(Mandatory = $false)]
[string]$CekName = "CEK"
)
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
Import-Module SqlServer -MinimumVersion 22.0.50 -ErrorAction Stop
Write-Host "[AE] Locating certificate '$CertificateSubject' in CurrentUser\\My"
$cert = Get-ChildItem -Path Cert:CurrentUser\My |
Where-Object { $_.Subject -eq "CN=$CertificateSubject" } |
Sort-Object NotAfter -Descending |
Select-Object -First 1
if (-not $cert) {
Write-Host "[AE] Certificate not found. Creating self-signed certificate."
$cert = New-SelfSignedCertificate `
-Subject $CertificateSubject `
-CertStoreLocation Cert:CurrentUser\My `
-KeyExportPolicy Exportable `
-Type DocumentEncryptionCert `
-KeyUsage DataEncipherment `
-KeySpec KeyExchange
}
Write-Host "[AE] Connecting to SQL Server '$ServerName' / Database '$DatabaseName'"
$connStr = "Server=$ServerName;Database=$DatabaseName;Integrated Security=True;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30"
try {
$database = Get-SqlDatabase -ConnectionString $connStr -ErrorAction Stop
}
catch {
Write-Error "Failed to connect to '$ServerName' database '$DatabaseName'. Verify instance name SQL2025, database existence, and local permissions."
throw
}
Write-Host "[AE] Creating CMK settings from certificate thumbprint"
$cmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation "CurrentUser" -Thumbprint $cert.Thumbprint -AllowEnclaveComputations
Write-Host "[AE] Ensuring CMK '$CmkName' exists"
$existingCmk = Get-SqlColumnMasterKey -InputObject $database | Where-Object { $_.Name -eq $CmkName }
if (-not $existingCmk) {
New-SqlColumnMasterKey -Name $CmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings | Out-Null
}
Write-Host "[AE] Ensuring CEK '$CekName' exists"
$existingCek = Get-SqlColumnEncryptionKey -InputObject $database | Where-Object { $_.Name -eq $CekName }
if (-not $existingCek) {
New-SqlColumnEncryptionKey -Name $CekName -InputObject $database -ColumnMasterKey $CmkName | Out-Null
}
Write-Host "Completed successfully"
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 utiliza o parâmetro
-AllowEnclaveComputationspara tornar a nova chave mestra de coluna compatível com 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.
param(
[Parameter(Mandatory = $true)] [string]$SubscriptionId,
[Parameter(Mandatory = $true)] [string]$ResourceGroupName,
[Parameter(Mandatory = $true)] [string]$AzureLocation,
[Parameter(Mandatory = $true)] [string]$KeyVaultName,
[Parameter(Mandatory = $true)] [string]$KeyName,
[Parameter(Mandatory = $true)] [string]$ServerName,
[Parameter(Mandatory = $true)] [string]$DatabaseName,
[string]$CmkName = "CMK",
[string]$CekName = "CEK",
[bool]$AssignRbacToCurrentPrincipal = $true
)
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
Import-Module Az.Accounts -ErrorAction Stop
Import-Module Az.Resources -ErrorAction Stop
Import-Module Az.KeyVault -ErrorAction Stop
Import-Module SqlServer -ErrorAction Stop
function Get-CurrentPrincipalObjectId {
param([string]$AccountId)
$userSignedIn = Get-AzADUser -SignedIn -ErrorAction SilentlyContinue
if ($userSignedIn) { return $userSignedIn.Id }
$user = Get-AzADUser -UserPrincipalName $AccountId -ErrorAction SilentlyContinue
if ($user) { return $user.Id }
$sp = Get-AzADServicePrincipal -DisplayName $AccountId -ErrorAction SilentlyContinue | Select-Object -First 1
if ($sp) { return $sp.Id }
throw "Could not resolve Microsoft Entra object id for account '$AccountId'."
}
try {
Write-Host "[AE] Signing in and selecting subscription"
Connect-AzAccount | Out-Null
$ctx = Set-AzContext -SubscriptionId $SubscriptionId
Write-Host "[AE] Ensuring resource group exists"
$resourceGroup = Get-AzResourceGroup -Name $ResourceGroupName -ErrorAction SilentlyContinue
if (-not $resourceGroup) {
$resourceGroup = New-AzResourceGroup -Name $ResourceGroupName -Location $AzureLocation
}
Write-Host "[AE] Ensuring key vault exists (RBAC mode)"
$vault = Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $ResourceGroupName -ErrorAction SilentlyContinue
if (-not $vault) {
$vault = New-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $ResourceGroupName -Location $AzureLocation -EnableRbacAuthorization
}
if (-not $vault.EnableRbacAuthorization) {
throw "Key Vault '$KeyVaultName' is not using RBAC authorization. Enable RBAC authorization on the vault before running this script."
}
if ($AssignRbacToCurrentPrincipal) {
Write-Host "[AE] Ensuring RBAC role assignment"
$principalSignInName = $ctx.Account.Id
$roleName = "Key Vault Crypto Officer"
$existingRole = Get-AzRoleAssignment -SignInName $principalSignInName -Scope $vault.ResourceId -RoleDefinitionName $roleName -ErrorAction SilentlyContinue
if (-not $existingRole) {
New-AzRoleAssignment -SignInName $principalSignInName -Scope $vault.ResourceId -RoleDefinitionName $roleName | Out-Null
}
}
Write-Host "[AE] Ensuring column master key material exists in Key Vault"
$akvKey = Get-AzKeyVaultKey -VaultName $KeyVaultName -Name $KeyName -ErrorAction SilentlyContinue
if (-not $akvKey) {
$akvKey = Add-AzKeyVaultKey -VaultName $KeyVaultName -Name $KeyName -Destination "Software"
}
Write-Host "[AE] Connecting to Azure SQL and creating metadata"
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl "https://vault.azure.net").Token
$connStr = "Server=tcp:$ServerName.database.windows.net,1433;Database=$DatabaseName;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Authentication=Active Directory Interactive"
$database = Get-SqlDatabase -ConnectionString $connStr -Encrypt Mandatory
$cmkSettings = New-SqlAzureKeyVaultColumnMasterKeySettings -KeyUrl $akvKey.Key.Kid -AllowEnclaveComputations
$existingCmk = Get-SqlColumnMasterKey -InputObject $database | Where-Object { $_.Name -eq $CmkName }
if (-not $existingCmk) {
New-SqlColumnMasterKey -Name $CmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings | Out-Null
}
$existingCek = Get-SqlColumnEncryptionKey -InputObject $database | Where-Object { $_.Name -eq $CekName }
if (-not $existingCek) {
New-SqlColumnEncryptionKey -Name $CekName -InputObject $database -ColumnMasterKey $CmkName -KeyVaultAccessToken $keyVaultAccessToken | Out-Null
}
Write-Host "Completed successfully"
}
catch {
Write-Error "Script failed: $($_.Exception.Message)"
throw
}
Conteúdo relacionado
- 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
- Introdução ao uso do Always Encrypted com enclaves seguros
- Gerencie chaves para Always Encrypted com enclaves seguros
- CREATE COLUMN MASTER KEY (Transact-SQL)