Güvenli bölge özellikli anahtarları sağlama

Şunlar için geçerlidir: Windows Azure SQL Veritabanı'nda SQL Server 2019 (15.x) ve sonraki sürümleri

Bu makalede, Güvenli Kuşatmalar ile Always Encryptediçin kullanılan, sunucu tarafındaki güvenli kuşatmalarda hesaplamaları destekleyen kuşatma destekli anahtarların nasıl temin edildiği ve yapılandırıldığı açıklanmaktadır.

Always Encrypted anahtarlarını yönetme için genel yönergeler ve işlemler, kapanım özellikli anahtarları sağlarken geçerlidir. Bu makalede, güvenli kuşatmalarla Always Encrypted'a özgü ayrıntılar ele alınıyor.

SQL Server Management Studio veya PowerShell kullanarak kapanım özellikli bir sütun ana anahtarı sağlamak için yeni anahtarın kapanım hesaplamalarını desteklediğinden emin olun. Bu, aracın (SSMS veya PowerShell) veritabanındaki sütunların anahtar meta verileri içinde CREATE COLUMN MASTER KEY'i ayarlayan ENCLAVE_COMPUTATIONS deyimini üretmesine neden olur. Daha fazla bilgi için bkz CREATE COLUMN MASTER KEY . (Transact-SQL).

Araç ayrıca sütun ana özelliklerini sütun ana anahtarıyla dijital olarak imzalar ve imzayı veritabanı meta verilerinde depolar. İmza, ENCLAVE_COMPUTATIONS ayarında kötü niyetli müdahaleyi önler. SQL istemci sürücüleri, güvenli alan kullanımına izin vermeden önce imzaları doğrular. Bu, güvenlik yöneticilerine kapalı alan içinde hangi sütun verilerinin hesaplanabileceğini denetleme olanağı sağlar.

Meta verilerde ENCLAVE_COMPUTATIONS sütun ana anahtarını tanımladıktan sonra özelliği sabittir ve değiştiremezsiniz. Mevcut bir sütun ana anahtarının şifrelediği bir sütun şifreleme anahtarını kullanarak güvenli bölme işlemlerini etkinleştirmek için, sütun ana anahtarını döndürüp güvenli bölme özellikli bir sütun ana anahtarıyla değiştirin. Bkz. Enklav etkin anahtarları döndürme.

Not

Şu anda hem SSMS hem de PowerShell, Azure Key Vault veya Windows Sertifika Deposu'nda depolanan kapanım özellikli sütun ana anahtarlarını destekler. Donanım güvenlik modülleri (CNG veya CAPI kullanılarak) desteklenmez.

Enclave özellikli bir sütun şifreleme anahtarı oluşturmak için, yeni anahtarı şifrelemek amacıyla enclave özellikli bir sütun ana anahtarı seçtiğinizden emin olmanız gerekir.

Aşağıdaki bölümlerde, SSMS ve PowerShell kullanarak kapanım özellikli anahtarları sağlama hakkında daha fazla ayrıntı sağlanır.

SQL Server Management Studio kullanarak güvenli bölge özellikli anahtarları sağlama

SQL Server Management Studio'da şunlar sağlayabilirsiniz:

  • Yeni Sütun Ana Anahtar Dialogunu kullanan kapalı oturum özellikli sütun anahtarı.
  • Enklav özellikli bir sütun şifreleme anahtarı, Yeni Sütun Şifreleme Anahtarı iletişim kutusu kullanılarak oluşturulur.

Always Encrypted Sihirbazı, kapanım özellikli bir sütun ana anahtarı ve kapanım özellikli bir sütun şifreleme anahtarı oluşturmanıza da olanak tanır.

SQL Server Management Studio'nun (SSMS) en son sürümünü yükleyin.

Yeni Sütun Ana Anahtarı iletişim kutusuyla kapanım özellikli sütun ana anahtarlarını sağlama

Enklav özellikli bir sütun ana anahtarı sağlamak için Yeni Sütun Ana Anahtarı İletişim Kutusu ile Sütun Ana Anahtarlarını Sağlama adımlarını izleyin. Enklav hesaplamalarına izin ver'i seçtiğinizden emin olun. Aşağıdaki ekran görüntüsüne bakın:

Enclave hesaplamalarına izin ver

Not

Kapanım hesaplamalarına izin ver onay kutusu yalnızca veritabanınız için güvenli bir kapanım yapılandırıldığında görünür. SQL Server kullanıyorsanız SQL Server'da güvenli korunağı yapılandırma bölümüne bakın. Azure SQL Veritabanı kullanıyorsanız bkz. Azure SQL Veritabanınız için güvenli kuşatmalarla Always Encrypted'ı etkinleştirme.

Bahşiş

Bir sütun anahtar yöneticisinin gömülü etkin olup olmadığını kontrol etmek için Nesne Gezgini'nde bu anahtara sağ tıklayın ve Özelliklerseçeneğini seçin. Anahtar yerleşik etkinse, anahtarın özelliklerini gösteren pencerede Yerleşik Hesaplamalar: İzin Verilen görünür. Alternatif olarak, sys.column_master_keys (Transact-SQL) görünümünü kullanabilirsiniz.

Yeni Sütun Şifreleme Anahtarı iletişim kutusuyla enclav güvenlik özellikli sütun şifreleme anahtarlarını sağlayın

Kapanım özellikli bir sütun şifreleme anahtarı sağlamak için Sütun Şifreleme Anahtarlarını Yeni Sütun Şifreleme Anahtarı İletişim Kutusu ile Sağlamaadımlarını izleyin. Bir sütun ana anahtarı seçerken enclave etkin olduğundan emin olun.

Bahşiş

Sütun şifreleme anahtarının güvenli alan etkin olup olmadığını denetlemek için Nesne Gezgini'nde bu anahtara sağ tıklayın ve Özelliklerseçin. Anahtar yerleşik etkinse, anahtarın özelliklerini gösteren pencerede Yerleşik Hesaplamalar: İzin Verilen görünür.

PowerShell kullanarak enklav destekli anahtarları sağlama

PowerShell kullanarak kapanım özellikli anahtarlar sağlamak için SqlServer PowerShell modülü sürüm 22 veya üzeri gerekir.

Not

Microsoft, Always Encrypted PowerShell betiklerini çalıştırırken PowerShell 7 veya üzerini kullanmanızı önerir. PowerShell 7, birçok Always Encrypted senaryosu için gereken gelişmiş platformlar arası destek, daha iyi performans ve SqlServer modülü (v22+) ile en son uyumluluk sağlar.

Genel olarak, PowerShell kullanarak Always Encrypted Anahtarları Sağlama başlığında açıklanan PowerShell anahtar sağlama iş akışları (rol ayrımı ile ve olmaksızın), gerek Always Encrypted gerekse ağ kapsayıcılı anahtarlar için de geçerlidir. Bu bölümde, kapanım özellikli anahtarlara özgü ayrıntılar açıklanmaktadır.

SqlServer PowerShell modülü, New-SqlCertificateStoreColumnMasterKeySettings ve New-SqlAzureKeyVaultColumnMasterKeySettings cmdlet'lerini -AllowEnclaveComputations parametresiyle genişleterek, temin işlemi sırasında enclave özellikli bir sütun anahtarı belirtmenize olanak sağlar. Her iki cmdlet de Azure Key Vault veya Windows Sertifika Deposu'nda depolanan bir sütun anahtarının özelliklerini içeren bir yerel nesne oluşturur. belirtilirse, -AllowEnclaveComputations özelliği anahtarı yerel nesnede enclave-enabled olarak işaretler. Ayrıca cmdlet'in başvuruda bulunan sütun ana anahtarına erişmesine (Azure Key Vault'ta veya Windows Sertifika Deposu'nda) anahtarın özelliklerini dijital olarak imzalamasına da neden olur. Yeni bir kapanım destekli sütun ana anahtarı için bir ayar nesnesi oluşturduktan sonra, bu nesneyi veritabanında yeni anahtarı açıklayan bir meta veri nesnesi oluşturmak üzere sonraki bir çağrıda New-SqlColumnMasterKey cmdlet'inde kullanabilirsiniz.

Kapanım özellikli sütun şifreleme anahtarlarının sağlanması, kapanım etkin olmayan sütun şifreleme anahtarlarının sağlanmasından farklı değildir. Yeni sütun şifreleme anahtarını şifrelemek için kullanılan sütun ana anahtarının enclave özellikli olduğundan emin olmanız yeterlidir.

Not

SqlServer PowerShell modülü şu anda donanım güvenlik modüllerinde (CNG veya CAPI kullanarak) depolanan kapanım özellikli anahtarları sağlamayı desteklememektedir.

Örnek - Windows Sertifika Deposu'nı kullanarak kapanım özellikli anahtarları sağlama

Aşağıdaki uçtan uca örnekte, Windows Sertifika Deposu'nda depolanan sütun ana anahtarını depolayarak kapanım özellikli anahtarların nasıl sağlandığı gösterilmektedir. Betik, Rol Ayrımı Olmadan Windows Sertifika Deposu (Örnek) içindeki örneği temel alır. Dikkat edilmesi gereken nokta, -AllowEnclaveComputations cmdlet'indeki parametresinin kullanılmasıdır. Bu, iki örnekteki iş akışları arasındaki tek farktır.

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

Örnek - Azure Key Vault kullanarak kapanım özellikli anahtarları sağlama

Aşağıdaki uçtan uca örnek, Azure Key Vault'taki bir anahtar kasasında sütun ana anahtarını depolayarak kapsül özellikli anahtarların nasıl sağlanabileceğini göstermektedir. Script, Rol Ayrımı Olmadan (Örnek) Azure Key Vaultörneği temel alır. Kapanım özellikli anahtarlar için iş akışı ile kapanım etkin olmayan anahtarlar arasındaki iki farka dikkat etmek önemlidir.

  • Aşağıdaki betikte New-SqlCertificateStoreColumnMasterKeySettings, yeni sütun ana anahtarını enclave etkin hale getirmek için -AllowEnclaveComputations parametresini kullanır.
  • Aşağıdaki betik, anahtar kasaları için erişim belirteci elde etmek amacıyla Get-AzAccessToken cmdlet'ini kullanır. New-SqlAzureKeyVaultColumnMasterKeySettings sütun ana anahtarının özelliklerini imzalamak için Azure Key Vault'a erişimi olması gerektiğinden bu gereklidir.
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
}