Enklávé-kompatibilis kulcsok biztosítása

A következőkre vonatkozik: SQL Server 2019 (15.x) és újabb verziók Windows Azure SQL Database-en

Ez a cikk ismerteti, hogyan lehet enklávé-kompatibilis kulcsokat kialakítani, amelyek támogatják a számításokat a kiszolgálóoldali biztonságos enklávékban, amelyeket a Always Encrypted biztonságos enklávékkalhasználnak.

Az Always Encrypted kulcsok kezelésének általános irányelvei és folyamatai vonatkoznak az enklávé-kompatibilis kulcsok kiépítésekor. Ez a cikk az Always Encryptedre vonatkozó, biztonságos enklávékkal kapcsolatos részleteket ismerteti.

Ha enklávé-kompatibilis oszlop főkulcsát szeretné kiépíteni az SQL Server Management Studio vagy a PowerShell használatával, győződjön meg arról, hogy az új kulcs támogatja az enklávészámításokat. Ez azt eredményezi, hogy az eszköz (SSMS vagy PowerShell) létrehozza az CREATE COLUMN MASTER KEY utasítást, amely beállítja a ENCLAVE_COMPUTATIONS az adatbázis főkulcs-metaadatainak oszlopaiban. További információ: CREATE COLUMN MASTER KEY (Transact-SQL).

Az eszköz digitálisan is aláírja az oszlopminta tulajdonságait az oszlop főkulcsával, és az aláírást az adatbázis metaadataiban tárolja. Az aláírás megakadályozza a rosszindulatú illetéktelen beavatkozást a ENCLAVE_COMPUTATIONS beállításnál. Az SQL-ügyfélillesztők az enklávé használatának engedélyezése előtt ellenőrzik az aláírásokat. Így a biztonsági rendszergazdák szabályozhatják, hogy mely oszlopadatok számíthatók ki az enklávéban.

Miután definiálta az oszlopfőkulcsot a metaadatokban, a ENCLAVE_COMPUTATIONS tulajdonság nem módosítható. Ha egy meglévő oszloptitkosítási kulcs által titkosított oszloptitkosítási kulccsal szeretné engedélyezni az enklávészámítást, forgassa el az oszlop főkulcsát, és cserélje le egy enklávé-kompatibilis oszlop főkulcsára. Lásd: Az enklávé-kompatibilis kulcsok elforgatása.

Jegyzet

Jelenleg mind az SSMS, mind a PowerShell támogatja az Azure Key Vaultban vagy a Windows Tanúsítványtárolóban tárolt enklávé-kompatibilis oszlop főkulcsait. A hardveres biztonsági modulok (CNG vagy CAPI használatával) nem támogatottak.

Enklávé-kompatibilis oszloptitkosítási kulcs létrehozásához meg kell győződnie arról, hogy az új kulcs titkosításához enklávé-kompatibilis oszlop főkulcsot kell választania.

Az alábbi szakaszok további részleteket nyújtanak arról, hogyan építhet ki enklávé-kompatibilis kulcsokat az SSMS és a PowerShell használatával.

Enklávé-kompatibilis kulcsok kiépítése az SQL Server Management Studióval

Az SQL Server Management Studióban kiépítheti a következőt:

  • Enklávé-kompatibilis oszlop főkulcs az Új oszlop főkulcs párbeszédpanel használatával.
  • Enklávébarát oszloptitkosítási kulcs az Új oszloptitkosítási kulcs párbeszédpanel használatával.

Az Always Encrypted varázsló lehetővé teszi egy enklávé-kompatibilis oszlop főkulcsának és egy enklávé-kompatibilis oszloptitkosítási kulcsnak a létrehozását is.

Telepítse az SQL Server Management Studio (SSMS) legújabb verzióját.

Az enklávé-kompatibilis oszlopfőkulcsok létrehozása az Új oszlopfőkulcs párbeszédpanelen

Enklávé-kompatibilis oszlop főkulcs létrehozásához kövesse a Oszlop főkulcsainak létrehozása az Új oszlop főkulcs párbeszédpanellel lépéseit. Győződjön meg arról, hogy Enklávészámítások engedélyezéselehetőséget választja. Tekintse meg az alábbi képernyőképet:

Enklávészámítások engedélyezése

Jegyzet

Az Enklávészámítás engedélyezése jelölőnégyzet csak akkor jelenik meg, ha egy biztonságos enklávé van konfigurálva az adatbázishoz. Ha SQL Servert használ, olvassa el a biztonságos enklávé konfigurálása az SQL Serverben című témakört. Ha az Azure SQL Database-t használja, tekintse meg a Biztonságos enklávékkal az Always Encrypted engedélyezése az Azure SQL Database-hez című útmutatót.

Borravaló

Ha ellenőrizni szeretné, hogy az oszlop főkulcsa enklávé-kompatibilis-e, kattintson rá a jobb gombbal az Object Explorerben, és válassza a Tulajdonságoklehetőséget. Ha a kulcs enklávé-kompatibilis, Enklávé-számítások: Engedélyezett jelenik meg az ablakban a kulcs tulajdonságaival. Másik lehetőségként használhatja a sys.column_master_keys (Transact-SQL) nézetet.

Enklávé-kompatibilis oszloptitkosítási kulcsok kiépítése az Új oszloptitkosítási kulcs párbeszédpanelen

Enklávé-kompatibilis oszloptitkosítási kulcs kiépítéséhez kövesse Oszloptitkosítási kulcsok kiépítése az Új oszloptitkosítási kulcs párbeszédpanelcímű témakörben leírt lépéseket. Az oszlop főkulcsának kiválasztásakor győződjön meg arról, hogy az enklávé-kompatibilis.

Borravaló

Ha ellenőrizni szeretné, hogy az oszloptitkosítási kulcs enklávéval kompatibilis-e, kattintson rá a jobb gombbal az Object Explorerben, és válassza a Tulajdonságoklehetőséget. Ha a kulcs enklávé-kompatibilis, Enklávé-számítások: Engedélyezett jelenik meg az ablakban a kulcs tulajdonságaival.

Enklávé-kompatibilis kulcsok kiépítése a PowerShell használatával

Ha enklávé-kompatibilis kulcsokat szeretne kiépíteni a PowerShell használatával, az SqlServer PowerShell-modul 22-es vagy újabb verziójára van szükség.

Jegyzet

Microsoft a PowerShell 7 vagy újabb verzióját javasolja Always Encrypted PowerShell-szkriptek futtatásakor. A PowerShell 7 továbbfejlesztett platformfüggetlen támogatást, jobb teljesítményt és a legújabb kompatibilitást biztosít az SqlServer modullal (v22+), amely számos Always Encrypted-forgatókönyvhöz szükséges.

Általánosságban elmondható, hogy az Always Encrypted PowerShell-kulcskiépítési munkafolyamatai (szerepkör-elkülönítéssel és anélkül) is érvényesek az enklávé-kompatibilis kulcsokra, Mindig titkosított kulcsok kiépítése PowerShell- használatával. Ez a szakasz az enklávéval kompatibilis kulcsokra vonatkozó részleteket ismerteti.

Az SqlServer PowerShell modul kibővíti a New-SqlCertificateStoreColumnMasterKeySettings és New-SqlAzureKeyVaultColumnMasterKeySettings parancsmagokat a -AllowEnclaveComputations paraméterrel, hogy lehetővé tegye egy olyan oszlop főkulcsának megadását, amely enklávé-kompatibilis a kiépítési folyamat során. Bármelyik parancsmag létrehoz egy helyi objektumot, amely egy oszlop főkulcsának tulajdonságait tartalmazza (az Azure Key Vaultban vagy a Windows Tanúsítványtárolóban). Ha meg van adva, a -AllowEnclaveComputations tulajdonság enklávé-kompatibilisként jelöli meg a kulcsot a helyi objektumban. Emellett a parancsmag hozzáfér a hivatkozott oszlop főkulcsához (az Azure Key Vaultban vagy a Windows Tanúsítványtárolóban) a kulcs tulajdonságainak digitális aláírásához. Miután létrehozott egy beállításobjektumot egy új enklávé-kompatibilis oszlop főkulcsához, a New-SqlColumnMasterKey parancsmag későbbi meghívásához használhatja az új kulcsot leíró metaadat-objektum létrehozásához az adatbázisban.

Az enklávé-kompatibilis oszloptitkosítási kulcsok kiépítése nem különbözik az olyan oszloptitkosítási kulcsok kiépítésétől, amelyek nem enklávé-kompatibilisek. Biztosítsa, hogy a fő oszlopkulcs, amelyet az új oszlopkódolási kulcs titkosításához használnak, enklávé-kompatibilis legyen.

Jegyzet

Az SqlServer PowerShell-modul jelenleg nem támogatja a hardveres biztonsági modulokban (CNG vagy CAPI használatával) tárolt enklávé-kompatibilis kulcsok kiépítését.

Példa – enklávé-kompatibilis kulcsok kiépítése a Windows Tanúsítványtároló használatával

Az alábbi teljes körű példa bemutatja, hogyan hozhat létre enklávéval bővített kulcsokat, a Windows Tanúsítványtárolóban tárolt oszlopfő kulcsot használva. A szkript az Windows tanúsítványtároló szerepkör-elkülönítés nélküli (példa)példán alapul. Fontos megjegyezni, hogy a -AllowEnclaveComputations paraméter használata a New-SqlCertificateStoreColumnMasterKeySettings parancsmagban, ami az egyetlen különbség a két példában szereplő munkafolyamatok között.

[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"

Példa – enklávé-kompatibilis kulcsok kiépítése az Azure Key Vault használatával

Az alábbi átfogó példa bemutatja, hogyan hozhat létre enklávé-kompatibilis kulcsokat, és hogyan tárolhatja az oszlop főkulcsát az Azure Key Vaultban. A szkript Azure Key Vault szerepkör-elkülönítés nélküli (példa)példán alapul. Fontos megjegyezni, hogy két különbség van az enklávé-kompatibilis kulcsok munkafolyamata és a nem enklávé-kompatibilis kulcsok között.

  • Az alábbi szkriptben az New-SqlCertificateStoreColumnMasterKeySettings az -AllowEnclaveComputations paramétert használja az új oszlop főkulcsának enklávé-engedélyezéséhez.
  • Az alábbi szkript a Get-AzAccessToken parancsmaggal szerez be hozzáférési jogkivonatot a kulcstartókhoz. Erre azért van szükség, mert a New-SqlAzureKeyVaultColumnMasterKeySettings hozzáféréssel kell rendelkeznie az Azure Key Vaulthoz az oszlop főkulcsának tulajdonságainak aláírásához.
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
}