Konfigurace šifrování sloupců pomocí funkce Always Encrypted s Využitím PowerShellu
platí pro:SQL Server
Azure SQL Database
azure SQL Managed Instance
Tento článek obsahuje postup nastavení cílové konfigurace Always Encrypted pro sloupce databáze pomocí rutiny Set-SqlColumnEncryption (v modulu SqlServer PowerShellu). Příkaz Set-SqlColumnEncryption upraví jak strukturu cílové databáze, tak data uložená ve vybraných sloupcích. Data uložená ve sloupci je možné zašifrovat, znovu zašifrovat nebo dešifrovat v závislosti na zadaném nastavení šifrování pro sloupce a aktuální konfiguraci šifrování.
Poznámka
Pokud používáte SQL Server 2019 (15.x) a vaše instance SQL Serveru je nakonfigurovaná se zabezpečeným enklávem, můžete spustit kryptografické operace na místě, aniž byste museli přesouvat data z databáze. Viz Konfigurujte šifrování sloupců na místě pomocí funkce Always Encrypted se zabezpečenými enklávami.
Další informace o podpoře funkce Always Encrypted v modulu SqlServer PowerShell najdete v tématu Konfigurace funkce Always Encrypted pomocí powershellového.
Požadavky
Pokud chcete nastavit cílovou konfiguraci šifrování, musíte se ujistit, že:
- V databázi je nakonfigurovaný šifrovací klíč sloupce (pokud šifrujete nebo znovu šifrujete sloupec). Podrobnosti najdete v tématu Konfigurace klíčů Always Encrypted pomocíPowerShellu .
- Ke hlavnímu klíči sloupce pro každý sloupec, který chcete šifrovat, znovu zašifrovat nebo dešifrovat, můžete přistupovat z počítače, na kterém běží rutiny PowerShellu.
- používáte modul SqlServer PowerShell verze 22.0.50 nebo novější.
Důležité informace o výkonu a dostupnosti
Pokud chcete použít zadaná cílová nastavení šifrování pro databázi, rutina Set-SqlColumnEncryption transparentně stáhne všechna data ze sloupců obsahujících cílové tabulky, nahraje data zpět do sady dočasných tabulek (s cílovým šifrovaným nastavením) a nakonec nahradí původní tabulky novými verzemi tabulek. Základní zprostředkovatel dat rozhraní .NET Framework pro SQL Server šifruje nebo/a dešifruje data při stahování nebo/a nahrání v závislosti na aktuální konfiguraci šifrování cílového sloupce a zadaných nastavení šifrování pro cílové sloupce. Přesunutí dat může trvat delší dobu v závislosti na velikosti dat v ovlivněných tabulkách a šířce pásma sítě.
Cmdlet Set-SqlColumnEncryption podporuje dva přístupy k nastavení konfigurace cílového šifrování: online a offline.
Při offline přístupu nejsou cílové tabulky (a všechny tabulky související s cílovými tabulkami, například všechny tabulky, se kterými má cílová tabulka relace cizího klíče) dostupné pro zápis transakcí po celou dobu operace. Sémantika omezení cizího klíče (CHECK nebo NOCHECK) se při použití offline přístupu vždy zachovají.
Při použití online přístupu (vyžaduje modul SqlServer PowerShell verze 21.x nebo novější), se operace kopírování a šifrování, dešifrování nebo opětovného šifrování dat provádí přírůstkově. Aplikace mohou číst a zapisovat data do a z cílových tabulek v rámci operace přesunu dat, s výjimkou poslední iterace, která je omezená parametrem MaxDownTimeInSeconds (který můžete definovat). Cmdlet umožňuje sledování změn v cílové databázi za účelem detekce a zpracování změn, které mohou aplikace provádět během kopírování dat. Z tohoto důvodu bude online přístup pravděpodobně využívat více prostředků na straně serveru než offline přístup. Tato operace může u online přístupu trvat mnohem déle, zejména v případě, že u databáze běží úloha náročné na zápis. Online přístup lze použít k šifrování jedné tabulky najednou a tabulka musí mít primární klíč. Ve výchozím nastavení se omezení cizího klíče znovu vytvoří s možností NOCHECK, aby se minimalizoval dopad na aplikace. Zachování sémantiky omezení cizího klíče můžete vynutit zadáním možnosti KeepCheckForeignKeyConstraints.
Tady jsou pokyny pro výběr mezi offline a online přístupy:
Použijte offline přístup:
- Chcete-li minimalizovat dobu trvání operace.
- Šifrování, dešifrování a opětovné šifrování sloupců ve více tabulkách najednou
- Pokud cílová tabulka nemá primární klíč.
Použijte online přístup:
- Pokud chcete minimalizovat výpadky nebo nedostupnost databáze pro vaše aplikace.
Důležité informace o zabezpečení
Rutina Set-SqlColumnEncryption, která slouží ke konfiguraci šifrování sloupců databáze, zpracovává klíče Always Encrypted i data uložená ve sloupcích databáze. Proto je důležité spustit cmdlet na zabezpečeném počítači. Pokud je vaše databáze v SQL Serveru, spusťte rutinu z jiného počítače, než je počítač hostující instanci SQL Serveru. Vzhledem k tomu, že primárním cílem funkce Always Encrypted je zajistit, aby šifrovaná citlivá data byla v bezpečí i v případě ohrožení databázového systému, spuštění skriptu PowerShellu, který zpracovává klíče nebo citlivá data na počítači s SQL Serverem, může snížit nebo porazit výhody této funkce.
Úkol | Článek | Přístup ke klíčům nebo úložišti klíčů ve formátu prostého textu | Přístup k databázi |
---|---|---|---|
Krok 1. Spusťte prostředí PowerShell a naimportujte modul SqlServer. | Import modulu SqlServer | Ne | Ne |
Krok 2. Připojení k serveru a databázi | Připojení k databázi | Ne | Ano |
Krok 3. Přihlaste se do Azure, pokud je váš hlavní klíč sloupce (který chrání šifrovací klíč sloupce a má být obnoven) uložený ve službě Azure Key Vault. | Connect-AzAccount | Ano | Ne |
Krok 4. Získejte přístupový token pro službu Azure Key Vault, pokud je hlavní klíč sloupce uložený ve službě Azure Key Vault. | Get-AzAccessToken | Ne | Ne |
Krok 5. Vytvořte pole objektů SqlColumnEncryptionSettings – jeden pro každý sloupec databáze, který chcete zašifrovat, znovu zašifrovat nebo dešifrovat. SqlColumnMasterKeySettings je objekt, který existuje v paměti (v PowerShellu). Určuje cílové schéma šifrování pro sloupec. | New-SqlColumnEncryptionSettings | Ne | Ne |
Krok 6. Nastavte požadovanou konfiguraci šifrování zadanou v poli objektů SqlColumnMasterKeySettings, které jste vytvořili v předchozím kroku. Sloupec se zašifruje, znovu zašifruje nebo dešifruje v závislosti na zadaných cílových nastaveních a aktuální konfiguraci šifrování sloupce. |
Set-SqlColumnEncryption Poznámka: Tento krok může trvat dlouhou dobu. Vaše aplikace nebudou mít přístup k tabulkám prostřednictvím celé operace nebo jeho části v závislosti na přístupu (online nebo offline), který vyberete. |
Ano | Ano |
Šifrování sloupců pomocí offline přístupu – příklad
Následující příklad ukazuje nastavení konfigurace cílového šifrování pro několik sloupců. Pokud některý ze sloupců ještě není zašifrovaný, zašifruje se. Pokud je některý sloupec už šifrovaný pomocí jiného klíče nebo jiného typu šifrování, dešifruje se a pak se znovu zašifruje zadaným cílovým klíčem nebo typem.
# 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
Šifrování sloupců pomocí online přístupu – příklad
Následující příklad ukazuje nastavení konfigurace cílového šifrování pro několik sloupců pomocí online přístupu. Pokud některý ze sloupců ještě není zašifrovaný, zašifruje se. Pokud je některý sloupec už šifrovaný pomocí jiného klíče nebo jiného typu šifrování, dešifruje se a pak se znovu zašifruje zadaným cílovým klíčem nebo typem.
# 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
Dešifrování sloupců – příklad
Následující příklad ukazuje, jak dešifrovat všechny sloupce, které jsou aktuálně šifrované v databázi.
# 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