在我撰写本文时,我仍在等待 SQL Server 2016 的正式发布,以便我们可以探索其“始终加密”功能的实用性。
我只想知道 SQL Server 2016 中的 Always Encrypted 和当前可用的透明数据加密之间的具体区别是什么,以便我们可以为未来的项目做出正确的决定。
sql-server transparent-data-encryption sql-server-2016 always-encrypted
使用什么证书来加密实例上的每个数据库。
我可以使用以下方法获取数据,但如何编写查询
USE master
GO
-- this provides the list of certificates
SELECT * FROM sys.certificates
-- this provides the list of databases (encryption_state = 3) is encrypted
SELECT * FROM sys.dm_database_encryption_keys
WHERE encryption_state = 3;
Run Code Online (Sandbox Code Playgroud)
我注意到 sys.certifcates.thumbprint 和 sys.dm_database_encryption_keys.encryptor_thumbprint 列包含相同的数据。
我正在阅读一些关于透明数据加密的文档和白皮书。一些文档也提到备份服务主密钥(为了澄清,我不是在谈论数据库主密钥)。我只是不完全理解为什么这是必要的,因为我能够在不使用任何服务主密钥的情况下将具有 TDE 加密的数据库从服务器 A(备份)备份/恢复到服务器 B(恢复)。
什么场景下需要恢复Service Master Key?
在 SQL Server 2017 (CU3) 上,每当我在我的一个 TDE 数据库上启用备份压缩时,备份过程总是会损坏数据库中的特定页面。如果我在不压缩的情况下运行备份,它不会被损坏。以下是我为验证和重现此问题而采取的步骤:
总结一下:数据库和常规备份看起来不错,在数据库上运行 CHECKDB 并在备份上运行 VERIFYONLY 不会报告任何错误。使用压缩备份数据库似乎会导致损坏。
下面是有错误的代码示例。(注意:在 TDE 数据库中使用压缩需要 MAXTRANSFERSIZE)
-- Good, completes with no corruption;
BACKUP DATABASE [TDE_DB1] TO DISK = N'E:\MSSQL\Backup\TDE_DB1a.bak' WITH CHECKSUM;
RESTORE VERIFYONLY FROM DISK = N'E:\MSSQL\Backup\TDE_DB1a.bak' WITH CHECKSUM;
RESTORE DATABASE [TDE_DB2]
FROM DISK = 'E:\MSSQL\Backup\TDE_DB1a.bak'
WITH MOVE 'DataFileName' to 'E:\MSSQL\Data\TDE_DB2.mdf'
,MOVE 'LogFileName' to 'F:\MSSQL\Log\TDE_DB2_log.ldf';
-- Bad, I …Run Code Online (Sandbox Code Playgroud) sql-server corruption transparent-data-encryption sql-server-2017
(幸运的是,我们目前并未处于这种情况,只是提前计划,看看如果发生这种情况,我们的选择是什么。)
对于使用透明日期加密 (TDE) 加密的数据库,除非您有用于加密它的证书的备份,否则数据库备份的副本是不可恢复的。
如果你没有那个怎么办?还有其他选择吗?
如果整个服务器发生故障,在新硬件上恢复 MASTER 数据库的备份是否也会恢复证书?
sql-server encryption transparent-data-encryption disaster-recovery
我在开发环境中工作以更好地理解TDE加密。我让它与另一台服务器上的备份和恢复一起工作。有几个问题,我知道我需要使用相应的私钥备份证书。
USE master;
GO
BACKUP CERTIFICATE Test
TO FILE = 'C:\Test.cer'
WITH PRIVATE KEY
(FILE = 'C:\Test.pvk',
ENCRYPTION BY PASSWORD = 'Example12#')
Run Code Online (Sandbox Code Playgroud)
如果发生故障,这些需要在新服务器上移动/恢复。在需要恢复到另一台服务器的情况下,我还需要从源服务器备份什么吗?
还有关于私钥存储的任何建议吗?我目前的想法是将证书、私钥和密码备份到单独备份和异地复制的 KeePass 数据库中。
这留下了一个问题,即将 KeePass 私钥备份到哪里?
更新:@AmitBanerjee - Microsoft SQL Server 产品组的高级项目经理确认 MS 将调查该问题,因为它是一个缺陷。
有没有人遇到过在启用 TDE 并使用MAXTRANSFERSIZE> 65536(在我的情况下,我选择 65537 以便我可以压缩 TDE 数据库)的情况下恢复在 SQL Server 2016 上进行的备份的问题CHECKSUM?
下面是一个repro:
--- create database
create database test_restore
go
-- create table
create table test_kin (fname char(10))
go
-- Enable TDE
use master
GO
CREATE CERTIFICATE test_restore WITH SUBJECT = 'test_restore_cert'
GO
SELECT name, pvt_key_encryption_type_desc, * FROM sys.certificates WHERE name = 'test_restore'
GO
use test_restore
go
CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM …Run Code Online (Sandbox Code Playgroud) sql-server restore transparent-data-encryption sql-server-2016
他们确实说没有“愚蠢的问题”这样的东西,所以这里是:
我了解 SQL Server透明数据加密(TDE) 对静态数据进行加密,因此如果有人闯入您的存储并窃取这些文件,您的数据库文件 (.mdf) 和备份文件 (.bak) 将被加密。我也知道从磁盘读取数据时会解密数据,因此它在内存中未加密(在运动中)。因此,运行远程查询(select * from SensitiveData)的用户请求的数据在通过网络传输时将是未加密的,因此容易被拦截。
因此,假设以上所有内容都是正确的,这是我的愚蠢问题:如果我的 SQL Server 实例在计算机 A 上并且我的 TDE 数据库备份被注销到远程计算机 B 上的存储,备份操作数据是否在传输时加密?计算机 A 要写入计算机 B 的磁盘吗?我认为它必须是(因为我认为加密操作首先发生在计算机 A 上),但我无法在任何 Microsoft 文档或博客中找到对此的确认。同样,在还原操作期间——是否有人拦截了从计算机 B 上的磁盘传输的数据以还原计算机 A 上的数据库——他们会发现移动中的数据是加密的吗?
我正在尝试备份 TDE 数据库的主密钥,但 SQL Server 说没有。这有点奇怪,但我确定我只是做错了什么。我是服务器上的系统管理员,所以我应该能够看到所有内容。
这是失败的声明:
USE [my_db];
BACKUP MASTER KEY
TO FILE = 'C:\master_key'
ENCRYPTION BY PASSWORD = 'some_killer_password';
Run Code Online (Sandbox Code Playgroud)
并返回错误消息:
消息 15151,级别 16,状态 1,第 11 行
找不到对称密钥“主密钥”,因为它不存在或您没有权限。
我已使用以下内容查看有关数据库加密密钥和关联证书的详细信息,但是sys.certificates表中的证书详细信息为空。
USE [my_db];
SELECT DatabaseName = d.name
, ddek.encryptor_type
, ddek.opened_date
, c.name
, c.cert_serial_number
, c.pvt_key_encryption_type_desc
, c.subject
FROM sys.dm_database_encryption_keys ddek
INNER JOIN sys.databases d ON ddek.database_id = d.database_id
LEFT JOIN sys.certificates c ON ddek.encryptor_thumbprint = c.thumbprint
WHERE d.name <> 'tempdb' /* tempdb is auto-encrypted by SQL Server …Run Code Online (Sandbox Code Playgroud) 我正在研究 VLDB 上的 TDE 实现,想知道是否有人拥有在生产服务器上启用加密的实际经验。
我可以期待什么样的问题(如果有的话)?我的测试显示在测试环境中影响很小,但我担心在生产环境中设置需要多长时间。任何反馈表示赞赏。
我在某处读到我需要在加密过程中禁用备份和数据库维护。这是真的?
这非常令人担忧,因为我的测试花了大约 4 天的时间来完成加密。
sql-server sql-server-2008-r2 encryption transparent-data-encryption vldb
sql-server ×10
transparent-data-encryption ×10
encryption ×6
corruption ×1
network ×1
restore ×1
security ×1
vldb ×1