Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für: SQL Server 2019 (15.x) und höhere Versionen in der Windows
Azure SQL-Datenbank
In diesem Artikel wird beschrieben, wie Sie Enclave-fähige Schlüssel bereitstellen, die Berechnungen in serverseitigen Secure Enclaves unterstützen, die für Always Encrypted mit Secure Enclaves verwendet werden.
Die allgemeinen Richtlinien und Prozesse für die Verwaltung von Always Encrypted-Schlüsseln gelten für die Bereitstellung von Enclave-fähigen Schlüsseln. In diesem Artikel werden Details speziell für Always Encrypted mit sicheren Enklaven behandelt.
Stellen Sie sicher, dass der neue Schlüssel Enclave-Berechnungen unterstützt, um einen Enclave-fähigen Spaltenhauptschlüssel mithilfe von SQL Server Management Studio (SSMS) oder PowerShell bereitzustellen. Das führt dazu, dass das Tool (SSMS oder PowerShell) die CREATE COLUMN MASTER KEY-Anweisung generiert, die ENCLAVE_COMPUTATIONS in den Metadaten des Spaltenhauptschlüssels in der Datenbank festlegt. Weitere Informationen finden Sie unter CREATE COLUMN MASTER KEY (Transact-SQL).
Das Tool signiert die Spaltenhaupteigenschaften digital mit dem Spaltenhauptschlüssen und speichert die Signatur in den Datenbankmetadaten. Die Signatur verhindert böswillige Änderungen mit der Einstellung ENCLAVE_COMPUTATIONS. Der SQL-Clienttreiber überprüft die Signaturen, bevor die Enclave-Nutzung zugelassen wird. Dadurch haben Sicherheitsadministratoren die Kontrolle darüber, welche Spaltendaten innerhalb der Enclave berechnet werden können.
Nachdem Sie den Spaltenmasterschlüssel in den Metadaten definiert haben, ist die ENCLAVE_COMPUTATIONS Eigenschaft unveränderlich und kann nicht geändert werden. Um Enklavenberechnungen mithilfe eines Spaltenverschlüsselungsschlüssels zu ermöglichen, den ein vorhandener Spaltenmasterschlüssel verschlüsselt, drehen Sie den Spaltenmasterschlüssel, und ersetzen Sie ihn durch einen enklavenfähigen Spaltenmasterschlüssel. Informationen hierzu finden Sie unter Rotieren Enclave-fähiger Schlüssel.
Hinweis
Derzeit unterstützen sowohl SSMS als auch PowerShell Enclave-fähige Spaltenhauptschlüssel, die in Azure Key Vault oder im Windows-Zertifikatspeicher gespeichert werden. Hardwaresicherheitsmodule (mit CNG oder CAPI) werden nicht unterstützt.
Sie müssen sicherstellen, dass Sie einen Enclave-fähigen Spaltenhauptschlüssel zum Verschlüsseln des neuen Schlüssels auswählen, um einen Enclave-fähigen Spaltenverschlüsselungsschlüssel zu erstellen.
In den folgenden Abschnitten finden Sie weitere Informationen zum Bereitstellen Enclave-fähiger Schlüssel mithilfe von SSMS und PowerShell.
Bereitstellen von Enclave-fähigen-Schlüsseln mithilfe von SQL Server Management Studio
In SQL Server Management Studio können Sie Folgendes bereitstellen:
- Einen Enclave-fähigen Spaltenhauptschlüssel über das Dialogfeld Neuer Spaltenhauptschlüssel
- Einen Enclave-fähigen Spaltenverschlüsselungsschlüssel über das Dialogfeld Neuer Spaltenverschlüsselungsschlüssel
Mit dem Always Encrypted Assistenten können Sie auch einen Enklaven-aktivierten Spaltenmasterschlüssel und einen Enklaven-fähigen Spaltenverschlüsselungsschlüssel erstellen.
Installieren Sie die neueste Version von SQL Server Management Studio (SSMS).
Bereitstellen Enclave-fähiger Spaltenhauptschlüssel mit dem Dialogfeld „Neuer Spaltenhauptschlüssel“
Führen Sie die Schritte unter Bereitstellen von Spaltenhauptschlüsseln mit dem Dialogfeld „Neuer Spaltenhauptschlüssel“ aus, um einen Enclave-fähigen Spaltenhauptschlüssel bereitzustellen. Stellen Sie sicher, dass Sie die Option Enclave-Berechnungen zulassen aktivieren. Diese Option sehen Sie im folgenden Screenshot:
Hinweis
Das Kontrollkästchen Enclave-Berechnungen zulassen wird nur angezeigt, wenn eine Secure Enclave für Ihre Datenbank konfiguriert ist. Wenn Sie SQL Server verwenden, lesen Sie "Konfigurieren der sicheren Enklave in SQL Server". Wenn Sie Azure SQL-Datenbank verwenden, sehen Sie sich Always Encrypted mit sicheren Enklaven für Ihre Azure SQL-Datenbank aktivieren an.
Tipp
Klicken Sie im Objekt-Explorer mit der rechten Maustaste auf den Spaltenhauptschlüssel, und wählen Sie dann Eigenschaften aus, um zu überprüfen, ob er Enclave-fähig ist. Wenn der Schlüssel Enklave-aktiviert ist, erscheint Enklave-Berechnungen: Erlaubt in dem Fenster, das die Eigenschaften des Schlüssels anzeigt. Alternativ können Sie die Sicht sys.column_master_keys (Transact-SQL) verwenden.
Bereitstellen Enclave-fähiger Spaltenverschlüsselungsschlüssel mithilfe des Dialogfelds „Neuer Spaltenverschlüsselungsschlüssel“
Führen Sie die Schritte unter Bereitstellen von Spaltenverschlüsselungsschlüsseln mit dem Dialogfeld „Neuer Spaltenverschlüsselungsschlüssel“ aus, um einen Enclave-fähigen Spaltenverschlüsselungsschlüssel bereitzustellen. Stellen Sie beim Auswählen eines Spaltenmaster-Schlüssels sicher, dass er Enklaven-fähig ist.
Tipp
Klicken Sie im Objekt-Explorer mit der rechten Maustaste auf den Spaltenverschlüsselungsschlüssel, und wählen Sie dann Eigenschaften aus, um zu überprüfen, ob er Enclave-fähig ist. Wenn der Schlüssel Enklave-aktiviert ist, erscheint Enklave-Berechnungen: Erlaubt in dem Fenster, das die Eigenschaften des Schlüssels anzeigt.
Bereitstellen Enclave-fähiger Schlüssel mit PowerShell
Für die Bereitstellung Enclave-fähiger Schlüssel mithilfe von PowerShell benötigen Sie mindestens die Version 22 des PowerShell-Moduls „SqlServer“.
Hinweis
Microsoft empfiehlt die Verwendung von PowerShell 7 oder höher beim Ausführen von Always Encrypted PowerShell-Skripts. PowerShell 7 bietet eine verbesserte plattformübergreifende Unterstützung, bessere Leistung und die neueste Kompatibilität mit dem SqlServer-Modul (v22+), die für viele Always Encrypted-Szenarien erforderlich ist.
Im Allgemeinen gelten die Bereitstellungsworkflows für PowerShell-Schlüssel (mit und ohne Rollentrennung), die unter Bereitstellen von Always Encrypted-Schlüsseln mithilfe von PowerShell beschrieben werden, auch für Enclave-fähige Schlüssel. In diesem Abschnitt werden spezifische Details zu Enclave-fähigen Schlüsseln beschrieben.
Das PowerShell-Modul „SqlServer“ erweitert die Cmdlets New-SqlCertificateStoreColumnMasterKeySettings und New-SqlAzureKeyVaultColumnMasterKeySettings um den Parameter -AllowEnclaveComputations, damit Sie während des Bereitstellungsprozesses einen Enclave-fähigen Spaltenhauptschlüssel festlegen können. Beide Cmdlets erstellen ein lokales Objekt, das Eigenschaften eines Spaltenhauptschlüssels enthält (der in Azure Key Vault oder im Windows-Zertifikatspeicher gespeichert wird). Die Eigenschaft -AllowEnclaveComputations kennzeichnet den Schlüssel im lokalen Objekt als Enclave-fähig, wenn sie festgelegt wird. Dies bewirkt außerdem, dass das Cmdlet auf den referenzierten Spaltenhauptschlüssel zugreift (der sich in Azure Key Vault oder im Windows-Zertifikatspeicher befindet), um die Eigenschaften des Schlüssels digital zu signieren. Sobald Sie ein Einstellungsobjekt für einen neuen Enclave-fähigen Spaltenhauptschlüssel erstellt haben, können Sie diesen in anschließenden Aufrufen des Cmdlets New-SqlColumnMasterKey verwenden, um ein Metadatenobjekt zu erstellen, das den neuen Schlüssel in der Datenbank beschreibt.
Die Bereitstellung Enclave-fähiger Spaltenverschlüsselungsschlüssel unterscheidet sich nicht von der Bereitstellung nicht Enclave-fähiger Spaltenverschlüsselungsschlüssel. Sie müssen lediglich sicherstellen, dass der Spaltenhauptschlüssel, der zum Verschlüsseln des neuen Spaltenverschlüsselungsschlüssel verwendet wird, Enclave-fähig ist.
Hinweis
Das SqlServer PowerShell-Modul unterstützt derzeit nicht die Bereitstellung von enclave-fähigen Schlüsseln, die in Hardwaresicherheitsmodulen gespeichert sind (unter Verwendung von CNG oder CAPI).
Beispiel: Bereitstellen Enclave-fähiger Schlüssel mithilfe des Windows-Zertifikatspeichers
Im folgenden vollumfassenden Beispiel wird veranschaulicht, wie Enclave-fähige Schlüssel bereitgestellt werden, wenn der Spaltenhauptschlüssel im Windows-Zertifikatspeicher gespeichert wird. Das Skript basiert auf dem Beispiel unter Windows-Zertifikatspeicher ohne Rollentrennung (Beispiel). Dabei sollte unbedingt die Verwendung des -AllowEnclaveComputations-Parameters im Cmdlet New-SqlCertificateStoreColumnMasterKeySettings beachtet werden, was den einzigen Unterschied zwischen den Workflows der beiden Beispiele darstellt.
[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"
Beispiel: Bereitstellen Enclave-fähiger Schlüssel mithilfe von Azure Key Vault
Im folgenden vollumfassenden Beispiel wird veranschaulicht, wie Enclave-fähige Schlüssel bereitgestellt werden, wenn der Spaltenhauptschlüssel in einem Schlüsseltresor im Azure Key Vault gespeichert wird. Das Skript basiert auf dem Beispiel unter Azure Key Vault ohne Rollentrennung (Beispiel). Hier sollten Sie unbedingt die zwei Unterschiede zwischen den Workflows für Enclave-fähige und nicht Enclave-fähige Schlüssel beachten.
- Im folgenden Skript wird im Cmdlet New-SqlCertificateStoreColumnMasterKeySettings der Parameter
-AllowEnclaveComputationsverwendet, damit der neue Spaltenhauptschlüssel Enclave-fähig ist. - Das folgende Skript verwendet das Cmdlet Get-AzAccessToken, um ein Zugriffstoken für Schlüsseltresor abzurufen. Dies ist erforderlich, da die New-SqlAzureKeyVaultColumnMasterKeySettings Zugriff auf den Azure Key Vault haben muss, um die Eigenschaften des Spaltenhauptschlüssels zu signieren.
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
}
Verwandte Inhalte
- Ausführen von Transact-SQL-Anweisungen mit Secure Enclaves
- Konfigurieren einer direkten Spaltenverschlüsselung mithilfe von Always Encrypted mit Secure Enclaves
- Aktivieren von Always Encrypted mit Secure Enclaves für vorhandene verschlüsselte Spalten
- Entwickeln von Anwendungen mithilfe von Always Encrypted mit Secure Enclaves
- Erste Schritte mit Always Encrypted mit Secure Enclaves
- Verwalten von Schlüsseln für Always Encrypted mit Secure Enclaves
- CREATE COLUMN MASTER KEY (Transact-SQL)