在安全合规或静态数据加密等场景下,推荐使用透明数据加密TDE(Transparent Data Encryption)功能,对数据文件执行实时I/O加密和解密,确保敏感数据在写入磁盘之前进行加密,从磁盘读入内存时进行解密,阻止可能的攻击者绕过数据库直接从存储中读取敏感信息,有效提高数据库中敏感数据的安全性。使用TDE功能不会增加数据文件的大小,开发人员无需更改任何应用程序。
TDE加密原理
TDE加密在计算机各个层级的体现大致如下:
操作系统层
Microsoft Data Protection API(DPAPI)是Windows操作系统中的一个API,它提供了加密和解密数据的服务,且用户无需直接处理加密密钥和算法的细节。
DPAPI位于TDE整体加密层级的根部,负责在计算机操作系统级别保护密钥层次结构,并用于保护数据库服务器实例的服务主密钥(SMK)。
SQL Server实例层
在SQL Server中,服务主密钥(Service Master Key,简称SMK)是数据库引擎使用的一种高级加密密钥。它是SQL Server数据库引擎的根级密钥,在SQL Server实例搭建好时创建,用于保护较低级别的密钥和数据。
SMK被DPAPI所保护,并用于保护数据库主密钥DMK。
数据库层
TDE在数据库这一层级的加密可再细分为Master库和User库两层。
Master库
在使用TDE时,会在Master库中创建一个数据库主密钥(Database Master Key,DMK),并使用该DMK创建一个证书,二者均被存储在Master库中。
DMK是用来保护数据库中敏感信息的一个对称密钥,它被SMK所保护,并用来加密证书。Master库中的证书则用来对User库中的DEK进行加密。
User库
User库中将创建一个仅作用于TDE的新密钥,称为数据库加密密钥(Database Encryption Key,DEK),它被存储在User库中。
DEK被Master库中的证书保护,DEK所在的整个User库中的数据都会被该DEK加密保护。数据写入过程中,被证书加密后的DEK存储在数据库中,而未加密的DEK只存在于内存中,用于实时加密和解密数据文件;数据读取过程中,SQL Server使用证书的私钥来解密存储在数据库中的加密DEK,解密后的DEK被加载到内存中,用于实时解密数据文件中的数据,这一过程对于应用程序和用户是透明的。
当Master库中没有TDE证书时,将无法解密DEK,从而导致启用TDE的数据库无法通过备份或附加恢复到实例上,这也是TDE功能的初衷。
前提条件
RDS SQL Server实例需满足以下要求:
实例规格:通用型、独享型(不支持共享型)
计费方式:包年包月或按量付费(不支持Serverless实例)
实例大版本:SQL Server 2019 标准版、SQL Server 2022 标准版、SQL Server 企业版
说明不支持SQL Server只读实例。
如果您使用自有密钥,请提前准备加密证书、私钥以及密码。
已使用阿里云主账号授权RDS访问密钥管理服务KMS(Key Management Service)。详情请参见授权RDS访问KMS。
注意事项
如果您使用阿里云提供的服务密钥,开通TDE后生成的备份不能直接恢复到本地。您可以参见TDE使用的最佳实践教程内的方案解决。
开启TDE后,会对数据库性能产生一定影响。具体体现如下:
性能影响范围:根据微软官方文档,TDE对数据库总体性能影响约在3~5%之间。
内存中数据的影响较小:如果访问的大部分数据已经被存储在内存中,TDE对性能的影响会明显降低。
CPU使用率和I/O的影响:TDE加密是一个CPU密集型过程,且在I/O上执行。
当服务器或应用程序的I/O操作较少(低I/O负载)且CPU使用率本就不高时,TDE带来的性能下降会较小;相反对于高CPU使用率的应用程序而言,启用TDE将产生较大的性能损失(估计约为28%)。
因此即使是高I/O的应用程序或服务器,如果CPU使用率足够低,性能也不会受到太大影响。
使用限制
开启了TDE的实例不支持2008 R2(本地SSD盘)升级为2012或2016、升级内核小版本操作。
开启了TDE的实例创建的备份数据,无法用于重建恢复。
开启TDE
访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
在左侧菜单栏中单击数据安全性。
在TDE页签单击未开通左边滑块。
说明仅特定实例支持TDE功能,请参见前提条件。
选择密钥类型,单击确定,开通TDE。
使用由阿里云自动生成的密钥
选中需要加密的数据库,单击图标,并单击确定。
使用自带SQL Server密钥加密
上传证书及私钥文件到OSS。具体操作,请参见控制台上传文件。
单击下一步,配置密钥相关参数。
参数
取值及说明
OSS Bucket
选择上传证书及私钥文件所在的OSS Bucket。
证书
选择您上传到OSS的证书文件。
私钥
选择您上传到OSS的私钥文件。
密码
输入您自有SQL Server密钥的密码。
单击下一步进入授权数据库。
选中需要加密的数据库,单击图标,并单击确定。
关闭TDE
如需解除单个或多个数据库级别的TDE加密,只需将目标数据库从已保护数据库列表中移除即可。
如需关闭单个实例级别的TDE加密功能,需要将所有数据库从已保护数据库列表中移除,系统会自动关闭实例TDE功能。
访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
在左侧菜单栏中单击数据安全性。
在TDE页签下,单击TDE设置。
在对话框右侧的已保护数据库中,选中需要解除TDE加密的数据库,单击图标,并单击确定。
关闭TDE功能涉及到数据库的多个操作,包括等待上一次备份完成、数据解密、日志记录、元数据更新等。特别是数据解密操作,作为一个资源密集型操作,它会显著占用CPU、内存和I/O资源,该操作所耗费的时间与数据量成正比,因此拥有大规模数据的数据库在关闭TDE功能时可能耗时较长(例如数据库含有200 GB左右数据时,关闭TDE所需时间可能在40分钟以上)。
若您在关闭TDE后想要查看当前TDE解密的进度,可以使用如下T-SQL:
SELECT
db_name(database_id) AS DatabaseName,
encryption_state,
percent_complete
FROM
sys.dm_database_encryption_keys;
相关文档
您还可以使用API开启透明数据加密,请参见ModifyDBInstanceTDE。
如果您还需要对实例访问链路进行加密,可以开启SSL链路加密,请参见设置SSL加密。
如需将开启了TDE后生成的备份恢复到本地,请参见TDE使用的最佳实践。