亚洲成精品动漫久久精久,九九在线精品视频播放,黄色成人免费观看,三级成人影院,久碰久,四虎成人欧美精品在永久在线

掃一掃
關(guān)注微信公眾號

SQL Server 2008的透明數(shù)據(jù)加密
2009-05-21   

對一個數(shù)據(jù)庫管理員來說,當(dāng)要保護(hù)你所支持的數(shù)據(jù)庫時,安全是要考慮的最重要方面之一。我們使用多種機(jī)制和技術(shù)來保護(hù)我們的數(shù)據(jù)和數(shù)據(jù)庫,例如防火墻、認(rèn)證和數(shù)據(jù)加密。不過盡管我們?yōu)槲覀兊沫h(huán)境設(shè)置了安全,但是關(guān)于數(shù)據(jù)庫安全還總是有問題出現(xiàn)。盡管我們在保護(hù)我們的數(shù)據(jù)庫,但是如果有人竊取mdf 文件或備份文件那么會怎么樣呢?但是在SQL Server 2008之前沒有什么方法來使用第三方解決方案控制這種場景也沒有什么本地方法來處理這個問題。SQL Server 2008推出了一個新的特性來保護(hù)數(shù)據(jù)庫,它叫做透明數(shù)據(jù)加密(Transparent Data Encryption)——TDE,它對整個數(shù)據(jù)庫提供了保護(hù)。這篇文章的內(nèi)容包括:

  什么是透明數(shù)據(jù)加密?

  TDE的執(zhí)行。

  我的數(shù)據(jù)庫現(xiàn)在是安全的嗎?

  在激活TDE之前需要考慮什么?

  當(dāng)激活TDE之后會影響什么?

  什么是透明數(shù)據(jù)加密?

  Microsoft SQL Server 2008推出了另一個級別的加密——透明數(shù)據(jù)加密。TDE是全數(shù)據(jù)庫級別的加密,它不局限于字段和記錄,而是保護(hù)數(shù)據(jù)文件和日志文件的。在一個數(shù)據(jù)庫上的TDE執(zhí)行對于連接到所選數(shù)據(jù)庫的應(yīng)用程序來說是非常簡單而透明的。它不需要對現(xiàn)有應(yīng)用程序做任何改變。這個保護(hù)是應(yīng)用于數(shù)據(jù)文件和日志文件以及備份文件的。一旦在一個數(shù)據(jù)庫上激活了TDE,備份恢復(fù)到另一個SQL Server實例或附加數(shù)據(jù)文件到另一個SQL Server實例上去將是不允許的,除非用來保護(hù)數(shù)據(jù)庫加密密鑰(DEK)的證書是可用的。

  TDE的加密特性是應(yīng)用于頁面級別的。一旦激活了,頁面就會在它們寫到磁盤之前加密,在讀取到內(nèi)存之前解密。有一點一定要記住,那就是SQL Server和客戶端應(yīng)用程序之間的通信渠道沒有通過TDE來保護(hù)和加密。

  下圖顯示了SQL Server怎樣使用TDE加密一個數(shù)據(jù)庫:

SQL Server

  透明數(shù)據(jù)加密使用一個數(shù)據(jù)加密密鑰(DEK)用于加密數(shù)據(jù)庫,它存儲在數(shù)據(jù)庫啟動記錄中。DEK由一個存儲在主數(shù)據(jù)庫中的證書來保護(hù)。可選的,DEK可以由一個放置在硬件安全模塊(HSM)中的非對稱密鑰以及外部密鑰管理(EKM)的支持來保護(hù)。證書的私鑰由對稱密鑰的數(shù)據(jù)庫主密鑰來加密,它通常由一個強(qiáng)密碼來保護(hù)。注意,盡管這個證書可以由一個密碼來保護(hù),但是TDE要求這個證書由數(shù)據(jù)庫主密鑰來保護(hù)。數(shù)據(jù)庫主密鑰由服務(wù)主密鑰來保護(hù),而服務(wù)主密鑰由數(shù)據(jù)保護(hù)API來保護(hù)。

TDE的執(zhí)行

  如同上面所提到的,TDE的執(zhí)行相對簡單。下面是一個示例腳本,它使得在一個叫做TestDatabase的數(shù)據(jù)庫上激活了TDE。 

-- 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

  前兩個步驟顯示了怎樣創(chuàng)建主數(shù)據(jù)庫中的數(shù)據(jù)庫主密鑰和證書。注意,ENCRYPTION BY PASSWORD 不是由CREATE CERTIFICATE 來指定,因此自簽名的證書的私鑰將由數(shù)據(jù)庫主密鑰來保護(hù)。下一步顯示了在TestDatabase中創(chuàng)建DEK的方法。執(zhí)行這個代碼。它添加了DEK到TestDatabase。如果這個證書的私鑰由一個密碼保護(hù),那么你將獲得如下所示的錯誤信息:

  Msg 33101, Level 16, State 1, Line 4

  不能使用證書“DEKCertificateTest”,因為它的私鑰沒有顯示出來或者它不是由數(shù)據(jù)庫主密鑰來保護(hù)的。SQL Server 需要自動訪問這個操作所使用證書的私鑰的能力。

  sys.dm_database_encryption_keys 使你可以看到DEK被添加到服務(wù)器上。字段encryption_state 表示DEK是處于下面的哪個狀態(tài):沒有加密、加密中、已加密、密鑰改變中、和解密中,這些各自對應(yīng)1、2、3、4、和5這幾個數(shù)值。當(dāng)你在設(shè)置ENCRYPTION之前運行DMV時,這個狀態(tài)將顯示為1,如果設(shè)置了,這個狀態(tài)將顯示為3。完成了。現(xiàn)在TestDatabase 已經(jīng)是完全安全的了。

  我的數(shù)據(jù)庫現(xiàn)在是安全的嗎?

  盡管我們成功地使得在我們的數(shù)據(jù)庫上激活了TDE,但是我們還需要確保它在所有級別都是安全的。我們將在這方面做兩個測試。首先,我們將備份這個數(shù)據(jù)庫并嘗試恢復(fù)這個備份到另一個SQL Server 2008實例上去。這個恢復(fù)操作一定會失敗的,除非這個證書用于保護(hù)DEK的私鑰是可用于主數(shù)據(jù)庫的。第二,我們將嘗試在另一個實例中附加TestDatabase的mdf和ldf文件。它應(yīng)該也不能起作用。這是用于測試的代碼:

-- First step is backing up the TestDatabase.
BACKUP DATABASE [TestDatabase]
TO DISK = N'E:\TestDatabaseFull.bak'
WITH NOFORMAT, NOINIT, NAME = N'TestDatabase-Full Database Backup'
GO
-- Now connect with another SQL Server 2008 instance.
-- Try to restore the backup we have taken, in the new instance.
-- This statement should be failed.
RESTORE DATABASE [TestDatabase]
FROM DISK = N'E:\TestDatabaseFull.bak'
WITH FILE = 1,
MOVE N'TestDatabase' TO N'D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\TestDatabase.mdf',
MOVE N'TestDatabase_log' TO N'D:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\TestDatabase_log.ldf',
NOUNLOAD, STATS = 10
GO

  第一個步驟備份了這個數(shù)據(jù)庫。第二部分需要運行在一個不同的SQL Server 2008實例上。當(dāng)你嘗試在一個不同的SQL Server 2008實例中恢復(fù)這個備份時,你將得到一個類似于下面所示的錯誤信息:  

10 percent processed.
20 percent processed.
31 percent processed.
41 percent processed.
52 percent processed.
62 percent processed.
73 percent processed.
83 percent processed.
94 percent processed.
100 percent processed.
  Msg 33111, Level 16, State 3, Line 1
  Cannot find server certificate with thumbprint '0x8AD8C0A89476752FCC3D7A7005A2DCF546C38C58'.
  Msg 3013, Level 16, State 1, Line 1
  RESTORE DATABASE is terminating abnormally.

  當(dāng)你嘗試將這個數(shù)據(jù)庫附加到另一個實例中去時你將面對相同的問題。

USE [master]
GO
CREATE DATABASE [TestDatabase] ON
( FILENAME = N'D:\Test\TestDatabase.mdf'),
( FILENAME = N'D:\Test\TestDatabase_log.ldf')
FOR ATTACH
GO

  上面代碼的結(jié)果是:

  Msg 33111, Level 16, State 3, Line 1

  Cannot find server certificate with thumbprint '0x8AD8C0A89476752FCC3D7A7005A2DCF546C38C58'.

  它起作用了。我們的數(shù)據(jù)庫是安全的了。恢復(fù)或附加TestDatabase 到另一個實例中去的唯一方法是在第二個實例中添加相同的證書。學(xué)習(xí)下面的代碼:

-- backup the certificate
-- The private key will be encrypted by the password specified
BACKUP CERTIFICATE DEKCertificate TO FILE = 'E:\DEKCertificate.cert'
         WITH PRIVATE KEY
         (
                  FILE = 'E:\Instance1PrivateKey.key',
                  ENCRYPTION BY PASSWORD = 'Pa$$w0rd5454'
         )
-- create the certificate in the second instance by using the backup
-- Private key will be loaded from the saved file.
USE [master]
GO
CREATE CERTIFICATE DEKCertificate
         FROM FILE = 'E:\DEKCertificate.cert'
         WITH PRIVATE KEY (
                  FILE = 'E:\Instance1PrivateKey.key'
                  , DECRYPTION BY PASSWORD = 'Pa$$w0rd5454'
                  )

  這個代碼的第一部分將這個證書備份到了一個文件中。它還備份了這個證書的私鑰。代碼中指定的密碼是用于加密私鑰的。代碼的第二部分需要運行在第二個SQL Server 2008實例上。它使用備份證書創(chuàng)建了一個證書。當(dāng)這個代碼運行后,你將可以恢復(fù)或附加TestDatabase數(shù)據(jù)庫到新的實例中去。

  在激活TDE之前需要考慮什么?

  在你在數(shù)據(jù)庫上激活TDE之前只有很少的事情需要注意,那就是:

  TDE是否影響所執(zhí)行的災(zāi)難復(fù)原計劃?

  設(shè)想一個簡單的災(zāi)難復(fù)原計劃,備份和恢復(fù)。你可能開發(fā)了這個計劃而且它執(zhí)行沒有任何問題。你激活了TDE,仍然沒有問題,時間表作業(yè)備份了你的數(shù)據(jù)庫。假設(shè)這個服務(wù)器開始產(chǎn)生嚴(yán)重錯誤導(dǎo)致你需要重新安裝操作系統(tǒng)和SQL Server。你可能不做它想就輕松地重新安裝,因為你有數(shù)據(jù)庫備份。當(dāng)數(shù)據(jù)庫恢復(fù)時問題出現(xiàn)了。你可能具有不是加密格式的數(shù)據(jù)庫完全備份,你可能有一些在激活TDE之后進(jìn)行的事務(wù)型備份,所以它們是加密的。你沒有用于TDE的證書備份。這導(dǎo)致你處于一個不可預(yù)料的境地。因為你沒有所用證書的備份,所以你將不能恢復(fù)事務(wù)型備份。

  想想在激活TDE之前災(zāi)難復(fù)原計劃的開發(fā)。如果你有計劃,那么確保這個計劃在激活TDE之后仍然可用。這不只用于備份和恢復(fù)策略,它還用于其它計劃,例如日志傳送和數(shù)據(jù)庫鏡像。

  在你的數(shù)據(jù)庫中有只讀文件組嗎?

  如果數(shù)據(jù)庫有只讀文件組,那么TDE將會失敗。一旦TDE激活了,那么encryption_state的數(shù)值將永遠(yuǎn)不可能是3(加密的)而是2(加密中)。SQL Server在運行TDE代碼時不會拋出任何異常。激活TDE之后,如果你打開數(shù)據(jù)庫的屬性窗口,你將會發(fā)現(xiàn)屬性Encryption Enabled的值被設(shè)為了true。使用下面的代碼進(jìn)行測試:

-- create a new database for testing TDE on readonly file groups
USE master
GO
CREATE DATABASE [TestDatabase2] ON PRIMARY
( NAME = N'TestDatabase2_Primary', FILENAME = N'E:\TestDatabase2_Primary.mdf' , SIZE = 3072KB , FILEGROWTH = 1024KB ),
FILEGROUP [FG1_Default]
( NAME = N'TestDatabase2_FG1', FILENAME = N'E:\TestDatabase2_FG1.ndf' , SIZE = 3072KB , FILEGROWTH = 1024KB ),
FILEGROUP [FG2_ReadOnly]
( NAME = N'TestDatabase2_FG2', FILENAME = N'E:\TestDatabase2_FG2.ndf' , SIZE = 3072KB , FILEGROWTH = 1024KB )
LOG ON
( NAME = N'TestDatabase2_log', FILENAME = N'E:\TestDatabase2_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)
GO

-- Set the FG1_Default file group as the default one.
USE [TestDatabase2]
GO
IF NOT EXISTS (SELECT name FROM sys.filegroups WHERE is_default=1 AND name = N'FG1_Default')
ALTER DATABASE [TestDatabase2]
MODIFY FILEGROUP [FG1_Default] DEFAULT
GO

-- Add a table to the default file group
USE [TestDatabase2]
GO
CREATE TABLE TestTable1 (Id int PRIMARY KEY, [Text] varchar(100))
GO
INSERT INTO TestTable1 VALUES (1, 'hello')

-- Add a table to the FG2_ReadOnly file group
CREATE TABLE TestTable2 (Id int PRIMARY KEY, [Text] varchar(100))
ON [FG2_ReadOnly]
GO
INSERT INTO TestTable2 VALUES (1, 'hello')
GO

-- Set the file group FG2_ReadOnly file group as READONLY
IF NOT EXISTS (SELECT name FROM sys.filegroups WHERE is_default=1 AND name = N'FG2_ReadOnly')
ALTER DATABASE [TestDatabase2]
MODIFY FILEGROUP [FG2_ReadOnly] READONLY
GO

-- Create Database Encryption Key (DEK) in the user database
USE TestDatabase2
GO
IF NOT EXISTS (SELECT * FROM sys.dm_database_encryption_keys WHERE database_id = DB_ID('TestDatabase2'))
BEGIN
        CREATE DATABASE ENCRYPTION KEY
        WITH ALGORITHM = AES_128
        ENCRYPTION BY SERVER CERTIFICATE DEKCertificate
END
GO

-- Enable TDE on the database
ALTER DATABASE TestDatabase2
SET ENCRYPTION ON
GO

  首先這個代碼創(chuàng)建了一個具有三個數(shù)據(jù)文件的數(shù)據(jù)庫,這三個文件叫做TestDatabase2_Primary、TestDatabase2_FG1和TestDatabase2_FG2。文件組FG1_Default 設(shè)置為默認(rèn)文件組,在其中創(chuàng)建了TestTable1。在FG2_ReadOnly文件組中創(chuàng)建了TestTable2。然后FG1_ReadOnly文件組被標(biāo)識為READONLY。

  最后,在TestDatabase2 中創(chuàng)建了DEK,Encryption屬性設(shè)置為true。所有的語句都成功執(zhí)行。如果你查詢sys.dm_database_encryption_keys,你將看到TestDatabase2的encryption_state是2,這表示加密結(jié)束了但沒有完成。

是否使用了FileStream數(shù)據(jù)類型?

  使用了filestream類型的數(shù)據(jù)庫可以使用TDE來進(jìn)行加密,但是文件流數(shù)據(jù)不會被加密。

  當(dāng)激活TDE之后會影響什么?

  在一個數(shù)據(jù)庫上激活TDE會影響以下事情:

  事務(wù)日志

  一旦TDE激活了,SQL Server 通過將文本數(shù)據(jù)清理出去從而確保日志文件不包含文本數(shù)據(jù)。SQL Server 從具有加密格式的新VLF開始。

  TEMPDB系統(tǒng)數(shù)據(jù)庫

  當(dāng)你在任何數(shù)據(jù)庫上激活了TDE之后這將會自動加密。這會導(dǎo)致使用tempdb數(shù)據(jù)庫的非加密數(shù)據(jù)庫性能下降。

  日志傳送和數(shù)據(jù)庫鏡像

  如果你在一個傳送日志到另一個數(shù)據(jù)庫的數(shù)據(jù)庫(意味著激活了日志傳送的數(shù)據(jù)庫)上激活了TDE,那么日志傳送操作將會在輔助數(shù)據(jù)庫上失敗,除非在輔助服務(wù)器上證書可用。

  壓縮備份

  下面是在一個激活了TDE的數(shù)據(jù)庫上進(jìn)行壓縮備份的測試,看起來在激活TDE的數(shù)據(jù)庫上壓縮并不怎么高效: 

-- create a new database for testing compressed backup on TDE enabled database
USE master
GO
CREATE DATABASE [TestDatabase3] ON PRIMARY
( NAME = N'TestDatabase3', FILENAME = N'E:\TestDatabase.mdf' , SIZE = 3072KB , FILEGROWTH = 1024KB ),
LOG ON
( NAME = N'TestDatabase3_log', FILENAME = N'E:\TestDatabase3_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)
GO

-- Create a table and insert some records
USE TestDatabase3
GO
CREATE TABLE TestTable (Id int primary key, [Value] char(8000))
GO
INSERT INTO TestTable VALUES (1, 'value1')
INSERT INTO TestTable VALUES (2, 'value1')
INSERT INTO TestTable VALUES (3, 'value1')
INSERT INTO TestTable VALUES (4, 'value1')
INSERT INTO TestTable VALUES (5, 'value1')
INSERT INTO TestTable VALUES (6, 'value1')

-- Backup the TestDatabase3 without compressing it
BACKUP DATABASE [TestDatabase3]
TO DISK = N'E:\TestDatabase3Full.bak'
WITH NOFORMAT, NOINIT, NAME = N'TestDatabase3-Full Database Backup'
GO

-- Backup the TestDatabase3 with  compression
BACKUP DATABASE [TestDatabase3]
TO DISK = N'E:\TestDatabase3Full_Compressed.bak'
WITH NOFORMAT, NOINIT, NAME = N'TestDatabase3-Full Database Backup (Compressed)', COMPRESSION
GO

-- Now enable TDE on this
-- Use the code we used with first example

-- Backup the TestDatabase3 again (after TDE enabled) without compressing it
BACKUP DATABASE [TestDatabase3]
TO DISK = N'E:\TestDatabase3Full_Encrypted.bak'
WITH NOFORMAT, NOINIT, NAME = N'TestDatabase3-Full Database Backup (encrypted)'
GO

-- Backup the TestDatabase3 with compression
BACKUP DATABASE [TestDatabase3]
TO DISK = N'E:\TestDatabase3Full_Encrypted_Compressed.bak'
WITH NOFORMAT, NOINIT, NAME = N'TestDatabase3-Full Database Backup (Encrypted and compressed', COMPRESSION
GO

  這個代碼創(chuàng)建一個數(shù)據(jù)庫并插入一些記錄到數(shù)據(jù)表中。然后這個數(shù)據(jù)庫被備份兩次,一次沒有壓縮另一次有壓縮。然后你需要在這個數(shù)據(jù)庫上激活TDE并執(zhí)行其它的與激活TDE之前備份所使用的相同代碼。備份文件規(guī)模是:

  在激活TDE之前完全備份1,365 KB

  在激活TDE之前有壓縮的完全備份124KB

  激活TDE之后的完全備份1,365 KB

  激活TDE之后有壓縮的完全備份 1,278 KB

  你可以看到它們的不同。結(jié)果證明激活了TDE的數(shù)據(jù)庫的壓縮備份文件不那么高效。

熱詞搜索:

上一篇:部署虛擬局域網(wǎng) 做好VLAN交換機(jī)的選購
下一篇:使用SQL Server 2008 CDC捕獲DDL改變

分享到: 收藏