Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Den här artikeln innehåller stegen för att rotera nycklar för Always Encrypted med hjälp av SqlServer PowerShell-modulen. Information om hur du börjar använda SqlServer PowerShell-modulen för Always Encrypted finns i Configure Always Encrypted using PowerShell.
Att rotera Always Encrypted Keys är processen att ersätta en befintlig nyckel med en ny. Du kan behöva rotera en nyckel om den har komprometterats, eller för att uppfylla organisationens principer eller efterlevnadsregler som kräver kryptografiska nycklar måste roteras regelbundet.
Always Encrypted använder två typer av nycklar, så det finns två huvudsakliga arbetsflöden för nyckelrotation: rotering av kolumnhuvudnycklar och rotering av kolumnkrypteringsnycklar.
- Kolumnkrypteringsnyckelrotation – innebär dekryptering av data som krypteras med den aktuella nyckeln och omkryptering av data med hjälp av den nya kolumnkrypteringsnyckeln. Eftersom rotation av en kolumnkrypteringsnyckel kräver åtkomst till både nycklar och databasen, kan kolumnkrypteringsnyckelrotation endast utföras utan rollseparering.
- Kolumnhuvudnyckelrotation – innebär dekryptering av kolumnkrypteringsnycklar som skyddas med den aktuella kolumnhuvudnyckeln, omkrypterar dem med den nya kolumnhuvudnyckeln och uppdaterar metadata för båda typerna av nycklar. Kolumnhuvudnyckelrotation kan slutföras med eller utan rollavgränsning (när du använder SqlServer PowerShell-modulen).
Kolumnhuvudnyckelrotation utan rollavgränsning
Metoden för att rotera en kolumnhuvudnyckel som beskrivs i det här avsnittet stöder inte rollseparation mellan en säkerhetsadministratör och en DBA. Några av stegen nedan kombinerar åtgärder på de fysiska nycklarna med åtgärder för nyckelmetadata, så det här arbetsflödet rekommenderas för organisationer som använder DevOps-modellen, eller när databasen finns i molnet och det primära målet är att begränsa molnadministratörer (men inte lokala DBA) från att komma åt känsliga data. Det rekommenderas inte om potentiella angripare inkluderar DBAs eller om DBAs inte ska ha åtkomst till känsliga data.
Uppgift | Artikel | Åtkomst till klartextnycklar/nyckelarkiv | Åtkomst till databasen |
---|---|---|---|
Steg 1. Skapa en ny kolumnhuvudnyckel i ett nyckelarkiv. Obs! SqlServer PowerShell-modulen stöder inte det här steget. För att utföra den här uppgiften från kommandoraden måste du använda verktyg som är specifika för ditt nyckelarkiv. |
Skapa och lagra kolumnhuvudnycklar för Always Encrypted | Ja | Nej |
Steg 2. Starta en PowerShell-miljö och importera SqlServer-modulen | Importera SqlServer-modulen | Nej | Nej |
Steg 3. Anslut till servern och databasen. | Ansluta till en databas | Nej | Ja |
Steg 4. Skapa ett SqlColumnMasterKeySettings-objekt som innehåller information om platsen för den nya kolumnhuvudnyckeln. SqlColumnMasterKeySettings är ett objekt som finns i minnet (i PowerShell). Om du vill skapa den måste du använda den cmdlet som är specifik för ditt nyckelarkiv. |
New-SqlAzureKeyVaultColumnMasterKeySettings New-SqlCertificateStoreColumnMasterKeySettings New-SqlCngColumnMasterKeySettings New-SqlCspColumnMasterKeySettings |
Nej | Nej |
Steg 5. Skapa metadata om den nya kolumnhuvudnyckeln i databasen. |
New-SqlColumnMasterKey Obs! I bakgrunden utfärdar den här cmdleten CREATE COLUMN MASTER KEY (Transact-SQL)-instruktionen för att skapa nyckelmetadata. |
Nej | Ja |
Steg 6. Autentisera till Azure om din aktuella kolumnhuvudnyckel eller din nya kolumnhuvudnyckel lagras i ett nyckelvalv eller en hanterad HSM i Azure Key Vault | Connect-AzAccount | Ja | Nej |
Steg 7. Hämta en åtkomsttoken för Azure Key Vaults om din kolumnhuvudnyckel lagras i Azure Key Vault. | Get-AzAccessToken | Nej | Nej |
Steg 8. Starta rotationen genom att kryptera var och en av kolumnkrypteringsnycklarna, som för närvarande är skyddad med den gamla kolumnhuvudnyckeln, med hjälp av den nya kolumnhuvudnyckeln. Efter det här steget krypteras varje kolumnkrypteringsnyckel (associerad med den gamla kolumnhuvudnyckeln, som roteras), med både den gamla och den nya kolumnhuvudnyckeln och har två krypterade värden i databasmetadata. | Invoke-SqlColumnMasterKeyRotation | Ja | Ja |
Steg 9. Samordna med administratörerna för alla program som kör frågor mot krypterade kolumner i databasen (och skyddas med den gamla kolumnhuvudnyckeln), så att de kan se till att programmen kan komma åt den nya kolumnhuvudnyckeln. | Skapa och lagra kolumnhuvudnycklar (alltid krypterade) | Ja | Nej |
Steg 10. Slutför rotationen Obs! innan du kör det här steget kontrollerar du att alla program som kör frågor mot krypterade kolumner som skyddas med den gamla kolumnhuvudnyckeln har konfigurerats för att använda den nya kolumnhuvudnyckeln. Om du utför det här steget i förtid kanske vissa av dessa program inte kan dekryptera data. Slutför rotationen genom att ta bort de krypterade värdena från databasen som skapades med den gamla kolumnhuvudnyckeln. Detta tar bort associationen mellan den gamla kolumnhuvudnyckeln och de kolumnkrypteringsnycklar som den skyddar. |
Complete-SqlColumnMasterKeyRotation | Nej | Ja |
Steg 10. Ta bort metadata från den gamla kolumnhuvudnyckeln. | Remove-SqlColumnMasterKey | Nej | Ja |
Anteckning
Vi rekommenderar starkt att du inte tar bort den gamla kolumnhuvudnyckeln permanent efter rotationen. I stället bör du behålla den gamla kolumnhuvudnyckeln i det aktuella nyckelarkivet eller arkivera den på en annan säker plats. Om du återställer databasen från en säkerhetskopia till en tidpunkt innan den nya kolumnhuvudnyckeln har konfigurerats behöver du den gamla nyckeln för att komma åt data.
Rotera en kolumnhuvudnyckel utan rollavgränsning (Exempel på Windows-certifikat)
Skriptet nedan är ett exempel från slutpunkt till slutpunkt som ersätter en befintlig kolumnhuvudnyckel (CMK1) med en ny kolumnhuvudnyckel (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; TrustServerCertificate = 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
Kolumnhuvudnyckelrotation med rollavgränsning
Arbetsflödet för kolumnhuvudnyckelrotation som beskrivs i det här avsnittet säkerställer separationen mellan en säkerhetsadministratör och en DBA.
Viktig
Innan du utför några steg där åtkomst sker till klartextnycklar/nyckelarkiv=Ja i tabellen nedan (steg som kommer åt klartextnycklar eller nyckelarkivet), kontrollera att PowerShell-miljön körs på en säker maskin som är separat från datorn som är värd för databasen. Mer information finns i säkerhetsöverväganden för Nyckelhantering.
Del 1: DBA
En DBA hämtar metadata om den kolumnhuvudnyckel som ska roteras och om de påverkade kolumnkrypteringsnycklarna, som är associerade med den aktuella kolumnhuvudnyckeln. DBA delar all denna information med en säkerhetsadministratör.
Uppgift | Artikel | Åtkomst till klartextnycklar/nyckelarkiv | Åtkomst till databasen |
---|---|---|---|
Steg 1. Starta en PowerShell-miljö och importera SqlServer-modulen. | Importera SqlServer-modulen | Nej | Ingen |
Steg 2. Anslut till servern och en databas. | Anslut till en databas | Nej | Ja |
Steg 3. Hämta metadata om den gamla kolumnhuvudnyckeln. | Get-SqlColumnMasterKey | Nej | Ja |
Steg 4. Hämta metadata om kolumnkrypteringsnycklar som skyddas av den gamla kolumnhuvudnyckeln, inklusive deras krypterade värden. | Get-SqlColumnEncryptionKey | Nej | Ja |
Steg 5. Dela platsen för kolumnhuvudnyckeln (providernamnet och en nyckelsökväg för kolumnhuvudnyckeln) och de krypterade värdena för motsvarande kolumnkrypteringsnycklar som skyddas med den gamla kolumnhuvudnyckeln. | Se exemplen nedan. | Nej | Nej |
Del 2: Säkerhetsadministratör
Säkerhetsadministratören genererar en ny kolumnhuvudnyckel, krypterar om de påverkade kolumnkrypteringsnycklarna med den nya kolumnhuvudnyckeln och delar informationen om den nya kolumnhuvudnyckeln samt uppsättningen med nya krypterade värden för de påverkade kolumnkrypteringsnycklarna med DBA.
Uppgift | Artikel | Åtkomst till klartextnycklar/nyckelarkiv | Åtkomst till databasen |
---|---|---|---|
Steg 1. Hämta platsen för den gamla kolumnhuvudnyckeln och de krypterade värdena för motsvarande kolumnkrypteringsnycklar, skyddade med den gamla kolumnhuvudnyckeln, från din DBA. | Ej tillämpligt Se exemplen nedan. |
Nej | Nej |
Steg 2. Skapa en ny kolumnhuvudnyckel i ett nyckelarkiv. Obs! SqlServer-modulen stöder inte det här steget. För att kunna utföra den här uppgiften från en kommandorad måste du använda de verktyg som är specifika för din nyckellagringstyp. |
Skapa och lagra kolumnhuvudnycklar för Always Encrypted | Ja | Nej |
Steg 3. Starta en PowerShell-miljö och importera SqlServer-modulen. | Importera SqlServer-modulen | Nej | Nej |
Steg 4. Skapa ett SqlColumnMasterKeySettings-objekt som innehåller information om platsen för din gamla kolumnhuvudnyckel. SqlColumnMasterKeySettings är ett objekt som finns i minnet (i PowerShell). | New-SqlColumnMasterKeySettings | Nej | Nej |
Steg 5. Skapa ett SqlColumnMasterKeySettings-objekt som innehåller information om platsen för din nya kolumnhuvudnyckel. SqlColumnMasterKeySettings är ett objekt som finns i minnet (i PowerShell). Om du vill skapa den måste du använda den cmdlet som är specifik för ditt nyckelarkiv. |
New-SqlAzureKeyVaultColumnMasterKeySettings Ny-SqlCertifikatStoreKolumnhuvudnyckelInställningar New-SqlCngColumnMasterKeySettings New-SqlCspColumnMasterKeySettings |
Nej | Nej |
Steg 6. Autentisera till Azure om din gamla (aktuella) kolumnhuvudnyckel eller din nya kolumnhuvudnyckel lagras i ett nyckelvalv eller en hanterad HSM i Azure Key Vault. | Connect-AzAccount | Ja | Nej |
Steg 7. Hämta en åtkomsttoken för Azure Key Vaults om din kolumnhuvudnyckel lagras i Azure Key Vault. | Get-AzAccessToken | Nej | Nej |
Steg 8. Omkryptera varje värde för kolumnkrypteringsnyckeln, som för närvarande skyddas med den gamla kolumnhuvudnyckeln, med hjälp av den nya kolumnhuvudnyckeln. |
Ny-SqlKolumnkrypteringsnyckelKrypteratVärde Obs! När du anropar den här cmdleten skickar du SqlColumnMasterKeySettings-objekten för både den gamla och den nya kolumnhuvudnyckeln, tillsammans med värdet för kolumnkrypteringsnyckeln, för att krypteras om. |
Ja | Nej |
Steg 9. Dela platsen för den nya kolumnhuvudnyckeln (providernamnet och en nyckelsökväg för kolumnhuvudnyckeln) och uppsättningen med nya krypterade värden för kolumnkrypteringsnycklarna med din DBA. | Se exemplen nedan. | Nej | Nej |
Notera
Vi rekommenderar starkt att du inte tar bort den gamla kolumnhuvudnyckeln permanent efter rotationen. I stället bör du behålla den gamla kolumnhuvudnyckeln i det aktuella nyckelarkivet eller arkivera den på en annan säker plats. Om du återställer databasen från en säkerhetskopia till en tidpunkt innan den nya kolumnhuvudnyckeln har konfigurerats behöver du den gamla nyckeln för att komma åt data.
Del 3: DBA
DBA skapar metadata för den nya kolumnhuvudnyckeln och uppdaterar metadata för de påverkade kolumnkrypteringsnycklarna för att lägga till den nya uppsättningen krypterade värden. I det här steget samordnar DBA även med administratörerna för de program som kör frågor mot krypteringskolumner, som ser till att programmet kan komma åt den nya kolumnhuvudnyckeln. När alla program har konfigurerats för att använda den nya kolumnhuvudnyckeln tar DBA bort den gamla uppsättningen krypterade värden och gamla huvudnyckelmetadata för kolumner.
Uppgift | Artikel | Åtkomst till klartextnycklar/nyckelarkiv | Åtkomst till databasen |
---|---|---|---|
Steg 1. Hämta platsen för den nya kolumnhuvudnyckeln och den nya uppsättningen krypterade värden för motsvarande kolumnkrypteringsnycklar, som skyddas med den gamla kolumnhuvudnyckeln, från säkerhetsadministratören. | Se exemplen nedan. | Nej | Nej |
Steg 2. Starta en PowerShell-miljö och importera SqlServer-modulen. | Importera SqlServer-modulen | Nej | Nej |
Steg 3. Anslut till servern och en databas. | Ansluta till en databas | Nej | Ja |
Steg 4. Skapa ett SqlColumnMasterKeySettings-objekt som innehåller information om platsen för den nya kolumnhuvudnyckeln. SqlColumnMasterKeySettings är ett objekt som finns i minnet (i PowerShell). | Nytt-SqlKolumnHuvudnyckelInställningar | Nej | Nej |
Steg 5. Skapa metadata om den nya kolumnhuvudnyckeln i databasen. |
New-SqlColumnMasterKey Obs! Den här cmdleten använder CREATE COLUMN MASTER KEY (Transact-SQL)-instruktionen för att skapa nyckelmetadata. |
Nej | Ja |
Steg 6. Hämta metadata om kolumnkrypteringsnycklar som skyddas av den gamla kolumnhuvudnyckeln. | Get-SqlColumnEncryptionKey | Nej | Ja |
Steg 7. Lägg till ett nytt krypterat värde (som skapas med den nya kolumnhuvudnyckeln) i metadata för varje påverkad kolumnkrypteringsnyckel. | Lägg till SqlColumnEncryptionKeyValue | Nej | Ja |
Steg 8. Samordna med administratörerna för alla program som kör frågor mot krypterade kolumner i databasen (och skyddas med den gamla kolumnhuvudnyckeln), så att de kan se till att programmen kan komma åt den nya kolumnhuvudnyckeln. | Skapa och lagra kolumnhuvudnycklar (Alltid krypterad) | Nej | Nej |
Steg 9. Slutför rotationen genom att ta bort de krypterade värden som är associerade med den gamla kolumnhuvudnyckeln från databasen. Obs! Innan du kör det här steget kontrollerar du att alla program som kör frågor mot krypterade kolumner som skyddas med den gamla kolumnhuvudnyckeln har konfigurerats för att använda den nya kolumnhuvudnyckeln. Om du utför det här steget i förtid kanske vissa av dessa program inte kan dekryptera data. Det här steget tar bort en association mellan den gamla kolumnhuvudnyckeln och de kolumnkrypteringsnycklar som den skyddar. |
Complete-SqlColumnMasterKeyRotation Du kan också använda Remove-SqlColumnEncryptionKeyValue |
Nej | Ja |
Steg 10. Ta bort de gamla huvudnyckelmetadata för kolumnerna från databasen | Remove-SqlColumnMasterKey | Nej | Ja |
Rotera en kolumnhuvudnyckel med rollavgränsning (Exempel på Windows-certifikat)
Skriptet nedan är ett exempel från slutpunkt till slutpunkt för att generera en ny kolumnhuvudnyckel som är certifikat i Windows-certifikatarkivet och roterar en befintlig (aktuell) kolumnhuvudnyckel för att ersätta den med den nya kolumnhuvudnyckeln. Skriptet förutsätter att måldatabasen innehåller kolumnhuvudnyckeln med namnet CMK1 (som ska roteras), som krypterar vissa kolumnkrypteringsnycklar.
Del 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; TrustServerCertificate = 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
}
}
Del 2: Säkerhetsadministratör
# 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
Del 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; TrustServerCertificate = 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
Rotera en kolumnkrypteringsnyckel
Att rotera en kolumnkrypteringsnyckel innebär att dekryptera data i alla kolumner, krypteras med nyckeln som ska roteras och omkryptera data med hjälp av den nya kolumnkrypteringsnyckeln. Det här rotationsarbetsflödet kräver åtkomst till både nycklar och databasen och kan därför inte utföras med rollavgränsning. Att rotera en kolumnkrypteringsnyckel kan ta lång tid om tabellerna som innehåller kolumner krypterade med nyckeln som roteras är stora. Därför måste din organisation planera en kolumnkrypteringsnyckelrotation noggrant.
Du kan rotera en kolumnkrypteringsnyckel med hjälp av en offline- eller onlinemetod. Den tidigare metoden kommer sannolikt att gå snabbare, men dina program kan inte skriva till de berörda tabellerna. Den senare metoden tar förmodligen längre tid, men du kan begränsa tidsintervallet, under vilket de berörda tabellerna inte är tillgängliga för program. Mer information finns i Konfigurera kolumnkryptering med Always Encrypted med PowerShell och Set-SqlColumnEncryption.
Uppgift | Artikel | Åtkomst till klartextnycklar/nyckelarkiv | Åtkomst till databasen |
---|---|---|---|
Steg 1. Starta en PowerShell-miljö och importera SqlServer-modulen. | Importera SqlServer-modulen | Nej | Nej |
Steg 2. Anslut till servern och en databas. | Ansluta till en databas | Nej | Ja |
Steg 3. Autentisera mot Azure om din kolumnhuvudnyckel, som skyddar kolumnkrypteringsnyckeln och ska roteras, lagras i ett nyckelvalv eller en hanterad HSM i Azure Key Vault. | Connect-AzAccount | Ja | Nej |
Steg 4. Hämta en åtkomsttoken för Azure Key Vaults om din kolumnhuvudnyckel lagras i Azure Key Vault. | Get-AzAccessToken | Nej | Nej |
Steg 5. Generera en ny kolumnkrypteringsnyckel, kryptera den med kolumnhuvudnyckeln och skapa metadata för kolumnkrypteringsnyckeln i databasen. |
New-SqlColumnEncryptionKey Obs! Använd en variant av cmdleten som internt genererar och krypterar en kolumnkrypteringsnyckel. I bakgrunden utfärdar den här cmdleten CREATE COLUMN ENCRYPTION KEY (Transact-SQL)-instruktionen för att skapa nyckelmetadata. |
Ja | Ja |
Steg 6. Hitta alla kolumner som är krypterade med den gamla kolumnkrypteringsnyckeln. | programmeringsguide för SQL Server Management Objects (SMO) | Nej | Ja |
Steg 7. Skapa en SqlColumnEncryptionSettings objekt för varje påverkad kolumn. SqlColumnEncryptionSettings är ett objekt som finns i minnet (i PowerShell). Den anger målkrypteringsschemat för en kolumn. I det här fallet ska objektet ange att den påverkade kolumnen ska krypteras med hjälp av den nya kolumnkrypteringsnyckeln. | New-SqlColumnEncryptionSettings | Nej | Nej |
Steg 8. Kryptera om kolumnerna, som identifieras i steg 5, med hjälp av den nya kolumnkrypteringsnyckeln. |
Set-SqlColumnEncryption Obs! Det här steget kan ta lång tid. Dina program kommer inte att kunna komma åt tabellerna via hela åtgärden eller en del av den, beroende på vilken metod (online eller offline) du väljer. |
Ja | Ja |
Steg 9. Ta bort metadata för den gamla kolumnkrypteringsnyckeln. | Remove-SqlColumnEncryptionKey | Nej | Ja |
Exempel – Rotera en kolumnkrypteringsnyckel
Skriptet nedan visar hur du roterar en kolumnkrypteringsnyckel. Skriptet förutsätter att måldatabasen innehåller vissa kolumner krypterade med en kolumnkrypteringsnyckel med namnet CEK1 (som ska roteras), som skyddas med en kolumnhuvudnyckel med namnet CMK1 (kolumnhuvudnyckeln lagras inte i 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; TrustServerCertificate = 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
Nästa steg
- Fråga ut kolumner med Always Encrypted i SQL Server Management Studio
- Utveckla program med Always Encrypted
Se även
- Always Encrypted
- Översikt över nyckelhantering för Always Encrypted
- Konfigurera Always Encrypted med PowerShell
- Rotera Always Encrypted-nycklar med SQL Server Management Studio
- SKAPA KOLUMNHUVUDNYCKEL (Transact-SQL)
- TA BORT KOLUMNHUVUDNYCKEL (Transact-SQL)
- SKAPA KOLUMNKRYPTERINGSNYCKEL (Transact-SQL)
- ÄNDRA KOLUMNKRYPTERINGSNYCKEL (Transact-SQL)
- TA BORT KOLUMNKRYPTERINGSNYCKEL (Transact-SQL)
- sys.column_master_keys (Transact-SQL)
- sys.column_encryption_keys (Transact-SQL)