Konfigurera kolumnkryptering med Always Encrypted med PowerShell
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Den här artikeln innehåller stegen för att ange always encrypted-målkonfigurationen för databaskolumner med hjälp av cmdleten Set-SqlColumnEncryption (i modulen SqlServer PowerShell). Cmdleten Set-SqlColumnEncryption ändrar både schemat för måldatabasen och de data som lagras i valda kolumnerna. Data som lagras i en kolumn kan krypteras, krypteras om eller dekrypteras, beroende på de angivna målkrypteringsinställningarna för kolumnerna och den aktuella krypteringskonfigurationen.
Obs
Om du använder SQL Server 2019 (15.x) och SQL Server-instansen har konfigurerats med en säker enklav kan du köra kryptografiska åtgärder på plats utan att flytta data från databasen. Se Konfigurera kolumnkryptering direkt genom Always Encrypted med säkra enklaver.
Mer information om Always Encrypted-stöd i SqlServer PowerShell-modulen finns i Configure Always Encrypted using PowerShell.
Förutsättningar
Om du vill ange målkrypteringskonfigurationen måste du se till att:
- en kolumnkrypteringsnyckel konfigureras i databasen (om du krypterar eller krypterar om en kolumn). Mer information finns i Konfigurera Always Encrypted-nycklar med PowerShell.
- du kan komma åt kolumnhuvudnyckeln för varje kolumn som du vill kryptera, kryptera om eller dekryptera från datorn som kör PowerShell-cmdletarna.
- du använder SqlServer PowerShell-modul version 22.0.50 eller senare.
Prestanda- och tillgänglighetsöverväganden
Om du vill tillämpa de angivna målkrypteringsinställningarna för databasen laddar Set-SqlColumnEncryption cmdlet transparent ned alla data från kolumnerna som innehåller måltabellerna, överför data tillbaka till en uppsättning temporära tabeller (med målkrypterade inställningar) och ersätter slutligen de ursprungliga tabellerna med de nya versionerna av tabellerna. Den underliggande .NET Framework-dataprovidern för SQL Server krypterar eller/och dekrypterar data vid nedladdning eller/och uppladdning, beroende på målkolumnens aktuella krypteringskonfiguration och de angivna målkrypteringsinställningarna för målkolumnerna. Det kan ta lång tid att flytta data, beroende på storleken på data i berörda tabeller och nätverksbandbredden.
Cmdleten Set-SqlColumnEncryption stöder två metoder för att konfigurera målkrypteringskonfigurationen: online och offline.
Med offlinemetoden är måltabellerna (och alla tabeller som är relaterade till måltabellerna, till exempel tabeller som en måltabell har sekundärnyckelrelationer med) inte tillgängliga för att skriva transaktioner under hela åtgärdens varaktighet. Semantiken för begränsningar för främmande nyckel (CHECK eller NOCHECK) bevaras alltid när den offline-metoden används.
Med onlinemetoden (kräver SqlServer PowerShell-modul version 21.x eller senare) utförs kopiering och kryptering, dekryptering eller omkryptering av data stegvis. Program kan läsa och skriva data från och till måltabellerna under hela dataflytten, förutom den senaste iterationen, vars varaktighet begränsas av parametern MaxDownTimeInSeconds (som du kan definiera). För att identifiera och bearbeta de ändringar som program kan göra när data kopieras möjliggör cmdleten ändringsspårning i måldatabasen. På grund av detta kommer onlinemetoden sannolikt att förbruka fler resurser på serversidan än offlinemetoden. Åtgärden kan också ta mycket mer tid med onlinemetoden, särskilt om en skrivintensiv arbetsbelastning körs mot databasen. Onlinemetoden kan användas för att kryptera en tabell i taget och tabellen måste ha en primärnyckel. Som förvalt, återskapas begränsningar för främmande nyckel med alternativet NOCHECK för att minimera påverkan på applikationer. Du kan framtvinga att semantiken för främmande nyckelbegränsningar bevaras genom att ange alternativet KeepCheckForeignKeyConstraints.
Här följer riktlinjerna för att välja mellan offline- och onlinemetoder:
Använd offlinemetoden:
- För att minimera varaktigheten för åtgärden.
- För att kryptera/dekryptera/kryptera om kolumner i flera tabeller samtidigt.
- Om måltabellen inte har någon primärnyckel.
Använd onlinemetoden:
- För att minimera stilleståndstiden/otillgängligheten för databasen till dina program.
Säkerhetshänsyn
Cmdleten Set-SqlColumnEncryption, som används för att konfigurera kryptering för databaskolumner, hanterar både Always Encrypted-nycklar och data som lagras i databaskolumner. Därför är det viktigt att du kör cmdleten på en säker dator. Om databasen finns i SQL Server kör du cmdleten från en annan dator än den dator som är värd för SQL Server-instansen. Eftersom det primära målet med Always Encrypted är att säkerställa att krypterade känsliga data är säkra även om databassystemet komprometteras kan körning av ett PowerShell-skript som bearbetar nycklar och/eller känsliga data på SQL Server-datorn minska eller motverka fördelarna med funktionen.
Uppgift | Artikel | Åtkomst till klartextnycklar/nyckelarkiv | Åtkomst till databasen |
---|---|---|---|
Steg 1. Starta en PowerShell-miljö och importera SqlServer-modulen. | Importera SqlServer-modulen | Nej | Nej |
Steg 2. Ansluta till servern och databasen | Ansluta till en databas | Nej | Ja |
Steg 3. Autentisera mot Azure, om din kolumnhuvudnyckel, som skyddar kolumnkrypteringsnyckeln som ska roteras, lagras i Azure Key Vault. | Connect-AzAccount | Ja | Nej |
Steg 4. Hämta en åtkomsttoken för Azure Key Vaults om din kolumnhuvudnyckel lagras i Azure Key Vault. | Get-AzAccessToken | Nej | Nej |
Steg 5. Skapa en matris med SqlColumnEncryptionSettings-objekt – en för varje databaskolumn som du vill kryptera, kryptera om eller dekryptera. SqlColumnMasterKeySettings är ett objekt som finns i minnet (i PowerShell). Den anger målkrypteringsschemat för en kolumn. | New-SqlColumnEncryptionSettings | Nej | Nej |
Steg 6. Ange önskad krypteringskonfiguration, som anges i matrisen med SqlColumnMasterKeySettings-objekt, som du skapade i föregående steg. En kolumn krypteras, krypteras om eller dekrypteras, beroende på de angivna målinställningarna och kolumnens aktuella krypteringskonfiguration. |
Set-SqlColumnEncryption Obs! Det här steget kan ta lång tid. Dina program kommer inte att kunna komma åt tabellerna via hela åtgärden eller en del av den, beroende på vilken metod (online eller offline) du väljer. |
Ja | Ja |
Kryptera kolumner med offlinemetod – exempel
Exemplet nedan visar hur du ställer in målkrypteringskonfigurationen för ett par kolumner. Om någon av kolumnerna inte redan är krypterade krypteras den. Om en kolumn redan är krypterad med en annan nyckel och/eller en annan krypteringstyp dekrypteras den och krypteras sedan igen med den angivna målnyckeln/typen.
# 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
Kryptera kolumner med onlinemetoden – exempel
Exemplet nedan visar hur du ställer in målkrypteringskonfigurationen för ett par kolumner med hjälp av onlinemetoden. Om någon av kolumnerna inte redan är krypterade krypteras den. Om en kolumn redan är krypterad med en annan nyckel och/eller en annan krypteringstyp dekrypteras den och krypteras sedan igen med den angivna målnyckeln/typen.
# 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
Dekryptera kolumner – exempel
I följande exempel visas hur du dekrypterar alla kolumner som för närvarande är krypterade i en databas.
# 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