web-dev-qa-db-de.com

Bitte erstellen Sie einen Hauptschlüssel in der Datenbank oder öffnen Sie den Hauptschlüssel in der Sitzung, bevor Sie diesen Vorgang ausführen

Ich erhalte den folgenden Fehler auf sekundären Replikaten, wenn ich versuche, eine verschlüsselte Sicherung wiederherzustellen, obwohl das Replikat über den Hauptschlüssel (dmk), den Diensthauptschlüssel, Zertifikate und private Schlüssel verfügt, die vom Ursprungs-/Primärserver, der die Sicherung generiert hat, wiederhergestellt wurden.

Msg 15581, Level 16, State 7, Line 137
Please create a master key in the database or open the master key in the session before performing this operation.
Msg 3013, Level 16, State 1, Line 137
VERIFY DATABASE is terminating abnormally.

Um den Fehler zu umgehen, öffne und schließe ich den Hauptschlüssel um die Operation wie z. Auf der Primärseite muss ich den Hauptschlüssel jedoch nicht öffnen und schließen, um die Operation auszuführen. 

OPEN MASTER KEY DECRYPTION BY PASSWORD = 'MyTest!M4st3rPass';
RESTORE VERIFYONLY FROM DISK = '\\FS1\SqlBackups\SQL01\SystemDbs\msdb_backup_2017_09_22_171915_6346240.bak' WITH FILE = 1, NOUNLOAD, NOREWIND;
CLOSE MASTER KEY ;

Ich glaube, das liegt daran, dass der Primärdatenbank die Sicherungshistorie mit dem Fingerabdruck der Verschlüsselung hat, aber ich frage mich, ob mir etwas anderes fehlt, das mit den Sekundärteilen zusammenhängt.

Da das Zertifikat jedoch auf den Sekundärdaten wiederhergestellt wird, weise ich es den SystemsDB Backup-Wartungsplanoptionen für die Sicherungsverschlüsselung zu. Der Job schlägt jedoch fehl, wenn die Überprüfungsoption aus demselben Grund aktiviert bleibt. 

Source: Back Up Database Task
Executing query "BACKUP DATABASE [master] TO  DISK = N'\\FS1\SqlBac...".: 50% complete
End Progress  
Error: 2017-09-22 17:08:09.28
Code: 0xC002F210
Source: Back Up Database Task Execute SQL Task
**Description**: Executing the query "declare @backupSetId as int  select @backupSetId =..." 
failed with the following error: "Please create a master key in the database or open the master key in the session before performing this operation.
VERIFY DATABASE is terminating abnormally.".
Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.
End Error 
4
Hiram

Fest.

Referenziert: https://docs.Microsoft.com/de-de/sql/relational-databases/security/encryption/sql-server-and-database-encryption-keys-database-engine

Dieser Absatz hat es verraten:

Die in der Systemdatenbank master gespeicherte Kopie des DMK wird bei jeder Änderung des DMK automatisch aktualisiert. Dieser Standardwert kann jedoch mit der Option DROP ENCRYPTION BY SERVICE MASTER KEY der Anweisung ALTER MASTER KEY geändert werden. Ein DMK, das nicht mit dem Diensthauptschlüssel verschlüsselt ist, muss mit der Anweisung OPEN MASTER KEY und einem Kennwort geöffnet werden.

Läuft folgendes auf meinen sekundären Knoten. 

  1. Zertifikat ablegen ...
  2. Hauptschlüssel ablegen
  3. Hauptschlüssel erstellen ...
  4. Zertifikat aus Datei erstellen ...

Nach der Überprüfung bei der Lösung angekommen.

--on primary, output: master 
select name from sys.databases where is_master_key_encrypted_by_server=1

--on secondary, output: nothing...
select name from sys.databases where is_master_key_encrypted_by_server=1

Ich dachte mir, wenn ich den Hauptschlüssel standardmäßig durch den Diensthauptschlüssel verschlüsseln lassen könnte, dann würde dies die Entschlüsselung automatisieren.

--on secondary
drop certificate [BackupCertWithPK]
drop master key

--Skipped restore master key from file.
--Instead, I ran create master key with password.
create master key encryption by password = 'MyTest!Mast3rP4ss';

--verify by open/close.
open master key decryption by password = 'MyTest!Mast3rP4ss';
close master key;

--proceed to restore/create cert from file.
create cerfiticate [BackupCertWithPK] 
from file = '\\FS1\SqlBackups\SQL1\Donot_delete_SQL1-Primary_BackupCertWithPK.cer' 
with private key (file = '\\FS1\SqlBackups\SQL1\Donot_delete_SQL1-Primary_BackupCertWithPK.key' , decryption by password = '[email protected]') ; 

Danach lief das oben nochmal ab.

--on secondary, output: master, now there was hope again!
select name from sys.databases where is_master_key_encrypted_by_server=1

Zum Schluss habe ich meinen Sicherungsjob erneut ausgeführt und die Optionen für Verify und Encryption erfolgreich festgelegt. Überprüfen Sie, ob der Schritt fehlgeschlagen ist, und Sie haben nicht aufgefordert, den Hauptschlüssel zu öffnen/schließen.

Das Folgende funktionierte einfach wie beabsichtigt, ohne den Hauptschlüssel öffnen/schließen zu müssen.

RESTORE VERIFYONLY FROM DISK = '\\FS1\SqlBackups\SQL01\SystemDbs\msdb_backup_2017_09_22_171915_6346240.bak' WITH FILE = 1, NOUNLOAD, NOREWIND;

Wohooo! Mission erfüllt. 

1
Hiram

Ich bin nicht sicher, ob Sie genau das suchen, aber die Bemerkungen zum OPEN MASTER KEY hatten etwas, das relevant schien.

Sie werden dies zu 100% nicht in der Produktion testen wollen, aber es scheint, dass Sie nach dem Öffnen des Hauptschlüssels die Option haben, dies nicht mit dem Befehl ALTER MASTER KEY REGENERATE zu verlangen.

Wenn der Datenbankhauptschlüssel mit dem Diensthauptschlüssel verschlüsselt wurde, es wird automatisch geöffnet, wenn es zur Entschlüsselung benötigt wird oder Verschlüsselung. In diesem Fall ist es nicht erforderlich, den OPEN MASTER .__ zu verwenden. KEY-Anweisung. 

Wenn eine Datenbank zum ersten Mal verbunden oder in einer .__ wiederhergestellt wird. neue Instanz von SQL Server, eine Kopie des Datenbankhauptschlüssels (vom Diensthauptschlüssel verschlüsselt) ist noch nicht auf dem Server gespeichert.

Sie müssen die OPEN MASTER KEY-Anweisung verwenden, um die Datenbank zu entschlüsseln Hauptschlüssel (DMK). Nachdem das DMK entschlüsselt wurde, haben Sie die Option Aktivieren der automatischen Entschlüsselung in der Zukunft mithilfe von ALTER MASTER KEY REGENERATE-Anweisung, um dem Server eine Kopie von .__ bereitzustellen. das DMK, verschlüsselt mit dem Diensthauptschlüssel (SMK). 

Wenn eine Datenbank von einer früheren Version aktualisiert wurde, sollte das DMK .__ sein. neu generiert, um den neueren AES-Algorithmus zu verwenden. Weitere Informationen zu das DMK regenerieren, siehe ALTER MASTER KEY (Transact-SQL). Die Zeit Die Aktualisierung des DMK-Schlüssels für die Aktualisierung auf AES hängt von der .__ ab. Anzahl der vom DMK geschützten Objekte. Generieren des DMK-Schlüssels in Ein Upgrade auf AES ist nur einmal erforderlich und hat keine Auswirkungen auf die Zukunft Regenerierungen als Teil einer Schlüsselrotationsstrategie.

https://docs.Microsoft.com/de-de/sql/t-sql/statements/open-master-key-transact-sql

0
ConstantineK

Ich hatte die gleiche Situation, aber anstatt das MDK neu zu erstellen, habe ich Folgendes ausgeführt, um das Problem zu beheben: ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY

0
Borogal