Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a: SQL Server 2019 (15.x) e versões posteriores no Banco de Dados SQL do Windows
Azure
Este artigo descreve como provisionar chaves com suporte a enclave que dão suporte a computações em enclaves seguros no lado do servidor usados pelo 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, consulte CREATE COLUMN MASTER KEY (Transact-SQL).
A ferramenta também assinará digitalmente as propriedades mestras da 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 de segurança controle sobre quais dados de coluna podem ser calculados dentro do enclave.
Depois de definir a chave mestra de coluna nos metadados, a ENCLAVE_COMPUTATIONS propriedade será imutável e você não poderá alterá-la. Para habilitar computações de enclave usando uma chave de criptografia de coluna criptografada por uma chave mestra de coluna existente, faça a rotação da chave mestra de coluna e substitua-a por uma chave mestra de coluna habilitada para enclave. Consulte Rotacionar chaves habilitadas para enclaves.
Observação
Atualmente, o SSMS e o PowerShell oferecem suporte a chaves mestras de coluna habilitadas para uso com enclave armazenadas no Azure Key Vault ou no Repositório de Certificados do Windows. Não há suporte para módulos de segurança de hardware (usando CNG ou CAPI).
Para criar uma chave de criptografia de coluna compatível com enclave, é necessário selecionar uma chave mestra de coluna compatível com 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.
Provisione chaves com suporte a enclave usando o SQL Server Management Studio
No SQL Server Management Studio, você pode provisionar:
- Uma chave mestra de coluna com suporte a enclave usando a caixa de diálogo Nova Chave Mestra de Coluna.
- Uma chave de criptografia de coluna com suporte a enclave usando a caixa de diálogo Nova Chave de Criptografia de Coluna.
O Assistente Always Encrypted também permite que você crie 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 SSMS (SQL Server Management Studio).
Provisione chaves mestras de coluna com suporte a enclave usando a caixa de diálogo Nova Chave Mestra de Coluna
Para provisionar uma chave mestra de coluna com enclave habilitado, siga as etapas em Provisionar Chaves Mestras de Coluna com a caixa de diálogo Nova Chave Mestra de Coluna. Certifique-se de selecionar Permitir computações de enclave. Veja a captura de tela abaixo:
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, consulte Configurar o enclave seguro no SQL Server. Se você estiver usando o Banco de Dados SQL do Azure, consulte Habilitar o Always Encrypted com enclaves seguros para o 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 uso com enclave, Computações de Enclave: Permitidas aparecerá na janela que mostra 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 com suporte a enclave, siga as etapas em Provisionar Chaves de Criptografia de Coluna usando a caixa de diálogo Nova Chave de Criptografia de Coluna. Ao selecionar uma chave mestra de coluna, certifique-se de que ela esteja habilitada para o 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 com enclave habilitado, Computações de Enclave: Permitidas aparecerá na janela que mostra 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.
Observação
A Microsoft recomenda usar o PowerShell 7 ou superior ao executar scripts do PowerShell para Always Encrypted. O PowerShell 7 fornece suporte multiplataforma aprimorado, melhor desempenho e compatibilidade com a versão mais recente do módulo SqlServer (v22+), que é necessária para muitos cenários do Always Encrypted.
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 os detalhes específicos das chaves com suporte a 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 uso com 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 marca a chave como habilitada para uso em 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
No momento, o módulo do SqlServer PowerShell não dá suporte ao provisionamento de chaves habilitadas para enclave armazenadas em módulos de segurança de hardware (usando CNG ou CAPI).
Exemplo – provisionar chaves habilitadas para uso com enclave usando o Repositório de Certificados do Windows
O exemplo completo abaixo mostra como provisionar chaves habilitadas para enclave, com 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.
[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 – 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 ressaltar duas diferenças entre o fluxo de trabalho das chaves habilitadas para enclave e o das chaves que não são habilitadas para enclave.
- No script abaixo, o New-SqlCertificateStoreColumnMasterKeySettings usa o parâmetro
-AllowEnclaveComputationspara 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.
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 os enclaves seguros
- Configurar a criptografia da coluna localmente usando Always Encrypted com enclaves seguros
- Habilitar o Always Encrypted com enclaves seguros para as colunas criptografadas existentes
- Desenvolver aplicativos usando o Always Encrypted com enclaves seguros
- Introdução ao uso de Always Encrypted com enclaves seguros
- Gerenciar chaves para Always Encrypted com enclaves seguros
- CREATE COLUMN MASTER KEY (Transact-SQL)