Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à : SQL Server 2019 (15.x) et versions ultérieures sur Windows
Azure SQL Database
Cet article explique comment provisionner des clés activées pour les enclaves qui prennent en charge les calculs à l’intérieur des enclaves sécurisées côté serveur utilisées pour Always Encrypted avec enclaves sécurisées.
Les instructions générales et les processus de gestion des clés Always Encrypted s’appliquent quand vous provisionnez des clés activées pour les enclaves. Cet article traite des détails spécifiques à Always Encrypted avec enclaves sécurisées.
Pour provisionner une clé principale de colonne activée pour les enclaves en utilisant SQL Server Management Studio ou PowerShell, vérifiez que la nouvelle clé prend en charge les calculs d’enclave. L’outil (SSMS ou PowerShell) génère alors l’instruction CREATE COLUMN MASTER KEY, qui définit ENCLAVE_COMPUTATIONS dans les métadonnées de clé principale des colonnes dans la base de données. Pour plus d’informations, consultez CREATE COLUMN MASTER KEY (Transact-SQL).
L’outil signe également numériquement les propriétés principales de colonne avec la clé principale de colonne et stocke la signature dans les métadonnées de la base de données. La signature empêche toute altération malveillante du paramètre ENCLAVE_COMPUTATIONS. Les pilotes du client SQL vérifient les signatures avant d’autoriser l’utilisation de l’enclave. Cela permet aux administrateurs de sécurité de contrôler quelles données de colonne peuvent être calculées dans l’enclave.
Après avoir défini la clé principale de colonne dans les métadonnées, la ENCLAVE_COMPUTATIONS propriété est immuable et vous ne pouvez pas la modifier. Pour activer les calculs d’enclave à l’aide d’une clé de chiffrement de colonne chiffrée par une clé principale de colonne existante, effectuez une rotation de la clé principale de colonne et remplacez-la par une clé principale de colonne compatible avec les enclaves. Voir Faire pivoter les clés compatibles avec les enclaves.
Remarque
Actuellement, SSMS et PowerShell prennent en charge les clés maîtres de colonne compatibles avec les enclaves stockées dans Azure Key Vault ou dans le magasin de certificats Windows. Les modules de sécurité matériels (utilisant CNG ou CAPI) ne sont pas pris en charge.
Pour créer une clé de chiffrement de colonne compatible avec les enclaves, vous devez vous assurer de sélectionner une clé principale de colonne compatible avec les enclaves pour chiffrer la nouvelle clé.
Les sections suivantes fournissent plus de détails sur le provisionnement des clés activées pour les enclaves avec SSMS et PowerShell.
Approvisionner des clés compatibles avec les enclaves à l’aide de SQL Server Management Studio
Dans SQL Server Management Studio, vous pouvez provisionner :
- Une clé principale de colonne compatible avec les enclaves créée à l’aide de la boîte de dialogue Nouvelle clé principale de colonne.
- Une clé de chiffrement de colonne compatible avec les enclaves à l’aide de la boîte de dialogue Nouvelle clé de chiffrement de colonne.
L’Assistant Always Encrypted vous permet également de créer une clé principale de colonne compatible avec les enclaves et une clé de chiffrement de colonne compatible avec les enclaves.
Installez la dernière version de SQL Server Management Studio (SSMS).
Créer des clés principales de colonne avec prise en charge des enclaves à l’aide de la boîte de dialogue Nouvelle clé principale de colonne
Pour provisionner une clé principale de colonne activée pour les enclaves, suivez les étapes décrites dans Provisionner des clés principales de colonne avec la boîte de dialogue Nouvelle clé principale de colonne. Veillez à sélectionner Autoriser les calculs d’enclave. Consultez la capture d’écran ci-dessous :
Remarque
La case à cocher Autoriser les calculs d’enclave n’apparaît que si une enclave sécurisée est configurée pour la base de données. Si vous utilisez SQL Server, consultez Configurer l’enclave sécurisée dans SQL Server. Si vous utilisez Azure SQL Database, consultez Activer Always Encrypted avec enclaves sécurisées pour votre base de données Azure SQL.
Conseil
Pour vérifier si une clé principale de colonne est activée pour les enclaves, cliquez sur celle-ci avec le bouton droit dans l’Explorateur d’objets, puis sélectionnez Propriétés. Si la clé est compatible avec les enclaves, Calculs d’enclave : autorisés s’affiche dans la fenêtre qui affiche les propriétés de la clé. Vous pouvez également utiliser la vue sys.column_master_keys (Transact-SQL).
Approvisionner des clés de chiffrement de colonne compatibles avec les enclaves à l’aide de la boîte de dialogue Nouvelle clé de chiffrement de colonne
Pour provisionner une clé de chiffrement de colonne activée pour les enclaves, suivez les étapes décrites dans Provisionner des clés de chiffrement de colonne avec la boîte de dialogue Nouvelle clé de chiffrement de colonne. Lorsque vous sélectionnez une clé maîtresse de colonne, vérifiez qu'elle est compatible avec l'enclave.
Conseil
Pour vérifier si une clé de chiffrement de colonne est activée pour les enclaves, cliquez sur celle-ci avec le bouton droit dans l’Explorateur d’objets, puis sélectionnez Propriétés. Si la clé est compatible avec les enclaves, Calculs en enclave : Autorisés s’affiche dans la fenêtre qui affiche les propriétés de la clé.
Approvisionner des clés compatibles avec les enclaves à l’aide de PowerShell
Pour provisionner des clés prenant en charge les enclaves avec PowerShell, vous avez besoin du module PowerShell SqlServer version 22 ou ultérieure.
Remarque
Microsoft recommande d’utiliser PowerShell 7 ou version ultérieure lors de l’exécution de scripts PowerShell Always Encrypted. PowerShell 7 offre une prise en charge multiplateforme améliorée, de meilleures performances et la dernière compatibilité avec le module SqlServer (v22+), qui est nécessaire pour de nombreux scénarios Always Encrypted.
En général, les workflows de provisionnement de clés PowerShell (avec et sans séparation des rôles) pour Always Encrypted, décrits dans Provisionner des clés Always Encrypted en utilisant PowerShell s’appliquent également aux clés activées pour les enclaves. Cette section décrit les détails spécifiques aux clés activées pour les enclaves.
Le module PowerShell SqlServer étend les cmdlets New-SqlCertificateStoreColumnMasterKeySettings et New-SqlAzureKeyVaultColumnMasterKeySettings avec le paramètre -AllowEnclaveComputations pour vous permettre de spécifier une clé principale de colonne compatible avec les enclaves pendant le processus d’approvisionnement. Les deux applets de commande créent un objet local contenant les propriétés d’une clé principale de colonne (stockée dans Azure Key Vault ou dans le magasin de certificats Windows). Si ce paramètre est spécifié, la propriété -AllowEnclaveComputations marque la clé comme étant activée pour les enclaves dans l’objet local. Elle a aussi pour effet que l’applet de commande accède à la clé principale de colonne référencée (dans Azure Key Vault ou dans le magasin de certificats Windows) pour signer numériquement les propriétés de la clé. Une fois que vous avez créé un objet de paramètres pour une nouvelle clé principale de colonne activée pour les enclaves, vous pouvez l’utiliser dans un appel ultérieur de l’applet de commande New-SqlColumnMasterKey pour créer un objet de métadonnées décrivant la nouvelle clé dans la base de données.
Le provisionnement des clés de chiffrement de colonne avec prise en charge des enclaves n’est pas différent de celui des clés de chiffrement de colonne sans prise en charge des enclaves. Il vous suffit de vérifier qu’une clé principale de colonne utilisée pour chiffrer la nouvelle clé de chiffrement de colonne est compatible avec les enclaves.
Remarque
Le module SqlServer PowerShell ne prend actuellement pas en charge l’approvisionnement des clés prenant en charge les enclaves stockées dans des modules de sécurité matériels (à l’aide de CNG ou CAPI).
Exemple - Provisionner des clés activées pour les enclaves en utilisant le magasin de certificats Windows
L’exemple de bout en bout ci-dessous montre comment configurer des clés compatibles avec les enclaves, en stockant la clé principale de colonne dans le magasin de certificats Windows. Le script est basé sur l’exemple de Magasin de certificats Windows sans séparation des rôles (exemple). Il est important de noter que l’utilisation du paramètre -AllowEnclaveComputations dans le l’applet de commande New-SqlCertificateStoreColumnMasterKeySettings est la seule différence entre les workflows dans les deux exemples.
[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"
Exemple - Provisionner des clés activées pour les enclaves en utilisant Azure Key Vault
L’exemple complet ci-dessous illustre comment provisionner des clés avec prise en charge des enclaves, en stockant la clé maître de colonne dans un coffre de clés Azure Key Vault. Le script est basé sur l’exemple de Azure Key Vault sans séparation des rôles (exemple). Il est important de noter deux différences entre le flux de travail des clés compatibles avec les enclaves et celui des clés non compatibles avec les enclaves.
- Dans le script ci-dessous, l’applet de commande New-SqlCertificateStoreColumnMasterKeySettings utilise le paramètre
-AllowEnclaveComputationspour rendre la nouvelle clé principale de colonne compatible avec les enclaves. - Le script ci-dessous utilise la cmdlet Get-AzAccessToken pour obtenir un jeton d’accès pour les coffres de clés. Ceci est nécessaire, car New-SqlAzureKeyVaultColumnMasterKeySettings doit avoir accès au Azure Key Vault pour signer les propriétés de la clé principale de colonne.
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
}
Contenu connexe
- Exécuter des instructions Transact-SQL à l’aide d’enclaves sécurisées
- Configurer le chiffrement de colonne sur place en utilisant Always Encrypted avec enclaves sécurisées
- Activer Always Encrypted avec enclaves sécurisées pour les colonnes chiffrées existantes
- Développer des applications en utilisant Always Encrypted avec enclaves sécurisées
- Prise en main d’Always Encrypted avec des enclaves sécurisées
- Gérer des clés pour Always Encrypted avec enclaves sécurisées
- CREATE COLUMN MASTER KEY (Transact-SQL)