在另一台服务器上恢复加密数据库(使用备份加密)

got*_*tqn 6 sql-server backup encryption sql-server-2014

我在同一台机器上有两个 SQL Server 实例。我想在其中一个数据库上创建加密备份,然后在第二个实例上还原它。我正在执行以下步骤:

  1. master将用于加密我们的证书的数据库中创建和备份数据库主密钥

    USE MASTER;
    GO
    
    CREATE MASTER KEY
    ENCRYPTION BY PASSWORD = 'MasterKey_Password';
    GO
    
    BACKUP MASTER KEY
    TO FILE = 'E:\GKKeys\MASTER_KEY.key'
    ENCRYPTION BY PASSWORD = 'MasterKey_BACKUP_Password';
    GO
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建并备份将用于加密的证书:

    USE MASTER;
    GO
    
    -- ????????? ??????????, ????? ?? ????????? ?? ?????????? ?? backup-a
    CREATE CERTIFICATE BackupEncryptTestCert
    WITH SUBJECT = 'smGK_BackupCertificate'
    GO
    
    BACKUP CERTIFICATE BackupEncryptTestCert
    TO FILE = 'E:\GKKeys\SMGK_BACKUP_CERTIFICATE.cer'
    WITH PRIVATE KEY
    (
        FILE = 'E:\GKKeys\SMGK_BACKUP_CERTIFICATE_PRIVATE_KEY.key'
       ,ENCRYPTION BY PASSWORD = 'smGK_BackupCertificate_BACKUP_Password'
    );
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建备份:

    BACKUP DATABASE smGK
    TO DISK = 'E:\GKKeys\smGKFULLEncrtypted.back'
    WITH COMPRESSION, STATS = 10, ENCRYPTION (ALGORITHM = AES_256,SERVER CERTIFICATE = BackupEncryptTestCert)
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在在第二个实例中,我想恢复master key但不允许:

    USE MASTER;
    GO
    
    RESTORE MASTER KEY
    FROM FILE = 'E:\GKKeys\MASTER_KEY.key'
    DECRYPTION BY PASSWORD = 'MasterKey_BACKUP_Password'
    ENCRYPTION BY PASSWORD = 'smGK_MasterKeyPassword';
    
    Run Code Online (Sandbox Code Playgroud)

    消息 15317,级别 16,状态 2,第 4 行 主密钥文件不存在或格式无效。

谁能告诉这是什么原因造成的?

Microsoft SQL Server 2014 - 12.0.4100.1 (X64) 
    2015 年 4 月 20 日 17:29:27 
    版权所有 (c) 微软公司
    企业版:基于核心的许可(64 位) 
    Windows NT 6.3(内部版本 9600:)(管理程序)

SQL*_*DBA 10

在您的第二个实例上创建一个全新的主密钥。即不要从您从第一个实例中获取的备份创建它。然后从备份中恢复证书,然后尝试。我猜你不需要主密钥,只需要证书来恢复。请按照以下步骤操作:

步骤 1:创建主密钥

CREATE MASTER KEY
ENCRYPTION BY PASSWORD = 'MasterKey_Password';
Run Code Online (Sandbox Code Playgroud)

步骤 2:验证对 cert 和 pvt 密钥的权限

确保第二个实例的 SQL Server 服务帐户对您创建的 cert 和 pvt 密钥具有完全权限。

Step3:从备份创建证书

CREATE CERTIFICATE BackupEncryptTestCert
    FROM FILE = 'E:\GKKeys\SMGK_BACKUP_CERTIFICATE.cer'
     WITH PRIVATE KEY 
      ( 
        FILE = 'E:\GKKeys\SMGK_BACKUP_CERTIFICATE_PRIVATE_KEY.key' ,
        DECRYPTION BY PASSWORD = 'smGK_BackupCertificate_BACKUP_Password'
      ) 
Run Code Online (Sandbox Code Playgroud)

Step4:恢复数据库


mar*_*ncy 7

我无法发表评论,但我想为此答案添加一些细节。

  • 数据库主密钥密码不需要在实例之间匹配
  • 当您备份证书时添加了私钥和密码,该私钥独立于现有的数据库主密钥。
  • 现在可以在具有数据库主密钥的任何其他实例上使用 .cert、.key 和私钥密码创建此证书(只要服务帐户具有 SQLPRODDBA 提到的权限)

SQLITY 关于备份证书的帖子

在 SQL Server 中,所有密钥始终受到密码或加密层次结构中的另一个密钥的保护。这也延伸到备份文件。由于备份文件旨在存储在站点中,因此 SQL Server 加密层次结构无法保护它们。因此,我们必须提供一个密码来保护密钥。