TDE使用的最佳实践

更新时间:
复制 MD 格式

RDS SQL Server支持透明数据加密(Transparent Data Encryption,简称TDE)功能增强数据保护,允许您使用阿里云自带密钥或用户自带密钥进行加密,但开启TDE后生成的备份自动加密且无法直接用于恢复。本文介绍如何开启TDE,并在两种不同加密场景下如何将开启了TDE的SQL Server数据库从阿里云RDS恢复到本地环境中。同时,若您开启TDE时使用了用户自带密钥的加密方式,也可参考本文场景二方案使用您自己配置的证书和密码恢复备份数据。

TDE加密原理

TDE功能通过在数据库层执行静态数据加密,阻止可能的攻击者绕过数据库直接从存储中读取敏感信息。经过数据库身份验证的应用和用户可以继续透明地访问应用数据(不需要更改应用代码或配置),而尝试读取表空间文件中的敏感数据的OS用户以及尝试读取磁盘或备份信息的未知用户将不允许访问明文数据。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功能的初衷。

开启或关闭TDE

开启TDE

前提条件

  • RDS SQL Server实例需满足以下要求:

    • 实例规格:通用型、独享型(不支持共享型)

    • 计费方式:包年包月或按量付费(不支持Serverless实例简介)

    • 实例大版本:SQL Server 2019 标准版、SQL Server 2022 标准版、SQL Server 2025 标准版、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使用率足够低,性能也不会受到太大影响。

使用限制

操作步骤

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

  2. 在左侧菜单栏中单击数据安全性。

  3. 在TDE页签单击未开通左边滑块。

    说明

    仅特定实例支持TDE功能,请参见前提条件。

  4. 选择密钥类型,单击确定,开通TDE。

    使用自动生成的密钥

    选中需要加密的数据库,单击图标,并单击确定。

    在TDE 设置对话框中,依次完成以下操作:

    1. 在可选数据库面板中勾选目标数据库(如 zht_ssl)。

    2. 单击中间的向右箭头>按钮,将所选数据库移至已保护数据库面板。

    3. 单击确定。

    使用自带SQL Server密钥加密
    1. 上传证书及私钥文件到OSS。具体操作,请参见上传文件。

      上传文件到 OSS 的建议:

      • 单个文件建议通过 OSS 控制台上传。

      • 多个文件建议采用断点续传方式并调用 OSS OpenAPI。

      • 可利用客户端形式上传文件到 OSS。

    2. 单击下一步,配置密钥相关参数。

      参数

      取值及说明

      OSS Bucket

      选择上传证书及私钥文件所在的OSS Bucket。

      证书

      选择您上传到OSS的证书文件。

      私钥

      选择您上传到OSS的私钥文件。

      密码

      输入您自有SQL Server密钥的密码。

    3. 单击下一步进入授权数据库。

      选中需要加密的数据库,单击图标,并单击确定。

      1. 在可选数据库面板中勾选需要加密的数据库(如 tb1 和 tb2)。

      2. 单击>按钮将所选数据库移至已保护数据库面板。

      3. 单击确定。

关闭TDE

说明
  • 如需解除单个或多个数据库级别的TDE加密,只需将目标数据库从已保护数据库列表中移除即可。

  • 如需关闭单个实例级别的TDE加密功能,需要将所有数据库从已保护数据库列表中移除,系统会自动关闭实例TDE功能。

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

  2. 在左侧菜单栏中单击数据安全性。

  3. 在TDE页签下,单击TDE设置。

  4. 在对话框右侧的已保护数据库中,选中需要解除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;

应用场景一:开启TDE(阿里云自动生成的密钥)后生成的备份恢复到本地

步骤一:关闭TDE

在RDS控制台实例详情页的数据安全性页面中,将想要备份的数据库从TDE功能中移除。

说明
  • 如需解除单个或多个数据库级别的TDE加密,只需将目标数据库从已保护数据库列表中移除即可。

  • 如需关闭单个实例级别的TDE加密功能,需要将所有数据库从已保护数据库列表中移除,系统会自动关闭实例TDE功能。

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

  2. 在左侧菜单栏中单击数据安全性。

  3. 在TDE页签下,单击TDE设置。

  4. 在对话框右侧的已保护数据库中,选中需要解除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;

步骤二:执行一次全量备份

关闭TDE后,还存在部分未解密的事务日志,此时下载的备份文件仍处于加密状态,无法直接用于恢复,因此在关闭TDE后还需再完成一次全量备份。更多信息,请参见Database Encryption in SQL Server 2008 Enterprise Edition。

您可以手动备份生成一个全量备份。具体操作,请参见手动备份SQL Server。

说明

手动发起备份时,可按需备份整个完整的实例、或仅备份指定数据库(仅备份机制为物理备份时)。

步骤三:下载备份并恢复到本地

在RDS实例详情页的备份恢复页面中将最新生成的全量备份下载到本地,再使用压缩包中的.bak文件自行恢复即可。下载方法,请参见下载备份。

应用场景二:开启TDE(自带SQL Server密钥)后生成的备份恢复到本地

您可以参考场景一方案关闭目标数据库的TDE功能,再进行全量备份并下载备份恢复到本地。本模块介绍另一种恢复方案,按需选择即可。

步骤一:创建主密钥

首先使用自定义的密码在目标服务器实例上的master库中创建数据库主密钥,密码无需与源服务器中用于创建主密钥的密码相同。

说明

本操作需要使用客户端连接RDS SQL Server实例。连接方法,请参见连接SQL Server实例。

以下SQL会先检查目标服务器实例中是否已存在主密钥,如果已存在则不会创建新的主密钥,您直接执行步骤二即可;如果不存在则会创建新密钥。

USE master; 
GO 
IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE symmetric_key_id = 101)
BEGIN
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'YourPassword'; --此处自定义密码
END;

步骤二:创建证书

使用开启TDE时自带的证书和私钥创建证书,并应用到目标服务器实例。

USE MASTER;
GO
CREATE CERTIFICATE TDE_Certificate
FROM FILE = 'C:\cert\tde_cert.cer' --此处修改为证书实际路径
WITH PRIVATE KEY (FILE = 'C:\cert\tde_privatekey.pvk', --此处修改为私钥实际路径
DECRYPTION BY PASSWORD = 'YourTDEPassword' ); --此处修改为实际密码

步骤三:下载备份并恢复到本地

在RDS实例详情页的备份恢复页面中找到目标备份集,将目标备份下载到本地,再使用压缩包中的.bak文件自行恢复即可。下载方法,请参见下载备份。

说明

将恢复数据到本地数据库时,如果遇到报错The media family on device '<backup file name>' is incorrectly formed. SQL Server cannot process this media family.,该报错是因为在高内核小版本的RDS SQL Server实例中,数据库开启TDE后生成的压缩备份文件可能采用了不向后兼容的新格式,导致在低内核小版本的本地SQL Server数据库上恢复时会报错。具体详情,请参见微软官方文档。

为避免此类报错,建议确保RDS SQL Server实例与本地SQL Server数据库的大版本与小版本都保持一致。您可以在RDS实例详情页的基本信息页面查看RDS SQL Server实例的版本信息。

相关文档

RDS SQL Server支持的其他加密方式,请参见数据安全与加密。