引言:在企業(yè)管理,網(wǎng)站維護(hù),程序開發(fā)等環(huán)境中,SQL Server數(shù)據(jù)庫使用極為廣泛。在SQL Server數(shù)據(jù)庫中,往往保存了大量的重要數(shù)據(jù)。因此,如何保證數(shù)據(jù)庫的安全性,防止其中的數(shù)據(jù)被盜取或者篡改,是保證SQL Server正常運(yùn)作必須面對(duì)的問題。
使用加密技術(shù)可以有效保護(hù)SQL Server數(shù)據(jù)庫的安全。例如,在SQL Server 2008中,就可以使用數(shù)據(jù)加密,數(shù)據(jù)操作身份審核,身份驗(yàn)證協(xié)議等手段,來提高數(shù)據(jù)庫的安全性。這里就以如何使用數(shù)據(jù)透明加密為例,來說明具體的實(shí)現(xiàn)方法。
在SQL Server 2008中,提供了透明數(shù)據(jù)加密技 術(shù)(即 Transparent Data Encryption),對(duì)整個(gè)數(shù)據(jù)庫進(jìn)行保護(hù),可以自動(dòng)加密SQL Server的數(shù)據(jù)文件和日志文件。透明加密是在物理文件層次運(yùn)作,即使沒有加密證書,也可以防止執(zhí)行數(shù)據(jù)庫文件還原和附加等操作。例如,當(dāng)需要將數(shù)據(jù)庫恢復(fù)或者附加到另外的SQL Server實(shí)例上時(shí),就必須提供加密時(shí)使用的加密密鑰證書,否則操作無法進(jìn)行。之前的SQL Server數(shù)據(jù)加密操作,針對(duì)的都是表中的字段,數(shù)據(jù)記錄等對(duì)象,無法從根本上保護(hù)數(shù)據(jù)庫文件的安全。
而透明加密及時(shí)保護(hù)的對(duì)象是數(shù)據(jù)庫文件,日志文件和備份文件。該加密方式是在頁級(jí)別工作的,相關(guān)數(shù)據(jù)庫中的頁會(huì)在寫入磁盤之前加密,在讀取到內(nèi)存之前解密。之所以叫透明數(shù)據(jù)加密,是因?yàn)檫@種加密在使用數(shù)據(jù)庫的程序或用戶看來,就好像沒有加密一樣。TDE加密是數(shù)據(jù)庫級(jí)別的。數(shù)據(jù)的加密和解密是以頁為單位,由數(shù)據(jù)引擎執(zhí)行的。在寫入時(shí)進(jìn)行加密,在讀出時(shí)進(jìn)行解密??蛻舳顺绦蛲耆挥米鋈魏尾僮?。所謂頁,指的是數(shù)據(jù)庫中一個(gè)I/O操作的基本單位,數(shù)據(jù)庫的頁是在磁盤上保存物理記錄的單位,這是邏輯的概念,有利于物理記錄的管理。
TDE的主要作用是保護(hù)數(shù)據(jù)庫的安全,例如當(dāng)數(shù)據(jù)庫備份或數(shù)據(jù)文件被黑客盜取之后,當(dāng)其在沒有數(shù)據(jù)加密密鑰的情況下,是無法恢復(fù)或附加數(shù)據(jù)庫的。透明加密技術(shù)使用數(shù)據(jù)庫加密密鑰,對(duì)數(shù)據(jù)庫進(jìn)行加密處理。該密鑰存儲(chǔ)在數(shù)據(jù)庫啟動(dòng)記錄中,對(duì)于對(duì)稱密鑰來說,透明加密功能使用存儲(chǔ)在數(shù)據(jù)庫實(shí)例中的Master數(shù)據(jù)庫中的證書對(duì)其進(jìn)行保護(hù)。對(duì)于非對(duì)稱密鑰來說,可以使用外部密鑰管理模塊對(duì)其加以保護(hù)。使用透明加密技術(shù),必須為數(shù)據(jù)庫創(chuàng)建一個(gè)主密鑰,例如運(yùn)行SQL Server Management Studio,連 接 到SQL服 務(wù)器,點(diǎn)擊菜單“文件”→“新建”→“數(shù)據(jù)庫引擎查詢”項(xiàng),或者點(diǎn)擊工具欄上的“數(shù)據(jù)查詢”按鈕,在查詢輸入窗口中執(zhí)行“create master key encryption by password ='jiamikey!@#'”語句,創(chuàng)建名為“jiamikey!@#”的主密鑰。注意,該密鑰必須符合Windows的密碼策略要求。對(duì)應(yīng)的,執(zhí)行“DROP MASTER KEY”語句,可以刪除主密鑰。
可以根據(jù)需要,對(duì)數(shù)據(jù)庫主密鑰的屬性進(jìn)行修改,例如執(zhí)行“alter master key regenerate with encryption by password =jiamikey!@#'”語句,來重建數(shù)據(jù)庫主密鑰以及受其保護(hù)的密鑰。如果使用“Force”參數(shù),例如執(zhí)行“alter master key force regenerate with encryption by password =jiamikey!@#'”語句,表示即使主密鑰不可用,該密鑰的重建過程也會(huì)強(qiáng)制執(zhí)行,這適用于主密鑰無法恢復(fù)或者解密失敗的情況。執(zhí)行“alter master key add encryption by password= jiamikey!@#'”,“alter master key add encryption by service master key”語句,可以使用服務(wù)主密鑰,對(duì)主密鑰的副本進(jìn)行加密,之后將副本保存在當(dāng)前數(shù)據(jù)庫和Master數(shù)據(jù)庫中。執(zhí)行“alter master key drop encryption by password= 'jiamikey!@#'”,“alter master key drop encryption by service master key”語句,可以刪除服務(wù)主密鑰對(duì)數(shù)據(jù)庫主密鑰的加密信息。
當(dāng)創(chuàng)建了主密鑰之后,需要及時(shí)對(duì)其進(jìn)行備份。例如執(zhí)行“backup master key to file = 'E:zhukey'encryption by password= 'jiamikey!@#'”語句,將其備份到指定的文件中。對(duì)應(yīng)的。執(zhí)行“restore master key from file ='E:zhukey' decryption by password = 'jiamikey!@#'encryption by password ='jiamiqwe!@#'”語句,可以導(dǎo)入之前備份的主密鑰。在“encryption by password”參數(shù)中可以指定新的密鑰信息。
接下來需要?jiǎng)?chuàng)建或取得由Master數(shù)據(jù)庫保護(hù)的證書,例如執(zhí)行“use master”,“create certificate wodecertificate encryption by password= 'certificate!@#' with subject = 'EnryptData certificate', start_date ='20150101',expiry_date= '20190101'”,“Go”等命令,可以創(chuàng)建指定名稱的證書,并指定用于對(duì)私鑰加密的密碼,如果不使用“encryption by password =' certificate!@#'”語句,則自動(dòng)使用數(shù)據(jù)庫主密鑰對(duì)私鑰進(jìn)行加密。利用證書可以使用數(shù)據(jù)庫級(jí)的內(nèi)部公鑰對(duì)數(shù)據(jù)表的字段等對(duì)象進(jìn)行加密,之后使用數(shù)據(jù)庫級(jí)的內(nèi)部私鑰對(duì)其解密。
對(duì)證書進(jìn)行備份時(shí)很有必要的,例如執(zhí)行“backup certificate wodecertificate to file = 'E:wodecertificate.cer'with private key (file = 'E:wodecertificate_key.pvk' ,decryption by pass word = 'hellocertificate!@#',encryption by password='hellocertificate' )”語句,可以將證書備份到指定的文件中,同時(shí)設(shè)定私鑰文件保存位置,以及對(duì)私鑰進(jìn)行加密和解密的密碼。對(duì)應(yīng)的,執(zhí) 行“create certificate mycertificate from file='E:wodecertificate.cer' with private key(file ='E:wodecertificate_key.pvk', decryption by pass word ='hellocertificate!@#')”語句,可以執(zhí)行證書的還原操作。如果想刪除證書,可以執(zhí)行“drop certificate wodecertificate”語句,就可以將名為“Mycertificate” 的證書刪除。
對(duì)數(shù)據(jù)庫進(jìn)行透明加密,需要?jiǎng)?chuàng)建對(duì)應(yīng)的加密密鑰。例如需要你對(duì)名為“shilidb”的數(shù)據(jù)庫進(jìn)行加密的話,可以執(zhí)行“use shilidb”,“create database encryption key with algorithm = AES_128 encryption by Server certificate wodecertificate”語句,為指定的數(shù)據(jù)庫創(chuàng)建加密密鑰,該密鑰使用上述創(chuàng)建的證書。如果需要對(duì)該加密密鑰進(jìn)行修改的話,例如修改其加密算法,可以執(zhí)行“use shilidb”,“alter database encryption key with algorithm = AES_256 encryption by Server certificate wodecertificate”,“Go”等語句,將其加密算法修改為“AES_256”。執(zhí)行“alter database shilidb set encryption ON”語句,將“shilidb”數(shù)據(jù)庫設(shè)置為透明加密狀態(tài)。當(dāng)啟用了透明加密后,目標(biāo)數(shù)據(jù)庫所有相關(guān)文件組都將進(jìn)行加密。
當(dāng)對(duì)受到透明加密的數(shù)據(jù)庫進(jìn)行備份后,當(dāng)試圖在其他SQL Server服務(wù)器上對(duì)其還原時(shí),是無法進(jìn)行操作的。要想解決問題,只有在該SQL Server服務(wù)器上創(chuàng)建同樣的證書。還以上面的例子進(jìn)行說明,在本SQL Server上執(zhí)行“use master”,“go”,“ backup certificate wodecertificate to file = 'E:wodecertificate.cer' with private key ( file = 'E:wodecertificate_key.pvk',decryption by password =' hellocertificate!@#'”,“go”命令,將本地的證書導(dǎo)出為獨(dú)立的文件。之后在目標(biāo)SQL Server服務(wù)器上執(zhí)行“use master”,“go”,“create master key encryption by password= 'jiamikey!@#'”,“go”,“use master”,“go”,“create certificate mycertificate from file ='E:wodecertificate.cer'with private key (file ='E:wodecertificate_key.pvk',decryption by password ='hellocertificate!@#')”,“go”等語句,在該SQL Server服務(wù)器上創(chuàng)建相同的證書和主密鑰。這樣,執(zhí)行“restore database shili from disk = 'E:datashili.bak'with move 'shili'TO 'E:shujukushili.mdf' move 'shili_log' TO'E:shujukushilildf'”等語句,就可以在該機(jī)上執(zhí)行數(shù)據(jù)庫還原操作了,假設(shè)使用的數(shù)據(jù)庫名為“shili”。
在加密時(shí),需要對(duì)數(shù)據(jù)庫相關(guān)文件進(jìn)行更改操作,如果數(shù)據(jù)庫中的任何文件夾設(shè)置為只讀狀態(tài),加密操作將無法進(jìn)行。注意,當(dāng)對(duì)數(shù)據(jù)庫進(jìn)行透明加解密,以及更改密鑰等操作時(shí),將無法執(zhí)行諸如從數(shù)據(jù)庫文件組中刪除文件,刪除數(shù)據(jù)庫,使數(shù)據(jù)庫脫機(jī),分離數(shù)據(jù)庫,將數(shù)據(jù)庫文件組轉(zhuǎn)換成只讀狀態(tài)等操作。一旦啟用了透明加密功能,SQL Server會(huì)將日志中的文本數(shù)據(jù)清理出去,并使用加密格式的日志文件。不管在任何數(shù)據(jù)庫上執(zhí)行了透明加密,SQL Server自帶的tempdb數(shù)據(jù)庫都會(huì)自動(dòng)進(jìn)行加密,這將導(dǎo)致其非加密數(shù)據(jù)庫性能的下降。當(dāng)傳送日志文件到另外的使用透明加密的數(shù)據(jù)庫時(shí),如果相關(guān)日志在另外的數(shù)據(jù)庫上不可用,日志傳送將無法進(jìn)行。使用了透明加密功能,將導(dǎo)致數(shù)據(jù)庫的額壓縮備份效率降低。