BACKUP MASTER KEY, bei dem ein Fehler auftritt, kann den symmetrischen Hauptschlüssel nicht finden, da er nicht vorhanden ist

8

Ich versuche, den Hauptschlüssel für eine TDE-Datenbank zu sichern, aber SQL Server gibt an, dass es keinen gibt. Es ist ein bisschen komisch, aber ich bin sicher, ich mache nur etwas falsch. Ich bin Systemadministrator auf dem Server, daher sollte ich alles sehen können.

Dies ist die Aussage, die fehlschlägt:

USE [my_db];
BACKUP MASTER KEY
TO FILE = 'C:\master_key'
ENCRYPTION BY PASSWORD = 'some_killer_password';

Und die Fehlermeldung gab zurück:

Meldung 15151, Ebene 16, Status 1, Zeile 11
Der symmetrische Schlüssel 'Hauptschlüssel' kann nicht gefunden werden, da er nicht vorhanden ist oder Sie keine Berechtigung haben.

Ich habe Folgendes verwendet, um die Details zum Datenbankverschlüsselungsschlüssel und zum zugehörigen Zertifikat anzuzeigen. Die Zertifikatdetails aus der sys.certificatesTabelle sind jedoch leer.

USE [my_db];
SELECT DatabaseName = d.name
    , ddek.encryptor_type
    , ddek.opened_date
    , c.name
    , c.cert_serial_number
    , c.pvt_key_encryption_type_desc
    , c.subject
FROM sys.dm_database_encryption_keys ddek
    INNER JOIN sys.databases d ON ddek.database_id = d.database_id
    LEFT JOIN sys.certificates c ON ddek.encryptor_thumbprint = c.thumbprint
WHERE d.name <> 'tempdb' /* tempdb is auto-encrypted by SQL Server */
╔══════════════╦════════════════╦═════════════════ ════════╦══════╦════════════════════╦═════════════ ═════════════════╦═════════╗
║ DatabaseName ║ encryptor_type ║ open_date ║ name ║ cert_serial_number ║ pvt_key_encryption_type_desc ║ subject ║
╠══════════════╬════════════════╬═════════════════ ════════╬══════╬════════════════════╬═════════════ ═════════════════╬═════════╣
║ my_db ║ CERTIFICATE ║ 2017-09-20 11: 24: 13.590 ║ NULL ║ NULL ║ NULL ║ NULL ║
╚══════════════╩════════════════╩═════════════════ ════════╩══════╩════════════════════╩═════════════ ═════════════════╩═════════╝

Ich kann also den Datenbankverschlüsselungsschlüssel sehen [my_db]und sehen, dass er durch ein Zertifikat verschlüsselt ist, aber das Zertifikat existiert nicht?

Max Vernon
quelle

Antworten:

7

Das von TDE zum Verschlüsseln des Datenbankverschlüsselungsschlüssels verwendete Zertifikat wird tatsächlich in der masterDatenbank gespeichert, die wiederum von dem database master keyin der masterDatenbank gespeicherten verschlüsselt wird .

Die Abfrage, um festzustellen, welches Zertifikat zum Entschlüsseln der my_dbTDE-verschlüsselten Datenbank verwendet wird, sollte lauten:

SELECT DatabaseName = d.name
    , ddek.encryptor_type
    , ddek.opened_date
    , c.name
    , c.cert_serial_number
    , c.pvt_key_encryption_type_desc
    , c.subject
FROM sys.dm_database_encryption_keys ddek
    INNER JOIN sys.databases d ON ddek.database_id = d.database_id
    LEFT JOIN master.sys.certificates c ON ddek.encryptor_thumbprint = c.thumbprint
WHERE d.name <> 'tempdb' /* tempdb is auto-encrypted by SQL Server */

Beachten Sie, dass die einzige Änderung darin besteht, sys.certificatesin der masterDatenbank zu referenzieren .

Die Ergebnisse dieser Abfrage zeigen:

╔══════════════╦════════════════╦═════════════════ ════════╦════════════════════╦════════════════════ ╦══════════════════════════════╦══════════════════ ═════════╗
║ DatabaseName ║ encryptor_type ║ open_date ║ CertName ║ cert_serial_number ║ pvt_key_encryption_type_desc ║ Certsubject ║
╠══════════════╬════════════════╬═════════════════ ════════╬════════════════════╬════════════════════ ╬══════════════════════════════╬══════════════════ ═════════╣
║ my_db ║ CERTIFICATE ║ 2017-09-20 11: 24: 13.590 ║ db_encryption_cert ║ <redacted> ║ ENCRYPTED_BY_MASTER_KEY ║ DB-Verschlüsselungszertifikat ║
╚══════════════╩════════════════╩═════════════════ ════════╩════════════════════╩════════════════════ ╩══════════════════════════════╩══════════════════ ═════════╝

Beachten Sie, dass die Abfrage anzeigt, dass das Zertifikat ist ENCRYPTED_BY_MASTER_KEY- der Hauptschlüssel, auf den hier verwiesen wird, ist der Hauptschlüssel für die masterDatenbank.

Um my_dbauf einem anderen Server wiederherzustellen , müssen Sie das Zertifikat (mit seinem privaten Schlüssel) sichern, das zum Verschlüsseln der Datenbank verwendet wird, und es dann auf dem Ziel-SQL Server wiederherstellen.

Dies sollte auf dem SQL Server-Quellcode geschehen:

BACKUP CERTIFICATE db_encryption_cert
TO FILE = 'C:\db_encryption_cert'
WITH PRIVATE KEY (
    FILE = 'C:\db_encryption_cert_private_key'
    , ENCRYPTION BY PASSWORD = 'new private key password'
    );

Speichern Sie die resultierende Zertifikatdatei und den privaten Schlüssel sowie das Kennwort auf einem sicheren Dateisystem außerhalb des Unternehmens.

Dies sollte auf dem Ziel-SQL Server geschehen:

CREATE CERTIFICATE db_encryption_cert
FROM FILE = 'C:\db_encryption_cert'
WITH PRIVATE KEY (
    FILE = 'C:\db_encryption_cert_private_key'
    , DECRYPTION BY PASSWORD = 'new private key password'
    );

Sobald Sie das Zertifikat auf dem Zielserver erstellt haben, sollten Sie in der Lage sein, die Datenbank ohne Probleme wiederherzustellen.

Wenn Sie sich auf die Notfallwiederherstellung vorbereiten und beabsichtigen, die Master-Datenbank des SQL Server-Quellcode usw. wiederherstellen zu können, sollten Sie auch den Service-Master-Schlüssel und den Master-Datenbank-Master-Schlüssel sichern:

USE master;
GO
BACKUP SERVICE MASTER KEY 
TO FILE = 'C:\service_master_key'
ENCRYPTION BY PASSWORD = 'new service master key password';

BACKUP MASTER KEY
TO FILE = 'C:\master_database_master_key'
ENCRYPTION BY PASSWORD = 'new master database master key password';

Diese Schlüssel und die zugehörigen Verschlüsselungskennwörter sollten an einem sicheren Ort außerhalb des Standorts gespeichert werden.

Max Vernon
quelle
Hallo Max. Danke für die tolle Erklärung. Wissen Sie zufällig auch, ob die Datenbank mit AES 256 verschlüsselt ist, ob der symmetrische Schlüssel als Teil der Datenbank gespeichert ist und ob dieser verschlüsselte symmetrische Schlüssel auch in Sicherungen gespeichert ist?
Dave Goldsmith
TDE-Verschlüsselungsschlüssel werden in der Master-Datenbank gespeichert. Dies schließt alle Sicherungen der Master-Datenbank ein. Having said that, ist der Schlüssel in der Master - Datenbank selbst durch den Diensthauptschlüssel verschlüsselt , die sich nicht in einer SQL - Server - Backup gesichert.
Max Vernon