【发布时间】:2021-03-04 10:04:35
【问题描述】:
我们有一个带有主实例和辅助实例的 Azure SQL 托管实例故障转移组设置——我遇到的问题是我们对一些数据库表列使用单元(列)级加密 (CLE)。我有限的理解是这些的解密取决于服务主密钥。我认为问题在于数据库主密钥使用服务主密钥加密,然后数据库在实例之间同步,但同步不会执行服务器(实例)级别的数据,即服务主密钥……等等实例数据可以解密,但在故障转移实例上它不能。因此,您会收到如下错误:
在执行此操作之前,请在数据库中创建主密钥或在会话中打开主密钥。
如果我在我的用户数据库上运行以下 SQL,它将解决问题,直到我进行故障转移,此时我需要再次运行它。所以从故障转移的角度来看并不理想,也意味着我不能将辅助实例用作只读实例。
OPEN MASTER KEY DECRYPTION BY PASSWORD = ‘XXX’
ALTER MASTER KEY DROP ENCRYPTION BY SERVICE MASTER KEY
OPEN MASTER KEY DECRYPTION BY PASSWORD = ‘XXX'
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
下面是我能找到的唯一一篇描述问题的文章(滚动到最后,上面写着“解密新主副本中的数据”),它通过从主实例备份服务主密钥并恢复来解决问题它到辅助实例,但它是与我们的 Azure 设置相比的本地设置,问题是 我不知道如何(或什至可能)对服务主密钥进行备份和恢复天蓝色。
我确实尝试从主实例备份服务主密钥,以便可以将其还原到辅助实例,但我看不到在 Azure SQL 托管实例中执行此导出的方法 - https://docs.microsoft.com/en-us/sql/t-sql/statements/backup-service-master-key-transact-sql?view=sql-server-ver15 ...我尝试提供它的 blob 存储位置有点牵强,它不喜欢它:
BACKUP SERVICE MASTER KEY TO FILE = 'https://ourstorage.blob.core.windows.net/database-backups/service_master_key.key' ENCRYPTION BY PASSWORD = 'YYYY';
消息 3078,第 16 级,状态 2,第 69 行 文件名“https://pptefsaaseprd.blob.core.windows.net/database-backups/ase_prod_service_master_key”作为指定设备类型的备份设备名称无效。使用有效的文件名和设备类型重新发出 BACKUP 语句。
我听说过可能改用 Azure Key Vault,但找不到任何示例,理想情况下不希望对代码/sql 造成任何重大更改。
为了提供更多上下文,我们当前的存储过程执行以下操作:
OPEN SYMMETRIC KEY SSN_Key_Surname
DECRYPTION BY CERTIFICATE Surname;
/* SQL making use of the decrypted column */
CLOSE SYMMETRIC KEY SSN_Key_Surname;
所以这就是我所在的位置。希望我只是错过了一个简单的步骤——这肯定不是罕见的情况吗?即如果您在故障转移组中有 Azure SQL 托管实例,并使用列级加密,其中数据库主密钥由服务主密钥加密,您如何配置以便可以在主实例和辅助实例上解密数据?
我想,要实现这一点,您需要能够从主实例备份服务主密钥并将其还原到辅助实例 - 这在 Azure 中可行吗?
【问题讨论】:
标签: azure encryption database-replication failover azure-sql-managed-instance