将truecrypt与MS SQL Server一起使用

将truecrypt与MS SQL Server一起使用,sql,sql-server,Sql,Sql Server,我正在尝试在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 其

我正在尝试在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:是我的卡车装载量。这似乎工作得很好,因为它创建了指定的文件和一个可用的数据库。然而,我不相信它实际上是安全的。我认为它将数据存储在D:volume之外的其他地方。我可以做到以下几点:

use test1;
go
CREATE TABLE Persons (ID int, name varchar(255));
go

INSERT INTO Persons VALUES (1, 'Jason');
go
然后关闭我的db客户端,卸载卷,重新打开客户端(sqlcmd),然后执行以下操作:


我得到了我输入的数据。显然,这意味着在Truecrypt卷之外发生了一些存储。我是否做错了什么,误解了什么,或者我试图做的事情在MS SQL Server上不可行?

此解决方案不安全。在各种情况下(例如,在排序或散列期间),SQL Server会自动将数据溢出到tempdb,因此最终可能会泄漏您想要保护的内容。
在这种情况下,我会远离TrueCrypt,如果可能的话,只使用它(在第一个数据库加密后,它也会自动加密tempdb)。或者,如果您确实想使用TC,还可以使用TrueCrypt保护tempdb,并确保没有人会强制卸载卷。否则,您会要求数据库损坏和数据丢失。

您可以使用
DBCC DROPCLEANBUFFERS
清除缓存。然后,读取将失败<代码>检查点强制写入磁盘,并始终写入日志,即使不写入任何内容。它也将失败

请注意,SQL Server还会写入tempdb及其错误日志。也可能去其他地方。使用Process Explorer列出sqlservr.exe必须查找更多位置的打开文件句柄

不过,我认为用户数据可能泄漏到的主要地方是tempdb

Endrju关于使用TDE的建议值得调查,但我怀疑它能否防止泄漏到tempdb。tempdb(除其他外)用于临时表、排序缓冲区、哈希缓冲区、
CHECKDB
temp数据


请注意,当您卸载和重新装载时,所有现有的文件句柄都将失效,SQL Server将无法再使用数据库。你必须让它离线和在线。不过,任何时候卸载都应该是安全的,因为SQL Server是崩溃一致的。任何时候瞬间断电都是安全的。

如果SQL Server保持文件打开,truecrypt在让您关闭卷之前会抱怨很多。“你确定它真的卸载了吗?”它抱怨道,并问我是否想强制卸载。我让它强制卸载,它似乎已经卸载了。D:卷在Truecrypt或文件资源管理器中不可见。运行此命令以验证文件的实际位置
使用Test1从sys.sysfiles中选择名称和文件名
,然后我怀疑SQL server正在内存中缓存信息,甚至从未发现磁盘已丢失。我建议:1。停止sql server,2。卸载truecrypt第3卷。重新启动sql server,看看是否有效。@VladimirOselsky卸载卷后,我无法执行您建议的查询。我重新安装了卷并重新创建了数据库,此时sysfiles查询表明数据库正在使用D:volume.tempdb上的指定文件。在使用TDE加密第一个数据库后,tempdb将自动加密。谢谢。备份也被加密,因此这一重要部分也受到保护。遗憾的是,这是企业独有的功能:(
use test1;
go
SELECT * FROM Persons;
go