SQL Server 2008中的加密和密鑰管理
服務(wù)器級(jí)安全可能是系統(tǒng)管理員最關(guān)心的問(wèn)題,而對(duì)于數(shù)據(jù)庫(kù)來(lái)說(shuō),所有操作都是在生產(chǎn)環(huán)境中完成的。在大多數(shù)情況下,數(shù)據(jù)庫(kù)管理員會(huì)將數(shù)據(jù)庫(kù)細(xì)節(jié)的問(wèn)題留給數(shù)據(jù)庫(kù)開(kāi)發(fā)人員處理,只要開(kāi)發(fā)人員在環(huán)境的限制內(nèi)工作。SQL Server 2008提供了大量確保數(shù)據(jù)庫(kù)安全的功能。
數(shù)據(jù)加密
SQL Server 2000 及其早期版本不支持加密存儲(chǔ)在數(shù)據(jù)庫(kù)中的數(shù)據(jù)。為什么需要加密存儲(chǔ)在安全性良好的數(shù)據(jù)庫(kù)(位于安全地嵌套在最新的防火墻之后的安全服務(wù)器上)中的數(shù)據(jù)?這是因?yàn)橐粋€(gè)重要的、叫做 defense in depth 的舊安全規(guī)范。Defense in depth 的意味著分層防御,即使攻擊者成功打破了最外層防御,他們?nèi)匀恍枰黄埔粚咏右粚拥姆烙拍塬@得成功。在數(shù)據(jù)庫(kù)中,這意味著攻擊者通過(guò)了防火墻和從服務(wù)器到數(shù)據(jù)庫(kù)的 Windows 安全以后,仍然需要進(jìn)行一些惡劣的、野蠻的和強(qiáng)制的黑客攻擊來(lái)解碼您的數(shù)據(jù)。另外,在如今這個(gè)立法保護(hù)數(shù)據(jù)和隱私的大環(huán)境中,數(shù)據(jù)需要加強(qiáng)保護(hù)。
SQL Server 2008 使用對(duì)稱(chēng)密鑰、非對(duì)稱(chēng)密鑰和數(shù)字證書(shū),為各種類(lèi)型的數(shù)據(jù)加密提供了豐富的支持。最出色的是,它為您管理密鑰,而密鑰管理是迄今為止加密中最難的部分。保密是一件很難的事情。
管理員可能至少需要管理圖10所示層次結(jié)構(gòu)中的上級(jí)密鑰。數(shù)據(jù)庫(kù)管理員需要理解服務(wù)器級(jí)的服務(wù)主密鑰和數(shù)據(jù)庫(kù)級(jí)的數(shù)據(jù)庫(kù)主密鑰。每一個(gè)密鑰都保護(hù)其子密鑰,子密鑰又保護(hù)其子密鑰,從樹(shù)形結(jié)構(gòu)圖依次向下。密碼保護(hù)對(duì)稱(chēng)密鑰或證書(shū)時(shí)例外,這是 SQL Server 使用戶(hù)管理自己的密鑰,以及負(fù)責(zé)保密密鑰的方法。

圖 1:SQL Server 2008 中的加密密鑰層次結(jié)構(gòu)
注意:Microsoft 不推薦直接使用證書(shū)或非對(duì)稱(chēng)密鑰加密數(shù)據(jù)。非對(duì)稱(chēng)密鑰加密的速度很慢,并且使用此機(jī)制保護(hù)的數(shù)據(jù)量有限(這取決于密鑰模數(shù)的大小)??梢允褂妹艽a,而不是數(shù)據(jù)庫(kù)主密鑰保護(hù)證書(shū)和非對(duì)稱(chēng)密鑰。
服務(wù)主密鑰是一個(gè)規(guī)定 SQL Server 中所有密鑰和證書(shū)的密鑰。它是 SQL Server 在安裝期間自動(dòng)創(chuàng)建的對(duì)稱(chēng)密鑰。顯然,它是一個(gè)至關(guān)重要的密鑰,因?yàn)槿绻嗣荑€泄露了,那么攻擊者最終將解碼服務(wù)中由 SQL Server 管理的每個(gè)密鑰。Windows 中的數(shù)據(jù)保護(hù) API (Data Protection API, DPAPI) 保護(hù)服務(wù)主密鑰。
SQL Server 為您管理服務(wù)主密鑰。雖然您可以對(duì)其執(zhí)行維護(hù)任務(wù),將其轉(zhuǎn)存到一個(gè)文件中,重新生成它,以及從文件中將其還原。不過(guò),大多數(shù)情況下,無(wú)需對(duì)密鑰做任何更改。備份服務(wù)主密鑰以防止密鑰損壞對(duì)于管理員來(lái)說(shuō)是明智的選擇。
在數(shù)據(jù)庫(kù)范圍內(nèi),數(shù)據(jù)庫(kù)主密鑰是數(shù)據(jù)庫(kù)中所有密鑰、證書(shū)和數(shù)據(jù)的根加密對(duì)象。每個(gè)數(shù)據(jù)庫(kù)都有惟一的主密鑰;嘗試創(chuàng)建第二個(gè)密鑰時(shí),會(huì)出現(xiàn)錯(cuò)誤提示。必須在使用前通過(guò) CREATE MASTER KEY Transact-SQL 語(yǔ)句和用戶(hù)提供的密碼創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)主密鑰:
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'EOhnDGS6!7JKv'
SQL Server 使用由密碼和服務(wù)主密鑰派生出來(lái)的三重 DES 密鑰加密密鑰。第一個(gè)副本存儲(chǔ)在數(shù)據(jù)庫(kù)中,第二個(gè)存儲(chǔ)在主數(shù)據(jù)庫(kù)中。由于服務(wù)主密鑰保護(hù)數(shù)據(jù)庫(kù)主密鑰,因此可能在需要時(shí)由SQL Server 自動(dòng)加密數(shù)據(jù)庫(kù)主密鑰。最終應(yīng)用程序或用戶(hù)無(wú)需使用密碼顯式打開(kāi)主密鑰,這是層次結(jié)構(gòu)保護(hù)密鑰的主要優(yōu)勢(shì)。
分離一個(gè)存在現(xiàn)有主密鑰的數(shù)據(jù)庫(kù),并將其移動(dòng)到另一個(gè)服務(wù)器上是一個(gè)難題。問(wèn)題在于新服務(wù)器的服務(wù)主密鑰與舊服務(wù)器的服務(wù)主密鑰不同。因此,服務(wù)器不能自動(dòng)解密數(shù)據(jù)庫(kù)主密鑰??梢酝ㄟ^(guò)使用加密密碼打開(kāi)數(shù)據(jù)庫(kù)主密鑰,然后使用 ALTER MASTER KEY 語(yǔ)句以新的服務(wù)主密鑰對(duì)其加密的方法避開(kāi)這個(gè)問(wèn)題。否則,總是需要顯式打開(kāi)數(shù)據(jù)庫(kù)主密鑰以后才能使用。
如果存在數(shù)據(jù)庫(kù)主密鑰,那么開(kāi)發(fā)人員就可以使用它創(chuàng)建三種類(lèi)型中的任何一種密鑰,具體取決于加密所需求的類(lèi)型:
非對(duì)稱(chēng)密鑰,使用公鑰/私鑰對(duì)進(jìn)行公鑰加密
對(duì)稱(chēng)密鑰,用于在同一個(gè)密鑰分別加密和解密數(shù)據(jù)的方面共享秘密
證書(shū),實(shí)質(zhì)上用于包裝公鑰
由于所有加密選項(xiàng)及其已經(jīng)深層集成于服務(wù)器和數(shù)據(jù)庫(kù)中,因此現(xiàn)在加密是將防御的最終層添加到數(shù)據(jù)的可行方法。然而,需明智使用工具,因?yàn)榧用芙o服務(wù)器增加了大量的處理開(kāi)銷(xiāo)。
透明數(shù)據(jù)加密
在 SQL Server 2005 中,可以使用數(shù)據(jù)庫(kù)引擎加密功能,通過(guò)編寫(xiě)自定義 Transact-SQL 加密數(shù)據(jù)庫(kù)中的數(shù)據(jù)。SQL Server 2008 引入了透明的數(shù)據(jù)加密,改進(jìn)了這種狀況。 
透明數(shù)據(jù)加密在數(shù)據(jù)庫(kù)級(jí)執(zhí)行所有加密操作,這消除了應(yīng)用程序開(kāi)發(fā)人員創(chuàng)建自定義代碼來(lái)加密和解密數(shù)據(jù)的需要。數(shù)據(jù)在寫(xiě)入磁盤(pán)時(shí)被加密,在從磁盤(pán)讀取時(shí)解密。通過(guò)使用 SQL Server 透明地管理加密和解密,就可以在不改變現(xiàn)有應(yīng)用程序的情況下確保數(shù)據(jù)庫(kù)中業(yè)務(wù)數(shù)據(jù)的安全,如圖 11 所示。

圖 2:透明數(shù)據(jù)加密
數(shù)據(jù)庫(kù)加密密鑰(Database Encryption Key,DEK)用于執(zhí)行加密和解密操作,該DEK存儲(chǔ)在數(shù)據(jù)庫(kù)啟動(dòng)記錄中,以便在恢復(fù)過(guò)程中使用。可以使用服務(wù)主密鑰(Service Master Key)或硬件安全模塊(Hardware Security Module,HSM)保護(hù) DEK。HSM 通常是 USB 設(shè)備或智能卡,因?yàn)椴灰妆槐I或丟失。
#p#
擴(kuò)展的密鑰管理
隨著法規(guī)遵從性需求的不斷增長(zhǎng)以及對(duì)數(shù)據(jù)隱私的整體關(guān)注,越來(lái)越多的組織將加密用作提供深層防御解決方案的手段。隨著組織越來(lái)越多地使用加密和密鑰來(lái)保護(hù)數(shù)據(jù),密鑰管理也變得更加復(fù)雜。一些高安全性數(shù)據(jù)庫(kù)要使用數(shù)千個(gè)密鑰,并且必須部署一個(gè)系統(tǒng)來(lái)存儲(chǔ)、注銷(xiāo)和重新生成這些密鑰。而且,應(yīng)該將這些密鑰與數(shù)據(jù)分開(kāi)存儲(chǔ)以增強(qiáng)安全性。
SQL Server 2008 為第三方供應(yīng)商的使用公開(kāi)了加密功能。這些解決方案可以與 SQL Server 2005 和 SQL Server 2008 數(shù)據(jù)庫(kù)無(wú)縫地一起工作并提供了企業(yè)級(jí)專(zhuān)用密鑰管理。這將密鑰管理工作負(fù)載從 SQL Server 轉(zhuǎn)移到了專(zhuān)用密鑰管理系統(tǒng)。
SQL Server 2008 中擴(kuò)展的密鑰管理還支持使用 HSM 提供密鑰與數(shù)據(jù)的物理分離。
代碼模塊簽名
在 SQL Server 中提供加密的一個(gè)好處就是它提供了使用證書(shū)對(duì)代碼模塊(存儲(chǔ)過(guò)程、函數(shù)、觸發(fā)器和事件通知)進(jìn)行數(shù)字簽名的能力。這提供了對(duì)數(shù)據(jù)庫(kù)表和其他對(duì)象訪(fǎng)問(wèn)的更細(xì)粒度的控制。像加密數(shù)據(jù)一樣,您使用證書(shū)中的私鑰簽名代碼。其結(jié)果是在該經(jīng)過(guò)簽名的代碼模塊中使用的表只能通過(guò)該代碼訪(fǎng)問(wèn)并且不允許在代碼模塊之外。換句話(huà)說(shuō),只能使用已經(jīng)用于簽名該模塊的證書(shū)獲得對(duì)該表的訪(fǎng)問(wèn)。
對(duì)于存儲(chǔ)過(guò)程而言,效果也是一樣的。例如,如果有完整的所有權(quán)鏈,您可以謹(jǐn)慎控制哪些用戶(hù)獲得該過(guò)程的 EXECUTE 權(quán)限,并且可以拒絕他們對(duì)基礎(chǔ)表的直接訪(fǎng)問(wèn)。但這在過(guò)程的所有權(quán)鏈被破壞或執(zhí)行動(dòng)態(tài) SQL 時(shí)不起作用,此時(shí)要求執(zhí)行該過(guò)程的用戶(hù)擁有對(duì)基礎(chǔ)表的權(quán)限。實(shí)現(xiàn)同樣效果的另一種方式是使用 EXECUTE AS,但這改變了過(guò)程執(zhí)行的安全上下文。這可能不是理想的情況,例如,需要在表中記錄實(shí)際使該過(guò)程運(yùn)行的用戶(hù)時(shí)(沒(méi)有要求將用戶(hù)名作為過(guò)程的參數(shù))。
簽名代碼模塊的另一個(gè)好處就是防止對(duì)代碼模塊作出未經(jīng)授權(quán)的更改。像其他經(jīng)過(guò)數(shù)字簽名的文檔一樣,在代碼改變時(shí),證書(shū)將失效。代碼不在證書(shū)上下文中執(zhí)行,因此任何被提供了證書(shū)訪(fǎng)問(wèn)權(quán)限的對(duì)象都將不可訪(fǎng)問(wèn)。
要繼續(xù)訪(fǎng)問(wèn)它們,需要?jiǎng)?chuàng)建一個(gè)證書(shū),將該證書(shū)與新用戶(hù)關(guān)聯(lián)并使用該證書(shū)簽名過(guò)程。授予該用戶(hù)執(zhí)行該存儲(chǔ)過(guò)程必要的任何權(quán)限。實(shí)質(zhì)上,已經(jīng)將該用戶(hù)作為次級(jí)身份標(biāo)識(shí)添加到了存儲(chǔ)過(guò)程安全上下文中。然后,授予需要執(zhí)行該過(guò)程的任何用戶(hù)或角色執(zhí)行權(quán)限。以下代碼展示了這些步驟。假設(shè)您想要簽名 mySchema.GetSecretStuff 過(guò)程,并且所有引用的對(duì)象已經(jīng)存在于數(shù)據(jù)庫(kù)中:
| 
 CREATE CERTIFICATE certCodeSigning -- Sign the stored procedure  -- Map a user to the certificate --Assign SELECT permissions to new certUser -- Grant execute permission to the user who will run the code  | 
現(xiàn)在只有明確授予對(duì)該存儲(chǔ)過(guò)程具有 EXECUTE 權(quán)限的用戶(hù)能夠訪(fǎng)問(wèn)該表的數(shù)據(jù)。
【編輯推薦】















 
 
 
 
 
 
 