当前位置:首页 > 问答 > 正文

SQL Server里头那些加密和密钥的事儿,怎么管理才靠谱一点

在SQL Server里头,数据安全是天大的事,尤其是里面存了用户密码、身份证号、银行卡号这些敏感信息的时候,加密就是给这些数据上了一把结实的锁,但光有锁不行,钥匙怎么管更重要,钥匙丢了或者被不该拿的人拿到了,那再好的锁也白搭,今天咱们就专门聊聊SQL Server里这些“锁”和“钥匙”该怎么管才算靠谱。

你得知道SQL Server的加密是分层的,就像一个大保险箱里面套着小铁盒,小铁盒里还有个带锁的日记本,这个设计就是为了安全,一层破了还有下一层,这个分层结构的最顶层,也就是整个加密体系的基石,叫做服务主密钥(Service Master Key, SMK),根据微软官方文档的描述,这个密钥是自动生成的,当你安装SQL Server实例的时候就创建好了,它的主要工作是保护这个实例下面所有的数据库主密钥,它自己本身则被Windows的数据保护API(DPAPI)来加密保护,DPAPI是Windows操作系统层面的一个东西,跟你的Windows账号密码有关系,简单理解就是,SMK是“总管的大钥匙”,由Windows系统帮忙看着,你一般不用直接动它,但一定要确保SQL Server服务账号有足够的权限,并且定期给它做个备份,备份SMK的命令是BACKUP SERVICE MASTER KEY,你得把这个备份文件放到一个极其安全的地方,比如另一个安全的服务器或者离线存储上,万一服务器彻底崩溃了,重建实例后可以用RESTORE SERVICE MASTER KEY把这把“总管钥匙”恢复回来。

SQL Server里头那些加密和密钥的事儿,怎么管理才靠谱一点

在服务主密钥下面一层,是数据库主密钥(Database Master Key, DMK),每个需要加密的数据库都应该创建自己的DMK,它是由SMK加密后存储在数据库里的,它的职责是保护这个数据库里其他的密钥,比如证书或者非对称密钥,创建DMK的时候,你需要设置一个密码,这里有个关键点:除了用密码保护,你最好也让它被SMK自动加密,这样的话,SQL Server实例上的服务就能在需要的时候自动打开DMK,不然每次使用前都得手动输入密码,非常麻烦,备份DMK同样至关重要,命令是BACKUP MASTER KEY,同样要妥善保管备份文件和密码。

再往下,就是实际用来加密数据的密钥了,主要有两种选择:证书(Certificate)对称密钥(Symmetric Key),证书是非对称加密,有一对钥匙,公钥和私钥,加密解密速度慢但更安全,通常用来保护更下一层的对称密钥,而对称密钥就像我们平常的一把钥匙,既能锁门也能开门,加解密速度快,适合用来加密大量的数据,在实际操作中,一个很常见的、也是微软推荐的最佳实践是:使用由DMK保护的证书,再去保护一个对称密钥,最后用这个对称密钥来加密表中的数据列(这叫列级加密),这样既保证了性能,又兼顾了安全性。

SQL Server里头那些加密和密钥的事儿,怎么管理才靠谱一点

知道了这些“家伙事儿”都是啥,接下来就是怎么管才靠谱的实操建议了:

  1. 备份是第一生命线! 上面已经强调了,SMK和每个数据库的DMK都必须备份,而且不能只备份一次,任何时候重新生成或者更改了这些主密钥,都必须立即重新备份,备份文件要和数据库的备份分开存放,最好有独立的、权限控制更严格的存储位置,想象一下,你数据库备份和钥匙备份放在同一个地方,那坏人一锅端就全完了。

    SQL Server里头那些加密和密钥的事儿,怎么管理才靠谱一点

  2. 严格控制访问权限。 不是每个能连上数据库的人都需要能接触密钥,在SQL Server里,对密钥的备份、还原、创建等操作需要很高的权限,比如CONTROL权限,一定要遵循最小权限原则,只给极少数真正需要的管理员账号授权,绝对不能把sa账号或者拥有高级权限的账号随便用在应用程序的连接字符串里。

  3. 定期轮换密钥。 好的安全策略不能一把钥匙用一辈子,应该定期(比如每年)更换你的加密密钥,这里要注意,轮换密钥不是简单地把旧密钥删掉换个新的,因为那样之前用旧密钥加密的数据就解不开了,正确的做法是:创建一个新密钥,然后将数据从用旧密钥加密改为用新密钥重新加密,这个过程可能需要在业务低峰期分批进行,最后再安全地废弃旧密钥,对于对称密钥,轮换起来相对容易一些。

  4. 善用透明数据加密(TDE)。 如果你是想保护整个数据库文件(比如防止有人直接把数据库文件.mdf偷走),那么列级加密就有点麻烦了,这时候应该考虑透明数据加密(Transparent Data Encryption, TDE),TDE的作用是加密整个数据库的数据文件和日志文件,它在磁盘级别进行加密和解密,所以对应用程序来说是“透明”的,应用程序完全感觉不到加密的存在,启用TDE也需要一个证书,这个证书同样需要被DMK保护,并且这个证书的备份极其重要!因为如果你丢了TDE的证书,这个数据库就永远打不开了,连微软都救不回来,一旦启用TDE,立刻备份证书和关联的私钥。

  5. 把密码和连接字符串管好。 所有加密用的密码、应用程序连接数据库的字符串(里面可能包含访问密钥的权限),都不能硬编码在代码里,应该使用安全的秘密管理工具,比如Azure Key Vault、HashiCorp Vault,或者Windows凭据管理器等来存储和管理这些秘密。

在SQL Server里管理加密,核心思想就是“分层保护,管好钥匙”,服务主密钥和数据库主密钥是根基,必须备份妥当,实际加密数据优先考虑“证书+对称密钥”的组合以平衡安全与性能,通过严格的权限控制、定期密钥轮换和使用TDE等综合手段,才能构建一个比较靠谱的数据安全防护体系,最关键的是,永远不要低估备份的重要性,尤其是那些顶级主密钥和TDE证书的备份,它们是你的最后一道防线。 主要参考和综合自微软官方文档中关于SQL Server安全性和加密的相关章节,包括但不限于“加密层次结构”、“服务主密钥”、“数据库主密钥”、“透明数据加密”等主题的说明。)