实现原理

  • 在principal: 创建master key 先判断是否存在master key, 如果存在可以先DROP再创建,因为涉及到master key密码需要利用,老的master key不一定记得住密码:
  • 在Principal:创建镜像使用的证书
  1. GO
  2. CREATE CERTIFICATE cer_db_mirror_principal
  3. WITH SUBJECT='certification for mirror',
  4. START_DATE='01/01/1999',
  5. EXPIRY_DATE='12/31/2099';
  6. 查询验证:
  7. SELECT
  8. *
  9. FROM sys.certificates
  10. WHERE name='cer_db_mirror_principal'
  • 在principal: 创建镜像使用的端点
  1. CREATE ENDPOINT endpoint_mirroring
  2. STATE=STARTED
  3. AS TCP (
  4. LISTENER_PORT=5022, LISTENER_IP=ALL )
  5. FOR data_mirroring(
  6. AUTHENTICATION=CERTIFICATE cer_db_mirror_principal,
  7. ENCRYPTION= REQUIRED ALGORITHM RC4, ROLE=ALL
  8. )
  9. 查询验证:
  10. SELECT
  11. *
  12. FROM sys.tcp_endpoints
  13. WHERE name='endpoint_mirroring'
  • 在principal: 备份master key
  1. OPEN MASTER KEY
  2. DECRYPTION BY PASSWORD = 'mypassword';
  3. BACKUP MASTER KEY
  4. TO FILE = 'D:\backup\master_key.mky'
  5. ENCRYPTION BY PASSWORD = 'context'
  • 在principal: 备份证书
  1. BACKUP CERTIFICATE cer_db_mirror_principal
  2. TO FILE='D:\backup\cer_db_mirror_principal.cer'
  • 在mirror: 还原master key
  1. RESTORE MASTER KEY
  2. FROM FILE = 'D:\Backup\master_key.mky'
  3. DECRYPTION BY PASSWORD = 'context'
  4. ENCRYPTION BY PASSWORD = 'context';
  5. 查询验证:
  6. SELECT
  7. *
  8. FROM sys.symmetric_keys
  9. WHERE name='##MS_DatabaseMasterKey##'
  • 在mirror: 创建证书
  1. USE master
  2. GO
  3. OPEN MASTER KEY DECRYPTION BY PASSWORD = 'context'
  4. CREATE CERTIFICATE cer_db_mirror_mirror
  5. WITH SUBJECT='CERTIFICATION FOR MIRROR',
  6. START_DATE='01/01/1999', EXPIRY_DATE='12/31/2099'
  7. 查询验证:
  8. *
  9. FROM sys.certificates
  10. WHERE name='cer_db_mirror_mirror'
  • 在mirror: 创建端点
  1. CREATE ENDPOINT endpoint_mirroring
  2. STATE=STARTED
  3. AS TCP (
  4. LISTENER_PORT=5022, LISTENER_IP=ALL )
  5. FOR DATA_MIRRORING(
  6. AUTHENTICATION=CERTIFICATE cer_db_mirror_mirror,
  7. ENCRYPTION= REQUIRED ALGORITHM RC4, ROLE=ALL
  8. )
  9. 查询验证:
  10. SELECT *
  11. FROM sys.tcp_endpoints
  12. WHERE name='endpoint_mirroring'
  • 在mirror: 备份镜像证书
  1. BACKUP CERTIFICATE cer_db_mirror_mirror
  2. TO FILE='D:\Backup\cer_db_mirror_mirror.cer'
  • 在principal: 创建端点的连接认证用户
  • 在principal: 创建镜像的证书,以打通相互成功握手通道
  1. CREATE CERTIFICATE cer_db_mirror_mirror
  2. AUTHORIZATION mirror_for_user
  3. FROM FILE='D:\Backup\cer_db_mirror_mirror.cer';
  • 在principal: 为端点授权
  1. GRANT CONNECT ON ENDPOINT::endpoint_mirroring TO mirror_for_login;
  • 在mirror: 创建端点的连接认证用户
  1. USE master
  2. GO
  3. CREATE LOGIN principal_for_login
  4. WITH PASSWORD=N'dd266320-AA4d-4R52-G38E-9DF5DE313B85'
  5. GO
  6. CREATE USER principal_for_user
  7. FOR LOGIN principal_for_login
  • 在mirror: 创建镜像的证书,以打通相互成功握手通道
  1. CREATE CERTIFICATE cer_db_mirror_principal
  2. AUTHORIZATION principal_for_user
  3. FROM FILE='D:\Backup\cer_db_mirror_principal.cer'
  • 在mirror: 为端点授权
  1. GRANT CONNECT ON ENDPOINT::endpoint_mirroring TO principal_for_login
  • 在principal: 创建一个测试书库
  1. CREATE DATABASE tde_mirror
  • 在principal: 设置数据库的恢复模式为FULL,并备份数据库和日志
  1. ALTER DATABASE tde_mirror
  2. SET RECOVERY FULL
  3. BACKUP DATABASE tde_mirror
  4. TO DISK='D:\Backup\tde_mirror.bak'
  5. WITH STATS=5,COMPRESSION
  6. BACKUP LOG tde_mirror
  7. TO DISK='D:\Backup\tde_mirror.trn'
  8. WITH STATS=5,COMPRESSION
  • 在mirror: 还原数据库
  1. RESTORE DATABASE tde_mirror
  2. FROM DISK='D:\Backup\tde_mirror.bak'
  3. WITH STATS=5,NORECOVERY
  4. RESTORE LOG tde_mirror
  5. FROM DISK='D:\Backup\tde_mirror.trn'
  6. WITH STATS=5,NORECOVERY
  • 在mirror: 设置镜像
  • 在principal: 应用镜像
  1. SET PARTNER = 'TCP://10.0.0.2:5022' --ip address or host name
  • 在principal: 创建TDE需要的证书
  1. CREATE CERTIFICATE cer_tde
  2. WITH SUBJECT='cert for tde',
  3. START_DATE='01/01/1999',
  4. EXPIRY_DATE='12/31/2099';
  5. 注意,创建完证书,数据库的同步状态可能会是SUSPEND,主备完成加密设置后才会恢复正常。
  • 在principal: 在主库用户数据库创建DEK
  1. USE tde_mirror
  2. GO
  3. CREATE DATABASE ENCRYPTION KEY
  4. WITH ALGORITHM = AES_128 ENCRYPTION
  5. BY SERVER CERTIFICATE cer_tde
  • 在principal: 设置数据库加密
  1. USE master
  2. GO
  3. ALTER DATABASE tde_mirror
  4. SET ENCRYPTION ON
  5. 查询验证:这个状态应该是3
  6. SELECT
  7. d.name,DEK.encryption_state
  8. FROM sys.dm_database_encryption_keys dek
  9. INNER JOIN sys.databases d
  10. ON dek.database_id=d.database_id
  • 在principal: 备份TDE证书
  1. BACKUP CERTIFICATE cer_tde
  2. TO FILE = 'D:\Backup\cer_tde.cer'
  3. WITH PRIVATE KEY ( FILE = 'D:\Backup\cer_tde.pvk',
  4. ENCRYPTION BY PASSWORD = 'tde_password');
  • 在mirror: 创建证书
  1. OPEN MASTER KEY DECRYPTION BY PASSWORD = 'context'
  2. CREATE CERTIFICATE cer_tde
  3. FROM FILE = 'D:\Backup\cer_tde.cer'
  4. WITH PRIVATE KEY (FILE = 'D:\Backup\cer_tde.pvk',
  5. DECRYPTION BY PASSWORD = 'tde_password')
  6. 验证: 这个状态应该是1,做FAILOVER后才变成3
  7. SELECT
  8. d.name,DEK.encryption_state
  9. FROM sys.dm_database_encryption_keys dek
  10. INNER JOIN sys.databases d
  11. ON dek.database_id=d.database_id

总结

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

透明数据库加密共存性

  • 事务日志 允许数据库使用 TDE 具有将虚拟事务日志的剩余部分“清零”以强制加密下一个虚拟事务日志的效果。这可以保证在数据库设置为加密后事务日志中不会留有明文。所有在数据库加密密钥更改前写入事务日志的数据都将使用之前的数据库加密密钥加密。在数据库加密密钥修改过两次后,必须执行日志备份才能再次对数据库加密密钥进行修改
  • tempdb系统数据库 如果 tempdb 实例中的任何用户数据库是使用 TDE 加密的,则会加密tempdb数据库。如果取消所有数据库加密状态,tempdb的加密数据库状态不会改变。
  • 复制 复制不会以加密形式从启用了 TDE 的数据库中自动复制数据。如果您想保护分发和订阅服务器数据库,则必须单独启用 TDE。快照复制以及用于事务和合并复制的初始数据分发,都能够在未加密的中间文件(例如 bcp 文件)中存储数据。 在事务或合并复制期间,可以启用加密来保护通信信道。
  • 与FileStream数据 即使启用了 TDE,也不会加密 FILESTREAM 数据。