我正在尝试在Truecrypt卷上创建MS SQL Server数据库。我需要我的系统具有以下属性:如果未安装Truecrypt卷,则无法访问数据库或数据库日志文件中的数据。我正在执行以下操作来创建数据库:

CREATE DATABASE test1 CONTAINMENT=PARTIAL ON (NAME='test1_data', FILENAME='D:\SqlData') LOG ON (NAME='test1_log', FILENAME='D:\SQLDataLog');
go

其中D:是我安装的Trucrypt卷。这似乎可以正常工作,因为它会创建指定的文件和可用的数据库。但是,我不确定它实际上是否安全。我认为它是在D:卷以外的地方存储数据。我可以执行以下操作:
use test1;
go
CREATE TABLE Persons (ID int, name varchar(255));
go

INSERT INTO Persons VALUES (1, 'Jason');
go

然后关闭我的数据库客户端,卸载卷,重新打开客户端(sqlcmd),然后执行以下操作:
use test1;
go
SELECT * FROM Persons;
go

并且我得到了放入的数据。显然,这意味着Truecrypt卷之外发生了一些存储。我是在做错什么,误解了什么,还是只是想在MS SQL Server上不可行?

最佳答案

该解决方案是不安全的。 SQL Server可以在各种情况下(例如在排序或哈希处理期间)自动将数据泄漏到tempdb,因此您最终可能会泄漏想要保护的内容。
在这种情况下,我将退出TrueCrypt,并尽可能使用Transparent Database Encryption(在第一个数据库加密后,它也会自动对tempdb进行加密)。或者,如果您真的想使用TC,也请使用TrueCrypt保护tempdb,并确保没有人会强制卸装该卷。否则,您要求数据库损坏和数据丢失。

09-29 20:05