我们有一个带有主实例和辅助实例的 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 中备份和恢复服务主密钥.
https://www.sqlshack.com/column-level-sql-server-encryption-with-sql-server-always-on-availability-groups/ https://www.sqlshack.com/column-level-sql-server-encryption-with-sql-server-always-on-availability-groups/
我确实尝试从主实例备份服务主密钥,以便可以将其恢复到辅助实例,但我看不到在 Azure SQL 托管实例中执行此导出的方法 -https://learn.microsoft.com/en-us/sql/t-sql/statements/backup-service-master-key-transact-sql?view=sql-server-ver15 https://learn.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;
这就是我现在的情况。希望我只是错过了一个简单的步骤——这肯定不是一个不常见的情况吗? IE。如果故障转移组中有 Azure SQL 托管实例,并且采用列级加密,其中数据库主密钥由服务主密钥加密,那么如何配置以便可以在主实例和辅助实例上解密数据?
我想为此工作,您需要能够从主实例备份服务主密钥并将其恢复到辅助实例 - 这在 Azure 中可能吗?