75706部隊(duì)16分隊(duì)傳輸室 雷治安
75660部隊(duì)軍事指揮教研室 陳騰楠
基于SQL Server 2008中的加密和密鑰管理探析
75706部隊(duì)16分隊(duì)傳輸室 雷治安
75660部隊(duì)軍事指揮教研室 陳騰楠
以SQL Server 2008為例,對(duì)加密和密鑰管理作簡(jiǎn)要探討分析,啟發(fā)搞好網(wǎng)絡(luò)和數(shù)據(jù)的安全維護(hù),加強(qiáng)保密性。
SQL Server 2008;加密;密鑰管理;探析
網(wǎng)絡(luò)時(shí)代,數(shù)據(jù)保密是個(gè)棘手問(wèn)題,這就要求系統(tǒng)提供大量確保數(shù)據(jù)庫(kù)安全的功能,方能適應(yīng)發(fā)展需要。譬如,SQL Server 2008中的加密和密鑰管理就是這樣。
首先加強(qiáng)立法保護(hù)數(shù)據(jù)。如今,無(wú)論軍民用信息都有相對(duì)的私密性,在信息技術(shù)迅猛發(fā)展和充滿隱私的大環(huán)境中,數(shù)據(jù)需要用法規(guī)形式保護(hù)。其次把數(shù)據(jù)加密存儲(chǔ)在安全性良好的數(shù)據(jù)庫(kù)中。良好的數(shù)據(jù)庫(kù)具備良好的安全規(guī)范,如SQL Server就有一個(gè)叫defense in depth重要的安全規(guī)范。Defense in depth意味著分層防御,即使攻擊者成功打破最外層防御,仍需突破一層接一層的防御才能獲得成功。這意味著攻擊者通過(guò)防火墻和從服務(wù)器到數(shù)據(jù)庫(kù)的Windows安全后,仍需進(jìn)行一些惡劣、野蠻和強(qiáng)制的黑客攻擊才能解碼數(shù)據(jù)庫(kù)中的數(shù)據(jù)。
SQL Server 2008使用對(duì)稱密鑰、非對(duì)稱密鑰和數(shù)字證書,為各種類型的數(shù)據(jù)加密提供豐富的支持。最出色的是,它可為您管理密鑰,而密鑰管理是加密中最難的部分。
管理員可能至少需要管理圖1所示層次結(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ì)稱密鑰或證書時(shí)例外,這是SQL Server用戶管理自己的密鑰,以及負(fù)責(zé)保密密鑰的方法。
注意:Microsoft不推薦直接使用證書或非對(duì)稱密鑰加密數(shù)據(jù)。非對(duì)稱密鑰加密速度慢且使用此機(jī)制保護(hù)的數(shù)據(jù)量有限(這取決于密鑰模數(shù)大小)。可使用密碼,而不是數(shù)據(jù)庫(kù)主密鑰保護(hù)證書和非對(duì)稱密鑰。
1.服務(wù)主密鑰
服務(wù)主密鑰是規(guī)定SQL Server中所有密鑰和證書的密鑰。它是SQL Server在安裝期間自動(dòng)創(chuàng)建的對(duì)稱密鑰,是個(gè)至關(guān)重要的密鑰。如此密鑰泄露,那么攻擊者最終將解碼服務(wù)器中由SQL Server管理的每個(gè)密鑰。Windows中的數(shù)據(jù)保護(hù)API(Data Protection API,DPAPI)為服務(wù)主密鑰提供保護(hù)。
SQL Server可管理服務(wù)主密鑰。雖然您可對(duì)其執(zhí)行維護(hù)任務(wù),將其轉(zhuǎn)存到一個(gè)文件中,重新生成它,以及從文件中將其還原。但大多數(shù)情況下,無(wú)需對(duì)密鑰做任何更改。備份服務(wù)主密鑰以防止密鑰損壞對(duì)管理員來(lái)說(shuō)是明智的選擇。
2.數(shù)據(jù)庫(kù)主密鑰
數(shù)據(jù)庫(kù)范圍內(nèi),數(shù)據(jù)庫(kù)主密鑰是數(shù)據(jù)庫(kù)中所有密鑰、證書和數(shù)據(jù)的根加密對(duì)象。每個(gè)數(shù)據(jù)庫(kù)都有唯一的主密鑰;嘗試創(chuàng)建第二個(gè)密鑰時(shí),會(huì)出現(xiàn)錯(cuò)誤提示。必須在使用前通過(guò)CREATE MASTER KEY Transact-SQL語(yǔ)句和用戶提供的密碼創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)主密鑰:
CREATE MASTER KEY ENCRYPTION BY PASSWORD='EOhnDGS6!7JKv'
3.層次結(jié)構(gòu)密鑰保護(hù)的特點(diǎn)
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)用程序或用戶無(wú)需用密碼顯式打開(kāi)主密鑰,這是層次結(jié)構(gòu)保護(hù)密鑰的主要優(yōu)勢(shì)。
分離一個(gè)存有主密鑰的數(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)建三種類型中的任何一種密鑰,具體取決于加密所需類型:非對(duì)稱密鑰,使用公鑰/私鑰對(duì)進(jìn)行公鑰加密;對(duì)稱密鑰,用于在同一個(gè)密鑰分別加密和解密數(shù)據(jù)的方面共享秘密;證書,實(shí)質(zhì)上用于包裝公鑰。
因所有加密選項(xiàng)及其已深層集成于服務(wù)器和數(shù)據(jù)庫(kù)中,所以現(xiàn)行加密必須將防御的最終層添加到數(shù)據(jù)上。然而,需明智使用工具,因?yàn)榧用芙o服務(wù)器增加了大量的處理開(kāi)銷。
SQL Server 2005中,可使用數(shù)據(jù)庫(kù)引擎加密功能,通過(guò)編寫自定義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ù)在寫入磁盤時(shí)被加密,從磁盤讀取時(shí)解密。通過(guò)使用SQL Server透明地管理加密和解密,就可在不改變現(xiàn)有應(yīng)用程序的情況下確保數(shù)據(jù)庫(kù)中業(yè)務(wù)數(shù)據(jù)的安全,如圖2所示。
數(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或丟失。
隨著法規(guī)遵從性需求的增長(zhǎng)以及對(duì)數(shù)據(jù)隱私的整體關(guān)注,越來(lái)越多的組織將加密用作解決深層防御方案的手段。隨著大規(guī)模使用加密和密鑰來(lái)保護(hù)數(shù)據(jù),密鑰管理變得更復(fù)雜。一些高安全性數(shù)據(jù)庫(kù)要使用數(shù)千個(gè)密鑰且必須部署一個(gè)系統(tǒng)來(lái)存儲(chǔ)、注銷和重新生成這些密鑰。而且,還應(yīng)將這些密鑰與數(shù)據(jù)分開(kāi)存儲(chǔ)以增強(qiáng)安全性。
SQL Server 2008為第三方使用公開(kāi)加密功能。這些解決方案可與SQL Server 2005和SQL Server 2008數(shù)據(jù)庫(kù)無(wú)縫地工作并提供企業(yè)級(jí)專用密鑰管理。這將密鑰管理工作負(fù)載從SQL Server轉(zhuǎn)移到專用密鑰管理系統(tǒng)。
SQL Server 2008中擴(kuò)展的密鑰管理還支持使用HSM提供密鑰與數(shù)據(jù)的物理分離。
SQL Server中提供加密的好處就是它提供使用證書對(duì)代碼模塊(存儲(chǔ)過(guò)程、函數(shù)、觸發(fā)器和事件通知)進(jìn)行數(shù)字簽名的能力。這提供了訪問(wèn)數(shù)據(jù)庫(kù)表比其他對(duì)象訪問(wèn)更細(xì)粒度的控制。像加密數(shù)據(jù)一樣,使用證書中的私鑰簽名代碼,其結(jié)果是使用代碼模塊簽名的表只能通過(guò)該代碼訪問(wèn)且不允許使用在代碼模塊之外。換言之,只能使用已經(jīng)簽名該模塊的證書,才能獲得對(duì)該表的訪問(wèn)。
對(duì)存儲(chǔ)過(guò)程而言,效果是一樣的。例如,如有完整的所有權(quán)鏈,您可謹(jǐn)慎控制哪些用戶獲得該過(guò)程的EXECUTE權(quán)限,并可拒絕他們對(duì)基礎(chǔ)表的直接訪問(wèn)。但這在過(guò)程的所有權(quán)鏈被破壞或執(zhí)行動(dòng)態(tài)SQL時(shí)不起作用,此時(shí)要求執(zhí)行該過(guò)程的用戶擁有對(duì)基礎(chǔ)表的權(quán)限。實(shí)現(xiàn)同樣效果的另一種方式是使用EXECUTE AS,但改變了過(guò)程執(zhí)行的安全上下文,這不是理想的情況。
簽名代碼模塊的另一好處就是防止對(duì)代碼模塊做出未授權(quán)的更改。像其他經(jīng)過(guò)數(shù)字簽名的文檔一樣,在代碼改變時(shí),證書將失效。代碼不在證書上下文中執(zhí)行,因此任何被提供證書訪問(wèn)權(quán)限的對(duì)象都將不可訪問(wèn)。要繼續(xù)訪問(wèn)它們,需要?jiǎng)?chuàng)建一個(gè)證書,將該證書與新用戶關(guān)聯(lián)并使用該證書簽名過(guò)程,授予該用戶執(zhí)行該存儲(chǔ)過(guò)程必要的權(quán)限。實(shí)質(zhì)上,已經(jīng)將該用戶作為次級(jí)身份標(biāo)識(shí)添加到存儲(chǔ)過(guò)程安全上下文中。然后,授予需要執(zhí)行該過(guò)程的任何用戶或角色執(zhí)行權(quán)限。以下代碼展示了這些步驟。假設(shè)您想要簽名my Schema.Get Secret Stuff過(guò)程,并且所有引用的對(duì)象已經(jīng)存在數(shù)據(jù)庫(kù)中:
現(xiàn)只有明確授予對(duì)該存儲(chǔ)過(guò)程具EXECUT權(quán)限的用戶能訪問(wèn)該表的數(shù)據(jù)。