對(duì)一個(gè)數(shù)據(jù)庫管理員來說,當(dāng)要保護(hù)你所支持的數(shù)據(jù)庫時(shí),安全是要考慮的最重要方面之一。我們使用多種機(jī)制和技術(shù)來保護(hù)我們的數(shù)據(jù)和數(shù)據(jù)庫,例如防火墻、認(rèn)證和數(shù)據(jù)加密。不過盡管我們?yōu)槲覀兊沫h(huán)境設(shè)置了安全,但是關(guān)于數(shù)據(jù)庫安全還總是有問題出現(xiàn)。盡管我們?cè)诒Wo(hù)我們的數(shù)據(jù)庫,但是如果有人竊取mdf 文件或備份文件那么會(huì)怎么樣呢?但是在SQL Server 2008之前沒有什么方法來使用第三方解決方案控制這種場(chǎng)景也沒有什么本地方法來處理這個(gè)問題。SQL Server 2008推出了一個(gè)新的特性來保護(hù)數(shù)據(jù)庫,它叫做透明數(shù)據(jù)加密(Transparent Data Encryption)——TDE,它對(duì)整個(gè)數(shù)據(jù)庫提供了保護(hù)。這篇文章的內(nèi)容包括:
什么是透明數(shù)據(jù)加密?
TDE的執(zhí)行。
我的數(shù)據(jù)庫現(xiàn)在是安全的嗎?
在激活TDE之前需要考慮什么?
當(dāng)激活TDE之后會(huì)影響什么?
什么是透明數(shù)據(jù)加密?
Microsoft SQL Server 2008推出了另一個(gè)級(jí)別的加密——透明數(shù)據(jù)加密。TDE是全數(shù)據(jù)庫級(jí)別的加密,它不局限于字段和記錄,而是保護(hù)數(shù)據(jù)文件和日志文件的。在一個(gè)數(shù)據(jù)庫上的TDE執(zhí)行對(duì)于連接到所選數(shù)據(jù)庫的應(yīng)用程序來說是非常簡(jiǎn)單而透明的。它不需要對(duì)現(xiàn)有應(yīng)用程序做任何改變。這個(gè)保護(hù)是應(yīng)用于數(shù)據(jù)文件和日志文件以及備份文件的。一旦在一個(gè)數(shù)據(jù)庫上激活了TDE,備份恢復(fù)到另一個(gè)SQL Server實(shí)例或附加數(shù)據(jù)文件到另一個(gè)SQL Server實(shí)例上去將是不允許的,除非用來保護(hù)數(shù)據(jù)庫加密密鑰(DEK)的證書是可用的。
TDE的加密特性是應(yīng)用于頁面級(jí)別的。一旦激活了,頁面就會(huì)在它們寫到磁盤之前加密,在讀取到內(nèi)存之前解密。有一點(diǎn)一定要記住,那就是SQL Server和客戶端應(yīng)用程序之間的通信渠道沒有通過TDE來保護(hù)和加密。
透明數(shù)據(jù)加密使用一個(gè)數(shù)據(jù)加密密鑰(DEK)用于加密數(shù)據(jù)庫,它存儲(chǔ)在數(shù)據(jù)庫啟動(dòng)記錄中。DEK由一個(gè)存儲(chǔ)在主數(shù)據(jù)庫中的證書來保護(hù)。可選的,DEK可以由一個(gè)放置在硬件安全模塊(HSM)中的非對(duì)稱密鑰以及外部密鑰管理(EKM)的支持來保護(hù)。證書的私鑰由對(duì)稱密鑰的數(shù)據(jù)庫主密鑰來加密,它通常由一個(gè)強(qiáng)密碼來保護(hù)。注意,盡管這個(gè)證書可以由一個(gè)密碼來保護(hù),但是TDE要求這個(gè)證書由數(shù)據(jù)庫主密鑰來保護(hù)。數(shù)據(jù)庫主密鑰由服務(wù)主密鑰來保護(hù),而服務(wù)主密鑰由數(shù)據(jù)保護(hù)API來保護(hù)。
TDE的執(zhí)行
如同上面所提到的,TDE的執(zhí)行相對(duì)簡(jiǎn)單。下面是一個(gè)示例腳本,它使得在一個(gè)叫做TestDatabase的數(shù)據(jù)庫上激活了TDE?!?BR> -- If the master key is not available, create it.
USE master;
GO
IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE name LIKE '%MS_DatabaseMasterKey%')
BEGIN
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Pa$$w0rd4545';
END
GO
-- Create the certificate in the master database.
USE master;
GO
-- Since ENCRYPTION BY PASSWORD is not mentioned, the private key of the certificate
-- will be encrypted by database master key created above.
IF NOT EXISTS (SELECT * FROM sys.certificates WHERE name LIKE '%DEKCertificate%')
BEGIN
CREATE CERTIFICATE DEKCertificate WITH SUBJECT = 'DEK Certificate'
END
GO
-- Create Database Encryption Key (DEK) in the user database
USE TestDatabase
GO
IF NOT EXISTS (SELECT * FROM sys.dm_database_encryption_keys WHERE database_id = DB_ID('TestDatabase'))
BEGIN
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_128
ENCRYPTION BY SERVER CERTIFICATE DEKCertificate
END
GO
-- Check whether the key is created
SELECT DB_NAME(database_id) AS DatabaseName, * FROM sys.dm_database_encryption_keys
-- This should return one row (or more if DEKs have been generated in other databases)
-- with the encryption_state of 1 (1 = unencrypted).
-- Set the DEK on in the TestDatabase.
ALTER DATABASE TestDatabase
SET ENCRYPTION ON
GO
-- Check whether the encryption_state is changed to 3. It should be.
SELECT DB_NAME(database_id) AS DatabaseName, * FROM sys.dm_database_encryption_keys
什么是透明數(shù)據(jù)加密?
TDE的執(zhí)行。
我的數(shù)據(jù)庫現(xiàn)在是安全的嗎?
在激活TDE之前需要考慮什么?
當(dāng)激活TDE之后會(huì)影響什么?
什么是透明數(shù)據(jù)加密?
Microsoft SQL Server 2008推出了另一個(gè)級(jí)別的加密——透明數(shù)據(jù)加密。TDE是全數(shù)據(jù)庫級(jí)別的加密,它不局限于字段和記錄,而是保護(hù)數(shù)據(jù)文件和日志文件的。在一個(gè)數(shù)據(jù)庫上的TDE執(zhí)行對(duì)于連接到所選數(shù)據(jù)庫的應(yīng)用程序來說是非常簡(jiǎn)單而透明的。它不需要對(duì)現(xiàn)有應(yīng)用程序做任何改變。這個(gè)保護(hù)是應(yīng)用于數(shù)據(jù)文件和日志文件以及備份文件的。一旦在一個(gè)數(shù)據(jù)庫上激活了TDE,備份恢復(fù)到另一個(gè)SQL Server實(shí)例或附加數(shù)據(jù)文件到另一個(gè)SQL Server實(shí)例上去將是不允許的,除非用來保護(hù)數(shù)據(jù)庫加密密鑰(DEK)的證書是可用的。
TDE的加密特性是應(yīng)用于頁面級(jí)別的。一旦激活了,頁面就會(huì)在它們寫到磁盤之前加密,在讀取到內(nèi)存之前解密。有一點(diǎn)一定要記住,那就是SQL Server和客戶端應(yīng)用程序之間的通信渠道沒有通過TDE來保護(hù)和加密。
透明數(shù)據(jù)加密使用一個(gè)數(shù)據(jù)加密密鑰(DEK)用于加密數(shù)據(jù)庫,它存儲(chǔ)在數(shù)據(jù)庫啟動(dòng)記錄中。DEK由一個(gè)存儲(chǔ)在主數(shù)據(jù)庫中的證書來保護(hù)。可選的,DEK可以由一個(gè)放置在硬件安全模塊(HSM)中的非對(duì)稱密鑰以及外部密鑰管理(EKM)的支持來保護(hù)。證書的私鑰由對(duì)稱密鑰的數(shù)據(jù)庫主密鑰來加密,它通常由一個(gè)強(qiáng)密碼來保護(hù)。注意,盡管這個(gè)證書可以由一個(gè)密碼來保護(hù),但是TDE要求這個(gè)證書由數(shù)據(jù)庫主密鑰來保護(hù)。數(shù)據(jù)庫主密鑰由服務(wù)主密鑰來保護(hù),而服務(wù)主密鑰由數(shù)據(jù)保護(hù)API來保護(hù)。
TDE的執(zhí)行
如同上面所提到的,TDE的執(zhí)行相對(duì)簡(jiǎn)單。下面是一個(gè)示例腳本,它使得在一個(gè)叫做TestDatabase的數(shù)據(jù)庫上激活了TDE?!?BR> -- If the master key is not available, create it.
USE master;
GO
IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE name LIKE '%MS_DatabaseMasterKey%')
BEGIN
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Pa$$w0rd4545';
END
GO
-- Create the certificate in the master database.
USE master;
GO
-- Since ENCRYPTION BY PASSWORD is not mentioned, the private key of the certificate
-- will be encrypted by database master key created above.
IF NOT EXISTS (SELECT * FROM sys.certificates WHERE name LIKE '%DEKCertificate%')
BEGIN
CREATE CERTIFICATE DEKCertificate WITH SUBJECT = 'DEK Certificate'
END
GO
-- Create Database Encryption Key (DEK) in the user database
USE TestDatabase
GO
IF NOT EXISTS (SELECT * FROM sys.dm_database_encryption_keys WHERE database_id = DB_ID('TestDatabase'))
BEGIN
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_128
ENCRYPTION BY SERVER CERTIFICATE DEKCertificate
END
GO
-- Check whether the key is created
SELECT DB_NAME(database_id) AS DatabaseName, * FROM sys.dm_database_encryption_keys
-- This should return one row (or more if DEKs have been generated in other databases)
-- with the encryption_state of 1 (1 = unencrypted).
-- Set the DEK on in the TestDatabase.
ALTER DATABASE TestDatabase
SET ENCRYPTION ON
GO
-- Check whether the encryption_state is changed to 3. It should be.
SELECT DB_NAME(database_id) AS DatabaseName, * FROM sys.dm_database_encryption_keys

