Delen via


Always Encrypted-sleutels roteren met Behulp van PowerShell

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Dit artikel bevat de stappen voor het roteren van sleutels voor Always Encrypted met behulp van de SqlServer PowerShell-module. Zie Always Encrypted configureren met behulp van PowerShellvoor meer informatie over het gebruik van de SqlServer PowerShell PowerShell-module voor Always Encrypted.

Het roteren van Always Encrypted-sleutels is het proces van het vervangen van een bestaande sleutel door een nieuwe. U moet mogelijk een sleutel roteren als deze is gecompromitteerd of om te voldoen aan de beleidsregels of nalevingsvoorschriften van uw organisatie die vereisen dat cryptografische sleutels regelmatig worden geroteerd.

Always Encrypted maakt gebruik van twee typen sleutels, dus er zijn twee belangrijke rotatiewerkstromen op hoog niveau; draaiende kolomhoofdsleutels en draaiende kolomversleutelingssleutels.

  • kolomversleutelingssleutelrotatie- omvat het ontsleutelen van gegevens die zijn versleuteld met de huidige sleutel en het opnieuw versleutelen van de gegevens met behulp van de nieuwe kolomversleutelingssleutel. Omdat het roteren van een kolomversleutelingssleutel toegang vereist tot zowel de sleutels als de database, kan kolomversleutelingssleutelrotatie alleen worden uitgevoerd zonder rolscheiding.
  • kolomhoofdsleutelrotatie- omvat het ontsleutelen van kolomversleutelingssleutels die zijn beveiligd met de huidige hoofdsleutel van de kolom, opnieuw versleutelen met behulp van de nieuwe kolomhoofdsleutel en het bijwerken van de metagegevens voor beide typen sleutels. Rotatie van kolomhoofdsleutels kan worden voltooid met of zonder rolscheiding (wanneer u de SqlServer PowerShell-module gebruikt).

Rotatie van kolommasterkey zonder rolscheiding

De methode voor het roteren van een kolomhoofdsleutel die in deze sectie wordt beschreven, biedt geen ondersteuning voor rolscheiding tussen een beveiligingsbeheerder en een DBA. Sommige van de onderstaande stappen combineren bewerkingen op de fysieke sleutels met bewerkingen op sleutelmetagegevens, zodat deze werkstroom wordt aanbevolen voor organisaties die het DevOps-model gebruiken, of wanneer uw database wordt gehost in de cloud en het primaire doel is om cloudbeheerders (maar niet on-premises DBA's) toegang te geven tot gevoelige gegevens. Het wordt niet aanbevolen als potentiële aanvallers DBA's bevatten of als DBA's geen toegang moeten hebben tot gevoelige gegevens.

Taak Artikel Toegang tot niet-gecodeerde sleutels/sleutelopslag Toegang tot database
Stap 1. Maak een nieuwe kolomhoofdsleutel aan in een sleutelopslag.

Opmerking: de SqlServer PowerShell-module biedt geen ondersteuning voor deze stap. Als u deze taak vanaf de command-line wilt uitvoeren, moet u tools gebruiken die specifiek zijn voor uw keystore.
kolomhoofdsleutels maken en opslaan voor Always Encrypted- Ja Nee
Stap 2. Een PowerShell-omgeving starten en de SqlServer-module importeren SqlServer-module importeren Nee Nee
Stap 3. Maak verbinding met uw server en database. Verbinding maken met een database Nee Ja
Stap 4. Maak een SqlColumnMasterKeySettings-object dat informatie bevat over de locatie van de nieuwe kolomhoofdsleutel. SqlColumnMasterKeySettings is een object dat zich in het geheugen bevindt (in PowerShell). Als u deze wilt maken, moet u de cmdlet gebruiken die specifiek is voor uw sleutelarchief. New-SqlAzureKeyVaultColumnMasterKeySettings

New-SqlCertificateStoreColumnMasterKeySettings

New-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettings
Nee Nee
Stap 5. Maak de metagegevens over de nieuwe kolomhoofdsleutel in uw database. New-SqlColumnMasterKey

Opmerking: onder de cover geeft deze cmdlet de CREATE COLUMN MASTER KEY (Transact-SQL) instructie uit om sleutelmetagegevens te maken.
Nee Ja
Stap 6. Verifiëren bij Azure, als uw huidige kolomhoofdsleutel of uw nieuwe kolomhoofdsleutel is opgeslagen in een sleutelkluis of een beheerde HSM in Azure Key Vault Connect-AzAccount Ja Nee
Stap 7. Verkrijg een toegangstoken voor Azure Key Vaults als uw kolomhoofdsleutel is opgeslagen in Azure Key Vault. Get-AzAccessToken Nee Nee
Stap 8. Start de rotatie door elk van de kolomversleutelingssleutels, die momenteel is beveiligd met de oude kolomhoofdsleutel, te versleutelen met behulp van de nieuwe kolomhoofdsleutel. Na deze stap wordt elke betrokken kolomversleutelingssleutel (gekoppeld aan de oude kolomhoofdsleutel, die wordt gedraaid), versleuteld met zowel de oude als de nieuwe kolomhoofdsleutel en heeft twee versleutelde waarden in de metagegevens van de database. Invoke-SqlColumnMasterKeyRotation Ja Ja
Stap 9. Werk samen met de beheerders van alle toepassingen die een query uitvoeren op versleutelde kolommen in de database (en zijn beveiligd met de oude kolomhoofdsleutel), zodat ze ervoor kunnen zorgen dat de toepassingen toegang hebben tot de nieuwe hoofdsleutel van de kolom. Kolomhoofdsleutels Maken en Opslaan (Altijd Versleuteld) Ja Nee
Stap 10. De draaiing voltooien

Opmerking: voordat u deze stap uitvoert, moet u ervoor zorgen dat alle toepassingen die versleutelde kolommen opvragen die zijn beveiligd met de oude hoofdsleutel van de kolom, zijn geconfigureerd voor het gebruik van de nieuwe kolomhoofdsleutel. Als u deze stap voortijdig uitvoert, kunnen sommige van deze toepassingen de gegevens mogelijk niet ontsleutelen. Voltooi de rotatie door de versleutelde waarden te verwijderen uit de database die zijn gemaakt met de oude kolomhoofdsleutel. Hiermee wordt de koppeling tussen de oude kolommeestersleutel en de kolomversleutelingssleutels die het beschermt, verwijderd.
Complete-SqlColumnMasterKeyRotation Nee Ja
Stap 10. Verwijder de metagegevens uit de oude kolomhoofdsleutel. Remove-SqlColumnMasterKey Nee Ja

Notitie

Het wordt ten zeerste aanbevolen om de oude kolomhoofdsleutel niet definitief te verwijderen na de rotatie. In plaats daarvan moet u de oude kolomhoofdsleutel in het huidige sleutelarchief bewaren of archiveren op een andere veilige plaats. Als u de database herstelt van een back-upbestand naar een bepaald tijdstip voordat de nieuwe kolomhoofdsleutel is geconfigureerd, hebt u de oude sleutel nodig om toegang te krijgen tot de gegevens.

Een kolomhoofdsleutel roteren zonder rolscheiding (Windows-certificaatvoorbeeld)

Het onderstaande script is een end-to-end-voorbeeld dat een bestaande kolomhoofdsleutel (CMK1) vervangt door een nieuwe kolomhoofdsleutel (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

Kolommodelsleutelrotatie met functiescheiding

De in deze sectie beschreven werkstroom voor het rouleren van de kolom hoofdsleutel zorgt voor de scheiding tussen een beveiligingsbeheerder en een databasebeheerder (DBA).

Belangrijk

Voordat u stappen uitvoert waarbij Accesses plaintext keys/keystore=Ja in de onderstaande tabel (stappen voor toegang tot niet-gecodeerde sleutels of het sleutelarchief), moet u ervoor zorgen dat de PowerShell-omgeving wordt uitgevoerd op een beveiligde computer die verschilt van een computer die als host fungeert voor uw database. Zie Beveiligingsoverwegingen voor sleutelbeheervoor meer informatie.

Deel 1: DBA

Een DBA haalt metagegevens op over de kolomhoofdsleutel die moet worden geroteerd en over de betrokken sleutel voor kolomversleuteling, die is gekoppeld aan de huidige hoofdsleutel van de kolom. De DBA deelt al deze informatie met een beveiligingsbeheerder.

Taak Artikel Toegang tot niet-gecodeerde sleutels/sleutelopslag Toegang tot database
Stap 1. Start een PowerShell-omgeving en importeer de SqlServer-module. SqlServer-module importeren Nee Geen
Stap 2. Maak verbinding met uw server en een database. Verbinding maken met een database Nee Ja
Stap 3. Haal de metagegevens over de oude kolomhoofdsleutel op. Get-SqlColumnMasterKey Nee Ja
Stap 4. Haal de metagegevens op over kolomversleutelingssleutels, beveiligd door de oude kolomhoofdsleutel, inclusief de versleutelde waarden. Get-SqlColumnEncryptionKey Nee Ja
Stap 5. Deel de locatie van de kolomhoofdsleutel (de providernaam en een sleutelpad van de kolomhoofdsleutel) en de versleutelde waarden van de bijbehorende kolomversleutelingssleutels, beveiligd met de oude kolomhoofdsleutel. Zie de onderstaande voorbeelden. Nee Nee

Deel 2: Beveiligingsbeheerder

De beveiligingsbeheerder genereert een nieuwe kolomhoofdsleutel, versleutelt de betrokken kolomversleutelingssleutels opnieuw met de nieuwe kolomhoofdsleutel en deelt de informatie over de nieuwe kolomhoofdsleutel en de set nieuwe versleutelde waarden voor de betrokken kolomversleutelingssleutels, met de DBA.

Taak Artikel Toegang tot niet-gecodeerde sleutels/sleutelarchief Toegang tot database
Stap 1. Haal de locatie op van de oude kolomhoofdsleutel en de versleutelde waarden van de bijbehorende kolomversleutelingssleutels, beveiligd met de oude kolomhoofdsleutel, vanuit uw DBA. N.V.T
Zie de onderstaande voorbeelden.
Nee Nee
Stap 2. Maak een nieuwe kolomhoofdsleutel in een sleutelarchief.

Opmerking: de SqlServer-module biedt geen ondersteuning voor deze stap. Als u deze taak vanaf een opdrachtregel wilt uitvoeren, moet u de hulpprogramma's gebruiken die specifiek zijn voor het type sleutelarchief.
kolomhoofdsleutels maken en opslaan voor Always Encrypted- Ja Nee
Stap 3. Start een PowerShell-omgeving en importeer de SqlServer-module. SqlServer-module importeren Nee Nee
Stap 4. Maak een SqlColumnMasterKeySettings-object dat informatie bevat over de locatie van uw oude kolomhoofdsleutel. SqlColumnMasterKeySettings is een object dat zich in het geheugen bevindt (in PowerShell). New-SqlColumnMasterKeyInstellingen Nee Nee
Stap 5. Maak een SqlColumnMasterKeySettings-object dat informatie bevat over de locatie van uw nieuwe kolomhoofdsleutel. SqlColumnMasterKeySettings is een object dat zich in het geheugen bevindt (in PowerShell). Als u deze wilt maken, moet u de cmdlet gebruiken die specifiek is voor uw sleutelarchief. New-SqlAzureKeyVaultColumnMasterKeySettings

New-SqlCertificateStoreColumnMasterKeySettings

New-SqlCngColumnMasterKeySettings

New-SqlCspColumnMasterKeySettings
Nee Nee
Stap 6. Verifieer bij Azure als uw oude (huidige) kolomhoofdsleutel of uw nieuwe kolomhoofdsleutel is opgeslagen in een sleutelkluis of een beheerde HSM in Azure Key Vault. Connect-AzAccount Ja Nee
Stap 7. Verkrijg een toegangstoken voor Azure Key Vaults als uw kolomhoofdsleutel is opgeslagen in Azure Key Vault. Get-AzAccessToken Nee Nee
Stap 8. Versleutel elke waarde van de kolomversleutelingssleutel, die momenteel is beveiligd met de oude hoofdsleutel van de kolom, opnieuw met behulp van de nieuwe kolomhoofdsleutel. New-SqlColumnEncryptionKeyEncryptedValue

Opmerking: Bij het aanroepen van deze cmdlet geeft u de Objecten SqlColumnMasterKeySettings door voor zowel de oude als de nieuwe kolomhoofdsleutel, samen met een waarde van de kolomversleutelingssleutel die opnieuw moet worden versleuteld.
Ja Nee
Stap 9. Deel de locatie van de nieuwe kolomhoofdsleutel (de providernaam en een sleutelpad van de kolomhoofdsleutel) en de set nieuwe versleutelde waarden van de kolomversleutelingssleutels met uw DBA. Zie de onderstaande voorbeelden. Nee Nee

Notitie

Het wordt ten zeerste aanbevolen om de oude kolomhoofdsleutel niet definitief te verwijderen na de rotatie. In plaats daarvan moet u de oude kolomhoofdsleutel in het huidige sleutelarchief bewaren of archiveren op een andere veilige plaats. Als u de database herstelt van een back-upbestand naar een bepaald tijdstip voordat de nieuwe kolomhoofdsleutel is geconfigureerd, hebt u de oude sleutel nodig om toegang te krijgen tot de gegevens.

Deel 3: DBA

De DBA maakt metagegevens voor de nieuwe kolomhoofdsleutel en werkt de metagegevens van de betrokken kolomversleutelingssleutels bij om de nieuwe set versleutelde waarden toe te voegen. In deze stap coördineert de DBA ook met de beheerders van de toepassingen die query's uitvoeren op versleutelingskolommen, die ervoor zorgen dat de toepassing toegang heeft tot de nieuwe hoofdsleutel van de kolom. Zodra alle toepassingen zijn ingesteld voor het gebruik van de nieuwe kolomhoofdsleutel, verwijdert de DBA de oude set versleutelde waarden en de oude metagegevens van de kolomhoofdsleutel.

Taak Artikel Toegang tot niet-gecodeerde sleutels/sleutelarchief Toegang tot database
Stap 1. Haal de locatie op van de nieuwe kolomhoofdsleutel en de nieuwe set versleutelde waarden van de bijbehorende kolomversleutelingssleutels, beveiligd met de oude kolomhoofdsleutel, van uw beveiligingsbeheerder. Zie de onderstaande voorbeelden. Nee Nee
Stap 2. Start een PowerShell-omgeving en importeer de SqlServer-module. SqlServer-module importeren Nee Nee
Stap 3. Maak verbinding met uw server en een database. Verbinding maken met een database Nee Ja
Stap 4. Maak een SqlColumnMasterKeySettings-object dat informatie bevat over de locatie van de nieuwe kolomhoofdsleutel. SqlColumnMasterKeySettings is een object dat zich in het geheugen bevindt (in PowerShell). Nieuwe-SqlKolomHoofdsleutelInstellingen Nee Nee
Stap 5. Maak de metagegevens over de nieuwe kolomhoofdsleutel in uw database. New-SqlColumnMasterKey

Opmerking: Onder de onderstaande cmdlet geeft u de instructie CREATE COLUMN MASTER KEY (Transact-SQL) uit om sleutelmetagegevens te maken.
Nee Ja
Stap 6. Haal de metagegevens op over kolomversleutelingssleutels, beveiligd door de oude kolomhoofdsleutel. Get-SqlColumnEncryptionKey Nee Ja
Stap 7. Voeg een nieuwe versleutelde waarde (geproduceerd met behulp van de nieuwe kolomhoofdsleutel) toe aan de metagegevens voor elke betrokken sleutel voor kolomversleuteling. Add-SqlColumnEncryptionKeyValue Nee Ja
Stap 8. Werk samen met de beheerders van alle toepassingen die een query uitvoeren op versleutelde kolommen in de database (en zijn beveiligd met de oude kolomhoofdsleutel), zodat ze ervoor kunnen zorgen dat de toepassingen toegang hebben tot de nieuwe hoofdsleutel van de kolom. Het maken en opslaan van kolomhoofdsleutels (Always Encrypted) Nee Nee
Stap 9. Voltooi de rotatie door de versleutelde waarden te verwijderen die zijn gekoppeld aan de oude kolomhoofdsleutel uit de database.

Opmerking: Voordat u deze stap uitvoert, moet u ervoor zorgen dat alle toepassingen die een query uitvoeren op versleutelde kolommen die zijn beveiligd met de oude kolomhoofdsleutel, zijn geconfigureerd voor het gebruik van de nieuwe kolomhoofdsleutel. Als u deze stap voortijdig uitvoert, kunnen sommige van deze toepassingen de gegevens mogelijk niet ontsleutelen.

Met deze stap verwijdert u een koppeling tussen de oude kolomhoofdsleutel en de kolomversleutelingssleutels die worden beveiligd.
Complete-SqlColumnMasterKeyRotation

U kunt in plaats daarvan ook de opdracht Remove-SqlColumnEncryptionKeyValue gebruiken
Nee Ja
Stap 10. De metagegevens van de oude kolomhoofdsleutel uit de database verwijderen Remove-SqlColumnMasterKey Nee Ja

Een kolomhoofdsleutel roteren met functiescheiding (Windows-certificaatvoorbeeld)

Het onderstaande script is een complete handleiding voor het genereren van een nieuwe kolomhoofdsleutel die als certificaat is opgeslagen in het Windows-certificaatarchief. Het script roteert een bestaande (huidige) kolomhoofdsleutel om deze te vervangen door de nieuwe kolomhoofdsleutel. In het script wordt ervan uitgegaan dat de doeldatabase de kolomhoofdsleutel bevat met de naam CMK1 (om te roteren), die enkele kolomversleutelingssleutels versleutelt.

Deel 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
    }
} 

Deel 2: Beveiligingsbeheerder

# 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

Deel 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

Een kolomversleutelingssleutel roteren

Het roteren van een kolomversleutelingssleutel omvat het ontsleutelen van de gegevens in alle kolommen, versleuteld met de sleutel die moet worden geroteerd en het opnieuw versleutelen van de gegevens met behulp van de nieuwe kolomversleutelingssleutel. Deze rotatiewerkstroom vereist toegang tot zowel de sleutels als de database, en kan daarom niet worden uitgevoerd met functiescheiding. Het roteren van een kolomversleutelingssleutel kan lang duren als de tabellen met kolommen die met deze sleutel zijn versleuteld groot zijn. Daarom moet uw organisatie zorgvuldig een rotatie van kolomversleutelingssleutels plannen.

U kunt een kolomversleutelingssleutel roteren met behulp van een offline- of onlinebenadering. De vorige methode is waarschijnlijk sneller, maar uw toepassingen kunnen niet naar de betrokken tabellen schrijven. De laatste benadering duurt waarschijnlijk langer, maar u kunt het tijdsinterval beperken, waarbij de betrokken tabellen niet beschikbaar zijn voor toepassingen. Zie Kolomversleuteling configureren met Always Encrypted met PowerShell en Set-SqlColumnEncryptionvoor meer informatie.

Taak Artikel Toegang tot niet-gecodeerde sleutels/sleutelopslag Toegang tot database
Stap 1. Start een PowerShell-omgeving en importeer de SqlServer-module. SqlServer-module importeren Nee Nee
Stap 2. Maak verbinding met uw server en een database. Verbinding maken met een database Nee Ja
Stap 3. Verifieer bij Azure wanneer uw kolomhoofdsleutel, die de kolomversleutelingssleutel beschermt en moet worden geroteerd, is opgeslagen in een sleutelkluis of een beheerde HSM in Azure Key Vault. Connect-AzAccount Ja Nee
Stap 4. Verkrijg een toegangstoken voor Azure Key Vaults als uw kolomhoofdsleutel is opgeslagen in Azure Key Vault. Get-AzAccessToken Nee Nee
Stap 5. Genereer een nieuwe kolomversleutelingssleutel, versleutel deze met de kolomhoofdsleutel en maak metagegevens van kolomversleutelingssleutels in de database. New-SqlColumnEncryptionKey

Opmerking: Gebruik een variant van de cmdlet die intern een kolomversleutelingssleutel genereert en versleutelt.
Onder de dekking van deze cmdlet geeft de CREATE COLUMN ENCRYPTION KEY (Transact-SQL) instructie voor het maken van de sleutelmetagegevens.
Ja Ja
Stap 6. Zoek alle kolommen die zijn versleuteld met de oude sleutel voor kolomversleuteling. programmeerhandleiding voor SQL Server Management Objects (SMO) Nee Ja
Stap 7. Maak een SqlColumnEncryptionSettings-object voor elke betrokken kolom. SqlColumnEncryptionSettings is een object dat zich in het geheugen bevindt (in PowerShell). Hiermee geeft u het doelversleutelingsschema voor een kolom op. In dit geval moet het object specificeren dat de betrokken kolom versleuteld moet worden met behulp van de nieuwe sleutel voor kolomversleuteling. New-SqlColumnEncryptionSettings Nee Nee
Stap 8. Versleutel de kolommen, geïdentificeerd in stap 5, opnieuw met behulp van de nieuwe kolomversleutelingssleutel. Set-SqlColumnEncryption

Opmerking: Deze stap kan lang duren. Uw toepassingen hebben geen toegang tot de tabellen via de hele bewerking of een deel ervan, afhankelijk van de aanpak (online versus offline), die u selecteert.
Ja Ja
Stap 9. Verwijder de metagegevens voor de oude kolomversleutelingssleutel. Remove-SqlColumnEncryptionKey Nee Ja

Voorbeeld: een kolomversleutelingssleutel roteren

In het onderstaande script ziet u hoe u een kolomversleutelingssleutel roteert. In het script wordt ervan uitgegaan dat de doeldatabase enkele kolommen bevat die zijn versleuteld met een kolomversleutelingssleutel, CEK1 (te roteren), die is beveiligd met behulp van een kolomhoofdsleutel, cmk1 genaamd (de kolomhoofdsleutel wordt niet opgeslagen in 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

Volgende stappen

Zie ook