透明数据加密

可以采取多种预防措施来帮助保护数据库,例如,设计安全系统、加密机密资产,以及围绕数据库服务器构建防火墙。 但是,如果物理媒体(例如驱动器或备份磁带)失窃,恶意方可能会还原或附加数据库并浏览数据。 一种解决方案是加密数据库中的敏感数据,并通过证书保护用于加密数据的密钥。 这可以防止任何没有密钥的人使用这些数据,但这种保护必须事先计划。

透明数据加密 (TDE) 可对数据和事务日志文件以及特殊 PDW 日志文件执行实时 I/O 加密和解密。 加密使用数据库加密密钥 (DEK),它存储在数据库引导记录中,可在恢复时使用。 DEK 是使用存储在 SQL Server PDW 的 master 数据库中的证书保护的对称密钥。 TDE 保护“处于休眠状态”的数据,即数据和日志文件。 它提供了遵从许多法律、法规和各个行业建立的准则的能力。 借助此功能,软件开发人员可以使用 AES 和 3DES 加密算法来加密数据,且无需更改现有的应用程序。

重要

TDE 不会为客户端和 PDW 之间传输的数据提供加密。 有关如何加密客户端和 SQL Server PDW 之间的数据的详细信息,请参阅预配证书

TDE 在移动或使用数据时不会加密数据。 SQL Server PDW 内的 PDW 组件之间的内部流量未加密。 临时存储在内存缓冲区中的数据未加密。 若要缓解此风险,请控制与 SQL Server PDW 的物理访问和连接。

对数据库实施保护措施后,可以通过使用正确的证书还原此数据库。

注意

为 TDE 创建证书时,应立即备份该证书和关联的私钥。 如果证书变为不可用,或者如果必须在另一台服务器上还原或附加数据库,则必须同时具有证书和私钥的备份,否则将无法打开该数据库。 即使不再对数据库启用 TDE,也应该保留加密证书。 即使数据库未加密,事务日志的某些部分仍可能保持受到保护,但在执行数据库的完整备份前,对于某些操作可能需要证书。 超过过期日期的证书仍可以用于通过 TDE 加密和解密数据。

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

下图显示了 TDE 加密的密钥的层次结构:

Displays the hierarchy

使用透明数据加密

若要使用 TDE,请按以下步骤操作。 在准备 SQL Server PDW 以支持 TDE 时,前三个步骤仅须完成一次。

  1. 在 master 数据库中,创建主密钥。

  2. 使用 sp_pdw_database_encryption 在 SQL Server PDW 上启用 TDE。 此操作会修改临时数据库,以确保保护将来的临时数据,并且如果有任何活动会话具有临时表,则其将失败。 sp_pdw_database_encryption 打开 PDW 系统日志中的用户数据掩码。 (有关 PDW 系统日志中的用户数据掩码的详细信息,请参阅 sp_pdw_log_user_data_masking。)

  3. 使用 sp_pdw_add_network_credentials 创建一个凭据,该凭据可以对存储证书备份的共享进行身份验证和写入。 如果预期存储服务器已存在凭据,则可以使用现有凭据。

  4. 在 master 数据库中,创建受主密钥保护的证书。

  5. 将证书备份到存储共享。

  6. 在用户数据库中,创建数据库加密密钥,并通过存储在 master 数据库中的证书对其进行保护。

  7. 使用 ALTER DATABASE 语句,以使用 TDE 加密数据库。

下面的示例演示如何使用在 SQL Server PDW 中创建的名为 MyServerCert 的证书加密 AdventureWorksPDW2012 数据库。

第一步:在 SQL Server PDW 上启用 TDE。 此操作只需执行一次。

USE master;  
GO  
  
-- Create a database master key in the master database  
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<UseStrongPasswordHere>';  
GO  
  
-- Enable encryption for PDW  
EXEC sp_pdw_database_encryption 1;  
GO  
  
-- Add a credential that can write to the share  
-- A credential created for a backup can be used if you wish  
EXEC sp_pdw_add_network_credentials 'SECURE_SERVER', '<domain>\<Windows_user>', '<password>';  

第二步:在 master 数据库中创建和备份证书。 此操作只需执行一次。 可以为每个数据库创建单独的证书(建议),也可以使用一个证书来保护多个数据库。

-- Create certificate in master  
CREATE CERTIFICATE MyServerCert WITH SUBJECT = 'My DEK Certificate';  
GO  
  
-- Back up the certificate with private key  
BACKUP CERTIFICATE MyServerCert   
    TO FILE = '\\SECURE_SERVER\cert\MyServerCert.cer'  
    WITH PRIVATE KEY   
    (   
        FILE = '\\SECURE_SERVER\cert\MyServerCert.key',  
        ENCRYPTION BY PASSWORD = '<UseStrongPasswordHere>'   
    )   
GO  

最后:创建 DEK 并使用 ALTER DATABASE 加密用户数据库。 对受 TDE 保护的每个数据库重复此操作。

USE AdventureWorksPDW2012;  
GO  
  
CREATE DATABASE ENCRYPTION KEY  
WITH ALGORITHM = AES_128  
ENCRYPTION BY SERVER CERTIFICATE MyServerCert;  
GO  
  
ALTER DATABASE AdventureWorksPDW2012 SET ENCRYPTION ON;  
GO  

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

注意

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

命令和函数

TDE 证书必须使用数据库主密钥加密才能被下列语句接受。

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

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

目录视图和动态管理视图

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

目录视图或动态管理视图 目的
sys.databases 显示数据库信息的目录视图。
sys.certificates 显示数据库中的证书的目录视图。
sys.dm_pdw_nodes_database_encryption_keys 动态管理视图,会提供每个节点的信息、有关数据库中使用的加密密钥的信息以及数据库加密状态的信息。

权限

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

查看 TDE 所涉及的元数据要求 CONTROL SERVER 权限。

注意事项

当进行数据库加密操作的重新加密扫描时,将禁用对数据库的维护操作。

可以使用 sys.dm_pdw_nodes_database_encryption_keys 动态管理视图来查找数据库加密状态。 有关详细信息,请参阅本文前面的目录视图和动态管理视图部分。

限制

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

  • 删除数据库。

  • 使用 ALTER DATABASE 命令。

  • 开始数据库备份。

  • 开始数据库还原。

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

  • 正在执行 ALTER DATABASE 命令。

  • 正在进行任何数据备份。

当创建数据库文件时,如果启用了 TDE,则即时文件初始化功能不可用。

未受 TDE 保护的区域

TDE 不保护外部表。

TDE 不保护诊断会话。 在使用诊断会话时,用户应注意不要使用带有敏感参数的查询。 当不再需要会透露敏感信息的诊断会话时,应立即将其删除。

当受 TDE 保护的数据放置在 SQL Server PDW 内存中时,应对其进行解密。 当设备出现某些问题时,会创建内存转储。 转储文件表示问题出现时内存的内容,并且可包含未加密形式的敏感数据。 在与他人共享内存转储之前,应先查看内存转储的内容。

master 数据库不受 TDE 保护。 虽然 master 数据库不包含用户数据,但它包含登录名等信息。

透明数据加密与事务日志

允许数据库使用 TDE 具有将虚拟事务日志的剩余部分置零以强制加密下一个虚拟事务日志的效果。 这可以保证在数据库设置为加密后事务日志中不会留有明文。 可通过查看 sys.dm_pdw_nodes_database_encryption_keys 视图中的 encryption_state 列来查找每个 PDW 节点上的日志文件加密状态,如以下示例所示:

WITH dek_encryption_state AS   
(  
    SELECT ISNULL(db_map.database_id, dek.database_id) AS database_id, encryption_state  
    FROM sys.dm_pdw_nodes_database_encryption_keys AS dek  
        INNER JOIN sys.pdw_nodes_pdw_physical_databases AS node_db_map  
           ON dek.database_id = node_db_map.database_id AND dek.pdw_node_id = node_db_map.pdw_node_id  
        LEFT JOIN sys.pdw_database_mappings AS db_map  
            ON node_db_map .physical_name = db_map.physical_name  
        INNER JOIN sys.dm_pdw_nodes AS nodes  
            ON nodes.pdw_node_id = dek.pdw_node_id  
    WHERE dek.encryptor_thumbprint <> 0x  
)  
SELECT TOP 1 encryption_state  
       FROM dek_encryption_state  
       WHERE dek_encryption_state.database_id = DB_ID('AdventureWorksPDW2012 ')  
       ORDER BY (CASE encryption_state WHEN 3 THEN -1 ELSE encryption_state END) DESC;  

所有在数据库加密密钥更改前写入事务日志的数据都将使用之前的数据库加密密钥加密。

PDW 活动日志

SQL Server PDW 维护一组用于疑难解答的日志。 (注意,这不是事务日志、SQL Server 错误日志或 Windows 事件日志。这些 PDW 活动日志可包含完整的明文语句,其中一些日志可能包含用户数据。 典型的示例包括 INSERTUPDATE 语句。 可以使用 sp_pdw_log_user_data_masking 明确打开或关闭用户数据的掩码。 在 SQL Server PDW 上启用加密会自动打开 PDW 活动日志中用户数据的掩码,以保护用户数据。 sp_pdw_log_user_data_masking 还可用于在不使用 TDE 时过滤语句,但不建议这样做,因为它会大大降低 Microsoft 支持团队分析问题的能力。

透明数据加密与 tempdb 系统数据库

使用 sp_pdw_database_encryption 启用加密时,会加密 tempdb 系统数据库。 在任何数据库都可以使用 TDE 之前,这是必需的。 这可能会对同一个 SQL Server PDW 实例上的未加密数据库产生性能影响。

密钥管理

数据库加密密钥 (DEK) 受存储在 master 数据库中的证书的保护。 这些证书受 master 数据库的数据库主密钥 (DMK) 的保护。 DMK 需要由服务主密钥 (SMK) 保护才能用于 TDE。

系统可以访问密钥,而无需人工干预(例如提供密码)。 如果证书不可用,系统将输出一个错误,说明在提供正确的证书之前,无法解密 DEK。

将数据库从一个设备移动到另一个设备时,必须先在目标服务器上还原用于保护其 DEK 的证书。 然后,可以像往常一样还原数据库。 有关详细信息,请参阅将受 TDE 保护的数据库移到其他 SQL Server上的标准 SQL Server 文档。

只要存在使用 DEK 的数据库备份,就应该保留用于加密 DEK 的证书。 证书备份必须包含证书私钥,因为如果没有私钥,则证书不能用于数据库还原。 这些证书私钥备份存储在单独的文件中,并由必须提供用于证书还原的密码保护。

还原 master 数据库

可以使用 DWConfig 还原 master 数据库,作为灾难恢复的一部分。

  • 如果控制节点未更改,即如果主数据库在执行 master 数据库备份的相同和未更改的设备上还原,则 DMK 和所有证书都将可读,且无需执行其他操作。

  • 如果主数据库在不同的设备上还原,或者如果控制节点自 master 数据库备份后已更改,则需要执行其他步骤,才能再生成 DMK。

    1. 打开 DMK:

      OPEN MASTER KEY DECRYPTION BY PASSWORD = '<password>';  
      
    2. 通过 SMK 添加加密:

      ALTER MASTER KEY   
          ADD ENCRYPTION BY SERVICE MASTER KEY;  
      
    3. 重启设备。

升级和替换虚拟机

如果执行升级或替换 VM 的设备上存在 DMK,则必须提供 DMK 密码作为参数。

升级操作的示例。 将 ********** 替换为你的 DMK 密码。

setup.exe /Action=ProvisionUpgrade ... DMKPassword='**********'

替换虚拟机的操作示例。

setup.exe /Action=ReplaceVM ... DMKPassword='**********'

在升级期间,如果用户 DB 已加密且未提供 DMK 密码,升级操作将失败。 在替换期间,如果未在 DMK 存在时提供正确的密码,该操作将跳过 DMK 恢复步骤。 所有其他步骤将在替换 VM 操作结束时完成,但该操作将在结束时报告失败,以指示需要执行其他步骤。 在安装日志(位于 \ProgramData\Microsoft\Microsoft SQL Server Parallel Data Warehouse\100\Logs\Setup\\<time-stamp>\Detail-Setup)中,以下警告将显示在其结尾附近。

*** WARNING \*\*\* DMK is detected in master database, but could not be recovered automatically! The DMK password was either not provided or is incorrect!

在 PDW 中手动执行这些语句,并在之后重启设备以恢复 DMK:

OPEN MASTER KEY DECRYPTION BY PASSWORD = '<DMK password>';  
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY;  

使用还原 master 数据库段落中的步骤恢复数据库,然后重启设备。

如果 DMK 之前存在但在操作后并未恢复,则查询数据库时将引发以下错误消息。

Msg 110806;  
A distributed query failed: Database '<db_name>' cannot be opened due to inaccessible files or insufficient memory or disk space. See the SQL Server errorlog for details.

性能影响

TDE 对性能的影响因你拥有的数据类型、存储方式以及 SQL Server PDW 上工作负载活动的类型而异。 如果受 TDE 保护,则读取数据后再解密数据的 I/O 或加密数据后再写入数据的 I/O 都是 CPU 密集型活动,并且在同时发生其他 CPU 密集型活动时会产生更大的影响。 由于 TDE 加密 tempdb,TDE 可能会影响未加密的数据库的性能。 若要准确了解性能,应使用数据和查询活动测试整个系统。

以下链接包含有关 SQL Server 如何管理加密的常规信息。 以下文章可帮助你了解 SQL Server 加密,但这些文章没有特定于 SQL Server PDW 的信息,并且它们讨论了 SQL Server PDW 中不存在的功能。

另请参阅

ALTER DATABASE
CREATE MASTER KEY
CREATE DATABASE ENCRYPTION KEY
BACKUP CERTIFICATE
sp_pdw_database_encryption
sp_pdw_database_encryption_regenerate_system_keys
sp_pdw_log_user_data_masking
sys.certificates
sys.dm_pdw_nodes_database_encryption_keys