Configurer le chiffrement de colonne sur place avec PowerShell

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Cet article fournit les étapes de définition de la configuration d’Always Encrypted cible pour les colonnes de base de données à l’aide de l’applet de commande Set-SqlColumnEncryption (dans le module PowerShell SqlServer ). L’applet de commande Set-SqlColumnEncryption modifie à la fois le schéma de la base de données cible et les données stockées dans les colonnes sélectionnées. Les données stockées dans une colonne peuvent être chiffrées, rechiffrées ou déchiffrées, en fonction des paramètres de chiffrement cible spécifiés pour les colonnes et de la configuration de chiffrement active. Pour déclencher des opérations de chiffrement sur place à l’aide d’une enclave, Set-SqlColumnEncryption doit utiliser une connexion de base de données créée à l’aide d’une chaîne de connexion avec le protocole d’attestation et éventuellement les mots clés d’URL d’attestation.

Prerequisites

Pour définir la configuration de chiffrement cible, vous devez vérifier ce qui suit :

  • Une clé de chiffrement de colonne prenant en charge les enclaves est configurée dans la base de données (si vous chiffrez ou rechiffrez une colonne). Pour plus d’informations, consultez Gérer les clés pour Always Encrypted avec enclaves sécurisées.
  • vous êtes connecté à la base de données avec Always Encrypted activé et les propriétés d’attestation spécifiées dans la chaîne de connexion.
  • Vous pouvez accéder à la clé principale de colonne pour chaque colonne que vous souhaitez chiffrer, rechiffrer ou déchiffrer, à partir de l’ordinateur qui exécute les applets de commande PowerShell.
  • vous utilisez le module SqlServer PowerShell version 22.0.50 ou ultérieure.

Considérations relatives à la disponibilité

L’applet de commande Set-SqlColumnEncryption sur place ne prend pas en charge le chiffrement en ligne.

Avec l’approche hors connexion, les tables cibles (et toutes les tables liées aux tables cibles, par exemple toutes les tables avec lesquelles une table cible a des relations de clés étrangères) ne sont pas disponibles pour l’écriture des transactions pendant toute la durée de l’opération. La sémantique des contraintes de clé étrangère (CHECK ou NOCHECK) est toujours conservée quand vous utilisez l’approche hors connexion.

Si vous ne pouvez pas vous permettre de temps d’arrêt pendant le processus de chiffrement, nous vous suggérons de configurer le chiffrement de colonne sur place avec Transact-SQL, qui prend en charge le chiffrement en ligne.

Security Considerations

L’applet de commande Set-SqlColumnEncryption , qui permet de configurer le chiffrement pour des colonnes de base de données, gère les clés Always Encrypted et les données stockées dans des colonnes de base de données. Vous devez donc exécuter cette applet de commande sur un ordinateur sécurisé. Si votre base de données est dans SQL Server, exécutez l’applet de commande à partir d’un ordinateur autre que celui qui héberge votre instance de SQL Server. L’objectif principal d’Always Encrypted étant de garantir la sécurité des données sensibles chiffrées même si le système de base de données est compromis, l’exécution d’un script PowerShell qui traite des clés et/ou des données sensibles sur l’ordinateur SQL Server peut réduire ou annuler les avantages de la fonctionnalité.

Task Article Accède au magasin de clés/aux clés en texte brut Accède à la base de données
Étape 1. Démarrer un environnement PowerShell et importer le module SqlServer. Importer le module SqlServer Non Non
Étape 2. Se connecter à votre serveur et à la base de données. Connexion à une base de données Non Oui
Étape 3. S’authentifier auprès d’Azure, si votre clé principale de colonne (qui protège la clé de chiffrement de colonne, soumise à permutation) est stockée dans Azure Key Vault. Connect-AzAccount Oui Non
Étape 4. Obtenez un jeton d’accès pour Azure Key Vaults. Get-AzAccessToken Non Non
Étape 5. Créer un tableau d’objets SqlColumnEncryptionSettings : un pour chaque colonne de base de données que vous souhaitez chiffrer, rechiffrer ou déchiffrer. SqlColumnMasterKeySettings est un objet qui existe en mémoire (dans PowerShell). Il spécifie le schéma de chiffrement cible pour une colonne. New-SqlColumnEncryptionSettings Non Non
Étape 5. Définir la configuration de chiffrement souhaitée, spécifiée dans le tableau d’objets SqlColumnMasterKeySettings que vous avez créé à l’étape précédente. Une colonne est chiffrée, rechiffrée ou déchiffrée en fonction des paramètres cible spécifiés et de la configuration de chiffrement active de la colonne. Set-SqlColumnEncryption

Remarque : cette étape peut prendre longtemps. Vos applications ne peuvent pas accéder aux tables pendant toute la durée de l’opération ou pendant une partie de l’opération, en fonction de l’approche sélectionnée (en ligne ou hors ligne).
Oui Oui

Chiffrer des colonnes à l’aide d’enclaves VBS

L’exemple ci-dessous illustre la définition de la configuration de chiffrement cible pour deux colonnes. Si l’une des colonnes n’est pas encore chiffrée, son chiffrement est effectué. Si l’une des colonnes est déjà chiffrée à l’aide d’une clé et/ou d’un type de chiffrement différent, elle est déchiffrée puis rechiffrée avec la clé et/ou le type cible spécifié. Actuellement, les enclaves VBS ne prennent pas en charge l’attestation. Le paramètre EnclaveAttestationProtocol doit être défini sur None et l’EnclaveAttestationUrl n’est pas obligatoire.

# 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

Déchiffrer des colonnes - Exemple

L’exemple suivant montre comment déchiffrer toutes les colonnes qui sont actuellement chiffrées dans une base de données.

# 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

Chiffrer des colonnes à l’aide d’enclaves SGX

L’exemple ci-dessous illustre la définition de la configuration de chiffrement cible pour deux colonnes. Si l’une des colonnes n’est pas encore chiffrée, son chiffrement est effectué. Si l’une des colonnes est déjà chiffrée à l’aide d’une clé et/ou d’un type de chiffrement différent, elle est déchiffrée puis rechiffrée avec la clé et/ou le type cible spécifié. Pour déclencher des opérations de chiffrement sur place à l’aide d’une enclave, les paramètres EnclaveAttestationProtocol et EnclaveAttestationUrl sont requis.

# 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

Déchiffrer des colonnes - Exemple

L’exemple suivant montre comment déchiffrer toutes les colonnes qui sont actuellement chiffrées dans une base de données.

# 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

Étapes suivantes

Voir aussi