Sdílet prostřednictvím


Konfigurace šifrování sloupců pomocí funkce Always Encrypted s Využitím PowerShellu

platí pro:SQL ServerAzure SQL Databaseazure 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

Další kroky

Viz také