SQLServer · 最佳实践 · 透明数据加密TDE在SQLServer的应用

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: SQL SERVER的TDE实现方式,在与镜像共存是如何来保证数据库的有效运转,需要在设置时,做一些特殊的处理。具体请参见文章。

title: SQLServer · 最佳实践 · 透明数据加密TDE在SQLServer的应用

author: 石沫

背景

作为云计算的服务提供者,我们在向用户提供优秀的服务能力时会遇到一个合规的问题。在数据库领域,数据是极其敏感和珍贵的,保护好数据,就如保护好企业的生命线。因此,需要采取一些预防措施来帮助保护数据库的安全,如设计一个安全系统、加密机密资产以及在数据库服务器的周围构建防火墙。但是,如果遇到物理介质被盗的情况,恶意破坏方只需还原或附加数据库即可浏览数据,或者遭遇拖库情况。一种解决方案是加密数据库中的敏感数据,并通过证书保护用于加密数据的密钥。这可以防止任何没有密钥的人使用这些数据,但这种保护必须事先计划。在SQL Server中,透明数据加密 (TDE) 可以加密 SQL Server数据文件,能够有效保护好我们的数据资产。

实现原理

数据库文件的加密在页级别执行。已加密数据库中的页在写入磁盘之前会进行加密,在读入内存时会进行解密,TDE 不会增加已加密数据库的大小。TDE 可对数据和日志文件执行实时 I/O 加密和解密。这种加密使用数据库加密密钥,该密钥存储在数据库引导记录中以供恢复时使用。数据库加密密钥是使用存储在服务器的 master 数据库中的证书保护的对称密钥,或者是由 EKM 模块保护的非对称密钥。TDE 保护“处于休眠状态”的数据,即数据和日志文件。体系如下:
neihe

实现方法

场景说明:

  如果只是简单的配置一个加密数据库,如下步骤即可:创建主密钥,创建证书,创建DEK,应用加密,我们选取了一个比较复杂的场景,与数据库镜像的共存。。同时镜像的创建是在非WINDOWS认证的安全策略,是通过证书的安全认证,这里涉及到master key等信息的特殊处理,证书的多样性。  

下面列举实现的方法:首先,需要配置好用户数据库的镜像:

  • 在principal: 创建master key
    先判断是否存在master key, 如果存在可以先DROP再创建,因为涉及到master key密码需要利用,老的master key不一定记得住密码:
USE master
GO
CREATE MASTER KEY 
ENCRYPTION BY PASSWORD='mypassword'
查询验证:
SELECT 
    * 
FROM sys.symmetric_keys
WHERE name='##MS_DatabaseMasterKey##'
  • 在Principal:创建镜像使用的证书
USE master
GO
CREATE CERTIFICATE cer_db_mirror_principal
WITH SUBJECT='certification for mirror', 
START_DATE='01/01/1999', 
EXPIRY_DATE='12/31/2099';

查询验证:
SELECT 
    *
FROM sys.certificates
WHERE name='cer_db_mirror_principal'
  • 在principal: 创建镜像使用的端点
CREATE ENDPOINT endpoint_mirroring 
STATE=STARTED 
AS TCP ( 
    LISTENER_PORT=5022, LISTENER_IP=ALL ) 
FOR data_mirroring( 
    AUTHENTICATION=CERTIFICATE cer_db_mirror_principal,
    ENCRYPTION= REQUIRED ALGORITHM RC4, ROLE=ALL 
)
查询验证:
SELECT 
    *
FROM sys.tcp_endpoints
WHERE name='endpoint_mirroring'
  • 在principal: 备份master key
OPEN MASTER KEY 
DECRYPTION BY PASSWORD = 'mypassword';
BACKUP MASTER KEY 
TO FILE = 'D:\backup\master_key.mky'
ENCRYPTION BY PASSWORD = 'context'
  • 在principal: 备份证书
BACKUP CERTIFICATE cer_db_mirror_principal 
TO FILE='D:\backup\cer_db_mirror_principal.cer'
  • 在mirror: 还原master key
RESTORE MASTER KEY
FROM FILE = 'D:\Backup\master_key.mky'
DECRYPTION BY PASSWORD = 'context'
ENCRYPTION BY PASSWORD = 'context';

查询验证:
SELECT 
*
FROM sys.symmetric_keys
WHERE name='##MS_DatabaseMasterKey##'
  • 在mirror: 创建证书
USE master
GO 
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'context'

CREATE CERTIFICATE cer_db_mirror_mirror 
WITH SUBJECT='CERTIFICATION FOR MIRROR',
START_DATE='01/01/1999', EXPIRY_DATE='12/31/2099'
查询验证:

SELECT 
*
FROM sys.certificates
WHERE name='cer_db_mirror_mirror'
  • 在mirror: 创建端点
CREATE ENDPOINT endpoint_mirroring 
STATE=STARTED 
AS TCP ( 
    LISTENER_PORT=5022, LISTENER_IP=ALL ) 
FOR DATA_MIRRORING( 
    AUTHENTICATION=CERTIFICATE cer_db_mirror_mirror, 
    ENCRYPTION= REQUIRED ALGORITHM RC4, ROLE=ALL 
)
查询验证:
SELECT * 
FROM sys.tcp_endpoints
WHERE name='endpoint_mirroring'
  • 在mirror: 备份镜像证书
BACKUP CERTIFICATE cer_db_mirror_mirror 
TO FILE='D:\backup\cer_db_mirror_mirror.cer'
  • 在principal: 创建端点的连接认证用户
USE master
GO
CREATE LOGIN mirror_for_login 
WITH PASSWORD=N'22266320-AA49-4F52-A38E-98D5DE313B85'
GO
CREATE USER mirror_for_user 
FOR LOGIN mirror_for_login
  • 在principal: 创建镜像的证书,以打通相互成功握手通道
CREATE CERTIFICATE  cer_db_mirror_mirror
AUTHORIZATION mirror_for_user 
FROM FILE='D:\Backup\cer_db_mirror_mirror.cer';
  • 在principal: 为端点授权
GRANT CONNECT ON ENDPOINT::endpoint_mirroring TO mirror_for_login;
  • 在mirror: 创建端点的连接认证用户
USE master
GO
CREATE LOGIN principal_for_login 
WITH PASSWORD=N'dd266320-AA4d-4R52-G38E-9DF5DE313B85'
GO
CREATE USER principal_for_user
FOR LOGIN principal_for_login
  • 在mirror: 创建镜像的证书,以打通相互成功握手通道
CREATE CERTIFICATE cer_db_mirror_principal 
AUTHORIZATION principal_for_user 
FROM FILE='D:\Backup\cer_db_mirror_principal.cer'
  • 在mirror: 为端点授权
GRANT CONNECT ON ENDPOINT::endpoint_mirroring TO principal_for_login
  • 在principal: 创建一个测试书库
CREATE DATABASE tde_mirror
  • 在principal: 设置数据库的恢复模式为FULL,并备份数据库和日志
ALTER DATABASE tde_mirror
SET RECOVERY FULL

BACKUP DATABASE tde_mirror 
TO DISK='D:\Backup\tde_mirror.bak'
WITH STATS=5,COMPRESSION

BACKUP LOG tde_mirror 
TO DISK='D:\Backup\tde_mirror.trn'
WITH STATS=5,COMPRESSION
  • 在mirror: 还原数据库
RESTORE DATABASE tde_mirror 
FROM DISK='D:\Backup\tde_mirror.bak'
WITH STATS=5,NORECOVERY

RESTORE LOG tde_mirror 
FROM DISK='D:\Backup\tde_mirror.trn'
WITH STATS=5,NORECOVERY
  • 在mirror: 设置镜像
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'context'  
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
ALTER DATABASE  tde_mirror
SET PARTNER = 'TCP://10.0.0.1:5022'  --ip address or host name
  • 在principal: 应用镜像
ALTER DATABASE  tde_mirror
SET PARTNER = 'TCP://10.0.0.2:5022' --ip address or host name
  • 在principal: 创建TDE需要的证书
CREATE CERTIFICATE cer_tde 
WITH SUBJECT='cert for tde',
START_DATE='01/01/1999',
EXPIRY_DATE='12/31/2099';

注意,创建完证书,数据库的同步状态可能会是SUSPEND,主备完成加密设置后才会恢复正常。
  • 在principal: 在主库用户数据库创建DEK
USE tde_mirror
GO
CREATE DATABASE ENCRYPTION KEY 
WITH ALGORITHM = AES_128 ENCRYPTION 
BY SERVER CERTIFICATE cer_tde
  • 在principal: 设置数据库加密
USE master
GO
ALTER DATABASE  tde_mirror
SET ENCRYPTION ON 

查询验证:这个状态应该是3
SELECT 
        d.name,DEK.encryption_state 
FROM sys.dm_database_encryption_keys dek
  INNER JOIN sys.databases d
        ON dek.database_id=d.database_id
  • 在principal: 备份TDE证书
BACKUP CERTIFICATE cer_tde 
TO FILE = 'D:\Backup\cer_tde.cer'
WITH PRIVATE KEY ( FILE = 'D:\Backup\cer_tde.pvk',
ENCRYPTION BY PASSWORD = 'tde_password');
  • 在mirror: 创建证书
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'context'
CREATE CERTIFICATE cer_tde
FROM FILE = 'D:\Backup\cer_tde.cer'
WITH PRIVATE KEY (FILE = 'D:\Backup\cer_tde.pvk',
DECRYPTION BY PASSWORD = 'tde_password')

验证: 这个状态应该是1,做FAILOVER后才变成3
SELECT 
    d.name,DEK.encryption_state 
FROM sys.dm_database_encryption_keys dek
INNER JOIN sys.databases d
    ON dek.database_id=d.database_id

总结

当TDE和镜像共存时,很多步骤还是不一样,配置也多了许多步骤,可以看出有几个点特别注意:第一是master key的处理方式;第二是镜像的证书和TDE证书的区分;第三是镜像数据库TDE的状态变化。

还原数据库

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

  • 首先备份TDE证书
BACKUP CERTIFICATE cer_tde 
TO FILE = 'D:\Backup\cer_tde.cer'
WITH PRIVATE KEY ( FILE = 'D:\Backup\cer_tde.pvk',
ENCRYPTION BY PASSWORD = 'tde_password');
  • 备份数据库
BACKUP DATABASE tde_mirror 
TO DISK='d:\backup\tde_mirror_201605.bak'
WITH STATS=5,COMPRESSION
  • 在需要还原的数据库上创建TDE证书
CREATE CERTIFICATE cer_tde
FROM FILE = 'D:\Backup\cer_tde.cer'
WITH PRIVATE KEY (FILE = 'D:\Backup\cer_tde.pvk',
DECRYPTION BY PASSWORD = 'tde_password')
  • 还原数据库
RESTORE FILELISTONLY  
FROM DISK='D:\backup\tde_mirror_201605.bak'
RESTORE DATABASE  tde_mirror
FROM DISK='D:\backup\tde_mirror_201605.bak'  

透明数据库加密共存性

  • 事务日志
    允许数据库使用 TDE 具有将虚拟事务日志的剩余部分“清零”以强制加密下一个虚拟事务日志的效果。这可以保证在数据库设置为加密后事务日志中不会留有明文。所有在数据库加密密钥更改前写入事务日志的数据都将使用之前的数据库加密密钥加密。在数据库加密密钥修改过两次后,必须执行日志备份才能再次对数据库加密密钥进行修改
  • tempdb系统数据库
    如果 tempdb 实例中的任何用户数据库是使用 TDE 加密的,则会加密tempdb数据库。如果取消所有数据库加密状态,tempdb的加密数据库状态不会改变。
  • 复制
    复制不会以加密形式从启用了 TDE 的数据库中自动复制数据。如果您想保护分发和订阅服务器数据库,则必须单独启用 TDE。快照复制以及用于事务和合并复制的初始数据分发,都能够在未加密的中间文件(例如 bcp 文件)中存储数据。 在事务或合并复制期间,可以启用加密来保护通信信道。
  • 与FileStream数据
    即使启用了 TDE,也不会加密 FILESTREAM 数据。
  • 内存中的OLTP
    可在拥有内存中 OLTP 对象的数据库上启用 TDE。如果启用 TDE,则内存中 OLTP 日志记录会被加密。如果启用了 TDE,则不对 MEMORY_OPTIMIZED_DATA 文件组中的数据进行加密。
目录
相关文章
|
1月前
|
存储 安全 算法
Go语言在数据加密与保护中的应用
【2月更文挑战第24天】Go语言以其高效的性能、简洁的语法和强大的标准库,在数据加密与保护领域获得了广泛的应用。本文详细探讨了Go语言在数据加密、数据脱敏、访问控制以及安全通信等方面的应用,并分析了Go语言在数据加密与保护方面的优势与未来趋势。
212 49
|
3月前
|
移动开发 JavaScript 安全
Vue 应用程序性能优化:代码压缩、加密和混淆配置详解
Vue 应用程序性能优化:代码压缩、加密和混淆配置详解
38 0
|
2天前
|
存储 监控 安全
网络安全与信息安全:防范漏洞、应用加密、提升意识
【4月更文挑战第18天】 在数字化时代,网络安全与信息安全保障已成为维护国家安全、企业利益和个人隐私的关键。本文深入探讨网络安全的多面性,包括识别和防御网络漏洞、应用加密技术保护数据以及提升全民网络安全意识的重要性。通过对这些关键领域的分析,文章旨在为读者提供实用的策略和建议,以增强其网络环境的安全防护能力。
4 0
|
26天前
|
存储 安全 网络安全
网络安全与信息安全:防范漏洞、应用加密技术与提升安全意识
在数字化时代,网络安全与信息安全已成为维护网络空间稳定的重要基石。本文将深入探讨网络安全中的关键问题——漏洞挖掘与利用,分析加密技术在信息保护中的核心作用,并强调提升个人与企业的安全意识的重要性。文章将提供对当前网络威胁的全面剖析,介绍前沿的防御策略,并分享如何构建一个多层次、全方位的安全防线。
|
28天前
|
安全 Java 数据安全/隐私保护
提升 Java 编程安全性 - 代码加密混淆工具的重要性和应用
提升 Java 编程安全性 - 代码加密混淆工具的重要性和应用
|
29天前
|
机器学习/深度学习 安全 网络安全
网络安全与信息安全:防范漏洞、应用加密技术与提升安全意识
【2月更文挑战第30天】 在数字化时代,随着网络技术的迅猛发展,网络安全和信息安全问题日益突出。本文将深入探讨网络安全漏洞的成因与危害、加密技术的应用以及如何提升个人和企业的安全意识。通过分析不同类型的网络攻击手段,我们旨在提供一系列的防护策略,以增强信息系统的抵抗力。同时,文章还将介绍最新的加密技术动态,并讨论如何培养良好的网络安全习惯,为读者打造一道坚实的信息安全防线。
|
1月前
|
存储 算法 安全
数据安全之道:加密算法在现代网络通信中的应用
本文将深入探讨加密算法在现代网络通信中的重要性和应用。通过介绍对称加密、非对称加密和哈希算法等加密技术,帮助读者了解数据安全保障的关键技术,并探讨其在保护数据完整性和隐私方面的作用。
|
2月前
|
存储 前端开发 算法
加密算法在网络通信中的应用及优势分析
本文将探讨加密算法在网络通信中的重要性,以及不同加密算法的应用和优势。通过对前端、后端、Java、Python、C、PHP、Go等多种技术的分析,我们将了解在日益增长的网络威胁下,加密算法对于确保数据安全和隐私保护的必要性。
|
3月前
|
存储 安全 算法
保护数据安全的重要性:安全加密算法在数据保护中的应用
在数字时代,数据的安全性越来越受到重视。本文将探讨安全加密算法作为一种关键的数据保护手段的重要性和应用。通过分析现有的加密算法和其在数据保护中的角色,我们可以更好地理解如何保护数据免受黑客攻击和隐私泄露。
|
3月前
|
移动开发 前端开发 数据安全/隐私保护
【教程】Ipa Guard为iOS应用提供免费加密混淆方案
【教程】Ipa Guard为iOS应用提供免费加密混淆方案
24 0