Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance Azure SQL
Tento článek obsahuje postup zřízení klíčů pro Always Encrypted pomocí modulu SqlServer PowerShell. Pomocí PowerShellu můžete zřizovat klíče Always Encrypted jak s oddělením rolí, tak bez oddělení rolí, abyste měli kontrolu nad tím, kdo má přístup k skutečným šifrovacím klíčům v úložišti klíčů a kdo má přístup k databázi.
Note
Microsoft doporučuje používat PowerShell 7 nebo novější při spouštění skriptů PowerShellu Always Encrypted. PowerShell 7 poskytuje vylepšenou podporu pro různé platformy, lepší výkon a nejnovější kompatibilitu s modulem SqlServer (v22+), který je nutný pro mnoho scénářů Always Encrypted.
Přehled správy klíčů Always Encrypted, včetně některých doporučení osvědčených postupů vysoké úrovně, najdete v tématu Přehled správy klíčů pro Always Encrypted. Informace o tom, jak začít používat modul SqlServer PowerShell pro Always Encrypted, najdete v tématu Konfigurace funkce Always Encrypted pomocí PowerShellu.
Nastavení klíčů bez oddělení rolí
Metoda zřizování klíčů popsaná v této části nepodporuje oddělení rolí mezi správci zabezpečení a dbA. Některé kroky v této části kombinují operace s fyzickými klíči s operacemi s metadaty klíčů. Proto tuto metodu zřizování klíčů použijte, pokud vaše organizace používá model DevOps nebo pokud je databáze hostovaná v cloudu a primárním cílem je omezit správce cloudu (ale ne místní dbA) na přístup k citlivým datům. Tuto metodu nepoužívejte, pokud mezi potenciální útočníky patří správci databáze nebo pokud by správci databáze neměli mít přístup k citlivým datům.
Před spuštěním jakýchkoli kroků, které zahrnují přístup ke klíčům ve formátu prostého textu nebo úložišti klíčů (identifikovaných ve sloupci Accesses keys/key store ve sloupci Úložiště klíčů v následující tabulce), se ujistěte, že prostředí PowerShell běží na zabezpečeném počítači, který se liší od počítače hostujícího vaši databázi. Další informace najdete v tématu Důležité informace o zabezpečení správy klíčů.
| Úkol | Článek | Přístup ke klíčům nebo úložišti klíčů ve formátu prostého textu | Přístup k databázi |
|---|---|---|---|
| Krok 1. Vytvořte hlavní klíč sloupce v úložišti klíčů. Poznámka: Tento krok nepodporuje modul SqlServer PowerShell. K provedení tohoto úkolu z příkazového řádku použijte nástroje specifické pro vybrané úložiště klíčů. |
Vytvoření a uložení hlavních klíčů sloupců pro funkci Always Encrypted | Ano | Ne |
| Krok 2. Spusťte prostředí PowerShell a naimportujte modul SqlServer PowerShellu. | Konfigurace funkce Always Encrypted pomocí PowerShellu | Ne | Ne |
| Krok 3. Připojte se k serveru a databázi. | Připojení k databázi | Ne | Ano |
| Krok 4. Vytvořte objekt SqlColumnMasterKeySettings , který obsahuje informace o umístění hlavního klíče sloupce. SqlColumnMasterKeySettings je objekt, který existuje v paměti (v PowerShellu). Použijte rutinu (cmdlet) specifickou pro vaše úložiště klíčů. |
New-SqlAzureKeyVaultColumnMasterKeySettings Nové nastavení hlavního klíče sloupce úložiště certifikátů SQL New-SqlCngColumnMasterKeySettings Nové nastavení hlavního klíče sloupce SQL CNG Nové nastavení klíče ColumnMasterKey pro SqlCsp |
Ne | Ne |
| Krok 5. Vytvořte metadata o hlavním klíči sloupce v databázi. Poznámka: Neověřujeme platnost klíčů nebo certifikátů použitých k vygenerování hlavního klíče sloupce. |
[New-SqlColumnMasterKey](/powershell/sqlserver/sqlserver/vlatest/new-sqlcolumnmasterkey) Poznámka: V rámci popisů rutina vydá CREATE COLUMN MASTER KEY příkaz pro vytvoření klíčových metadat. |
Ne | Ano |
| Krok 6. Ověřte se v Azure, pokud je hlavní klíč sloupce uložený ve službě Azure Key Vault. | Connect-AzAccount | Ano | Ne |
| Krok 7. Získejte přístupový token pro službu Azure Key Vault, pokud je hlavní klíč sloupce uložený ve službě Azure Key Vault. | Get-AzAccessToken | Ne | Ne |
| Krok 8. Vygenerujte nový šifrovací klíč sloupce, zašifrujte ho pomocí hlavního klíče sloupce a vytvořte metadata šifrovacího klíče sloupce v databázi. |
New-SqlColumnEncryptionKey Poznámka: Použijte variantu rutiny, která interně generuje a šifruje šifrovací klíč sloupce. Poznámka: Na pozadí cmdlet spustí příkaz CREATE COLUMN ENCRYPTION KEY k vytvoření metadat klíče. |
Ano | Ano |
Windows Certificate Store bez oddělení rolí (příklad)
Tento skript je kompletní příklad pro generování hlavního klíče sloupce, který je certifikátem ve Windows Certificate Storu, generování a šifrování šifrovacího klíče sloupce a vytváření metadat klíčů v databázi SQL Serveru.
[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
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"
Azure Key Vault bez oddělení rolí (příklad)
Tento skript je kompletní příklad pro zřizování a konfiguraci trezoru klíčů ve službě Azure Key Vault, generování hlavního klíče sloupce v trezoru, generování a šifrování šifrovacího klíče sloupce a vytváření metadat klíčů v databázi Azure SQL.
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
$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
}
CNG/KSP bez oddělení rolí (příklad)
Následující skript je kompletní příklad pro generování hlavního klíče sloupce v úložišti klíčů, který implementuje rozhraní CNG (Cryptography Next Generation API), generování a šifrování šifrovacího klíče sloupce a vytváření metadat klíčů v databázi SQL Serveru.
Příklad používá úložiště klíčů, které používá softwarového zprostředkovatele úložiště klíčů Microsoft. Můžete změnit příklad tak, aby používal jiné úložiště, například modul hardwarového zabezpečení. Abyste toho dosáhli, musíte se ujistit, že poskytovatel úložiště klíčů (KSP), který implementuje CNG pro vaše zařízení, je na vašem počítači správně nainstalován a funkční. Budete muset nahradit Microsoft Software Key Storage Provider názvem KSP vašeho zařízení.
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[string]$ServerName = "<server name>",
[Parameter(Mandatory = $true)]
[string]$DatabaseName = "<database name>",
[Parameter(Mandatory = $false)]
[string]$CngKeyName = "AlwaysEncryptedKey",
[Parameter(Mandatory = $false)]
[string]$CmkName = "CMK",
[Parameter(Mandatory = $false)]
[string]$CekName = "CEK"
)
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
# Local key store provider and key settings.
$cngProviderName = "Microsoft Software Key Storage Provider"
$cngAlgorithmName = "RSA"
$cngKeySize = 2048
Import-Module SqlServer -ErrorAction Stop
Write-Host "[AE] Creating local CNG key '$CngKeyName'"
$cngProvider = New-Object System.Security.Cryptography.CngProvider($cngProviderName)
$cngKeyParams = New-Object System.Security.Cryptography.CngKeyCreationParameters
$cngKeyParams.Provider = $cngProvider
$cngKeyParams.KeyCreationOptions = [System.Security.Cryptography.CngKeyCreationOptions]::OverwriteExistingKey
$keySizeProperty = New-Object System.Security.Cryptography.CngProperty(
"Length",
[System.BitConverter]::GetBytes($cngKeySize),
[System.Security.Cryptography.CngPropertyOptions]::None
)
$cngKeyParams.Parameters.Add($keySizeProperty)
$cngAlgorithm = New-Object System.Security.Cryptography.CngAlgorithm($cngAlgorithmName)
[System.Security.Cryptography.CngKey]::Create($cngAlgorithm, $CngKeyName, $cngKeyParams) | Out-Null
Write-Host "[AE] Connecting to $ServerName / $DatabaseName"
$connStr = "Server=$ServerName;Database=$DatabaseName;Integrated Security=True;Encrypt=True;TrustServerCertificate=True"
$database = Get-SqlDatabase -ConnectionString $connStr
Write-Host "[AE] Preparing column master key settings"
$cmkSettings = New-SqlCngColumnMasterKeySettings -CngProviderName $cngProviderName -KeyName $CngKeyName
Write-Host "[AE] Ensuring CMK 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 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"
Správa klíčů s oddělením rolí
Tato část obsahuje postup konfigurace šifrování, kdy správci zabezpečení nemají přístup k databázi a správci databází nemají přístup k úložišti klíčů nebo klíčům prostého textu.
Správce zabezpečení
Před spuštěním jakýchkoli kroků, které zahrnují přístup ke klíčům ve formátu prostého textu nebo k úložišti klíčů (identifikovaných ve sloupci Accesses keys/key store ve sloupci Úložiště klíčů v následující tabulce), se ujistěte, že:
- Prostředí PowerShell běží na zabezpečeném počítači, který se liší od počítače hostujícího vaši databázi.
- DbA ve vaší organizaci nemají přístup k počítači (které by poškodilo účel oddělení rolí).
Další informace najdete v tématu Důležité informace o zabezpečení správy klíčů.
| Úkol | Článek | Přístup ke klíčům nebo úložišti klíčů ve formátu prostého textu | Přístup k databázi |
|---|---|---|---|
| Krok 1. Vytvořte hlavní klíč sloupce v úložišti klíčů. Poznámka: Modul SqlServer tento krok nepodporuje. Pokud chcete tento úkol provést z příkazového řádku, musíte použít nástroje, které jsou specifické pro konkrétní typ úložiště klíčů. |
Vytvoření a uložení hlavních klíčů sloupců pro funkci Always Encrypted | Ano | Ne |
| Krok 2. Spusťte relaci PowerShellu a naimportujte modul SqlServer. | Import modulu SqlServer | Ne | Ne |
| Krok 3. Vytvořte objekt SqlColumnMasterKeySettings , který obsahuje informace o umístění hlavního klíče sloupce. SqlColumnMasterKeySettings je objekt, který existuje v paměti (v PowerShellu). Použijte rutinu (cmdlet) specifickou pro vaše úložiště klíčů. |
New-SqlAzureKeyVaultColumnMasterKeySettings Nové nastavení hlavního klíče sloupce úložiště certifikátů SQL New-SqlCngColumnMasterKeySettings Nové nastavení hlavního klíče sloupce SQL CNG Nové nastavení klíče ColumnMasterKey pro SqlCsp |
Ne | Ne |
| Krok 4. Ověřte se v Azure, pokud je hlavní klíč sloupce uložený ve službě Azure Key Vault. | Connect-AzAccount | Ano | Ne |
| Krok 5. Získejte přístupový token pro službu Azure Key Vault, pokud je hlavní klíč sloupce uložený ve službě Azure Key Vault. | Get-AzAccessToken | Ne | Ne |
| Krok 6. Vygenerujte šifrovací klíč sloupce, zašifrujte ho pomocí hlavního klíče sloupce a vytvořte zašifrovanou hodnotu šifrovacího klíče sloupce. | New-SqlColumnEncryptionKeyEncryptedValue | Ano | Ne |
| Krok 7. Poskytněte umístění sloupcového hlavního klíče (název poskytovatele a cestu ke klíči sloupcového hlavního klíče) a zašifrovanou hodnotu šifrovacího klíče sloupce správci databáze. | Podívejte se na příklady na konci článku. | Ne | Ne |
správce databází
DbA používají informace, které obdrží od správce zabezpečení (krok 7 výše), k vytvoření a správě metadat klíčů Always Encrypted v databázi.
| Úkol | Článek | Přístup ke klíčům prostého textu | Přístup k databázi |
|---|---|---|---|
| Krok 1. Získejte umístění hlavního klíče sloupce a zašifrovanou hodnotu šifrovacího klíče sloupce od správce zabezpečení. | Podívejte se na příklady na konci článku. | Ne | Ne |
| Krok 2. Spusťte prostředí PowerShell a naimportujte modul SqlServer. | Konfigurace funkce Always Encrypted pomocí PowerShellu | Ne | Ne |
| Krok 3. Připojte se k serveru a databázi. | Připojení k databázi | Ne | Ano |
| Krok 4. Vytvořte objekt SqlColumnMasterKeySettings, který obsahuje informace o umístění hlavního klíče sloupce. SqlColumnMasterKeySettings je objekt, který existuje v paměti. | Nová nastavení hlavního klíče sloupce SQL | Ne | Ne |
| Krok 5. Vytvořte metadata o hlavním klíči sloupce v databázi. Poznámka: Neověřujeme platnost klíčů nebo certifikátů použitých k vygenerování hlavního klíče sloupce. |
New-SqlColumnMasterKey Poznámka: na pozadí cmdlet vydá příkaz CREATE COLUMN MASTER KEY (Transact-SQL) pro vytvoření metadat hlavního klíče sloupce. |
Ne | Ano |
| Krok 6. Vytvořte v databázi metadata sloupcového šifrovacího klíče. | New-SqlColumnEncryptionKey Poznámka: Administrátoři databází používají variantu cmdletu, která vytváří pouze metadata šifrovacího klíče sloupce. Na pozadí cmdlet vydá příkaz CREATE COLUMN ENCRYPTION KEY (Transact-SQL) k vytvoření metadat šifrovacího klíče sloupce. |
Ne | Ano |
Windows Certificate Store s oddělením rolí (příklad)
Správce zabezpečení
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[string]$ServerName = '<server name>',
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]$DatabaseName = '<database name>',
[Parameter(Mandatory = $false)]
[string]$CertificateSubject = 'AlwaysEncryptedCert',
[Parameter(Mandatory = $false)]
[string]$CmkName = 'CMK1',
[Parameter(Mandatory = $false)]
[string]$CekName = 'CEK1',
[Parameter(Mandatory = $false)]
[string]$ExportKeyDataPath = 'C:\temp\keydata.txt'
)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
Import-Module SqlServer -MinimumVersion 22.0.50 -ErrorAction Stop
Write-Host "[AE] Finding 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 a new 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' / '$DatabaseName'. Verify instance name, database, and local permissions."
throw
}
Write-Host '[AE] Building CMK settings from certificate'
$cmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation 'CurrentUser' -Thumbprint $cert.Thumbprint
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
}
if ($ExportKeyDataPath) {
Write-Host "[AE] Exporting key metadata to '$ExportKeyDataPath'"
$encryptedValue = New-SqlColumnEncryptionKeyEncryptedValue -TargetColumnMasterKeySettings $cmkSettings
"KeyStoreProviderName,KeyPath,EncryptedValue" | Set-Content -Path $ExportKeyDataPath -Encoding UTF8
"$($cmkSettings.KeyStoreProviderName),$($cmkSettings.KeyPath),$encryptedValue" | Add-Content -Path $ExportKeyDataPath -Encoding UTF8
}
Write-Host 'Completed successfully'
správce databází
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[string]$ServerName = 'localhost\SQL2025',
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]$DatabaseName = 'AdventureWorks2025',
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]$KeyDataFile = 'C:\temp\keydata.txt',
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]$CmkName = 'CMK1',
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]$CekName = 'CEK1'
)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
Import-Module SqlServer -MinimumVersion 22.0.50 -ErrorAction Stop
if (-not (Test-Path -Path $KeyDataFile -PathType Leaf)) {
throw "Key data file not found: $KeyDataFile"
}
Write-Host "[AE] Loading key metadata from '$KeyDataFile'"
$keyData = Import-Csv -Path $KeyDataFile
if (-not $keyData) {
throw "Key data file '$KeyDataFile' is empty."
}
$keyDataRow = $keyData | Select-Object -First 1
if (-not $keyDataRow.KeyStoreProviderName -or -not $keyDataRow.KeyPath -or -not $keyDataRow.EncryptedValue) {
throw "Key data file must include non-empty columns: KeyStoreProviderName, KeyPath, EncryptedValue."
}
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' / '$DatabaseName'. Verify instance name, database, and local permissions."
throw
}
Write-Host "[AE] Building CMK settings for provider '$($keyDataRow.KeyStoreProviderName)'"
$cmkSettings = New-SqlColumnMasterKeySettings -KeyStoreProviderName $keyDataRow.KeyStoreProviderName -KeyPath $keyDataRow.KeyPath
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 -EncryptedValue $keyDataRow.EncryptedValue | Out-Null
}
Write-Host 'Completed successfully'
Související obsah
- Konfigurace šifrování sloupců pomocí funkce Always Encrypted s Využitím PowerShellu
- Rotace klíčů Always Encrypted pomocí PowerShellu
- Vývoj aplikací s využitím funkce Always Encrypted
- Always Encrypted
- Přehled správy klíčů pro Always Encrypted
- Vytvoření a uložení hlavních klíčů sloupců pro funkci Always Encrypted
- Konfigurace funkce Always Encrypted pomocí PowerShellu
- Zřízení klíčů Always Encrypted pomocí aplikace SQL Server Management Studio
- CREATE COLUMN MASTER KEY (Transact-SQL)
- DROP COLUMN MASTER KEY (Transact-SQL)
- CREATE COLUMN ENCRYPTION KEY (Transact-SQL)
- ALTER COLUMN ENCRYPTION KEY (Transact-SQL)
- DROP COLUMN ENCRYPTION KEY (Transact-SQL)
- sys.column_master_keys (Transact-SQL)
- sys.column_encryption_keys (Transact-SQL) - Šifrovací klíče sloupců systému