原文地址:https://severalnines.com/database-blog/enabling-transparent-data-encryption-for-sql-server
原文作者:Rajendra Gupta
近年来,数据加密作为保护组织机构内数据的最有效方法之一而广受欢迎。数据加密的工作原理是将数据转换为不可读的格式(称为密文),从而保护数据。将数据转换为密文的过程就是所谓的加密。
这个术语“加密”本身非常广泛。其中一种方法是对数据库中的敏感数据进行加密,并使用证书来保护密钥。这种方法可确保没有密钥的人无法访问数据库。但是这种保护方式必须提前计划才有效。
透明数据加密 (TDE)也称为加密静态数据,是一个当数据处于静态时,保护或加密数据的过程。这是一个可以加密数据文件和日志文件的功能强大的工具。此加密技术需要用到证书。证书专用于保护DEK或数据库加密密钥,此密钥是作为私钥,用来解密已经加密的信息。
此框架为数据、日志和备份文件提供加密,这在许多场景下至关重要,特别是对于力求遵守和存储敏感客户数据相关的各种法律法规的软件工程师来说。TDE允许软件开发人员通过完全加密数据来提供端到端加密,而无需更改其现有代码以遵守特定行业中存在的许多规则。
注:以下SQLServer Linux版本支持TDE:标准版、企业版和开发人员版。
Linux上SQLServer的透明数据加密
数据库的加密要求在将数据库页写入磁盘之前对其进行加密。同样,数据库页应解密到内存中。TDE不会因加密或解密的引入而增加任何内存大小,也不会显著影响读取或写入已加密数据库的访问速度(3-5%开销)。下图展示了数据库中透明数据加密的架构(TDE)。数据库级项目(如数据库加密密钥、ALTER DATABASE语句和某些内部系统程序)是用户可配置级别的。
图片来源点这里:微软文档
Linux上为SQLServer配置TDE的步骤
如下脚本会执行相应的任务:
1. 创建主密钥
首先,我们在Master数据库中创建主密钥。接下来我们将使用“USE MASTER”命令来实现,因为我们无法把密钥添加到用户数据库。
USE master;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<UseStrongPasswordHere>';
2. 创建受主密钥保护的证书
一旦我们创建并记住强口令或将其保存在安全位置,就可以继续创建实际的证书,以便我们用它连接到服务器。
CREATE CERTIFICATE MyServerCert WITH SUBJECT = 'My DEK Certificate';
go
3. 创建数据库加密密钥
-
接下来,我们会用“USE”命令切换到想要加密的数据库。在执行此命令以后,会在我们已经创建的证书和其指定的数据库之间建立相应的连接或关联。
-
在此步骤之后,我们必须指出打算用于所选数据库的加密算法的类型;这种情况下,它是AES_256加密。同样,在大多数场景下,也推荐使用AES_256。
USE AdventureWorks2012;
GO
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_256
ENCRYPTION BY SERVER CERTIFICATE MyServerCert;
GO
4.启用加密
当我们准备好所有加密选项后,只需要用“ALTER DATABASE”命令将这些选项应用到数据库即可。
ALTER DATABASE AdventureWorks2012
SET ENCRYPTION ON;
GO
在数据库上启用透明数据加密(TDE)前,SQLServer必须执行一次加密扫描。此次扫描会将数据文件中的每个页面读取到缓冲池中,然后再把已经加密的页面写回到磁盘里。
SQLServer 2019(15.x)引入了一项名为TDE暂停和恢复的新功能。此功能允许我们在需要时恢复或暂停扫描。如果扫描被挂起,也允许数据库继续运行且不会降低速度。
- 暂停TDE加密扫描的脚本:
ALTER DATABASE <db_name> SET ENCRYPTION SUSPEND;
- 恢复TDE加密扫描的脚本:
ALTER DATABASE <db_name> SET ENCRYPTION RESUME;
TDE和Tempdb系统数据库
如果SQLServer实例上的任何其他数据库已用TDE加密,那么tempdb数据库也会被加密。加密操作可能会对那些未加密的数据库造成一定的性能影响。
注: 在TDE中,数据库中的所有文件和文件组都是加密的。如果某个数据库中的任何文件组被标记为只读,则此数据库加密操作失败。
备份证书
将已创建证书的副本保存在安全位置是至关重要的。如果服务器宕机,备份站点需要在为客户提供服务之前,先导入此证书。假设DR服务器已启动并处于热备份状态。在这种情况下,我们建议提前自动导入已保存的证书,这样做的好处是,如果硬件出现了什么问题,也能顺利运行,不会因此中断。
以下脚本会将证书及其私钥备份在C:\Temp目录上。
BACKUP CERTIFICATE MyServerCert
TO FILE = 'C:\temp\MyServerCert'
WITH PRIVATE KEY (file='C:\temp\MyServerCert.pvk',
ENCRYPTION BY PASSWORD='StrongPassword')
删除TDE
从数据库中删除透明数据加密,请使用以下SQL脚本。
ALTER DATABASE <db_name> SET ENCRYPTION OFF;
结束语
透明数据加密(TDE)是SQLServer一项强大的功能,它允许您加密数据文件和事务日志,以防止物理盗窃或未经授权的访问。尤其是在当今形势下,此功能对于遵守法律法规以及保护组织免受网络间谍活动至关重要。您是否知道ClusterControl现在支持SQLServer?立即开始 30天免费试用并下载ClusterControl,一起来亲身体验功能强大的数据库自动化平台吧。