Chiffrement de base de données
Chiffrement de base de données
Activer le chiffrement transparent des données (TDE) à l'aide de DuoKey EKM
Vue d'ensemble
Le chiffrement transparent des données (TDE) chiffre le stockage d'une base de données entière à l'aide d'une clé de chiffrement de base de données (DEK). Avec DuoKey EKM, cette DEK est protégée par une clé asymétrique stockée dans la plateforme cloud de DuoKey, offrant une couche de sécurité supplémentaire.
Prérequis
- SQL Server configuré avec le fournisseur DuoKey EKM
- Clé asymétrique créée et chiffrement activé dans DuoKey
- SQL Server Management Studio (SSMS) installé
- Privilèges Sysadmin sur SQL Server
Hiérarchie de chiffrement
Plateforme cloud DuoKey
Clé de chiffrement maître (MEK)
Protégée par MPCSQL Server (base de données master)
Clé asymétrique (EKM)
RSA-2048Base de données utilisateur
Clé de chiffrement de base de données (DEK)
AES-256Fichiers de données
.mdf, .ndf, .ldf
Chiffrés au reposCréer une base de données et activer TDE
Créer ou sélectionner une base de données
Créez une nouvelle base de données ou utilisez-en une existante :
-- Create a new database
CREATE DATABASE EmployeeDB;
GO
USE EmployeeDB;
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(128),
LastName VARCHAR(128),
Salary DECIMAL(10, 2),
SSN VARCHAR(11)
);
GOCréer la clé de chiffrement de base de données
Créez une DEK protégée par la clé asymétrique dans DuoKey :
USE EmployeeDB;
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_256
ENCRYPTION BY SERVER ASYMMETRIC KEY SQL_EKM_Key;
GO| Algorithme | Taille de clé | Recommandation |
|---|---|---|
| AES_128 | 128 bits | Bonne sécurité |
| AES_192 | 192 bits | Meilleure sécurité |
| AES_256 | 256 bits | Recommandé - le plus robuste |
| Triple DES | 168 bits | Non recommandé |
Utilisez AES_256 pour le chiffrement le plus robuste. Il offre une excellente sécurité avec un impact minimal sur les performances du matériel moderne.
Activer le chiffrement
Activez TDE sur la base de données :
ALTER DATABASE EmployeeDB
SET ENCRYPTION ON;
GOLe chiffrement est effectué de manière asynchrone. Pour les grandes bases de données, ce processus peut prendre un certain temps.
Suivre la progression du chiffrement
SELECT
DB_NAME(database_id) AS DatabaseName,
encryption_state,
CASE encryption_state
WHEN 0 THEN 'No database encryption key present'
WHEN 1 THEN 'Unencrypted'
WHEN 2 THEN 'Encryption in progress'
WHEN 3 THEN 'Encrypted'
WHEN 4 THEN 'Key change in progress'
WHEN 5 THEN 'Decryption in progress'
WHEN 6 THEN 'Protection change in progress'
END AS Status,
percent_complete,
encryptor_type
FROM sys.dm_database_encryption_keys;
GORéférence des états de chiffrement
| État | Valeur | Description | Action requise |
|---|---|---|---|
| 0 | Aucune DEK | Aucune clé de chiffrement de base de données présente | Créer une DEK avec CREATE DATABASE ENCRYPTION KEY |
| 1 | Non chiffrée | La DEK existe mais le chiffrement n'est pas activé | Activer avec ALTER DATABASE SET ENCRYPTION ON |
| 2 | Chiffrement en cours | Chiffrement en cours | Attendre la fin, surveiller percent_complete |
| 3 | Chiffrée | Base de données entièrement chiffrée | Aucune — fonctionnement normal |
| 4 | Changement de clé | Rotation de clé en cours | Attendre la fin |
| 5 | Déchiffrement | Déchiffrement en cours | Attendre la fin |
| 6 | Changement de protection | Changement de protecteur en cours | Attendre la fin |
Vérifier le chiffrement
SELECT
d.name AS DatabaseName,
d.is_encrypted,
dek.encryption_state,
dek.percent_complete,
dek.key_algorithm,
dek.key_length
FROM sys.databases d
LEFT JOIN sys.dm_database_encryption_keys dek
ON d.database_id = dek.database_id
WHERE d.name = 'EmployeeDB';
GOUSE master;
SELECT
ak.name AS AsymmetricKeyName,
ak.algorithm_desc,
ak.key_length,
cp.name AS CryptoProviderName
FROM sys.asymmetric_keys ak
INNER JOIN sys.cryptographic_providers cp
ON ak.provider_id = cp.provider_id;
GOTester les opérations sur les données
Une fois le chiffrement activé, testez que les opérations sur les données fonctionnent de manière transparente :
USE EmployeeDB;
-- Insert test data
INSERT INTO Employees (EmployeeID, FirstName, LastName, Salary, SSN)
VALUES
(1, 'John', 'Doe', 75000.00, '123-45-6789'),
(2, 'Jane', 'Smith', 82000.00, '987-65-4321'),
(3, 'Bob', 'Johnson', 68000.00, '555-12-3456');
GO
-- Query data (works transparently)
SELECT * FROM Employees;
GOLes données sont automatiquement chiffrées au repos tout en restant transparentes pour les applications.
Considérations de performance
Chiffrement initial
- Processeur : augmentation modérée
- E/S : activité significative
- Vitesse : ~1-5 Go/minute
- La base de données reste en ligne
Impact continu
- Opérations de lecture : 3-5 % de surcharge
- Opérations d'écriture : 5-10 % de surcharge
- Utilisation du processeur : augmentation de 1-3 %
- AES-NI réduit l'impact
- Planifiez le chiffrement initial pendant les fenêtres de maintenance
- Surveillez le processeur et les E/S pendant le chiffrement
- Utilisez des processeurs compatibles AES-NI pour de meilleures performances
- Assurez un espace tempdb adéquat
Chiffrer plusieurs bases de données
Utilisez un script pour chiffrer plusieurs bases de données à la fois :
DECLARE @dbname NVARCHAR(128);
DECLARE @sql NVARCHAR(MAX);
DECLARE db_cursor CURSOR FOR
SELECT name FROM sys.databases
WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb')
AND is_encrypted = 0;
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @dbname;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = N'USE [' + @dbname + '];
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_256
ENCRYPTION BY SERVER ASYMMETRIC KEY SQL_EKM_Key;
ALTER DATABASE [' + @dbname + '] SET ENCRYPTION ON;';
EXEC sp_executesql @sql;
PRINT 'Encrypted database: ' + @dbname;
FETCH NEXT FROM db_cursor INTO @dbname;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;
GODésactiver le chiffrement
La désactivation du chiffrement déchiffrera la base de données, ce qui peut prendre un temps considérable pour les grandes bases de données.
-- Disable encryption
ALTER DATABASE EmployeeDB
SET ENCRYPTION OFF;
GO
-- Monitor decryption progress
SELECT
DB_NAME(database_id) AS DatabaseName,
encryption_state,
percent_complete
FROM sys.dm_database_encryption_keys
WHERE DB_NAME(database_id) = 'EmployeeDB';
GO
-- After decryption completes (encryption_state = 1)
USE EmployeeDB;
DROP DATABASE ENCRYPTION KEY;
GOBonnes pratiques
Sécurité
Chiffrez les bases de données tôt, protégez les clés de sauvegarde, auditez l'accès aux clés
Exploitation
Testez avant la production, surveillez les performances, planifiez la croissance
Maintenance
Sauvegardes régulières, tests de restauration, gardez DuoKey accessible