Datenbankverschlüsselung
Datenbankverschlüsselung
Transparent Data Encryption (TDE) mit DuoKey EKM aktivieren
Überblick
Transparent Data Encryption (TDE) verschlüsselt den Speicher einer gesamten Datenbank mithilfe eines Database Encryption Key (DEK). Mit DuoKey EKM wird dieser DEK durch einen asymmetrischen Schlüssel geschützt, der in der Cloud-Plattform von DuoKey gespeichert ist, was eine zusätzliche Sicherheitsebene bietet.
Voraussetzungen
- SQL Server mit DuoKey EKM-Provider konfiguriert
- Asymmetrischer Schlüssel erstellt und Verschlüsselung in DuoKey aktiviert
- SQL Server Management Studio (SSMS) installiert
- Sysadmin-Rechte auf SQL Server
Verschlüsselungshierarchie
DuoKey Cloud Platform
Master Encryption Key (MEK)
MPC-geschütztSQL Server (master-Datenbank)
Asymmetrischer Schlüssel (EKM)
RSA-2048Benutzerdatenbank
Database Encryption Key (DEK)
AES-256Datendateien
.mdf, .ndf, .ldf
Ruhend verschlüsseltDatenbank erstellen und TDE aktivieren
Datenbank erstellen oder auswählen
Erstellen Sie eine neue Datenbank oder verwenden Sie eine vorhandene:
-- 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)
);
GODatabase Encryption Key erstellen
Erstellen Sie einen DEK, der durch den asymmetrischen Schlüssel in DuoKey geschützt ist:
USE EmployeeDB;
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_256
ENCRYPTION BY SERVER ASYMMETRIC KEY SQL_EKM_Key;
GO| Algorithmus | Schlüsselgröße | Empfehlung |
|---|---|---|
| AES_128 | 128-Bit | Gute Sicherheit |
| AES_192 | 192-Bit | Bessere Sicherheit |
| AES_256 | 256-Bit | Empfohlen – stärkste |
| Triple DES | 168-Bit | Nicht empfohlen |
Verwenden Sie AES_256 für die stärkste Verschlüsselung. Es bietet ausgezeichnete Sicherheit bei minimaler Leistungseinbuße auf moderner Hardware.
Verschlüsselung aktivieren
Aktivieren Sie TDE für die Datenbank:
ALTER DATABASE EmployeeDB
SET ENCRYPTION ON;
GODie Verschlüsselung wird asynchron durchgeführt. Bei großen Datenbanken kann dieser Vorgang einige Zeit in Anspruch nehmen.
Verschlüsselungsfortschritt überwachen
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;
GOReferenz der Verschlüsselungszustände
| Zustand | Wert | Beschreibung | Erforderliche Aktion |
|---|---|---|---|
| 0 | Kein DEK | Kein Datenbankverschlüsselungsschlüssel vorhanden | DEK mit CREATE DATABASE ENCRYPTION KEY erstellen |
| 1 | Unverschlüsselt | DEK vorhanden, Verschlüsselung jedoch nicht aktiviert | Mit ALTER DATABASE SET ENCRYPTION ON aktivieren |
| 2 | Verschlüsselung läuft | Verschlüsselung wird durchgeführt | Auf Abschluss warten, percent_complete überwachen |
| 3 | Verschlüsselt | Datenbank vollständig verschlüsselt | Keine – normaler Betrieb |
| 4 | Schlüsselwechsel | Schlüsselrotation wird durchgeführt | Auf Abschluss warten |
| 5 | Entschlüsselung läuft | Entschlüsselung wird durchgeführt | Auf Abschluss warten |
| 6 | Schutzwechsel | Wechsel des Protektors wird durchgeführt | Auf Abschluss warten |
Verschlüsselung überprüfen
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;
GODatenoperationen testen
Testen Sie nach dem Aktivieren der Verschlüsselung, ob Datenoperationen transparent funktionieren:
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;
GODie Daten werden im Ruhezustand automatisch verschlüsselt, bleiben für Anwendungen jedoch transparent.
Leistungsbetrachtungen
Erstverschlüsselung
- CPU: Moderater Anstieg
- E/A: Erhebliche Aktivität
- Geschwindigkeit: ~1–5 GB/Minute
- Datenbank bleibt online
Laufende Auswirkung
- Leseoperationen: 3–5 % Overhead
- Schreiboperationen: 5–10 % Overhead
- CPU-Auslastung: 1–3 % Anstieg
- AES-NI reduziert die Auswirkung
- Planen Sie die Erstverschlüsselung während Wartungsfenstern
- Überwachen Sie CPU und E/A während der Verschlüsselung
- Verwenden Sie AES-NI-fähige Prozessoren für beste Leistung
- Stellen Sie ausreichend tempdb-Speicherplatz sicher
Mehrere Datenbanken verschlüsseln
Verwenden Sie ein Skript, um mehrere Datenbanken gleichzeitig zu verschlüsseln:
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;
GOVerschlüsselung deaktivieren
Das Deaktivieren der Verschlüsselung entschlüsselt die Datenbank, was bei großen Datenbanken erhebliche Zeit in Anspruch nehmen kann.
-- 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;
GOBest Practices
Sicherheit
Datenbanken frühzeitig verschlüsseln, Sicherungsschlüssel schützen, Schlüsselzugriff prüfen
Betrieb
Vor der Produktion testen, Leistung überwachen, für Wachstum planen
Wartung
Regelmäßige Sicherungen, Wiederherstellungen testen, DuoKey zugänglich halten