Dela via


Konfigurera kolumnkryptering på plats med PowerShell

gäller för:SQL ServerAzure SQL DatabaseAzure 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 de 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. Om du vill utlösa kryptografiska åtgärder på plats med hjälp av en enklav måste Set-SqlColumnEncryption använda en databasanslutning som skapats med hjälp av en anslutningssträng med attesteringsprotokollet och eventuellt nyckelorden Attesterings-URL.

Förutsättningar

Om du vill ange målkrypteringskonfigurationen måste du se till att:

  • En enklavaktiverad kolumnkrypteringsnyckel är konfigurerad i databasen (om du håller på att kryptera eller omkryptera en kolumn). Mer information finns i Hantera nycklar för Always Encrypted med säkra enklaver.
  • du är ansluten till databasen med Always Encrypted aktiverat och attesteringsegenskaperna som anges i anslutningssträngen.
  • 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. För onlinekryptering på plats använder du SqlServer PowerShell-modul version 22.3.0 eller senare.

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 kolumnmästar-nyckel, som skyddar kolumnkrypteringsnyckeln och som behöver roteras, lagras i Azure Key Vault. Connect-AzAccount Ja Nej
Steg 4. Hämta en åtkomsttoken för Azure Key Vaults. 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 5. 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 hjälp av VBS-enklaver

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. VBS-enklaver stöder för närvarande inte attestering. Parametern EnclaveAttestationProtocol ska anges till Ingen och EnclaveAttestationUrl krävs inte.

# Import modules
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 = "<servername>.database.windows.net"
$databaseName = "<DatabaseName>"
# 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.Employees.SSN" -EncryptionType "Randomized" -EncryptionKey "CEK" 
$ces += New-SqlColumnEncryptionSettings -ColumnName "dbo.Employees.Salary" -EncryptionType "Randomized" -EncryptionKey "CEK" 
Set-SqlColumnEncryption -InputObject $database -ColumnEncryptionSettings $ces -LogFileDirectory . -EnclaveAttestationProtocol "None" -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 modules
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 . -EnclaveAttestationProtocol "None" -KeyVaultAccessToken $keyVaultAccessToken

Kryptera kolumner med SGX-enklaver

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. För att utlösa kryptografiska åtgärder på plats med hjälp av en enklav krävs parametrarna EnclaveAttestationProtocol och EnclaveAttestationUrl.

# Import modules
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 = "<servername>.database.windows.net"
$databaseName = "<DatabaseName>"
# 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.Employees.SSN" -EncryptionType "Randomized" -EncryptionKey "CEK" 
$ces += New-SqlColumnEncryptionSettings -ColumnName "dbo.Employees.Salary" -EncryptionType "Randomized" -EncryptionKey "CEK" 
Set-SqlColumnEncryption -InputObject $database -ColumnEncryptionSettings $ces -LogFileDirectory . -EnclaveAttestationProtocol "AAS" -EnclaveAttestationURL "https://<attestationURL>"   -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 modules
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 . -EnclaveAttestationProtocol "AAS" -EnclaveAttestationURL "https://<attestationURL>" -KeyVaultAccessToken $keyVaultAccessToken

Nästa steg

Se även