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


Oszloptitkosítás konfigurálása az Always Encrypted és a PowerShell használatával

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

Ez a cikk a Set-SqlColumnEncryption parancsmaggal (az SqlServer PowerShell modulban) ismerteti az adatbázisoszlopok cél Always Encrypted konfigurációjának beállításának lépéseit. A Set-SqlColumnEncryption parancsmag módosítja a céladatbázis sémáját és a kijelölt oszlopokban tárolt adatokat is. Az oszlopban tárolt adatok titkosíthatók, újra titkosíthatók vagy visszafejthetők az oszlopokhoz megadott céltitkosítási beállításoktól és az aktuális titkosítási konfigurációtól függően.

Jegyzet

Ha AZ SQL Server 2019 -et (15.x) használja, és az SQL Server-példány biztonságos enklávéval van konfigurálva, a titkosítási műveleteket helyben futtathatja anélkül, hogy adatokat helyezne át az adatbázisból. Lásd: Az oszloptitkosítás helyben történő konfigurálása az Always Encrypted használatával biztonságos enklávékkal.

Az SqlServer PowerShell modul Always Encrypted-támogatásával kapcsolatos további információkért lásd: Always Encrypted konfigurálása a PowerShell használatával.

Előfeltételek

A céltitkosítási konfiguráció beállításához győződjön meg arról, hogy:

  • egy oszloptitkosítási kulcs van konfigurálva az adatbázisban (ha egy oszlopot titkosít vagy újratitkosított). További információ: Always Encrypted kulcsok konfigurálása a PowerShell használatával.
  • A PowerShell-parancsmagokat futtató számítógépről hozzáférhet az oszlop főkulcsához minden olyan oszlop esetében, amelyet titkosítani, újratitkosítani vagy visszafejteni szeretne.
  • Az SqlServer PowerShell-modul 22.0.50-es vagy újabb verzióját használja.

Teljesítménnyel és rendelkezésre állási szempontokkal kapcsolatos szempontok

Az adatbázis megadott céltitkosítási beállításainak alkalmazásához a Set-SqlColumnEncryption parancsmag transzparensen letölti az összes adatot a céltáblákat tartalmazó oszlopokból, feltölti az adatokat egy ideiglenes táblába (a célként megadott titkosított beállításokkal), és végül lecseréli az eredeti táblákat a táblák új verzióira. Az SQL Server mögöttes .NET-keretrendszer-adatszolgáltatója a céloszlop aktuális titkosítási konfigurációjától és a céloszlopok megadott céltitkosítási beállításaitól függően titkosítja vagy/és visszafejti az adatokat letöltéskor vagy/és feltöltéskor. Az adatok áthelyezésének művelete hosszú időt vehet igénybe az érintett táblákban lévő adatok méretétől és a hálózati sávszélességtől függően.

A Set-SqlColumnEncryption parancsmag két módszert támogat a céltitkosítási konfiguráció beállításához: online és offline.

Offline megközelítés esetén a céltáblák (és a céltáblákhoz kapcsolódó táblák, például a céltáblákhoz külső kulcskapcsolattal rendelkező táblák) nem érhetők el a tranzakciók írásához a művelet teljes időtartama alatt. Az offline megközelítés használata esetén az idegenkulcs-korlátozások szemantikája (CHECK vagy NOCHECK) mindig megmarad.

Az online megközelítéssel (amelyhez az SqlServer PowerShell-modul 21.x vagy újabb verziója szükséges), az adatok másolásának és titkosításának, visszafejtésének vagy újratitkosításának művelete növekményesen történik. Az alkalmazások az adatáthelyezési művelet során a céltáblákról és a céltáblákra is beolvashatják az adatokat, kivéve az utolsó iterációt, amelynek időtartamát a MaxDownTimeInSeconds paraméter korlátozza (amelyet definiálhat). Az alkalmazások által az adatok másolása közben elvégezhető módosítások észleléséhez és feldolgozásához a parancsmag engedélyezi a változáskövetést a céladatbázisban. Emiatt az online megközelítés valószínűleg több erőforrást fog használni a kiszolgáló oldalán, mint az offline megközelítés. A művelet az online megközelítéssel is sokkal több időt vehet igénybe, különösen akkor, ha egy írási terhelés fut az adatbázison. Az online módszer használatával egyszerre egy táblát titkosíthat, a táblának pedig elsődleges kulccsal kell rendelkeznie. Alapértelmezés szerint az idegenkulcs-megkötések újra létrejönnek a NOCHECK beállítással az alkalmazásokra gyakorolt hatás minimalizálása érdekében. A KeepCheckForeignKeyConstraints beállítás megadásával kényszerítheti az idegen kulcsok szemantikájának megőrzését.

Az alábbiakban az offline és az online megközelítések közötti választásra vonatkozó irányelveket találja:

Használja az offline megközelítést:

  • A művelet időtartamának minimalizálása.
  • Több tábla oszlopainak egyidejű titkosításához/visszafejtéséhez/újratitkosításához.
  • Ha a céltábla nem rendelkezik elsődleges kulccsal.

Használja az online megközelítést:

  • Az adatbázis állásidejének/elérhetetlenségének minimalizálása az alkalmazások számára.

Biztonsági szempontok

Az adatbázisoszlopok titkosításának konfigurálásához használt Set-SqlColumnEncryption parancsmag az Always Encrypted kulcsokat és az adatbázisoszlopokban tárolt adatokat egyaránt kezeli. Ezért fontos, hogy biztonságos számítógépen futtassa a parancsmagot. Ha az adatbázis az SQL Serverben található, hajtsa végre a parancsmagot egy másik számítógépről, mint az SQL Server-példányt üzemeltető számítógép. Mivel az Always Encrypted elsődleges célja annak biztosítása, hogy a titkosított bizalmas adatok akkor is biztonságosak legyenek, ha az adatbázisrendszer biztonsága sérül, a kulcsokat és/vagy bizalmas adatokat az SQL Server-számítógépen feldolgozó PowerShell-szkriptek végrehajtása csökkentheti vagy csökkentheti a funkció előnyeit.

Feladat Cikk Egyszerű szöveges kulcsok/kulcstárolók 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. Csatlakozás a kiszolgálóhoz és az adatbázishoz Csatlakozás adatbázishoz Nem Igen
3. lépés. Hitelesítés az Azure-ban, ha az oszlop főkulcsa (az elforgatandó oszloptitkosítási kulcs védelme) az Azure Key Vaultban van tárolva Connect-AzAccount Igen Nem
4. lépés. Szerezze be az Azure Key Vault tárolók hozzáférési tokenjét, ha az oszlopfőkulcs az Azure Key Vaultban van tárolva. Get-AzAccessToken Nem Nem
5. lépés. SqlColumnEncryptionSettings-objektumok tömbjének létrehozása – egy-egy adatbázisoszlophoz, amelyet titkosítani, újratitkosítani vagy visszafejteni szeretne. Az SqlColumnMasterKeySettings egy olyan objektum, amely a memóriában (a PowerShellben) létezik. Egy oszlop céltitkosítási sémájának megadása. New-SqlColumnEncryptionSettings Nem Nem
6. lépés. Állítsa be az előző lépésben létrehozott SqlColumnMasterKeySettings-objektumok tömbjében megadott kívánt titkosítási konfigurációt. Az oszlop titkosítása, újratitkosítása vagy visszafejtése a megadott célbeállításoktól és az oszlop aktuális titkosítási konfigurációjától függően lesz. 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

Oszlopok titkosítása offline módszerrel – példa

Az alábbi példa bemutatja a céltitkosítási konfiguráció beállítását néhány oszlophoz. Ha egyik oszlop sincs még titkosítva, az titkosítva lesz. Ha bármelyik oszlop már titkosítva van egy másik kulccsal és/vagy más titkosítási típussal, a rendszer visszafejti, majd újra titkosítja a megadott célkulcs/típus használatával.

# Import the SqlServer module.
Import-Module "SqlServer" -MinimumVersion 22.0.50
Import-Module Az.Accounts -MinimumVersion 2.2.0

#Connect to Azure
Connect-AzAccount

# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token  

# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True"
$database = Get-SqlDatabase -ConnectionString $connStr

# Encrypt the selected columns (or re-encrypt, if they are already encrypted using keys/encrypt types, different than the specified keys/types.
$ces = @()
$ces += New-SqlColumnEncryptionSettings -ColumnName "dbo.Patients.SSN" -EncryptionType "Deterministic" -EncryptionKey "CEK1"
$ces += New-SqlColumnEncryptionSettings -ColumnName "dbo.Patients.BirthDate" -EncryptionType "Randomized" -EncryptionKey "CEK1"
Set-SqlColumnEncryption -InputObject $database -ColumnEncryptionSettings $ces -LogFileDirectory . -KeyVaultAccessToken $keyVaultAccessToken

Oszlopok titkosítása online módszerrel – példa

Az alábbi példa bemutatja, hogy a céltitkosítási konfigurációt több oszlophoz is beállítja az online megközelítéssel. Ha egyik oszlop sincs még titkosítva, az titkosítva lesz. Ha bármelyik oszlop már titkosítva van egy másik kulccsal és/vagy más titkosítási típussal, a rendszer visszafejti, majd újra titkosítja a megadott célkulcs/típus használatával.

# Import the SqlServer module.
Import-Module "SqlServer" -MinimumVersion 22.0.50
Import-Module Az.Accounts -MinimumVersion 2.2.0

#Connect to Azure
Connect-AzAccount

# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token  

# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True"
$database = Get-SqlDatabase -ConnectionString $connStr

# Encrypt the selected columns (or re-encrypt, if they are already encrypted using keys/encrypt types, different than the specified keys/types.
$ces = @()
$ces += New-SqlColumnEncryptionSettings -ColumnName "dbo.Patients.SSN" -EncryptionType "Deterministic" -EncryptionKey "CEK1"
$ces += New-SqlColumnEncryptionSettings -ColumnName "dbo.Patients.BirthDate" -EncryptionType "Randomized" -EncryptionKey "CEK1"
Set-SqlColumnEncryption -InputObject $database -ColumnEncryptionSettings $ces -UseOnlineApproach -MaxDowntimeInSeconds 180 -LogFileDirectory . -KeyVaultAccessToken $keyVaultAccessToken

Oszlopok visszafejtése – Példa

Az alábbi példa bemutatja, hogyan fejtheti vissza az adatbázisban jelenleg titkosított összes oszlopot.

# Import the SqlServer module.
Import-Module "SqlServer" -MinimumVersion 22.0.50
Import-Module Az.Accounts -MinimumVersion 2.2.0

#Connect to Azure
Connect-AzAccount

# Obtain an access token for key vaults.
$keyVaultAccessToken = (Get-AzAccessToken -ResourceUrl https://vault.azure.net).Token  

# Connect to your database.
$serverName = "<server name>"
$databaseName = "<database name>"
# Change the authentication method in the connection string, if needed.
$connStr = "Server = " + $serverName + "; Database = " + $databaseName + "; Integrated Security = True"
$database = Get-SqlDatabase -ConnectionString $connStr

# Find all encrypted columns, and create a SqlColumnEncryptionSetting object for each column.
$ces = @()
$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) {
            $threeColPartName = $tables[$i].Schema + "." + $tables[$i].Name + "." + $columns[$j].Name 
            $ces += New-SqlColumnEncryptionSettings -ColumnName $threeColPartName -EncryptionType "Plaintext" 
        }
    }
}

# Decrypt all columns.
Set-SqlColumnEncryption -ColumnEncryptionSettings $ces -InputObject $database -LogFileDirectory . -KeyVaultAccessToken $keyVaultAccessToken

Titkosítás utáni

Tisztítsa meg a gyorstárat minden olyan köteg és tárolt eljárás esetében, amely a táblához hozzáfér, így frissülhet a paraméterek titkosítási információja.

ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;

Jegyzet

Ha nem távolítja el az érintett lekérdezés tervét a gyorsítótárból, a lekérdezés titkosítás utáni első végrehajtása sikertelen lehet.

Körültekintően használja a ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE vagy DBCC FREEPROCCACHE opciót a tervgyorsítótár törléséhez, mivel ez ideiglenes lekérdezési teljesítménycsökkenést eredményezhet. A gyorsítótár kiürítésének negatív hatásának minimalizálása érdekében csak az érintett lekérdezések terveit távolíthatja el szelektíven.

Hívja meg sp_refresh_parameter_encryption , hogy frissítse az egyes modulok (tárolt eljárás, függvény, nézet, eseményindító) paramétereinek metaadatait, amelyek a sys.parametersben vannak tárolva, és az oszlopok titkosításával érvénytelenné válhattak.

Következő lépések

Lásd még: