透明数据加密 (TDE)

适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW)

透明数据加密 (TDE) 可以加密 SQL Server、Azure SQL 数据库和 Azure Synapse Analytics 数据文件。 这种加密方式称为静态数据加密。

为了帮助保护用户数据库的安全,可以采取以下预防措施:

  • 设计安全的系统。
  • 对机密资产加密。
  • 在数据库服务器外围构建防火墙。

但恶意方如果窃取了硬盘或备份磁带等物理介质,就可以还原或附加数据库并浏览其数据。

一种解决方案是加密数据库中的敏感数据,并使用证书保护用于加密数据的密钥。 此解决方案可以防止没有密钥的人使用这些数据。 但必须提前规划好此类保护。

TDE 对数据和日志文件进行实时 I/O 加密和解密。 加密使用的是数据库加密密钥 (DEK)。 数据库启动记录存储该密钥,供还原时使用。 DEK 是对称密钥,由服务器的 master 数据库存储的证书或 EKM 模块所保护的非对称密钥提供保护。

TDE 保护静态数据,也就是数据和日志文件。 它让你可以遵循许多法律、法规和各个行业建立的准则。 借助此功能,软件开发人员可以使用 AES 和 3DES 加密算法来加密数据,且无需更改现有的应用程序。

注意

TDE 不适用于系统数据库。 不能用于加密 mastermodelmsdbtempdb 启用 TDE 但无法直接加密的用户数据库时,会自动加密。

TDE 不提供跨信道加密。 若要详细了解如何跨信道加密数据,请参阅配置 SQL Server 数据库引擎以加密连接

相关主题

关于 TDE

数据库文件加密在页面级执行。 已加密数据库中的页在写入磁盘之前会进行加密,在读入内存时会进行解密。 TDE 不会增加已加密数据库的大小。

适用于 SQL 数据库的信息

将 TDE 与 Azure SQL 数据库一起使用时, SQL 数据库将自动为你创建存储在 master 数据库中的服务器级别证书。 若要在 SQL 数据库上移动 TDE 数据库,无需为移动操作解密数据库。 有关将 TDE 与 SQL 数据库一起使用的详细信息,请参阅 Azure SQL 数据库的透明数据加密

适用于 SQL Server 的信息

保证数据库的安全后,可以使用正确的证书来还原数据库。 有关证书的详细信息,请参阅 SQL Server Certificates and Asymmetric Keys

启用 TDE 后,立即备份证书及其关联的私钥。 如果证书不可用,或者如果在另一台服务器上还原或附加数据库,则需要备份证书和私钥。 否则,将无法打开数据库。 还应备份存储在“包含的系统数据库”中的证书。

即使你在数据库上禁用了 TDE,也要保留加密证书。 虽然数据库未加密,但事务日志的某些部分仍可能受到保护。 在执行完整的数据库备份之前,某些操作可能还需要使用证书。

你仍可使用超过过期日期的证书来通过 TDE 加密和解密数据。

加密层次结构

Windows 数据保护 API (DPAPI) 位于加密树的根目录中,在计算机级别保护密钥层次结构,并用于保护数据库服务器实例的服务主密钥 (SMK) 。 SMK 保护存储在用户数据库级别的数据库主密钥 (DMK),并保护证书和非对称密钥。 这些密钥反过来又保护对称密钥,进而保护数据。 TDE 使用与证书类似的层次结构。 使用 TDE 时,DMK 和证书必须存储在 master 数据库中。 仅用于 TDE 且称为数据库加密密钥 (DEK) 的新密钥将在用户数据库中创建和存储。

下图显示了 TDE 加密体系结构。 在 SQL 数据库上使用 TDE 时,用户仅能配置数据库级项目(数据库加密密钥和 ALTER DATABASE 部分)。

显示透明数据加密体系结构的关系图。

启用 TDE

若要使用 TDE,请按以下步骤操作。

适用于: SQL Server。

  1. 创建主密钥。
  2. 创建或获取由主密钥保护的证书。
  3. 创建数据库加密密钥并使用此证书保护该密钥。
  4. 将数据库设置为使用加密。

下面的示例演示如何使用安装在服务器上的 MyServerCert 证书来加密和解密 AdventureWorks2022 数据库。

USE master;
GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<UseStrongPasswordHere>';
GO

CREATE CERTIFICATE MyServerCert
    WITH SUBJECT = 'My DEK Certificate';
GO

USE AdventureWorks2022;
GO

CREATE DATABASE ENCRYPTION KEY
    WITH ALGORITHM = AES_256
    ENCRYPTION BY SERVER CERTIFICATE MyServerCert;
GO

ALTER DATABASE AdventureWorks2022
    SET ENCRYPTION ON;
GO

加密和解密操作由 SQL Server 安排在后台线程中执行。 若要查看这些操作的状态,可以使用本文后面部分显示的表中的目录视图和动态管理视图。

注意

启用了 TDE 的数据库备份文件也使用 DEK 进行加密。 因此,在还原这些备份时,用于保护 DEK 的证书必须可用。 因此,除了备份数据库之外,一定要注意维护好服务器证书的备份。 如果证书不再可用,就会造成数据丢失。

有关详细信息,请参阅 SQL Server Certificates and Asymmetric Keys

命令和函数

对于接受 TDE 证书的以下语句,请使用数据库主密钥对其加密。 如果只用密码加密,这些语句将拒绝将它们视为加密程序。

重要

如果在 TDE 使用证书后将证书设置为密码保护,那么数据库在重启后将无法访问。

下表提供了 TDE 命令和函数的链接和说明:

命令或函数 用途
CREATE DATABASE ENCRYPTION KEY 创建用于加密数据库的密钥
ALTER DATABASE ENCRYPTION KEY 更改用于加密数据库的密钥
DROP DATABASE ENCRYPTION KEY 删除用于加密数据库的密钥
ALTER DATABASE SET 选项 介绍用来启用 TDE 的 ALTER DATABASE 选项

目录视图和动态管理视图

下表显示了 TDE 目录视图和动态管理视图 (DMV)。

目录视图或动态管理视图 用途
sys.databases 显示数据库信息的目录视图
sys.certificates 用于显示数据库中的证书的目录视图
sys.dm_database_encryption_keys 用于提供有关数据库加密密钥的信息以及加密状态的动态管理视图。

权限

如上表中所述,TDE 的每项功能和每个命令都有各自的权限要求。

查看 TDE 所涉及的元数据要求拥有对证书的 VIEW DEFINITION 权限。

注意事项

当进行数据库加密操作的重新加密扫描时,将禁用对数据库的维护操作。 可以使用数据库的单用户模式设置来执行维护操作。 有关更多信息,请参阅“将数据库设置为单用户模式”。

使用 sys.dm_database_encryption_keys 动态管理视图来查找数据库加密状态。 有关更多信息,请参阅本文前面的“目录视图和动态管理视图”部分。

在 TDE 过程中,数据库中的所有文件和文件组都进行加密。 如果将数据库中的任何文件组标记为 READ ONLY,数据库加密操作将会失败。

如果在数据库镜像或日志发送中使用数据库,则两个数据库都将进行加密。 日志事务在它们之间发送时,都是加密的。

重要

当数据库设置为加密时,将加密全文检索。 在 SQL Server 2005 (9.x) 及更早版本中创建的这些索引由 SQL Server 2008 (10.0.x) 及更高版本导入数据库,并由 TDE 加密。

提示

要监视数据库的 TDE 状态更改,请使用 SQL Server 审核或 Azure SQL 数据库审核。 对于 SQL Server,在审核操作组 DATABASE_OBJECT_CHANGE_GROUP 下跟踪 TDE,可在 SQL Server 审核操作组和操作中找到该组。

限制

在初始数据库加密、密钥更改或数据库解密期间,不允许执行下列操作:

  • 从数据库中的文件组中删除文件
  • 删除数据库
  • 使数据库脱机
  • 分离数据库
  • 将数据库或文件组转换为 READ ONLY 状态

以下操作在 CREATE DATABASE ENCRYPTION KEYALTER DATABASE ENCRYPTION KEYDROP DATABASE ENCRYPTION KEYALTER DATABASE...SET ENCRYPTION 语句中是不允许的:

  • 从数据库中的文件组中删除文件
  • 删除数据库
  • 使数据库脱机
  • 分离数据库
  • 将数据库或文件组转换为 READ ONLY 状态
  • 使用 ALTER DATABASE 命令
  • 启动数据库或数据库文件备份
  • 启动数据库或数据库文件还原
  • 创建快照

以下操作或条件会阻止 CREATE DATABASE ENCRYPTION KEYALTER DATABASE ENCRYPTION KEYDROP DATABASE ENCRYPTION KEYALTER DATABASE...SET ENCRYPTION 语句运行:

  • 数据库为只读或包含只读文件组。
  • ALTER DATABASE 命令正在运行。
  • 正在进行数据备份。
  • 数据库处于脱机或还原状态。
  • 正在创建快照。
  • 正在运行数据库维护任务。

创建了数据库文件后,如果启用了 TDE,则无法执行即时文件初始化。

要使用非对称密钥加密 DEK,非对称密钥必须位于可扩展密钥管理提供程序上。

TDE 扫描

要在数据库上启用 TDE, SQL Server 必须执行加密扫描。 扫描将数据文件中的每个页面读入缓冲池,然后将加密页面写入磁盘。

为了让你对加密扫描有更多的控制权,SQL Server 2019 (15.x) 引入了 TDE 扫描,其中包含暂停和恢复语法。 你可以在系统工作量大时或在业务关键时段暂停扫描,然后稍后再恢复扫描。

使用以下语法暂停 TDE 加密扫描:

ALTER DATABASE <db_name> SET ENCRYPTION SUSPEND;

同样,使用以下语法恢复 TDE 加密扫描:

ALTER DATABASE <db_name> SET ENCRYPTION RESUME;

encryption_scan_state 列已被添加到 sys.dm_database_encryption_keys 动态管理视图。 它显示加密扫描的当前状态。 还有一个名为 encryption_scan_modify_date 的新列,此列包含上次加密扫描状态更改的日期和时间。

如果 SQL Server 实例在其加密扫描被暂停时重启,则会在启动时的错误日志中记录一条消息。 该消息指示已暂停现有扫描。

重要

暂停和恢复 TDE 扫描功能目前在 Azure SQL 数据库、Azure SQL 托管实例和 Azure Synapse Analytics 中不可用。

TDE 和事务日志

TDE 可保护静态数据文件和日志文件。 在未加密的数据库上启用 TDE 后加密整个数据库是一项相当大的数据操作,它所需的时间取决于运行此数据库的系统资源。 sys.dm_database_encryption_keys DMV 可用于确定数据库的加密状态。

打开 TDE 后,数据库引擎会强制创建新的事务日志,该事务日志将由数据库加密密钥加密。 在 TDE 状态更改之间交错的先前事务或当前长期运行事务生成的任何日志都不会加密。

可以使用 sys.dm_db_log_info DMV 监视事务日志,该 DMV 还使用 Azure SQL 以及 SQL Server 2019 (15.x) 及更高版本中提供的 vlf_encryptor_thumbprint 列显示日志文件是否已加密。 下面的查询示例演示了如何使用 sys.dm_database_encryption_keys 视图中的 encryption_state 列查找日志文件的加密状态:

USE AdventureWorks2022;
GO

/* The value 3 represents an encrypted state
   on the database and transaction logs. */
SELECT *
FROM sys.dm_database_encryption_keys
WHERE encryption_state = 3;
GO

有关 SQL Server 日志文件体系结构的详细信息,请参阅事务日志

在 DEK 更改之前,以前的 DEK 会对写入事务日志的所有数据进行加密。

如果更改 DEK 两次,则必须执行日志备份,然后才能再次更改 DEK。

TDE 和 tempdb 系统数据库

如果 SQL Server 实例中的任何其他数据库是使用 TDE 加密的,则会加密 tempdb 系统数据库。 这种加密可能会对同一个 SQL Server 实例上的未加密数据库产生性能影响。 有关 tempdb 系统数据库的详细信息,请参阅 tempdb 数据库

TDE 和复制

复制不会以加密形式从启用了 TDE 的数据库中自动复制数据。 如果想保护分发和订阅服务器数据库,请单独启用 TDE。

快照复制可以将数据存储在未加密的中间文件(如 BCP 文件)中。 事务性复制和合并复制的初始数据分发也可以这样做。 在此类复制期间,可以启用加密来保护信道。

有关详细信息,请参阅将 SQL Server 数据库引擎配置为使用加密连接

TDE 和可用性组

将加密数据库添加到 Always On 可用性组

要对属于可用性组的数据库进行加密,在主要副本上创建数据库加密密钥之前,请在所有次要副本上创建主密钥和证书或非对称密钥 (EKM)。

如果使用证书保护 DEK,请将在主要副本上创建的证书进行备份,然后在所有次要副本上从文件创建证书,再在主要副本上创建 DEK。

TDE 和 FILESTREAM 数据

即使启用了 TDE,也不会加密 FILESTREAM 数据。

TDE 和备份

证书通常用于透明数据加密,以保护 DEK。 必须在 master 数据库中创建证书。 启用了 TDE 的数据库备份文件也使用 DEK 进行加密。 因此,还原这些备份时,用于保护 DEK 的证书必须可用。 也就是说,除了备份数据库之外,你还要确保自己保留了服务器证书的备份,以防数据丢失。 如果证书不再可用会导致数据丢失。

移除 TDE

使用 ALTER DATABASE 语句从数据库中删除加密。

ALTER DATABASE <db_name> SET ENCRYPTION OFF;

若要查看数据库的状态,请使用 sys.dm_database_encryption_keys 动态管理视图。

注意

加密过程正在进行时, ALTER DATABASE 不允许对数据库使用语句。 在加密过程完成之前,无法开始解密数据库。

请先等到解密完成,再使用 DROP DATABASE ENCRYPTION KEY 删除 DEK。

重要

将用于 TDE 的主密钥和证书备份到安全位置。 需要主密钥和证书,才能还原使用 TDE 加密数据库时进行的备份。 删除 DEK 后,请进行日志备份,然后对解密的数据库进行全新完整备份。

TDE 和缓冲池扩展

在使用 TDE 加密数据库时,与缓冲池扩展 (BPE) 相关的文件不会被加密。 对于这些文件,使用文件系统级别的加密工具,如 BitLocker 或 EFS。

TED 和内存中 OLTP

可在拥有内存中 OLTP 对象的数据库上启用 TDE。 在 SQL Server 2016(13.x)和 Azure SQL 数据库中,如果启用 TDE,则内存中 OLTP 日志记录和数据将加密。 在 SQL Server 2014 (12.x) 中,如果启用 TDE,将对内存中 OLTP 日志记录加密,但不对 MEMORY_OPTIMIZED_DATA 文件组中的文件加密。

管理 TDE 中使用的证书的准则

为 TDE 启用数据库并在日志传送或数据库镜像中使用时,必需备份证书和数据库主密钥。 还应备份存储在“包含的系统数据库”中的证书。

绝不能从 master 数据库中删除用于保护 DEK 的证书。 这样做会导致加密的数据库无法访问。

如果在命令中使用的证书尚未备份,将在执行 CREATE DATABASE ENCRYPTION KEY 后出现类似如下消息(错误 33091)。

警告

尚未对用于加密数据库加密密钥的证书进行备份。 应当立即备份该证书以及与该证书关联的私钥。 如果证书变得不可用,或者必须在另一台服务器上还原或附加数据库,则必须同时备份证书和私钥,否则将无法打开数据库。

以下查询可以用于标识在创建 TDE 时尚未备份的证书。

SELECT pvt_key_last_backup_date,
       Db_name(dek.database_id) AS encrypteddatabase,
       c.name AS Certificate_Name
FROM sys.certificates AS c
     INNER JOIN sys.dm_database_encryption_keys AS dek
         ON c.thumbprint = dek.encryptor_thumbprint;

如果 pvt_key_last_backup_date 列为 NULL,则与该行对应的数据库已启用了 TDE,但用于保护其 DEK 的证书尚未备份。 有关备份证书的更多信息,请参阅“备份证书”。