Delen via


Kolomversleuteling in-place configureren met PowerShell

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Dit artikel bevat de stappen voor het instellen van de always encrypted-doelconfiguratie voor databasekolommen met behulp van de cmdlet Set-SqlColumnEncryption (in de SqlServer PowerShell-module). De Set-SqlColumnEncryption cmdlet wijzigt zowel het schema van de doeldatabase als de gegevens die zijn opgeslagen in de geselecteerde kolommen. De gegevens die in een kolom zijn opgeslagen, kunnen worden versleuteld, opnieuw versleuteld of ontsleuteld, afhankelijk van de opgegeven instellingen voor doelversleuteling voor de kolommen en de huidige versleutelingsconfiguratie. Als u cryptografische in-place bewerkingen wilt activeren met behulp van een enclave, moet Set-SqlColumnEncryption- een databaseverbinding gebruiken die is gemaakt met behulp van een verbindingsreeks met het Attestation-protocol en eventueel de trefwoorden voor de Attestation-URL.

Voorwaarden

Als u de configuratie van de doelversleuteling wilt instellen, moet u ervoor zorgen dat:

  • een enclave-versleutelingssleutel voor kolommen wordt geconfigureerd in de database (als u een kolom versleutelt of opnieuw versleutelt). Zie Sleutels beheren voor Always Encrypted met beveiligde enclavesvoor meer informatie.
  • u bent verbonden met de database met Always Encrypted ingeschakeld en de attestation-eigenschappen zoals opgegeven in de verbindingsreeks.
  • u hebt toegang tot de hoofdsleutel van de kolom voor elke kolom die u wilt versleutelen, opnieuw versleutelen of ontsleutelen vanaf de computer waarop de PowerShell-cmdlets worden uitgevoerd.
  • u sqlServer PowerShell-moduleversie 22.0.50 of hoger gebruikt. Voor in-place online versleuteling gebruikt u SqlServer PowerShell-module versie 22.3.0 of hoger.

Beveiligingsoverwegingen

De Set-SqlColumnEncryption cmdlet, gebruikt voor het configureren van versleuteling voor databasekolommen, verwerkt zowel Always Encrypted-sleutels als de gegevens die zijn opgeslagen in databasekolommen. Daarom is het belangrijk dat u de cmdlet uitvoert op een beveiligde computer. Als uw database zich in SQL Server bevindt, voert u de cmdlet uit vanaf een andere computer dan de computer die als host fungeert voor uw SQL Server-exemplaar. Omdat het primaire doel van Always Encrypted is om ervoor te zorgen dat versleutelde gevoelige gegevens veilig zijn, zelfs als het databasesysteem wordt aangetast, kan het uitvoeren van een PowerShell-script waarmee sleutels en/of gevoelige gegevens op de SQL Server-computer worden verwerkt, de voordelen van de functie verminderen of verslaan.

Taak Artikel Toegang tot platte-tekstsleutels/ sleutelopslag Toegang tot database
Stap 1. Start een PowerShell-omgeving en importeer de SqlServer-module. Importeer de SqlServer-module Nee Nee
Stap 2. Verbinding maken met uw server en database Verbinding maken met een database Nee Ja
Stap 3. Verifiëren bij Azure, als uw kolomhoofdsleutel (het beveiligen van de kolomversleutelingssleutel, die moet worden geroteerd), wordt opgeslagen in Azure Key Vault Connect-AzAccount Ja Nee
Stap 4. Een toegangstoken verkrijgen voor Azure Key Vaults. Get-AzAccessToken Nee Nee
Stap 5. Maak een matrix van SqlColumnEncryptionSettings-objecten: één voor elke databasekolom, u wilt versleutelen, opnieuw versleutelen of ontsleutelen. SqlColumnMasterKeySettings is een object dat zich in het geheugen bevindt (in PowerShell). Hiermee geeft u het doelversleutelingsschema voor een kolom op. New-SqlColumnEncryptionSettings Nee Nee
Stap 5. Stel de gewenste versleutelingsconfiguratie in die is opgegeven in de matrix van SqlColumnMasterKeySettings-objecten die u in de vorige stap hebt gemaakt. Een kolom wordt versleuteld, opnieuw versleuteld of ontsleuteld, afhankelijk van de opgegeven doelinstellingen en de huidige versleutelingsconfiguratie van de kolom. Set-SqlColumnEncryption

Opmerking: Deze stap kan lang duren. Uw toepassingen hebben geen toegang tot de tabellen via de hele bewerking of een deel ervan, afhankelijk van de aanpak (online versus offline), die u selecteert.
Ja Ja

Kolommen versleutelen met VBS-enclaves

In het onderstaande voorbeeld ziet u hoe u de configuratie van de doelversleuteling instelt voor een aantal kolommen. Als een van beide kolommen nog niet is versleuteld, wordt deze versleuteld. Als een kolom al is versleuteld met een andere sleutel en/of een ander versleutelingstype, wordt deze ontsleuteld en vervolgens opnieuw versleuteld met de opgegeven doelsleutel/-type. VBS-enclaves bieden momenteel geen ondersteuning voor attestation. De parameter EnclaveAttestationProtocol moet worden ingesteld op Geen en de EnclaveAttestationUrl is niet vereist.

# 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

Kolommen ontsleutelen - voorbeeld

In het volgende voorbeeld ziet u hoe u alle kolommen ontsleutelt die momenteel zijn versleuteld in een database.

# 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

Kolommen versleutelen met behulp van SGX-enclaves

In het onderstaande voorbeeld ziet u hoe u de configuratie van de doelversleuteling instelt voor een aantal kolommen. Als een van beide kolommen nog niet is versleuteld, wordt deze versleuteld. Als een kolom al is versleuteld met een andere sleutel en/of een ander versleutelingstype, wordt deze ontsleuteld en vervolgens opnieuw versleuteld met de opgegeven doelsleutel/-type. Als u cryptografische in-place bewerkingen wilt activeren met behulp van een enclave, zijn de parameters EnclaveAttestationProtocol en EnclaveAttestationUrl vereist.

# 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

Kolommen ontsleutelen - voorbeeld

In het volgende voorbeeld ziet u hoe u alle kolommen ontsleutelt die momenteel zijn versleuteld in een database.

# 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

Volgende stappen

Zie ook