Megosztás a következőn keresztül:


Mindig titkosított kulcsok elforgatása a PowerShell használatával

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példány

Ez a cikk az Always Encrypted kulcsainak az SqlServer PowerShell-modullal történő forgatásának lépéseit ismerteti. Az Always Encryptedhez készült SqlServer PowerShell-modul használatának megkezdéséről további információt az Always Encrypted konfigurálása a PowerShell használatával című témakörben talál.

Az Always Encrypted-kulcsok elforgatása a meglévő kulcsok újra cserélésének folyamata. Előfordulhat, hogy el kell forgatnia egy kulcsot, ha az illetéktelen kezekbe került, vagy a szervezet szabályzatainak vagy megfelelőségi előírásainak való megfelelés érdekében a titkosítási kulcsokat rendszeresen el kell forgatni.

Az Always Encrypted kétféle kulcstípust használ, ezért két magas szintű kulcsforgatási munkafolyamat létezik; az oszlop főkulcsának elforgatása és az oszloptitkosítási kulcsok elforgatása.

  • Oszloptitkosítási kulcs rotálása – az aktuális kulccsal titkosított adatok visszafejtésével és az új oszloptitkosítási kulccsal történő újratitkosításával jár. Mivel az oszloptitkosítási kulcsok elforgatásához mind a kulcsokhoz, mind az adatbázishoz hozzá kell férni, az oszloptitkosítási kulcs elforgatása csak szerepkör-elkülönítés nélkül végezhető el.
  • Oszlop főkulcsának elforgatása – az aktuális oszlop főkulcsával védett oszloptitkosítási kulcsok visszafejtésével, az új oszlop főkulcsával történő újratitkosításával, valamint a metaadatok mindkét típusú kulcs esetében történő frissítésével jár. Az oszlop főkulcs-elforgatása szerepkör-elkülönítéssel vagy anélkül is elvégezhető (az SqlServer PowerShell-modul használatakor).

Oszlop főkulcsának elforgatása szerepkör-elkülönítés nélkül

Az oszlop főkulcsának ebben a szakaszban ismertetett elforgatása nem támogatja a biztonsági rendszergazda és a DBA közötti szerepkör-elkülönítést. Az alábbi lépések némelyike kombinálja a fizikai kulcsok műveleteit a kulcs metaadatain végzett műveletekkel, ezért ez a munkafolyamat ajánlott a DevOps-modellt használó szervezetek számára, vagy amikor az adatbázist a felhőben üzemeltetik, és az elsődleges cél a felhőgazdák (de nem a helyszíni ADATBÁZIS-üzemeltetők) hozzáférésének korlátozása a bizalmas adatokhoz. Nem ajánlott, ha a lehetséges támadók adatbázis-kezelőket is tartalmaznak, vagy ha a adatbázis-kezelőknek nem szabad hozzáféréssel rendelkezniük a bizalmas adatokhoz.

Feladat Cikk Szövegformátumú kulcsok/keystore-ok elérése Adatbázis elérése
1. lépés. Hozzon létre egy új oszlop főkulcsát egy kulcstárolóban.

Jegyzet: Az SqlServer PowerShell-modul nem támogatja ezt a lépést. A feladat parancssorból történő végrehajtásához a kulcstárolóhoz tartozó eszközöket kell használnia. Ha az Azure Key Vaultot használja kulcstárolóként, a több-bérlős ügyfél által felügyelt kulcsváltás nem támogatott. Győződjön meg arról, hogy az új ügyfél által kezelt kulcs ugyanabban a bérlőben van, mint a meglévő.
Oszlop főkulcsainak létrehozása és tárolása az Always Encryptedhez Igen Nem
2. lépés. PowerShell-környezet indítása és az SqlServer modul importálása Az SqlServer modul importálása Nem Nem
3. lépés. Csatlakozzon a kiszolgálóhoz és az adatbázishoz. Csatlakozás adatbázishoz Nem Igen
4. lépés. Hozzon létre egy SqlColumnMasterKeySettings objektumot, amely információkat tartalmaz az új oszlop főkulcsának helyéről. Az SqlColumnMasterKeySettings egy olyan objektum, amely a memóriában (a PowerShellben) létezik. A létrehozásához a kulcstárolóra jellemző parancsmagot kell használnia. Új-SqlAzureKeyVaultOszlopFőKulcsBeállítások

Új-SqlTanúsítványTárolóOszlopFőkulcsBeállítások

Új-SqlCngOszlopMesterKulcsBeállítások

Új-SqlCspOszlopMesterKulcsBeállítások
Nem Nem
5. lépés. Hozza létre az új oszlop főkulcsának metaadatait az adatbázisban. New-SqlColumnMasterKey

Megjegyzés: A borítók alatt ez a parancsmag a CREATE COLUMN MASTER KEY (Transact-SQL) utasítást ad ki a kulcs metaadatainak létrehozásához.
Nem Igen
6. lépés. Hitelesítés az Azure-ban, ha az aktuális oszlop főkulcsa vagy az új oszlop főkulcsa kulcstartóban vagy felügyelt HSM-ben van tárolva az Azure Key Vaultban Connect-AzAccount Igen Nem
7. lépés. Szerezze be az Azure Key Vaultok hozzáférési jogkivonatát, ha az oszlop főkulcsa az Azure Key Vaultban van tárolva. Get-AzAccessToken Nem Nem
8. lépés. Indítsa el a forgatási folyamatot azzal, hogy az egyes oszloptitkosítási kulcsokat titkosítja, amelyek a régi oszlop főkulccsal vannak védve, az új oszlop főkulcs használatával. A lépés után az egyes érintett oszloptitkosítási kulcsok (amelyek a forgatás alatt álló régi oszlop főkulcshoz tartoznak) mind a régi, mind az új oszlop főkulccsal titkosítva vannak, és két titkosított értékkel rendelkeznek az adatbázis metaadataiban. Invoke-SqlColumnMasterKeyRotation Igen Igen
9. lépés. Az adatbázis titkosított oszlopait lekérdező (és a régi oszlop főkulcsával védett) alkalmazások rendszergazdáival együttműködve biztosíthatják, hogy az alkalmazások hozzáférhessenek az új oszlop főkulcsához. Oszlop főkulcsának létrehozása és tárolása (Mindig titkosított) Igen Nem
10. lépés. A forgatás befejezése

Megjegyzés: A lépés végrehajtása előtt győződjön meg arról, hogy a régi oszlop főkulcsával védett titkosított oszlopokat lekérdező összes alkalmazás konfigurálva lett az új oszlopmintakulcs használatára. Ha ezt a lépést idő előtt hajtja végre, előfordulhat, hogy néhány alkalmazás nem tudja visszafejteni az adatokat. Végezze el a forgatást úgy, hogy eltávolítja a titkosított értékeket a régi oszlop főkulcsával létrehozott adatbázisból. Ez eltávolítja a régi oszlop főkulcsa és az általa védett oszloptitkosítási kulcsok közötti társításokat.
Teljes-SqlColumnMasterKeyRotation Nem Igen
10. lépés. Távolítsa el a metaadatokat a régi oszlop főkulcsából. Távolítsa el az SqlColumnMasterKey kulcsát Nem Igen

Jegyzet

Erősen ajánlott, hogy a forgatás után ne törölje véglegesen a régi oszlop főkulcsát. Ehelyett a régi oszlop főkulcsát a jelenlegi kulcstárolójában kell tartania, vagy egy másik biztonságos helyen kell archiválnia. Ha egy biztonságimásolat-fájlból visszaállítja az adatbázist az új oszlop főkulcsának konfigurálása előtti időpontra, az adatok eléréséhez szüksége lesz a régi kulcsra.

Egy oszlop főkulcsának forgatása szerepkör különválasztása nélkül (Windows-tanúsítvány példa)

Az alábbi szkript egy teljes példa, amely lecserél egy meglévő oszlop mesterkulcsot (CMK1) egy új oszlop mesterkulcsra (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

Oszlop főkulcsának cseréje szerepkör-elkülönítéssel

Az ebben a szakaszban ismertetett főkulcs-rotációs munkafolyamat biztosítja a biztonsági rendszergazda és a DBA elkülönítését.

Fontos

Mielőtt végrehajtaná az alábbi táblázatban szereplő azon lépéseket, amelyek hozzáférnek a szövegesen tárolt kulcsokhoz vagy a kulcstárolóhoz=Yes értéket kap, győződjön meg róla, hogy a PowerShell környezet egy olyan biztonságos gépen fut, amely különbözik az adatbázist futtató számítógéptől. További információ: A kulcskezelés biztonsági szempontjai.

1. rész: DBA

A DBA lekéri az elforgatni kívánt oszlop főkulcsának metaadatait, valamint az aktuális oszlop főkulcsához társított érintett oszloptitkosítási kulcsokat. A DBA ezeket az információkat egy biztonsági rendszergazdával osztja meg.

Feladat Cikk Szövegformátumú kulcsok/keystore-ok elérése Adatbázis elérése
1. lépés. Indítsa el a PowerShell-környezetet, és importálja az SqlServer modult. Az SqlServer modul importálása Nem Egyik sem
2. lépés. Csatlakozzon a kiszolgálóhoz és egy adatbázishoz. Csatlakozás adatbázishoz Nem Igen
3. lépés. Kérje le a régi oszlop főkulcsának metaadatait. Get-SqlColumnMasterKey Nem Igen
4. lépés. Kérje le az oszloptitkosítási kulcsok metaadatait, amelyeket a régi oszlop főkulcsa véd, beleértve azok titkosított értékeit is. Get-SqlColumnEncryptionKey Nem Igen
5. lépés. Ossza meg az oszlop főkulcsának helyét (az oszlop főkulcsának szolgáltatónevét és kulcsútvonalát) és a megfelelő oszloptitkosítási kulcsok titkosított értékeit, amelyek a régi oszlop főkulcsával védettek. Lásd az alábbi példákat. Nem Nem

2. rész: Biztonsági rendszergazda

A biztonsági rendszergazda létrehoz egy új oszlop-főkulcsot, újra titkosítja az érintett oszloptitkosítási kulcsokat az új oszloptitkosítási kulccsal, és megosztja az új oszlop főkulcsával, valamint az érintett oszloptitkosítási kulcsok új titkosított értékeinek készletével kapcsolatos információkat a DBA-val.

Feladat Cikk Egyszerű szöveges kulcsok/keystore elérése Adatbázis elérése
1. lépés. Szerezze be a régi oszlop főkulcsának helyét és a megfelelő oszloptitkosítási kulcsok titkosított értékeit, amelyek a régi oszlop főkulcsával védettek a DBA-ból. Nincs adat.
Lásd az alábbi példákat.
Nem Nem
2. lépés. Hozzon létre egy új oszlop főkulcsát egy kulcstárolóban.

Jegyzet: Az SqlServer modul nem támogatja ezt a lépést. Ha parancssorból szeretné elvégezni ezt a feladatot, a kulcstároló típusának megfelelő eszközöket kell használnia. Ha az Azure Key Vaultot használja kulcstárolóként, a több-bérlős ügyfél által felügyelt kulcsváltás nem támogatott. Győződjön meg arról, hogy az új ügyfél által kezelt kulcs ugyanabban a bérlőben van, mint a meglévő.
Oszlop főkulcsainak létrehozása és tárolása az Always Encryptedhez Igen Nem
3. lépés. Indítsa el a PowerShell-környezetet, és importálja az SqlServer modult. Az SqlServer modul importálása Nem Nem
4. lépés. Hozzon létre egy SqlColumnMasterKeySettings objektumot, amely információkat tartalmaz a régi oszlop főkulcsának helyéről. Az SqlColumnMasterKeySettings egy olyan objektum, amely a memóriában (a PowerShellben) létezik. Új-SqlOszlopfőkulcsBeállítások Nem Nem
5. lépés. Hozzon létre egy SqlColumnMasterKeySettings objektumot, amely információkat tartalmaz az új oszlop főkulcsának helyéről. Az SqlColumnMasterKeySettings egy olyan objektum, amely a memóriában (a PowerShellben) létezik. A létrehozásához a kulcstárolóra jellemző parancsmagot kell használnia. Új-SqlAzureKeyVaultOszlopFőKulcsBeállítások

Új-SqlTanúsítványTárolóOszlopFőkulcsBeállítások

Új-SqlCngOszlopMesterKulcsBeállítások

Új-SqlCspOszlopMesterKulcsBeállítások
Nem Nem
6. lépés. Hitelesítés az Azure-ban, ha a régi (jelenlegi) oszlop főkulcsa vagy az új oszlop főkulcsa kulcstartóban vagy felügyelt HSM-ben van tárolva az Azure Key Vaultban. Connect-AzAccount Igen Nem
7. lépés. Szerezze be az Azure Key Vaultok hozzáférési jogkivonatát, ha az oszlop főkulcsa az Azure Key Vaultban van tárolva. Get-AzAccessToken Nem Nem
8. lépés. Az új oszloptitkosítási kulccsal újratitkosíthatja az oszloptitkosítási kulcs minden értékét, amely jelenleg a régi oszlop főkulcsával van védve. New-SqlColumnEncryptionKeyEncryptedValue

Jegyzet: A parancsmag meghívásakor adja át az SqlColumnMasterKeySettings objektumokat a régi és az új oszlop főkulcsához, valamint az oszloptitkosítási kulcs értékét, hogy újra titkosítva legyen.
Igen Nem
9. lépés. Ossza meg az új oszlop főkulcsának helyét (az oszlop főkulcsának szolgáltatónevét és kulcsútvonalát) és az oszloptitkosítási kulcsok új titkosított értékeinek készletét a DBA-val. Lásd az alábbi példákat. Nem Nem

Jegyzet

Erősen ajánlott, hogy a forgatás után ne törölje véglegesen a régi oszlop főkulcsát. Ehelyett a régi oszlop főkulcsát a jelenlegi kulcstárolójában kell tartania, vagy egy másik biztonságos helyen kell archiválnia. Ha egy biztonságimásolat-fájlból visszaállítja az adatbázist az új oszlop főkulcsának konfigurálása előtti időpontra, az adatok eléréséhez szüksége lesz a régi kulcsra.

3. rész: DBA

A DBA metaadatokat hoz létre az új oszlop főkulcsához, és frissíti az érintett oszloptitkosítási kulcsok metaadatait az új titkosított értékek hozzáadásához. Ebben a lépésben a DBA egyeztet a titkosítási oszlopokat lekérdező alkalmazások rendszergazdáival is, akik biztosítják, hogy az alkalmazás hozzáférhessen az új oszlop főkulcsához. Miután minden alkalmazás be van állítva az új oszlop főkulcsának használatára, a DBA eltávolítja a régi titkosított értékeket és a régi oszlop főkulcs-metaadatait.

Feladat Cikk Egyszerű szöveges kulcsok/keystore elérése Adatbázis elérése
1. lépés. Szerezze be az új oszlop főkulcsának helyét és a megfelelő oszloptitkosítási kulcsok új, a régi oszlop főkulcsával védett titkosított értékeit a biztonsági rendszergazdától. Lásd az alábbi példákat. Nem Nem
2. lépés. Indítsa el a PowerShell-környezetet, és importálja az SqlServer modult. Az SqlServer modul importálása Nem Nem
3. lépés. Csatlakozzon a kiszolgálóhoz és egy adatbázishoz. Csatlakozás adatbázishoz Nem Igen
4. lépés. Hozzon létre egy SqlColumnMasterKeySettings objektumot, amely információkat tartalmaz az új oszlop főkulcsának helyéről. Az SqlColumnMasterKeySettings egy olyan objektum, amely a memóriában (a PowerShellben) létezik. Új-SqlOszlopfőkulcsBeállítások Nem Nem
5. lépés. Hozza létre az új oszlop főkulcsának metaadatait az adatbázisban. New-SqlColumnMasterKey

Jegyzet: A parancsmag alatt a CREATE COLUMN MASTER KEY (Transact-SQL) utasítás jelenik meg a kulcs metaadatainak létrehozásához.
Nem Igen
6. lépés. Kérje le a metaadatokat az oszloptitkosítási kulcsokról, amelyeket a régi oszlop főkulcsa véd. Get-SqlColumnEncryptionKey Nem Igen
7. lépés. Adjon hozzá egy új (az új oszlop főkulcsával előállított) titkosított értéket az egyes érintett oszloptitkosítási kulcsok metaadataihoz. Add-SqlOszlopTitkosításKulcsÉrték Nem Igen
8. lépés. Az adatbázis titkosított oszlopait lekérdező (és a régi oszlop főkulcsával védett) alkalmazások rendszergazdáival együttműködve biztosíthatják, hogy az alkalmazások hozzáférhessenek az új oszlop főkulcsához. Oszlop főkulcsainak létrehozása és tárolása (Mindig titkosított) Nem Nem
9. lépés. A forgatás befejezéséhez távolítsa el a régi oszlop főkulcsához társított titkosított értékeket az adatbázisból.

Jegyzet: A lépés végrehajtása előtt győződjön meg arról, hogy minden olyan alkalmazás, amely a régi oszlop főkulcsával védett titkosított oszlopokat kérdez le, konfigurálva legyen az új oszlopmintakulcs használatára. Ha ezt a lépést idő előtt hajtja végre, előfordulhat, hogy néhány alkalmazás nem tudja visszafejteni az adatokat.

Ez a lépés eltávolítja a régi oszlop főkulcsa és az általa védett oszloptitkosítási kulcsok közötti társításokat.
Teljes-SqlColumnMasterKeyRotation

Másik lehetőségként a Remove-SqlColumnEncryptionKeyValue parancsot is használhatja
Nem Igen
10. lépés. A régi oszlop főkulcs-metaadatainak eltávolítása az adatbázisból Távolítsa el az SqlColumnMasterKey kulcsát Nem Igen

Oszlop főkulcsa forgatása szerepkörök szétválasztásával (a Windows-tanúsítvány példáján keresztül)

Az alábbi szkript egy átfogó példa arra, hogyan lehet egy új oszlop főkulcsot generálni, amely tanúsítványként szerepel a Windows Tanúsítványtárolóban. Ez magában foglalja egy meglévő (jelenlegi) oszlop főkulcsának kicserélését az új oszlop főkulcsra. A szkript feltételezi, hogy a céladatbázis tartalmazza a CMK1 (forgatandó) nevű oszlop főkulcsát, amely titkosít néhány oszloptitkosítási kulcsot.

1. rész: 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
    }
} 

2. rész: Biztonsági rendszergazda

# 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

3. rész: 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

Oszloptitkosítási kulcs elforgatása

Az oszloptitkosítási kulcs elforgatása során az összes oszlop adatainak visszafejtése történik az elforgatandó kulccsal, majd az adatok újratitkosítása az új oszloptitkosítási kulccsal. Ez a rotációs munkafolyamat a kulcsokhoz és az adatbázishoz is hozzáférést igényel, ezért szerepkör-elkülönítéssel nem hajtható végre. Az oszloptitkosítási kulcsok elforgatása hosszú időt vehet igénybe, ha a kulccsal titkosított oszlopokat tartalmazó táblák nagyok. Ezért a szervezetnek körültekintően kell megterveznie az oszloptitkosítási kulcs rotálását.

Az oszloptitkosítási kulcsot offline vagy online módon is elforgathatja. A korábbi módszer valószínűleg gyorsabb lesz, de az alkalmazások nem tudnak írni az érintett táblákba. Az utóbbi megközelítés valószínűleg hosszabb időt vesz igénybe, de korlátozhatja az időintervallumot, amely alatt az érintett táblák nem érhetők el az alkalmazások számára. További információért lásd: Oszloptitkosítás konfigurálása a PowerShell Always Encrypted használatával és a Set-SqlColumnEncryption használatával.

Feladat Cikk Szövegformátumú kulcsok/keystore-ok elérése Adatbázis elérése
1. lépés. Indítsa el a PowerShell-környezetet, és importálja az SqlServer modult. Az SqlServer modul importálása Nem Nem
2. lépés. Csatlakozzon a kiszolgálóhoz és egy adatbázishoz. Csatlakozás adatbázishoz Nem Igen
3. lépés. Jelentkezzen be az Azure-ba, ha az oszlop főkulcsa, amely az elforgatandó oszloptitkosítási kulcsot védi, az Azure Key Vault kulcstartójában vagy egy felügyelt HSM-ben van tárolva. Connect-AzAccount Igen Nem
4. lépés. Szerezze be az Azure Key Vaultok hozzáférési jogkivonatát, ha az oszlop főkulcsa az Azure Key Vaultban van tárolva. Get-AzAccessToken Nem Nem
5. lépés. Hozzon létre egy új oszloptitkosítási kulcsot, titkosítsa az oszlop főkulcsával, és hozzon létre oszloptitkosítási kulcs metaadatait az adatbázisban. New-SqlColumnEncryptionKey

Jegyzet: Használja a parancsmag egy olyan változatát, amely belsőleg létrehoz és titkosít egy oszloptitkosítási kulcsot.
A parancsmag alatt a CREATE COLUMN ENCRYPTION KEY (Transact-SQL) utasítás jelenik meg a kulcs metaadatainak létrehozásához.
Igen Igen
6. lépés. Keresse meg a régi oszloptitkosítási kulccsal titkosított összes oszlopot. SQL Server Management Objects (SMO) programozási útmutató Nem Igen
7. lépés. Hozzon létre egy SqlColumnEncryptionSettings objektumot minden érintett oszlophoz. Az SqlColumnEncryptionSettings egy olyan objektum, amely a memóriában (a PowerShellben) létezik. Egy oszlop céltitkosítási sémájának megadása. Ebben az esetben az objektumnak meg kell adnia, hogy az érintett oszlopot az új oszloptitkosítási kulcs használatával kell titkosítani. New-SqlColumnEncryptionSettings Nem Nem
8. lépés. Az 5. lépésben azonosított oszlopok újratitkosítása az új oszloptitkosítási kulccsal. Set-SqlColumnEncryption

Jegyzet: Ez a lépés hosszú időt vehet igénybe. Az alkalmazások a választott megközelítéstől (online vagy offline) függően nem tudják elérni a táblákat a teljes művelettel vagy annak egy részével.
Igen Igen
9. lépés. Távolítsa el a régi oszloptitkosítási kulcs metaadatait. Remove-SqlColumnEncryptionKey Nem Igen

Példa – Oszloptitkosítási kulcs elforgatása

Az alábbi szkript egy oszloptitkosítási kulcs elforgatását mutatja be. A szkript feltételezi, hogy a céladatbázis tartalmaz néhány oszloptitkosítási kulccsal titkosított, CEK1 (forgatandó) nevű oszloptitkosítási kulcsot, amelyet cmK1 nevű oszlop-főkulcs véd (az oszlop főkulcsa nem az Azure Key Vaultban van tárolva).

# 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

Következő lépések

Lásd még: