在安全合规或静态数据加密等场景下,推荐使用透明数据加密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(高性能本地盘)升级为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使用的最佳实践。