设置透明数据加密TDE

更新时间:
复制 MD 格式

在安全合规或静态数据加密等场景下,推荐使用透明数据加密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实例搭建好时创建,用于保护较低级别的密钥和数据。

SMKDPAPI所保护,并用于保护数据库主密钥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库中。

DEKMaster库中的证书保护,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 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使用率足够低,性能也不会受到太大影响。

使用限制

开启TDE

  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;

相关文档