Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felü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
- Oszlopok lekérdezése az Always Encrypted használatával az SQL Server Management Studióval
- Alkalmazások fejlesztése az Always Encrypted használatával
Lásd még:
- Mindig titkosítva
- Az Always Encrypted kulcskezelésének áttekintése
- Always Encrypted konfigurálása a PowerShell használatával
- Always Encrypted kulcsok elforgatása az SQL Server Management Studióval
- OSZLOPFŐ KULCS LÉTREHOZÁSA (Transact-SQL)
- DROP COLUMN MASTER KEY (Transact-SQL)
- OSZLOPTITKOSÍTÁSI KULCS LÉTREHOZÁSA (Transact-SQL)
- ALTER COLUMN ENCRYPTION KEY (Transact-SQL)
- OSZLOP TITKOSÍTÁSI KULCS (Transact-SQL)
- sys.column_master_keys (Transact-SQL)
- sys.oszlop_titkosítási_kulcsok (Transact-SQL)