Otočení klíčů Always Encrypted pomocí PowerShellu
platí pro:SQL Server
Azure SQL Database
azure SQL Managed Instance
Tento článek obsahuje postup obměna klíčů pro Always Encrypted pomocí modulu SqlServer PowerShell. Informace o tom, jak začít používat modul SqlServer PowerShell pro Always Encrypted, najdete v tématu Konfigurace funkce Always Encrypted pomocí powershellového.
Rotace klíčů Always Encrypted je proces nahrazení existujícího klíče novým klíčem. Pokud byl klíč kompromitován nebo pokud to vyžadují zásady vaší organizace či předpisy ohledně dodržování souladu, které nařizují pravidelnou obměnu kryptografických klíčů, může být nutné klíč obměnit.
Funkce Always Encrypted používá dva typy klíčů, takže existují dva vysoké úrovně pracovních postupů obměny klíčů: obměna hlavních klíčů sloupců a obměna šifrovacích klíčů sloupců.
- Obnovení šifrovacího klíče sloupce – zahrnuje dešifrování dat šifrovaných aktuálním klíčem a opětovné zašifrování dat pomocí nového šifrovacího klíče sloupce. Vzhledem k tomu, že rotace šifrovacího klíče sloupce vyžaduje přístup ke klíčům i k databázi, lze obměnu šifrovacích klíčů sloupců provést pouze bez oddělení rolí.
- Rotace hlavního klíče sloupce – zahrnuje dešifrování šifrovacích klíčů sloupců, které jsou chráněny aktuálním hlavním klíčem sloupce, jejich opětovné šifrování pomocí nového hlavního klíče sloupce a aktualizaci metadat pro oba typy klíčů. Rotace hlavního klíče sloupce může být dokončena s oddělením rolí nebo bez něj (při použití modulu SqlServer PowerShell).
Obměna hlavního klíče sloupce bez oddělení rolí
Metoda otáčení hlavního klíče sloupce popsaná v této části nepodporuje oddělení rolí mezi Správcem zabezpečení a DBA. Některé z následujících kroků kombinují operace s fyzickými klíči s operacemi s metadaty klíčů, takže tento pracovní postup se doporučuje pro organizace používající model DevOps nebo když je vaše 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. Nedoporučuje se, pokud potenciální protivníci zahrnují správce databází nebo pokud by správci databází neměli mít přístup k citlivým datům.
Ú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 nový klíč hlavního sloupce v úložišti klíčů. Poznámka: modul SqlServer PowerShell tento krok nepodporuje. Pokud chcete tuto úlohu provést z příkazového řádku, musíte použít nástroje, které jsou specifické pro vaše úložiště klíčů. |
Vytvoření a uložení hlavních klíčů sloupců pro funkci Always Encrypted | Ano | Ne |
Krok 2. Spuštění prostředí PowerShellu a import modulu SqlServer | Import modulu SqlServer | 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í nového hlavního klíče sloupce. SqlColumnMasterKeySettings je objekt, který existuje v paměti (v PowerShellu). Pokud ho chcete vytvořit, musíte použít rutinu, která je specifická pro vaše úložiště klíčů. |
New-SqlAzureKeyVaultColumnMasterKeySettings New-SqlCertificateStoreColumnMasterKeySettings New-SqlCngColumnMasterKeySettings New-SqlCspColumnMasterKeySettings |
Ne | Ne |
Krok 5. Vytvořte metadata o novém hlavním klíči sloupce v databázi. |
New-SqlColumnMasterKey Poznámka: v zákulisí tento cmdlet vydá příkaz CREATE COLUMN MASTER KEY(Transact-SQL) pro vytvoření metadat klíče. |
Ne | Ano |
Krok 6. Ověřte se v Azure, pokud je váš aktuální hlavní klíč sloupce nebo nový hlavní klíč sloupce uložený v trezoru klíčů nebo spravovaném HSM 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. Zahajte otáčení tím, že pomocí nového hlavního klíče sloupce zašifrujte každý šifrovací klíč sloupce, který je aktuálně chráněný starým hlavním klíčem sloupce. Po tomto kroku je každý ovlivněný šifrovací klíč sloupce (spojený se starým hlavním klíčem sloupce, který se rotuje) zašifrován jak starým, tak novým hlavním klíčem sloupce a má dvě šifrované hodnoty v metadatech databáze. | Invoke-SqlColumnMasterKeyRotation | Ano | Ano |
Krok 9. Koordinujte se správci všech aplikací, které dotazují šifrované sloupce v databázi (a jsou chráněné starým hlavním klíčem sloupce), aby mohly zajistit, aby aplikace mohly přistupovat k novému hlavnímu klíči sloupce. | Vytvoření a uložení mistrovských klíčů sloupců (Always Encrypted) | Ano | Ne |
Krok 10. Dokončení otočení Poznámka: před provedením tohoto kroku se ujistěte, že všechny aplikace, které se dotazují na šifrované sloupce chráněné starým hlavním klíčem sloupce, byly nakonfigurovány tak, aby používaly nový hlavní klíč sloupce. Pokud tento krok provedete předčasně, některé z těchto aplikací nemusí být schopny data dešifrovat. Dokončete rotaci odebráním šifrovaných hodnot z databáze, které byly vytvořeny se starým hlavním klíčem sloupce. Tím se odstraní propojení mezi starým hlavním klíčem sloupce a šifrovacími klíči sloupců, které chrání. |
Dokončit-SqlColumnMasterKeyRotation | Ne | Ano |
Krok 10. Odeberte metadata ze starého sloupcového hlavního klíče. | Remove-SqlColumnMasterKey | Ne | Ano |
Poznámka
Důrazně doporučujeme po rotaci trvale neodstraňovat starý hlavní klíč sloupce. Místo toho byste měli zachovat původní hlavní klíč sloupce v aktuálním úložišti klíčů nebo ho archivovat na jiném zabezpečeném místě. Pokud databázi obnovíte ze záložního souboru k určitému bodu v čase před konfigurace nového hlavního klíče sloupce, budete pro přístup k datům potřebovat starý klíč.
Rotace hlavního klíče sloupce bez oddělení rolí (příklad certifikátu systému Windows)
Následující skript je kompletní příklad, který nahradí stávající hlavní klíč sloupce (CMK1) novým hlavním klíčem sloupce (CMK2).
# Create a new column master key in Windows Certificate Store.
$cert = New-SelfSignedCertificate -Subject "AlwaysEncryptedCert" -CertStoreLocation Cert:CurrentUser\My -KeyExportPolicy Exportable -Type DocumentEncryptionCert -KeyUsage KeyEncipherment -KeySpec KeyExchange -KeyLength 2048
# Import the SqlServer module
Import-Module "SqlServer"
# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True"
$database = Get-SqlDatabase -ConnectionString $connStr
# Create a SqlColumnMasterKeySettings object for your new column master key.
$newCmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation "CurrentUser" -Thumbprint $cert.Thumbprint
# Create metadata for your new column master key in the database.
$newCmkName = "CMK2"
New-SqlColumnMasterKey -Name $newCmkName -InputObject $database -ColumnMasterKeySettings $newCmkSettings
# Initiate the rotation from the current column master key to the new column master key.
$oldCmkName = "CMK1"
Invoke-SqlColumnMasterKeyRotation -SourceColumnMasterKeyName $oldCmkName -TargetColumnMasterKeyName $newCmkName -InputObject $database
# Complete the rotation of the old column master key.
Complete-SqlColumnMasterKeyRotation -SourceColumnMasterKeyName $oldCmkName -InputObject $database
# Remove the old column master key metadata.
Remove-SqlColumnMasterKey -Name $oldCmkName -InputObject $database
Rotace hlavního klíče sloupce s oddělením rolí
Pracovní postup rotace hlavního klíče sloupce popsaný v této části zajišťuje oddělení mezi správcem zabezpečení a administrátorem databáze (DBA).
Důležitý
Před provedením jakéhokoli postupu, kdy Accesses plaintext keys/keystore=Ano v následující tabulce (kroky, které přistupují ke klíčům prostého textu nebo úložišti klíčů), ujistěte se, ž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 aspekty zabezpečení pro správu klíčů.
Část 1: DBA
Správce databáze načte metadata o hlavním klíči sloupce, který se má otočit, a o ovlivněných šifrovacích klíčích sloupců, které jsou přidružené k hlavnímu klíči aktuálního sloupce. Databázový administrátor sdílí všechny tyto informace se správcem zabezpečení.
Ú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. Spusťte prostředí PowerShell a naimportujte modul SqlServer. | Import modulu SqlServer | Ne | Žádný |
Krok 2. Připojte se k serveru a databázi. | Připojit k databázi | Ne | Ano |
Krok 3. Načtěte metadata o starém hlavním klíči sloupce. | Get-SqlColumnMasterKey | Ne | Ano |
Krok 4. Načtěte metadata o šifrovacích klíčích sloupců chráněných starým hlavním klíčem sloupce včetně jejich šifrovaných hodnot. | Get-SqlColumnEncryptionKey | Ne | Ano |
Krok 5. Sdílejte umístění hlavního klíče sloupce (název zprostředkovatele a cestu ke klíči hlavního klíče pro sloupec) a šifrované hodnoty odpovídajících šifrovacích klíčů sloupců, chráněné starým hlavním klíčem sloupce. | Podívejte se na následující příklady. | Ne | Ne |
Část 2: Správce zabezpečení
Správce zabezpečení vygeneruje nový hlavní klíč sloupce, znovu zašifruje ovlivněné šifrovací klíče sloupců pomocí nového hlavního klíče sloupce a sdílí informace o novém hlavním klíči sloupce a také sadu nových šifrovaných hodnot pro ovlivněné šifrovací klíče sloupců s DBA.
Ú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. Získejte umístění původního hlavního klíče sloupce a šifrovaných hodnot odpovídajících šifrovacích klíčů sloupců chráněných starým hlavním klíčem sloupce z dbA. | Není k dispozici Podívejte se na následující příklady. |
Ne | Ne |
Krok 2. Vytvořte nový sloupcový hlavní klíč 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 3. Spusťte prostředí PowerShell a naimportujte modul SqlServer. | Import modulu SqlServer | Ne | Ne |
Krok 4. Vytvořte objekt SqlColumnMasterKeySettings, který obsahuje informace o umístění vašeho starého hlavního klíče sloupce. SqlColumnMasterKeySettings je objekt, který existuje v paměti (v PowerShellu). | New-SqlColumnMasterKeySettings | Ne | Ne |
Krok 5. Vytvořte objekt SqlColumnMasterKeySettings, který obsahuje informace o umístění hlavní klíč nového sloupce. SqlColumnMasterKeySettings je objekt, který existuje v paměti (v PowerShellu). Pokud ho chcete vytvořit, musíte použít rutinu, která je specifická pro vaše úložiště klíčů. |
New-SqlAzureKeyVaultColumnMasterKeySettings New-SqlCertificateStoreColumnMasterKeySettings New-SqlCngColumnMasterKeySettings New-SqlCspColumnMasterKeySettings |
Ne | Ne |
Krok 6. Ověřte se v Azure, pokud je váš starý (aktuální) hlavní klíč sloupce nebo nový hlavní klíč sloupce uložený v trezoru klíčů nebo spravovaný HSM 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. Znovu zašifrujte každou hodnotu šifrovacího klíče sloupce, která je aktuálně chráněna starým hlavním klíčem sloupce pomocí nového hlavního klíče sloupce. |
New-SqlColumnEncryptionKeyEncryptedValue Poznámka: Při volání této rutiny předejte objekty SqlColumnMasterKeySettings pro starý i nový hlavní klíč sloupce spolu s hodnotou šifrovacího klíče sloupce, která se má znovu zašifrovat. |
Ano | Ne |
Krok 9. Sdílejte umístění nového hlavního klíče sloupce (název poskytovatele a cestu ke klíči) a také sadu nových šifrovaných hodnot klíčů pro šifrování sloupců se svým DBA. | Podívejte se na následující příklady. | Ne | Ne |
Poznámka
Důrazně doporučujeme, abyste po rotaci starý hlavní klíč sloupce trvale neodstranili. Místo toho byste měli zachovat původní hlavní klíč sloupce v aktuálním úložišti klíčů nebo ho archivovat na jiném zabezpečeném místě. Pokud obnovíte svou databázi ze záložního souboru do bodu v čase , který je před okamžikem, kdy byl nakonfigurován nový hlavní klíč sloupce, budete potřebovat starý klíč pro přístup k datům.
Část 3: DBA
DbA vytvoří metadata pro nový hlavní klíč sloupce a aktualizuje metadata ovlivněných šifrovacích klíčů sloupců, aby se přidala nová sada šifrovaných hodnot. V tomto kroku dbA také koordinuje správce aplikací dotazující se na šifrovací sloupce, kteří zajistí, aby aplikace získala přístup k novému hlavnímu klíči sloupce. Jakmile jsou všechny aplikace nastaveny tak, aby používaly nový hlavní klíč sloupce, dbA odebere starou sadu šifrovaných hodnot a metadat hlavního klíče starého sloupce.
Ú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. Získejte umístění nového hlavního klíče sloupce a novou sadu šifrovaných hodnot odpovídajících šifrovacích klíčů sloupce chráněných starým hlavním klíčem sloupce od správce zabezpečení. | Podívejte se na následující příklady. | Ne | Ne |
Krok 2. Spusťte prostředí PowerShell a naimportujte modul SqlServer. | Import modulu SqlServer | 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í nového hlavního klíče sloupce. SqlColumnMasterKeySettings je objekt, který existuje v paměti (v PowerShellu). | New-SqlColumnMasterKeySettings | Ne | Ne |
Krok 5. Vytvořte metadata o novém hlavním klíči sloupce v databázi. |
New-SqlColumnMasterKey Poznámka: Tento cmdlet spouští příkaz CREATE COLUMN MASTER KEY (Transact-SQL) k vytvoření metadat klíče. |
Ne | Ano |
Krok 6. Načtěte metadata o šifrovacích klíčích sloupců chráněných starým hlavním klíčem sloupce. | Get-SqlColumnEncryptionKey | Ne | Ano |
Krok 7. Přidejte do metadat pro každý ovlivněný šifrovací klíč sloupce novou šifrovanou hodnotu (vytvořenou pomocí nového hlavního klíče sloupce). | Add-SqlColumnEncryptionKeyValue | Ne | Ano |
Krok 8. Koordinujte se správci všech aplikací, které dotazují šifrované sloupce v databázi (a jsou chráněné starým hlavním klíčem sloupce), aby mohly zajistit, aby aplikace mohly přistupovat k novému hlavnímu klíči sloupce. | vytváření a ukládání hlavních klíčů sloupců (Always Encrypted) | Ne | Ne |
Krok 9. Dokončete rotaci odebráním šifrovaných hodnot přidružených ke starému hlavnímu klíči sloupce z databáze. Poznámka: Před provedením tohoto kroku se ujistěte, že všechny aplikace, které se dotazují na šifrované sloupce chráněné starým hlavním klíčem sloupce, byly nakonfigurovány tak, aby používaly nový hlavní klíč sloupce. Pokud tento krok provedete předčasně, některé z těchto aplikací nemusí být schopny data dešifrovat. Tento krok odebere vazbu mezi starým hlavním klíčem sloupce a šifrovacími klíči sloupců, které chrání. |
Complete-SqlColumnMasterKeyRotation Alternativně můžete použít Remove-SqlColumnEncryptionKeyValue |
Ne | Ano |
Krok 10. Odebrání metadat hlavního klíče starého sloupce z databáze | Remove-SqlColumnMasterKey | Ne | Ano |
Otočení hlavního klíče sloupce pomocí oddělení rolí (příklad certifikátu Systému Windows)
Následující skript je kompletní příklad pro generování nového hlavního klíče sloupce, uloženého v úložišti certifikátů systému Windows jako certifikát, rotací existujícího (aktuálního) hlavního klíče sloupce a jeho nahrazení novým hlavním klíčem sloupce. Skript předpokládá, že cílová databáze obsahuje hlavní klíč sloupce s názvem CMK1 (který se má otočit), který šifruje některé šifrovací klíče sloupců.
Část 1: DBA
# Import the SqlServer module.
Import-Module "SqlServer"
# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True"
$database = Get-SqlDatabase -ConnectionString $connStr
# Retrieve the data about the old column master key, which needs to be rotated.
$oldCmkName = "CMK1"
$oldCmk = Get-SqlColumnMasterKey -Name $oldCmkName -InputObject $database
# Share the location of the old column master key with a Security Administrator, via a CSV file on a share drive.
$oldCmkDataFile = "Z:\oldcmkdata.txt"
"KeyStoreProviderName, KeyPath" > $oldCmkDataFile
$oldCmk.KeyStoreProviderName +", " + $oldCmk.KeyPath >> $oldCmkDataFile
# Find column encryption keys associated with the old column master key and provide the encrypted values of column encryption keys to the Security Administrator, via a CSV file on a share drive.
$ceks = Get-SqlColumnEncryptionKey -InputObject $database
$oldCekValuesFile = "Z:\oldcekvalues.txt"
"CEKName, CEKEncryptedValue" > $oldCekValuesFile
for($i=0; $i -lt $ceks.Length; $i++){
if($ceks[$i].ColumnEncryptionKeyValues.Length -eq 2) {
# This column encryption has 2 encrypted values - let's check, if it is associated with the old column master key.
if($ceks[$i].ColumnEncryptionKeyValues[0].ColumnMasterKeyName -eq $oldCmkName -or $ceks[$i].ColumnEncryptionKeyValues[1].ColumnMasterKeyName -eq $oldCmkName) {
Write-Host $ceks[$i].Name "already has 2 encrypted values and therefore" $oldCmkName + "cannot be rotated"
exit 1
}
}
if($ceks[$i].ColumnEncryptionKeyValues[0].ColumnMasterKeyName -eq $oldCmkName) {# This column encryption key has 1 encrypted value that was produced using the old column master key
# Save the name and the encrypted value of the column encryption key in the file.
$encryptedValue = "0x" + -join ($ceks[$i].ColumnEncryptionKeyValues[0].EncryptedValue | foreach {$_.ToString("X2") } )
$ceks[$i].Name + "," + $encryptedValue >> $oldCekValuesFile
}
}
Část 2: Správce zabezpečení
# Obtain the location of the old column master key and the encrypted values of the corresponding column encryption keys, from your DBA, via a CSV file on a share drive.
$oldCmkDataFile = "Z:\oldcmkdata.txt"
$oldCmkData = Import-Csv $oldCmkDataFile
$oldCekValuesFile = "Z:\oldcekvalues.txt"
$oldCekValues = @(Import-Csv $oldCekValuesFile)
# Create a new column master key in Windows Certificate Store.
$storeLocation = "CurrentUser"
$certPath = "Cert:\" + $storeLocation + "\My"
$cert = New-SelfSignedCertificate -Subject "AlwaysEncryptedCert" -CertStoreLocation $certPath -KeyExportPolicy Exportable -Type DocumentEncryptionCert -KeyUsage DataEncipherment -KeySpec KeyExchange
# Import the SqlServer module.
Import-Module "SqlServer"
# Create a SqlColumnMasterKeySettings object for your old column master key.
$oldCmkSettings = New-SqlColumnMasterKeySettings -KeyStoreProviderName $oldCmkData.KeyStoreProviderName -KeyPath $oldCmkData.KeyPath
# Create a SqlColumnMasterKeySettings object for your new column master key.
$newCmkSettings = New-SqlCertificateStoreColumnMasterKeySettings -CertificateStoreLocation $storeLocation -Thumbprint $cert.Thumbprint
# Prepare a CSV file, you will use to share the encrypted values of column encryption keys, produced using the new column master key.
$newCekValuesFile = "Z:\newcekvalues.txt"
"CEKName, CEKEncryptedValue" > $newCekValuesFile
# Re-encrypt each value with the new column master key and save the new encrypted value in the file.
for($i=0; $i -lt $oldCekValues.Count; $i++){
# Re-encrypt each value with the new CMK
$newValue = New-SqlColumnEncryptionKeyEncryptedValue -TargetColumnMasterKeySettings $newCmkSettings -ColumnMasterKeySettings $oldCmkSettings -EncryptedValue $oldCekValues[$i].CEKEncryptedValue
$oldCekValues[$i].CEKName + ", " + $newValue >> $newCekValuesFile
}
# Share the new column master key data with your DBA, via a CSV file.
$newCmkDataFile = $home + "\newcmkdata.txt"
"KeyStoreProviderName, KeyPath" > $newCmkDataFile
$newCmkSettings.KeyStoreProviderName +", " + $newCmkSettings.KeyPath >> $newCmkDataFile
Část 3: DBA
# Obtain the location of the new column master key and the new encrypted values of the corresponding column encryption keys, from your Security Administrator, via a CSV file on a share drive.
$newCmkDataFile = "Z:\newcmkdata.txt"
$newCmkData = Import-Csv $newCmkDataFile
$newCekValuesFile = "Z:\newcekvalues.txt"
$newCekValues = @(Import-Csv $newCekValuesFile)
# Import the SqlServer module.
Import-Module "SqlServer"
# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True"
$database = Get-SqlDatabase -ConnectionString $connStr
# Create a SqlColumnMasterKeySettings object for your new column master key.
$newCmkSettings = New-SqlColumnMasterKeySettings -KeyStoreProviderName $newCmkData.KeyStoreProviderName -KeyPath $newCmkData.KeyPath
# Create metadata for the new column master key in the database.
$newCmkName = "CMK2"
New-SqlColumnMasterKey -Name $newCmkName -InputObject $database -ColumnMasterKeySettings $newCmkSettings
# Get all CEK objects
$oldCmkName = "CMK1"
$ceks = Get-SqlColumnEncryptionKey -InputObject $database
for($i=0; $i -lt $ceks.Length; $i++){
if($ceks[$i].ColumnEncryptionKeyValues.Length -eq 2) {# This column encryption key has 2 encrypted values. Let's check, if it is associated with the old CMK.
if($ceks[$i].ColumnEncryptionKeyValues[0].ColumnMasterKeyName -eq $oldCmkName -or $ceks[$i].ColumnEncryptionKeyValues[1].ColumnMasterKeyName -eq $oldCmkName) {
Write-Host $ceks[$i].Name "already has 2 encrypted values and therefore" $oldCmkName + "cannot be rotated"
exit 1
}
}
if($ceks[$i].ColumnEncryptionKeyValues[0].ColumnMasterKeyName -eq $oldCmkName) {
# Find the corresponding new encrypted value, received from the Security Administrator.
$newValueRow = ($newCekValues| Where-Object {$_.CEKName -eq $ceks[$i].Name }[0])
# Update the column encryption key metadata object by adding the new encrypted value
Add-SqlColumnEncryptionKeyValue -ColumnMasterKeyName $newCmkName -Name $ceks[$i].Name -EncryptedValue $newValueRow.CEKEncryptedValue -InputObject $database
}
}
# Complete the rotation of the current column master key.
Complete-SqlColumnMasterKeyRotation -SourceColumnMasterKeyName $oldCmkName -InputObject $database
# Remove the old column master key.
Remove-SqlColumnMasterKey -Name $oldCmkName -InputObject $database
Výměna sloupcového šifrovacího klíče
Obměna šifrovacího klíče sloupce zahrnuje dešifrování dat ve všech sloupcích, které byly zašifrovány klíčem, jenž má být nahrazen, a opětovné zašifrování dat pomocí nového šifrovacího klíče sloupce. Tento pracovní postup obměně vyžaduje přístup ke klíčům i k databázi, a proto se nedá provádět oddělení rolí. Obměna šifrovacího klíče sloupce může trvat dlouhou dobu, pokud jsou tabulky, které obsahují sloupce zašifrované klíčem, jež se obměňuje, velké. Proto vaše organizace musí pečlivě naplánovat rotaci sloupcového šifrovacího klíče.
Šifrovací klíč sloupce můžete otočit pomocí offline nebo online přístupu. První metoda bude pravděpodobně rychlejší, ale vaše aplikace nemůžou zapisovat do ovlivněných tabulek. Druhý přístup bude pravděpodobně trvat déle, ale můžete omezit časový interval, během kterého nejsou ovlivněné tabulky dostupné pro aplikace. Další informace najdete v tématu Konfigurace šifrování sloupců pomocí Always Encrypted s PowerShellem a Set-SqlColumnEncryption.
Ú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. Spusťte prostředí PowerShell a naimportujte modul SqlServer. | Import modulu SqlServer | Ne | Ne |
Krok 2. Připojte se k serveru a databázi. | Připojení k databázi | Ne | Ano |
Krok 3. Ověřte se v Azure, pokud je hlavní klíč sloupce (chráněný šifrovací klíč sloupce, který se má otočit), uložený v trezoru klíčů nebo spravovaném HSM ve službě Azure Key Vault. | Connect-AzAccount | Ano | Ne |
Krok 4. 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 5. 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. Tato rutinní procedura v pozadí používá příkaz CREATE COLUMN ENCRYPTION KEY (Transact-SQL) k vytvoření metadat klíče. |
Ano | Ano |
Krok 6. Najdi všechny sloupce zašifrované pomocí starého šifrovacího klíče sloupce. | průvodce programováním objektů SMO (SQL Server Management Objects) | Ne | Ano |
Krok 7. Vytvořte SqlColumnEncryptionSettings objekt pro každý ovlivněný sloupec. SqlColumnEncryptionSettings je objekt, který existuje v paměti (v PowerShellu). Určuje cílové schéma šifrování pro sloupec. V tomto případě by měl objekt určit, že ovlivněný sloupec má být zašifrován pomocí nového šifrovacího klíče sloupce. | New-SqlColumnEncryptionSettings | Ne | Ne |
Krok 8. Znovu zašifrujte sloupce identifikované v kroku 5 pomocí nového šifrovacího klíče sloupce. |
Set-SqlColumnEncryption Poznámka: Tento krok může trvat dlouhou dobu. Vaše aplikace nebudou mít přístup k tabulkám prostřednictvím celé operace nebo jeho části v závislosti na přístupu (online nebo offline), který vyberete. |
Ano | Ano |
Krok 9. Odeberte metadata pro starý sloupcový šifrovací klíč. | Remove-SqlColumnEncryptionKey | Ne | Ano |
Příklad – rotace šifrovacího klíče sloupce
Následující skript ukazuje rotaci šifrovacího klíče ke sloupci. Skript předpokládá, že cílová databáze obsahuje některé sloupce zašifrované šifrovacím klíčem sloupce s názvem CEK1 (který se má otočit), který je chráněný pomocí hlavního klíče sloupce s názvem CMK1 (hlavní klíč sloupce není uložený ve službě Azure Key Vault).
# Import the SqlServer module.
Import-Module "SqlServer"
# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True"
$database = Get-SqlDatabase -ConnectionString $connStr
# Generate a new column encryption key, encrypt it with the column master key and create column encryption key metadata in the database.
$cmkName = "CMK1"
$newCekName = "CEK2"
New-SqlColumnEncryptionKey -Name $newCekName -InputObject $database -ColumnMasterKey $cmkName
# Find all columns encrypted with the old column encryption key, and create a SqlColumnEncryptionSetting object for each column.
$ces = @()
$oldCekName = "CEK1"
$tables = $database.Tables
for($i=0; $i -lt $tables.Count; $i++){
$columns = $tables[$i].Columns
for($j=0; $j -lt $columns.Count; $j++) {
if($columns[$j].isEncrypted -and $columns[$j].ColumnEncryptionKeyName -eq $oldCekName) {
$threeColPartName = $tables[$i].Schema + "." + $tables[$i].Name + "." + $columns[$j].Name
$ces += New-SqlColumnEncryptionSettings -ColumnName $threeColPartName -EncryptionType $columns[$j].EncryptionType -EncryptionKey $newCekName
}
}
}
# Re-encrypt all columns, currently encrypted with the old column encryption key, using the new column encryption key.
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces -InputObject $database -UseOnlineApproach -MaxDowntimeInSeconds 120 -LogFileDirectory .
# Remove the old column encryption key metadata.
Remove-SqlColumnEncryptionKey -Name $oldCekName -InputObject $database
Další kroky
- Dotazování na sloupce pomocí Always Encrypted ve SQL Server Management Studio
- Vývoj aplikací pomocí funkce Always Encrypted
Viz také
- funkce Always Encrypted
- Přehled správy klíčů pro funkci Always Encrypted
- Konfigurace Always Encrypted pomocí PowerShellu
- Rotace klíčů Always Encrypted pomocí aplikace SQL Server Management Studio
- CREATE COLUMN MASTER KEY (Transact-SQL)
- DROP COLUMN MASTER KEY (Transact-SQL)
- VYTVOŘIT KLÍČ PRO ŠIFROVÁNÍ SLOUPCE (Transact-SQL)
- ALTER COLUMN ENCRYPTION KEY (Transact-SQL)
- ŠIFROVACÍ KLÍČ DROP COLUMN (Transact-SQL)
- sys.column_master_keys (Transact-SQL)
- sys.column_encryption_keys (Transact-SQL)