【问题标题】:Encryption with an AlwaysOn cluster使用 AlwaysOn 集群进行加密
【发布时间】:2015-09-02 18:35:37
【问题描述】:

我有一个数据库从旧的 SQL Server 2008R2 实例移到 SQL Server 2012 AlwaysOn 集群中。数据库中有几个字段使用 SQL Server 内置加密功能(主密钥、证书、对称密钥)进行加密。

我在我的 QA AO 实例上运行了以下命令(与在旧服务器上运行的步骤相同):

 CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password'

 CREATE CERTIFICATE myCert  
    WITH SUBJECT = 'password'

 CREATE SYMMETRIC KEY myKeyName    
    WITH ALGORITHM = TRIPLE_DES 
    ENCRYPTION BY CERTIFICATE myCert 

此外,我必须运行以下命令才能正确解密数据:

 OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password'
 ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY

当我运行此命令时,我会看到所有数据都已解密:

OPEN SYMMETRIC KEY myKeyName
DECRYPTION BY CERTIFICATE myCert 
select TOP 1000 userid, CONVERT(nVARCHAR(255),DECRYPTBYKEY(password)) from  users
CLOSE SYMMETRIC KEY myKeyName

到目前为止一切顺利。但是,如果我在生产 AO 集群上运行这些相同的步骤,则此查询:

select TOP 1000 userid, CONVERT(nVARCHAR(255),DECRYPTBYKEY(password)) from  users

返回 NULL 作为密码。为了让这更令人抓狂,这个语句(在 QA 环境的上下文中运行)很好地解密了两个数据库中的所有内容:

 OPEN SYMMETRIC KEY myKeyName
 DECRYPTION BY CERTIFICATE myCert 

 SELECT TOP 1000 
    userid, 
    CONVERT(nVARCHAR(255),DECRYPTBYKEY(password)) 
 FROM users

 SELECT TOP 1000 
    userid, 
    CONVERT(nVARCHAR(255),DECRYPTBYKEY(password))  
 FROM PRODUCTIONAO.prod_database.dbo.users

 CLOSE SYMMETRIC KEY myKeyName

我不确定为什么这适用于我的 QA 实例,但不适用于我的生产实例。任何帮助将不胜感激!

【问题讨论】:

  • 您的 QA 盒子和 Prod 盒子有什么区别?都是在同一个硬件上吗?相同的操作系统?相同的服务包等?
  • 它们是不同的AO Cluster,但是每个cluster中的两台机器是相同的。这些机器是虚拟的。
  • 为你添加了另一个答案。

标签: sql-server encryption alwayson


【解决方案1】:

您最后一次查询有效的原因是您使用 QA 实例的密钥/证书来解密生产数据。在 QA 中,您可以使用数据库主密钥 (DMK) 自动解密证书,因为它由 QA 服务主密钥 (SMK) 加密,如下所示:

服务主密钥 (QA) 数据库主密钥 (QA) 证书(质量保证) 对称密钥 (QA) 数据(产品)

在 prod 中,您有不同的 SMK,因此打开 DMK 的唯一选项是使用密码。您似乎在 QA 环境中运行了以下内容,但在 prod 中没有:

/* Add service master key encryption to the database master key */
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password'
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY

在产品中试试这个:

OPEN MASTER KEY DECRYPTION BY PASSWORD = 'password'
OPEN SYMMETRIC KEY myKeyName
DECRYPTION BY CERTIFICATE myCert 
select TOP 1000 userid, CONVERT(nVARCHAR(255),DECRYPTBYKEY(password)) from users
CLOSE SYMMETRIC KEY myKeyName

如果返回数据,您需要将 SMK 加密添加到生产中的 DMK(第一个脚本)。另一种选择是从源实例备份 SMK 并在辅助实例上恢复它。我只建议在实例是故障转移伙伴并且两者都在同一环境中的 HA 用例中使用此方法。在 QA 和 prod 之间共享 SMK 是一种不好的做法。

【讨论】:

    【解决方案2】:

    创建数据库主密钥时,服务器会保存 2 个版本的密钥。一个版本由主服务密钥加密,默认情况下由服务器使用。第二个版本由您在创建数据库主密钥时提供给服务器的密码加密。通常不使用此版本。当您将数据库移动到不同的环境(在您的情况下为生产环境)时,新服务器具有不同的主服务密钥。由于它不是用于加密数据库主密钥的服务密钥,因此也不能用于打开数据库的主密钥。这是您应该使用用您的密码加密的版本的地方。您需要使用密码打开主密钥,然后使用新的服务密钥对其进行加密并关闭它。完成此操作后,数据库的主密钥可以与主服务密钥一起使用,因此您无需再次这样做。

    步骤/代码:

    通过密码打开主密钥解密 = 'WriteYouOriginalPasswordHere'

    alter master key add encryption by service master key

    关闭主密钥

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 2016-07-12
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 2016-06-11
      相关资源
      最近更新 更多