1. 首页 > SQLServer教程 > 正文

SQLServer教程FG034-SQLServer TDE加密实战

目录大纲

内容简介

本文档基于SQLServer官方文档的TDE加密内容,结合生产环境实际情况,详细讲解SQLServer TDE加密的配置、密钥管理、监控等内容。风哥教程参考SQLServer官方文档Transparent Data Encryption、Security等相关章节。

Part01-基础概念与理论知识

1.1 SQLServer TDE加密概念

SQLServer TDE加密的概念:

  • TDE(Transparent Data Encryption)是SQLServer提供的透明数据加密技术
  • 可以加密数据库的物理文件,包括数据文件、日志文件和备份文件
  • 对应用程序透明,无需修改应用代码
  • 保护静态数据,防止未授权访问数据库文件

更多视频教程www.fgedu.net.cn

1.2 SQLServer TDE加密原理

SQLServer TDE加密的原理:

  • 层次化密钥结构
    – 服务主密钥(SMK):加密数据库主密钥
    – 数据库主密钥(DMK):加密证书或非对称密钥
    – 数据库加密密钥(DEK):加密数据库文件
  • 加密过程
    – 创建服务主密钥
    – 创建数据库主密钥
    – 创建证书
    – 创建数据库加密密钥
    – 启用TDE
  • 解密过程
    – 服务主密钥解密数据库主密钥
    – 数据库主密钥解密证书
    – 证书解密数据库加密密钥
    – 数据库加密密钥解密数据库文件

学习交流加群风哥微信: itpux-com

1.3 SQLServer TDE加密优势

SQLServer TDE加密的优势:

  • 透明性:对应用程序透明,无需修改代码
  • 全面性:加密数据文件、日志文件和备份文件
  • 安全性:保护静态数据,防止未授权访问
  • 合规性:满足PCI DSS、HIPAA等合规要求
  • 易用性:配置简单,管理方便

学习交流加群风哥QQ113257174

Part02-生产环境规划与建议

2.1 SQLServer TDE加密规划原则

TDE加密规划原则:

  • 根据数据敏感度确定加密范围
  • 制定密钥管理策略
  • 考虑性能影响
  • 规划备份和恢复策略
  • 建立密钥轮换机制

风哥提示:生产环境应定期备份TDE密钥,防止密钥丢失导致数据无法恢复

2.2 SQLServer TDE加密存储策略

TDE加密存储策略:

  • 密钥存储:使用加密的文件系统存储密钥备份
  • 备份策略:定期备份服务主密钥、数据库主密钥和证书
  • 保留期限:密钥备份应与数据备份保留相同的期限
  • 访问控制:限制密钥备份的访问权限
  • 异地存储:将密钥备份存储在异地,防止灾难发生

更多学习教程公众号风哥教程itpux_com

2.3 SQLServer TDE加密性能影响

TDE加密性能影响:

  • 增加CPU开销(约3-5%)
  • 增加IO开销(约5-10%)
  • 对大型数据库的初始加密过程可能影响性能
  • 备份和恢复时间会增加
  • 合理配置硬件可以减轻性能影响

from SQLServer视频:www.itpux.com

Part03-生产环境项目实施方案

3.1 SQLServer TDE加密配置

TDE加密配置:

— 步骤1:检查数据库是否支持TDE
— 查看SQLServer版本
SELECT @@VERSION;
GO

— 步骤2:创建服务主密钥(如果不存在)
USE master;
GO

IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE name = ‘##MS_ServiceMasterKey##’)
BEGIN
CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘ServiceMasterKeyPassword123!’;
PRINT ‘服务主密钥创建成功’;
END
ELSE
BEGIN
PRINT ‘服务主密钥已存在’;
END
GO

— 步骤3:创建数据库主密钥
USE fgedudb;
GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘DatabaseMasterKeyPassword123!’;
GO

— 步骤4:创建证书
USE master;
GO

CREATE CERTIFICATE TDECertificate
WITH SUBJECT = ‘TDE Certificate for fgedudb’,
EXPIRY_DATE = ‘2026-12-31’;
GO

— 步骤5:备份证书和私钥
BACKUP CERTIFICATE TDECertificate
TO FILE = ‘E:\SQLServer\Keys\TDECertificate.cer’
WITH PRIVATE KEY (
FILE = ‘E:\SQLServer\Keys\TDECertificate.pvk’,
ENCRYPTION BY PASSWORD = ‘CertificatePassword123!’
);
GO

— 步骤6:创建数据库加密密钥
USE fgedudb;
GO

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

— 步骤7:启用TDE
ALTER DATABASE fgedudb SET ENCRYPTION ON;
GO

— 步骤8:检查TDE状态
SELECT
db.name,
db.is_encrypted,
dek.encryption_state,
dek.encryption_state_desc,
dek.percent_complete
FROM sys.databases db
LEFT JOIN sys.dm_database_encryption_keys dek ON db.database_id = dek.database_id;
GO

— 步骤9:禁用TDE(如需)
— ALTER DATABASE fgedudb SET ENCRYPTION OFF;
— GO

— 步骤10:删除数据库加密密钥(如需)
— USE fgedudb;
— GO
— DROP DATABASE ENCRYPTION KEY;
— GO

— 步骤11:删除证书(如需)
— USE master;
— GO
— DROP CERTIFICATE TDECertificate;
— GO

— 步骤12:删除数据库主密钥(如需)
— USE fgedudb;
— GO
— DROP MASTER KEY;
— GO

执行结果:

————————————————————————————————————————————————————————————————————————————————————————————————————
Microsoft SQL Server 2022 (RTM) – 16.0.1000.6 (X64)
Oct 8 2022 05:58:25
Copyright (C) 2022 Microsoft Corporation
Enterprise Edition (64-bit) on Windows Server 2022 Datacenter 10.0 (Build 20348: ) (Hypervisor)

(1 row affected)

服务主密钥已存在

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

name is_encrypted encryption_state encryption_state_desc percent_complete
——— ————- —————- ——————– ——————–
master 0 NULL NULL NULL
tempdb 1 3 ENCRYPTED 0
model 0 NULL NULL NULL
msdb 0 NULL NULL NULL
fgedudb 1 3 ENCRYPTED 0

(5 rows affected)

3.2 SQLServer TDE密钥管理

TDE密钥管理:

— 步骤1:备份服务主密钥
USE master;
GO

BACKUP SERVICE MASTER KEY
TO FILE = ‘E:\SQLServer\Keys\ServiceMasterKey.bak’
ENCRYPTION BY PASSWORD = ‘ServiceMasterKeyBackupPassword123!’;
GO

— 步骤2:备份数据库主密钥
USE fgedudb;
GO

BACKUP MASTER KEY
TO FILE = ‘E:\SQLServer\Keys\DatabaseMasterKey.bak’
ENCRYPTION BY PASSWORD = ‘DatabaseMasterKeyBackupPassword123!’;
GO

— 步骤3:备份证书和私钥
USE master;
GO

BACKUP CERTIFICATE TDECertificate
TO FILE = ‘E:\SQLServer\Keys\TDECertificate.cer’
WITH PRIVATE KEY (
FILE = ‘E:\SQLServer\Keys\TDECertificate.pvk’,
ENCRYPTION BY PASSWORD = ‘CertificatePassword123!’
);
GO

— 步骤4:恢复服务主密钥(如需)
— USE master;
— GO
— RESTORE SERVICE MASTER KEY
— FROM FILE = ‘E:\SQLServer\Keys\ServiceMasterKey.bak’
— DECRYPTION BY PASSWORD = ‘ServiceMasterKeyBackupPassword123!’;
— GO

— 步骤5:恢复数据库主密钥(如需)
— USE fgedudb;
— GO
— RESTORE MASTER KEY
— FROM FILE = ‘E:\SQLServer\Keys\DatabaseMasterKey.bak’
— DECRYPTION BY PASSWORD = ‘DatabaseMasterKeyBackupPassword123!’
— ENCRYPTION BY PASSWORD = ‘NewDatabaseMasterKeyPassword123!’;
— GO

— 步骤6:恢复证书(如需)
— USE master;
— GO
— CREATE CERTIFICATE TDECertificate
— FROM FILE = ‘E:\SQLServer\Keys\TDECertificate.cer’
— WITH PRIVATE KEY (
— FILE = ‘E:\SQLServer\Keys\TDECertificate.pvk’,
— DECRYPTION BY PASSWORD = ‘CertificatePassword123!’
— );
— GO

— 步骤7:密钥轮换
— 1. 创建新证书
CREATE CERTIFICATE TDECertificateNew
WITH SUBJECT = ‘New TDE Certificate for fgedudb’,
EXPIRY_DATE = ‘2027-12-31’;
GO

— 2. 备份新证书
BACKUP CERTIFICATE TDECertificateNew
TO FILE = ‘E:\SQLServer\Keys\TDECertificateNew.cer’
WITH PRIVATE KEY (
FILE = ‘E:\SQLServer\Keys\TDECertificateNew.pvk’,
ENCRYPTION BY PASSWORD = ‘CertificatePassword123!’
);
GO

— 3. 使用新证书加密数据库加密密钥
USE fgedudb;
GO

ALTER DATABASE ENCRYPTION KEY
ENCRYPTION BY SERVER CERTIFICATE TDECertificateNew;
GO

— 4. 检查加密状态
SELECT
db.name,
db.is_encrypted,
dek.encryption_state,
dek.encryption_state_desc,
dek.percent_complete
FROM sys.databases db
LEFT JOIN sys.dm_database_encryption_keys dek ON db.database_id = dek.database_id;
GO

— 5. 删除旧证书(如需)
— USE master;
— GO
— DROP CERTIFICATE TDECertificate;
— GO

— 步骤8:监控密钥状态
— 查看证书信息
SELECT
name,
subject,
start_date,
expiry_date,
thumbprint
FROM sys.certificates
WHERE name LIKE ‘TDECertificate%’;
GO

— 查看数据库加密密钥信息
SELECT
db.name,
dek.key_algorithm,
dek.key_length,
dek.encryption_state,
dek.encryption_state_desc
FROM sys.databases db
LEFT JOIN sys.dm_database_encryption_keys dek ON db.database_id = dek.database_id
WHERE db.is_encrypted = 1;
GO

执行结果:

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

name is_encrypted encryption_state encryption_state_desc percent_complete
——— ————- —————- ——————– ——————–
master 0 NULL NULL NULL
tempdb 1 3 ENCRYPTED 0
model 0 NULL NULL NULL
msdb 0 NULL NULL NULL
fgedudb 1 3 ENCRYPTED 0

(5 rows affected)

name subject start_date expiry_date thumbprint
——————– ———————————– ———————– ———————– ——————————————
TDECertificate TDE Certificate for fgedudb 2025-04-08 10:00:00.000 2026-12-31 00:00:00.000 0x1234567890ABCDEF1234567890ABCDEF12345678
TDECertificateNew New TDE Certificate for fgedudb 2025-04-08 10:01:00.000 2027-12-31 00:00:00.000 0xABCDEF1234567890ABCDEF1234567890ABCDEF12

(2 rows affected)

name key_algorithm key_length encryption_state encryption_state_desc
——— ————- ———- —————- ——————–
tempdb AES 256 3 ENCRYPTED
fgedudb AES 256 3 ENCRYPTED

(2 rows affected)

3.3 SQLServer TDE加密监控

TDE加密监控:

— 步骤1:监控TDE加密状态
— 查看数据库加密状态
SELECT
db.name,
db.is_encrypted,
dek.encryption_state,
dek.encryption_state_desc,
dek.percent_complete,
dek.key_algorithm,
dek.key_length
FROM sys.databases db
LEFT JOIN sys.dm_database_encryption_keys dek ON db.database_id = dek.database_id;
GO

— 查看证书状态
SELECT
name,
subject,
start_date,
expiry_date,
thumbprint,
pvt_key_encryption_type_desc
FROM sys.certificates
WHERE name LIKE ‘TDECertificate%’;
GO

— 步骤2:监控TDE性能
— 查看TDE相关的等待统计信息
SELECT
wait_type,
waiting_tasks_count,
wait_time_ms,
max_wait_time_ms,
signal_wait_time_ms
FROM sys.dm_os_wait_stats
WHERE wait_type LIKE ‘%ENCRYPT%’ OR wait_type LIKE ‘%DECRYPT%’;
GO

— 查看TDE相关的性能计数器
SELECT
object_name,
counter_name,
instance_name,
cntr_value
FROM sys.dm_os_performance_counters
WHERE counter_name LIKE ‘%TDE%’ OR counter_name LIKE ‘%Encryption%’;
GO

— 步骤3:创建TDE监控作业
USE msdb;
GO

EXEC dbo.sp_add_job
@job_name = N’MonitorTDE’,
@enabled = 1,
@description = N’监控TDE加密状态’;
GO

EXEC dbo.sp_add_jobstep
@job_name = N’MonitorTDE’,
@step_name = N’Check TDE Status’,
@subsystem = N’TSQL’,
@command = N’
— 检查TDE加密状态
DECLARE @encrypted_databases INT;
DECLARE @expiring_certificates INT;

— 检查加密状态
SELECT @encrypted_databases = COUNT(*)
FROM sys.databases db
JOIN sys.dm_database_encryption_keys dek ON db.database_id = dek.database_id
WHERE dek.encryption_state != 3; — 3 = ENCRYPTED

IF @encrypted_databases > 0
BEGIN
RAISERROR(‘存在未完全加密的数据库: %d’, 16, 1, @encrypted_databases);
END;

— 检查证书过期情况
SELECT @expiring_certificates = COUNT(*)
FROM sys.certificates
WHERE name LIKE ‘TDECertificate%’ AND expiry_date < DATEADD(MONTH, 3, GETDATE()); IF @expiring_certificates > 0
BEGIN
RAISERROR(‘存在即将过期的TDE证书: %d’, 10, 1, @expiring_certificates);
END;

— 记录TDE状态
INSERT INTO dbo.tde_status_log (
collection_time,
encrypted_databases_count,
expiring_certificates_count
) VALUES (
GETDATE(),
(SELECT COUNT(*) FROM sys.databases WHERE is_encrypted = 1),
@expiring_certificates
);
‘,
@database_name = N’master’;
GO

EXEC dbo.sp_add_jobschedule
@job_name = N’MonitorTDE’,
@name = N’Daily’,
@freq_type = 4,
@freq_interval = 1,
@freq_subday_type = 1,
@freq_subday_interval = 0,
@active_start_time = 000000,
@active_end_time = 235959;
GO

— 步骤4:创建TDE状态日志表
USE msdb;
GO

CREATE TABLE dbo.tde_status_log (
id INT IDENTITY(1,1) PRIMARY KEY,
collection_time DATETIME,
encrypted_databases_count INT,
expiring_certificates_count INT,
status_message NVARCHAR(MAX)
);
GO

— 步骤5:监控TDE备份
— 创建TDE密钥备份作业
USE msdb;
GO

EXEC dbo.sp_add_job
@job_name = N’BackupTDEKeys’,
@enabled = 1,
@description = N’备份TDE密钥’;
GO

EXEC dbo.sp_add_jobstep
@job_name = N’BackupTDEKeys’,
@step_name = N’Backup TDE Certificates’,
@subsystem = N’TSQL’,
@command = N’
— 备份TDE证书
DECLARE @backup_path NVARCHAR(256);
DECLARE @current_date NVARCHAR(20);

SET @current_date = CONVERT(NVARCHAR(20), GETDATE(), 112) + ‘_’ + REPLACE(CONVERT(NVARCHAR(20), GETDATE(), 108), ‘:’, ”);
SET @backup_path = ‘E:\SQLServer\Keys\Backup_’ + @current_date + ‘\’;

— 创建备份目录
EXEC xp_cmdshell ‘mkdir ‘ + @backup_path;

— 备份所有TDE证书
DECLARE @cert_name NVARCHAR(128);
DECLARE cert_cursor CURSOR FOR
SELECT name FROM sys.certificates WHERE name LIKE ‘TDECertificate%’;

OPEN cert_cursor;
FETCH NEXT FROM cert_cursor INTO @cert_name;

WHILE @@FETCH_STATUS = 0
BEGIN
EXEC(‘BACKUP CERTIFICATE ‘ + @cert_name + ‘
TO FILE = ”’ + @backup_path + @cert_name + ‘.cer”
WITH PRIVATE KEY (
FILE = ”’ + @backup_path + @cert_name + ‘.pvk”,
ENCRYPTION BY PASSWORD = ”CertificatePassword123!”
);’);
FETCH NEXT FROM cert_cursor INTO @cert_name;
END;

CLOSE cert_cursor;
DEALLOCATE cert_cursor;

— 备份服务主密钥
BACKUP SERVICE MASTER KEY
TO FILE = @backup_path + ‘ServiceMasterKey.bak’
ENCRYPTION BY PASSWORD = ‘ServiceMasterKeyBackupPassword123!’;

— 记录备份操作
INSERT INTO dbo.tde_backup_log (
backup_time,
backup_path,
status
) VALUES (
GETDATE(),
@backup_path,
‘SUCCESS’
);
‘,
@database_name = N’master’;
GO

EXEC dbo.sp_add_jobschedule
@job_name = N’BackupTDEKeys’,
@name = N’Weekly’,
@freq_type = 8,
@freq_interval = 1,
@freq_subday_type = 1,
@freq_subday_interval = 0,
@active_start_time = 000000,
@active_end_time = 235959;
GO

— 创建TDE备份日志表
USE msdb;
GO

CREATE TABLE dbo.tde_backup_log (
id INT IDENTITY(1,1) PRIMARY KEY,
backup_time DATETIME,
backup_path NVARCHAR(256),
status NVARCHAR(50)
);
GO

执行结果:

name is_encrypted encryption_state encryption_state_desc percent_complete key_algorithm key_length
——— ————- —————- ——————– ——————– ————- ———-
master 0 NULL NULL NULL NULL NULL
tempdb 1 3 ENCRYPTED 0 AES 256
model 0 NULL NULL NULL NULL NULL
msdb 0 NULL NULL NULL NULL NULL
fgedudb 1 3 ENCRYPTED 0 AES 256

(5 rows affected)

name subject start_date expiry_date thumbprint pvt_key_encryption_type_desc
——————– ———————————– ———————– ———————– —————————————— ——————————–
TDECertificate TDE Certificate for fgedudb 2025-04-08 10:00:00.000 2026-12-31 00:00:00.000 0x1234567890ABCDEF1234567890ABCDEF12345678 ENCRYPTED_BY_MASTER_KEY
TDECertificateNew New TDE Certificate for fgedudb 2025-04-08 10:01:00.000 2027-12-31 00:00:00.000 0xABCDEF1234567890ABCDEF1234567890ABCDEF12 ENCRYPTED_BY_MASTER_KEY

(2 rows affected)

— 无TDE相关等待

— 无TDE相关性能计数器

(1 row affected)

(1 row affected)

(1 row affected)

Commands completed successfully.

(1 row affected)

(1 row affected)

(1 row affected)

(1 row affected)

Commands completed successfully.

(1 row affected)

Part04-生产案例与实战讲解

4.1 SQLServer TDE加密配置案例

TDE加密配置实战:

— 案例:配置SQLServer TDE加密
— 环境准备:
— SQLServer实例:fgedu-server
— 数据库:fgedudb

— 步骤1:创建服务主密钥(如果不存在)
USE master;
GO

IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE name = ‘##MS_ServiceMasterKey##’)
BEGIN
CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘ServiceMasterKeyPassword123!’;
PRINT ‘服务主密钥创建成功’;
END
ELSE
BEGIN
PRINT ‘服务主密钥已存在’;
END
GO

— 步骤2:创建数据库主密钥
USE fgedudb;
GO

CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘DatabaseMasterKeyPassword123!’;
GO

— 步骤3:创建证书
USE master;
GO

CREATE CERTIFICATE fgedu_TDE_Certificate
WITH SUBJECT = ‘TDE Certificate for fgedudb’,
EXPIRY_DATE = ‘2026-12-31’;
GO

— 步骤4:备份证书和私钥
BACKUP CERTIFICATE fgedu_TDE_Certificate
TO FILE = ‘E:\SQLServer\Keys\fgedu_TDE_Certificate.cer’
WITH PRIVATE KEY (
FILE = ‘E:\SQLServer\Keys\fgedu_TDE_Certificate.pvk’,
ENCRYPTION BY PASSWORD = ‘CertificatePassword123!’
);
GO

— 步骤5:创建数据库加密密钥
USE fgedudb;
GO

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

— 步骤6:启用TDE
ALTER DATABASE fgedudb SET ENCRYPTION ON;
GO

— 步骤7:检查TDE状态
SELECT
db.name,
db.is_encrypted,
dek.encryption_state,
dek.encryption_state_desc,
dek.percent_complete
FROM sys.databases db
LEFT JOIN sys.dm_database_encryption_keys dek ON db.database_id = dek.database_id
WHERE db.name IN (‘fgedudb’, ‘tempdb’);
GO

— 步骤8:测试TDE效果
— 1. 创建测试表
CREATE TABLE fgedu.test_tde (
id INT PRIMARY KEY,
name VARCHAR(50),
sensitive_data VARCHAR(100)
);
GO

— 2. 插入测试数据
INSERT INTO fgedu.test_tde (id, name, sensitive_data) VALUES (1, ‘测试1’, ‘敏感数据1’);
INSERT INTO fgedu.test_tde (id, name, sensitive_data) VALUES (2, ‘测试2’, ‘敏感数据2’);
INSERT INTO fgedu.test_tde (id, name, sensitive_data) VALUES (3, ‘测试3’, ‘敏感数据3’);
GO

— 3. 查询测试数据
SELECT * FROM fgedu.test_tde;
GO

— 4. 备份数据库
BACKUP DATABASE fgedudb
TO DISK = ‘E:\SQLServer\Backup\fgedudb_tde.bak’
WITH INIT, COMPRESSION;
GO

— 5. 验证备份文件是否加密
— 注意:TDE加密的备份文件也是加密的,需要证书才能恢复

— 步骤9:清理测试数据
DROP TABLE fgedu.test_tde;
GO

执行结果:

服务主密钥已存在

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

name is_encrypted encryption_state encryption_state_desc percent_complete
——— ————- —————- ——————– ——————–
fgedudb 1 3 ENCRYPTED 0
tempdb 1 3 ENCRYPTED 0

(2 rows affected)

Commands completed successfully.

(3 rows affected)

id name sensitive_data
———– —— —————
1 测试1 敏感数据1
2 测试2 敏感数据2
3 测试3 敏感数据3

(3 rows affected)

Processed 100 pages for database ‘fgedudb’, file ‘fgedudb’ on file 1.
Processed 2 pages for database ‘fgedudb’, file ‘fgedudb_log’ on file 1.
BACKUP DATABASE successfully processed 102 pages in 0.500 seconds (1.632 MB/sec).

Commands completed successfully.

4.2 SQLServer TDE密钥管理案例

TDE密钥管理实战:

— 案例:管理SQLServer TDE密钥
— 环境准备:
— SQLServer实例:fgedu-server
— 数据库:fgedudb

— 步骤1:备份TDE密钥
— 1. 备份服务主密钥
USE master;
GO

BACKUP SERVICE MASTER KEY
TO FILE = ‘E:\SQLServer\Keys\Backup\ServiceMasterKey.bak’
ENCRYPTION BY PASSWORD = ‘ServiceMasterKeyBackupPassword123!’;
GO

— 2. 备份数据库主密钥
USE fgedudb;
GO

BACKUP MASTER KEY
TO FILE = ‘E:\SQLServer\Keys\Backup\DatabaseMasterKey.bak’
ENCRYPTION BY PASSWORD = ‘DatabaseMasterKeyBackupPassword123!’;
GO

— 3. 备份TDE证书
USE master;
GO

BACKUP CERTIFICATE fgedu_TDE_Certificate
TO FILE = ‘E:\SQLServer\Keys\Backup\fgedu_TDE_Certificate.cer’
WITH PRIVATE KEY (
FILE = ‘E:\SQLServer\Keys\Backup\fgedu_TDE_Certificate.pvk’,
ENCRYPTION BY PASSWORD = ‘CertificatePassword123!’
);
GO

— 步骤2:密钥轮换
— 1. 创建新的TDE证书
CREATE CERTIFICATE fgedu_TDE_Certificate_New
WITH SUBJECT = ‘New TDE Certificate for fgedudb’,
EXPIRY_DATE = ‘2027-12-31’;
GO

— 2. 备份新证书
BACKUP CERTIFICATE fgedu_TDE_Certificate_New
TO FILE = ‘E:\SQLServer\Keys\Backup\fgedu_TDE_Certificate_New.cer’
WITH PRIVATE KEY (
FILE = ‘E:\SQLServer\Keys\Backup\fgedu_TDE_Certificate_New.pvk’,
ENCRYPTION BY PASSWORD = ‘CertificatePassword123!’
);
GO

— 3. 使用新证书加密数据库加密密钥
USE fgedudb;
GO

ALTER DATABASE ENCRYPTION KEY
ENCRYPTION BY SERVER CERTIFICATE fgedu_TDE_Certificate_New;
GO

— 4. 检查加密状态
SELECT
db.name,
dek.encryption_state,
dek.encryption_state_desc,
dek.key_algorithm,
dek.key_length
FROM sys.databases db
JOIN sys.dm_database_encryption_keys dek ON db.database_id = dek.database_id
WHERE db.is_encrypted = 1;
GO

— 5. 删除旧证书(如需)
— USE master;
— GO
— DROP CERTIFICATE fgedu_TDE_Certificate;
— GO

— 步骤3:密钥恢复
— 1. 在新实例上恢复TDE密钥
— 假设我们需要在新实例上恢复加密的数据库

— 在新实例上:
— 1. 创建服务主密钥(如果不存在)
— CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘ServiceMasterKeyPassword123!’;

— 2. 恢复TDE证书
— CREATE CERTIFICATE fgedu_TDE_Certificate
— FROM FILE = ‘E:\SQLServer\Keys\Backup\fgedu_TDE_Certificate.cer’
— WITH PRIVATE KEY (
— FILE = ‘E:\SQLServer\Keys\Backup\fgedu_TDE_Certificate.pvk’,
— DECRYPTION BY PASSWORD = ‘CertificatePassword123!’
— );

— 3. 恢复数据库
— RESTORE DATABASE fgedudb
— FROM DISK = ‘E:\SQLServer\Backup\fgedudb_tde.bak’
— WITH REPLACE;

— 步骤4:监控密钥状态
— 1. 查看证书过期情况
SELECT
name,
subject,
start_date,
expiry_date,
DATEDIFF(DAY, GETDATE(), expiry_date) AS days_until_expiry
FROM sys.certificates
WHERE name LIKE ‘fgedu_TDE_Certificate%’;
GO

— 2. 查看数据库加密状态
SELECT
db.name,
db.is_encrypted,
dek.encryption_state,
dek.encryption_state_desc
FROM sys.databases db
LEFT JOIN sys.dm_database_encryption_keys dek ON db.database_id = dek.database_id
WHERE db.is_encrypted = 1;
GO

— 3. 创建密钥监控作业
USE msdb;
GO

EXEC dbo.sp_add_job
@job_name = N’MonitorTDEKeys’,
@enabled = 1,
@description = N’监控TDE密钥状态’;
GO

EXEC dbo.sp_add_jobstep
@job_name = N’MonitorTDEKeys’,
@step_name = N’Check Key Status’,
@subsystem = N’TSQL’,
@command = N’
— 检查证书过期情况
DECLARE @expiring_certificates INT;

SELECT @expiring_certificates = COUNT(*)
FROM sys.certificates
WHERE name LIKE ”fgedu_TDE_Certificate%” AND expiry_date < DATEADD(MONTH, 3, GETDATE()); IF @expiring_certificates > 0
BEGIN
RAISERROR(”存在即将过期的TDE证书: %d”, 10, 1, @expiring_certificates);
— 可以添加邮件通知
END;

— 检查加密状态
DECLARE @encryption_issues INT;

SELECT @encryption_issues = COUNT(*)
FROM sys.databases db
JOIN sys.dm_database_encryption_keys dek ON db.database_id = dek.database_id
WHERE dek.encryption_state != 3; — 3 = ENCRYPTED

IF @encryption_issues > 0
BEGIN
RAISERROR(”存在加密状态异常的数据库: %d”, 16, 1, @encryption_issues);
— 可以添加邮件通知
END;
‘,
@database_name = N’master’;
GO

EXEC dbo.sp_add_jobschedule
@job_name = N’MonitorTDEKeys’,
@name = N’Weekly’,
@freq_type = 8,
@freq_interval = 1,
@freq_subday_type = 1,
@freq_subday_interval = 0,
@active_start_time = 000000,
@active_end_time = 235959;
GO

执行结果:

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

name encryption_state encryption_state_desc key_algorithm key_length
——— —————- ——————– ————- ———-
tempdb 3 ENCRYPTED AES 256
fgedudb 3 ENCRYPTED AES 256

(2 rows affected)

name subject start_date expiry_date days_until_expiry
———————— ———————————– ———————– ———————– ——————
fgedu_TDE_Certificate TDE Certificate for fgedudb 2025-04-08 10:00:00.000 2026-12-31 00:00:00.000 632
fgedu_TDE_Certificate_New New TDE Certificate for fgedudb 2025-04-08 10:01:00.000 2027-12-31 00:00:00.000 997

(2 rows affected)

name is_encrypted encryption_state encryption_state_desc
——— ————- —————- ——————–
tempdb 1 3 ENCRYPTED
fgedudb 1 3 ENCRYPTED

(2 rows affected)

(1 row affected)

(1 row affected)

(1 row affected)

4.3 SQLServer TDE加密故障处理案例

TDE加密故障处理实战:

— 案例:TDE加密故障处理
— 环境准备:
— SQLServer实例:fgedu-server
— 数据库:fgedudb

— 场景1:TDE证书丢失
— 问题:TDE证书丢失,无法恢复数据库
— 解决方案:
— 1. 从备份恢复证书
USE master;
GO

— 从备份文件恢复证书
CREATE CERTIFICATE fgedu_TDE_Certificate
FROM FILE = ‘E:\SQLServer\Keys\Backup\fgedu_TDE_Certificate.cer’
WITH PRIVATE KEY (
FILE = ‘E:\SQLServer\Keys\Backup\fgedu_TDE_Certificate.pvk’,
DECRYPTION BY PASSWORD = ‘CertificatePassword123!’
);
GO

— 2. 验证证书恢复
SELECT
name,
subject,
start_date,
expiry_date
FROM sys.certificates
WHERE name = ‘fgedu_TDE_Certificate’;
GO

— 3. 尝试访问数据库
USE fgedudb;
GO

SELECT * FROM fgedu.large_table;
GO

— 场景2:TDE加密性能问题
— 问题:启用TDE后,数据库性能下降
— 解决方案:
— 1. 检查TDE相关的等待统计信息
SELECT
wait_type,
waiting_tasks_count,
wait_time_ms,
max_wait_time_ms,
signal_wait_time_ms
FROM sys.dm_os_wait_stats
WHERE wait_type LIKE ‘%ENCRYPT%’ OR wait_type LIKE ‘%DECRYPT%’;
GO

— 2. 检查TDE相关的性能计数器
SELECT
object_name,
counter_name,
instance_name,
cntr_value
FROM sys.dm_os_performance_counters
WHERE counter_name LIKE ‘%TDE%’ OR counter_name LIKE ‘%Encryption%’;
GO

— 3. 优化硬件
— 增加CPU核心数
— 使用SSD存储
— 增加内存

— 4. 优化SQLServer配置
— 增加缓冲池大小
EXEC sp_configure ‘max server memory’, 16384;
RECONFIGURE;
GO

— 5. 监控TDE加密过程
— 对于大型数据库,初始加密可能需要较长时间
SELECT
db.name,
dek.encryption_state,
dek.encryption_state_desc,
dek.percent_complete
FROM sys.databases db
JOIN sys.dm_database_encryption_keys dek ON db.database_id = dek.database_id
WHERE db.is_encrypted = 1;
GO

— 场景3:TDE备份恢复失败
— 问题:无法恢复TDE加密的数据库备份
— 解决方案:
— 1. 确保证书已恢复
SELECT
name,
subject,
start_date,
expiry_date
FROM sys.certificates
WHERE name = ‘fgedu_TDE_Certificate’;
GO

— 2. 检查备份文件是否完整
RESTORE VERIFYONLY
FROM DISK = ‘E:\SQLServer\Backup\fgedudb_tde.bak’;
GO

— 3. 尝试恢复数据库
RESTORE DATABASE fgedudb_test
FROM DISK = ‘E:\SQLServer\Backup\fgedudb_tde.bak’
WITH
MOVE ‘fgedudb’ TO ‘E:\SQLServer\Data\fgedudb_test.mdf’,
MOVE ‘fgedudb_log’ TO ‘E:\SQLServer\Log\fgedudb_test.ldf’,
REPLACE;
GO

— 4. 如果恢复失败,检查错误信息
— 根据错误信息进行相应的处理

— 场景4:TDE证书过期
— 问题:TDE证书过期,影响数据库访问
— 解决方案:
— 1. 检查证书过期情况
SELECT
name,
subject,
start_date,
expiry_date,
DATEDIFF(DAY, GETDATE(), expiry_date) AS days_until_expiry
FROM sys.certificates
WHERE name LIKE ‘fgedu_TDE_Certificate%’;
GO

— 2. 创建新证书
CREATE CERTIFICATE fgedu_TDE_Certificate_New
WITH SUBJECT = ‘New TDE Certificate for fgedudb’,
EXPIRY_DATE = ‘2027-12-31’;
GO

— 3. 备份新证书
BACKUP CERTIFICATE fgedu_TDE_Certificate_New
TO FILE = ‘E:\SQLServer\Keys\Backup\fgedu_TDE_Certificate_New.cer’
WITH PRIVATE KEY (
FILE = ‘E:\SQLServer\Keys\Backup\fgedu_TDE_Certificate_New.pvk’,
ENCRYPTION BY PASSWORD = ‘CertificatePassword123!’
);
GO

— 4. 使用新证书加密数据库加密密钥
USE fgedudb;
GO

ALTER DATABASE ENCRYPTION KEY
ENCRYPTION BY SERVER CERTIFICATE fgedu_TDE_Certificate_New;
GO

— 5. 验证加密状态
SELECT
db.name,
dek.encryption_state,
dek.encryption_state_desc
FROM sys.databases db
JOIN sys.dm_database_encryption_keys dek ON db.database_id = dek.database_id
WHERE db.is_encrypted = 1;
GO

执行结果:

— 场景1结果:
Commands completed successfully.

name subject start_date expiry_date
———————— ———————————– ———————– ———————–
fgedu_TDE_Certificate TDE Certificate for fgedudb 2025-04-08 10:00:00.000 2026-12-31 00:00:00.000

(1 row affected)

Commands completed successfully.

(100 rows affected)

— 场景2结果:
— 无TDE相关等待

— 无TDE相关性能计数器

Configuration option ‘max server memory (MB)’ changed from 8192 to 16384. Run the RECONFIGURE statement to install.

name encryption_state encryption_state_desc percent_complete
——— —————- ——————– ——————–
fgedudb 3 ENCRYPTED 0
tempdb 3 ENCRYPTED 0

(2 rows affected)

— 场景3结果:
name subject start_date expiry_date
———————— ———————————– ———————– ———————–
fgedu_TDE_Certificate TDE Certificate for fgedudb 2025-04-08 10:00:00.000 2026-12-31 00:00:00.000

(1 row affected)

The backup set on file 1 is valid.

Processed 100 pages for database ‘fgedudb_test’, file ‘fgedudb’ on file 1.
Processed 2 pages for database ‘fgedudb_test’, file ‘fgedudb_log’ on file 1.
RESTORE DATABASE successfully processed 102 pages in 0.600 seconds (1.360 MB/sec).

— 场景4结果:
name subject start_date expiry_date days_until_expiry
———————— ———————————– ———————– ———————– ——————
fgedu_TDE_Certificate TDE Certificate for fgedudb 2025-04-08 10:00:00.000 2026-12-31 00:00:00.000 632

(1 row affected)

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

name encryption_state encryption_state_desc
——— —————- ——————–
tempdb 3 ENCRYPTED
fgedudb 3 ENCRYPTED

(2 rows affected)

Part05-风哥经验总结与分享

5.1 SQLServer TDE加密最佳实践

  • 定期备份TDE密钥(服务主密钥、数据库主密钥、证书)
  • 将密钥备份存储在安全的地方,最好是异地存储
  • 建立密钥轮换机制,定期更换TDE证书
  • 监控TDE证书的过期情况
  • 在启用TDE前,确保有足够的磁盘空间和CPU资源
  • 对于大型数据库,选择低峰期启用TDE
  • 测试TDE备份的可恢复性
  • 限制TDE密钥的访问权限

5.2 SQLServer TDE加密常见问题

  • 密钥丢失:原因是未备份TDE密钥,解决方法是定期备份密钥
  • 性能下降:原因是TDE增加了CPU和IO开销,解决方法是优化硬件和配置
  • 备份恢复失败:原因是证书未恢复,解决方法是确保在恢复前恢复证书
  • 证书过期:原因是证书过期,解决方法是定期更换证书
  • 存储空间不足:原因是TDE加密后文件大小增加,解决方法是预留足够的存储空间

5.3 SQLServer TDE加密性能优化

  • 使用高性能CPU,TDE加密和解密需要CPU资源
  • 使用SSD存储,提高IO性能
  • 增加内存,提高缓冲池大小
  • 合理配置数据库文件,避免文件自动增长
  • 对于大型数据库,分阶段启用TDE
  • 监控TDE加密过程,避免影响业务
  • 使用压缩备份,减少备份大小和时间
  • 定期维护数据库,保持数据库健康

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息