鈴……我的手機鈴聲急促地響起來,領(lǐng)導(dǎo)在電話中語氣沉重的告訴我,CRM系統(tǒng)所使用的數(shù)據(jù)庫被人做了分離以及重新附加的操作,這就意味著數(shù)據(jù)庫文件存在被復(fù)制的可能,這無疑是一個晴天霹靂的壞消息。
?
我所在的公司是國內(nèi)一家比較大的汽車銷售公司,這些數(shù)據(jù)一旦失竊或是泄露出去將給企業(yè)帶來不可估量的損失。公司在第一時間進行監(jiān)控及審核排查,另一方面要求信息技術(shù)部門立即著手加強數(shù)據(jù)安全管理。還好我們使用的是SQL Server數(shù)據(jù)庫,從SQL Server2005開始有一個新特性——內(nèi)置數(shù)據(jù)加密的功能。該功能實現(xiàn)了完整的加密基礎(chǔ)結(jié)構(gòu),不需要再借此其他工具就可以實現(xiàn)完整的加密、解密操作。利用好此功能,即使存儲設(shè)備失竊也不用擔(dān)心數(shù)據(jù)泄露的問題。
首先看一下數(shù)據(jù)庫加密體系結(jié)構(gòu)。整個加密體系看起來挺復(fù)雜,但其實很簡單,這個加密體系分為多個加密級別,如下圖所示:
?
?
第一個級別:Windows級別。主要使用的是Windows的DPAPI(數(shù)據(jù)保護API)使用的用戶的憑據(jù),也就是使用用戶的密碼來對需要保護的對象進行加密的一種方法。在這里主要是使用Windows級別的用戶憑據(jù)對第二個級別也就是SQL
Server服務(wù)器級別進行加密。
第二個級別:SQL
Server的服務(wù)器實例級別。這一個層次有一個服務(wù)主密鑰,但是這個服務(wù)主密鑰必須使用DPAPI(也就是第一個級別的用戶憑據(jù))進行加密。而這個服務(wù)主密鑰又用于對第三個級別——數(shù)據(jù)庫主密鑰進行加密,也就是說上層必須為下層服務(wù)。
第三個級別:主數(shù)據(jù)庫級別。存在一個數(shù)據(jù)庫主密鑰,它可以加密數(shù)據(jù)庫中的其他對象,對稱密鑰不使用數(shù)據(jù)庫主密鑰加密,我們從圖中可以看出來,對稱密鑰使用證書,非對稱密鑰或是指定的密碼加密,同時又被第二級別服務(wù)主密鑰所保護。
第四個級別:用戶數(shù)據(jù)庫級別。當(dāng)數(shù)據(jù)庫中有了數(shù)據(jù)庫主密鑰后就可以使用數(shù)據(jù)庫主密鑰來保護數(shù)據(jù)庫中的證書和非對稱密鑰,再使用對稱密鑰來保護其他對稱密鑰和數(shù)據(jù),當(dāng)然也可以直接使用證書和非對稱密鑰來保護數(shù)據(jù)。?
下面我們來逐個看一下各種密鑰:
?
服務(wù)主密鑰:在安裝SQL Server時自動生成的一個密鑰,是128BIT的3DES密鑰。它的作用是,直接或者間接地保護體系中的其他密鑰。使用SQL Server的配置管理器更改服務(wù)賬戶,能夠自動完成加密和解密的過程。服務(wù)主密鑰是安裝時自動生成的,所以我們不能創(chuàng)建,但是我們可備份和還原服務(wù)主密鑰。
備份:Backup service master key to? file=’c:\bak\smk.bak’ encryption by
password=’DUfei2008’
?
備份的時候必須使用一個強密碼,因為如果要是沒有密碼保護的話,那么其他人很容易進行還原,得到服務(wù)主密鑰。
?
還原:必須給定備份時的密碼:Restore service master? key from file=’c:\bak\smk.bak’ decryption by password=’DUfei2008’?
?
下面我們來看一下數(shù)據(jù)庫主密鑰,有三點需要注意:?
?
1、數(shù)據(jù)庫主密鑰不會自己生成,必須需要管理員手動創(chuàng)建;
2、由密碼保護和服務(wù)主密鑰同時保護;
3、是128bit的3DES密鑰。
?
創(chuàng)建語法:Create master key encryption by password=’DUfei2008’ ——由指定的密碼和服務(wù)主密鑰保護。
?
可以使用密碼來解開,如分離后復(fù)制到另一個服務(wù)器上,因為使用不同的服務(wù)賬戶,那么服務(wù)主密鑰不同,所以就不能解密使用服務(wù)主密鑰加密的數(shù)據(jù)庫主密鑰。這個時候可以使用加密時所提供的密碼來解開數(shù)據(jù)庫主密鑰。
?
我們在創(chuàng)建數(shù)據(jù)庫主密鑰的時候,會自動使用服務(wù)主密鑰進行保護,使用時會自動使用服務(wù)主密鑰解開數(shù)據(jù)庫主密鑰,當(dāng)然我們也可以刪除服務(wù)主密鑰對數(shù)據(jù)庫主密鑰的保護,那么在每一次打開的時候必須手動打開數(shù)據(jù)庫主密鑰,因為沒有了服務(wù)主密鑰那么就必須指定在加密時所指定的口令。
?
打開數(shù)據(jù)庫主密鑰語法:Open master key decryption by password=’DUfei2008’
?
使用完畢后關(guān)閉數(shù)據(jù)庫主密鑰:Close master key?
?
也可以修改數(shù)據(jù)庫主密鑰,重新生成數(shù)據(jù)庫主密鑰,這是很耗資源的一個工作,因為舊的數(shù)據(jù)庫主密鑰會解密現(xiàn)有數(shù)據(jù),然后使用新的數(shù)據(jù)庫主密鑰進行加密。管理員可以根據(jù)安全性和適合場合來決定是使用服務(wù)主密鑰還是刪除服務(wù)主密鑰。管理員還可以通過目錄視圖Sys.symmetric_keys、Sys.databases 查看數(shù)據(jù)庫主密鑰狀態(tài)。?
?
備份數(shù)據(jù)庫主密鑰:Backup master key to file=’c:\bak\dmk.bak’ encryption by password=’DUfei2008’?
?
還原數(shù)據(jù)庫主密鑰:Restore master key from file=’c:\bak\dmk.bak’ decryption by password=’舊密碼’ encryption by password=’新密碼’?
?
以上對數(shù)據(jù)庫加密體系進行了一個簡單的介紹,下面咱們來看一下使用數(shù)據(jù)庫加密保護數(shù)據(jù)。要保護數(shù)據(jù),必須有一個可以保護數(shù)據(jù)的密鑰,這個密鑰有三種,對稱密鑰,非對稱密鑰和證書(公鑰加密,私鑰解密),有了密鑰才可能去對數(shù)據(jù)進行加密,所以我們還得先來看一下如何創(chuàng)建相應(yīng)的密鑰,也就是如何創(chuàng)建證書,創(chuàng)建對稱密鑰,創(chuàng)建非對稱密鑰,然后再利用這些密鑰對數(shù)據(jù)進行加密。?
?
咱們先看一下創(chuàng)建證書,在此我使用的是自簽名的證書(也可以使用現(xiàn)有的CA進行證書的頒發(fā))。
?
創(chuàng)建自簽名證書語法:
?
Create certificate證書名 encryption by password=’密碼’?? with subject=’主題’,Start_date=’起始日期’ expiry_data=’到期日期’?
?
說明:其中這個口令用于保護我們的私鑰;主題,就是一個描述信息(無所謂)有效期在這里不是很嚴(yán)格,需要結(jié)合程序或者存儲過程來進行檢查。相關(guān)更改證書的操作:更改用于加密私鑰的密碼或者是刪除私鑰。第一種情況適合于口令泄露的情況,不安全;第二種情況適合于只加密不解密的情況,很常見如一些注冊用戶密碼,不希望管理看到。看不到原文,但是用戶一樣可以使用。?
?
更改私鑰的密碼語法: alter certificate cert1 with private key? (decryption by password='DUfei2008',encryption by password='DUfei2008')
?
備份證書(導(dǎo)出證書):Backup certificate 證書名to file=’c:\bak\mycert.cer’ with private key (decryption by? password=’舊口令’,file=’c:\bak\mycertpvt’,encryption?? by password=’私鑰的口令’)
?
還原(導(dǎo)入): 還原證書在此不用restore而是create導(dǎo)入,create certificate cert1 from? file='c:\bak\mycert.cer' with? private key (file='c:\bak\mypvt'? ,decryption by password='DUfei2008',encryption by password='DUfei2008' )
?
刪除證書的私鑰:? Alter certificate證書名remove private key
?
增加私鑰: alter certificate cert1 with private key (file='c:\bak\mypvt', decryption by? password='DUfei2008',encryption by password='DUfei2008')?
?
另外還要用到一些與證書相關(guān)的函數(shù):?
?
Encryptbycert(證書ID,加密文本)用于加密;Decryptbycert ( 證書ID,密文,加密口令)用于解密;Cert_id(證書名)得到證書ID,因為加密,解密使用的都是ID。?
?
下面咱們就看一下具體的實例:
?
咱們就以dufei數(shù)據(jù)庫為例,先看一下服務(wù)主密鑰。咱們前面已經(jīng)介紹了,它不是咱們手動創(chuàng)建出來的,在安裝SQL SERVER時就已經(jīng)存在了。我們做的只能是備份和還原。
?
備份: backup service master key to? file='c:\bak\smk.bak' encryption by password='DUfei2008'
?
還原:restore service master key from? file='c:\bak\smk.bak' decryption by password='DUfei2008'
?
生成新的服務(wù)主密鑰, 適應(yīng)于更改服務(wù)帳戶的情況,一般推薦使用配置管理器更改服務(wù)帳戶:alter service master key regenerate
?
---------數(shù)據(jù)庫主密鑰---
?
1)為當(dāng)前dufei數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)庫主密鑰
use dufei
create?? master key encryption by
password='DUfei2008'
?
2)查看數(shù)據(jù)庫加密狀態(tài)
select * from sys.databases where? name='dufei'
?
3)? 查看數(shù)據(jù)庫主密鑰的信息
select * from sys.symmetric_keys???
?
4)備份數(shù)據(jù)庫主密鑰
backup master key to file='c:\bak\dmk.bak'? encryption by
password='DUfei2008'
?
默認(rèn)情況下,創(chuàng)建數(shù)據(jù)庫主密鑰會被服務(wù)主密鑰所保護的,但有的時候我們不希望數(shù)據(jù)庫主密鑰使用服務(wù)主密鑰保護,那么就可以刪除服務(wù)主密鑰對數(shù)據(jù)庫主密鑰的保護。我們先不刪除,我們來利用數(shù)據(jù)庫主密鑰創(chuàng)建非對稱密鑰,可以直接創(chuàng)建。
?
Create asymmetric key asy_key1 with? algorithm=RSA_1024 --成功
?
語法:Alter master key drop encryption by service? master key
?
再次查看數(shù)據(jù)庫的加密狀態(tài):Select * from sys.databases where name=’dufei’
?
--主要是看is_master_key_encrypted_by_server? 已經(jīng)是0了。說明不被服務(wù)主密鑰保護了。
?
此時我們再創(chuàng)建一個非對稱密鑰,則不成功,Create asymmetric key asy_key2 with? algorithm=RSA_1024 --失敗了,因為這個時候數(shù)據(jù)庫主密鑰不會自動打開了,必須打開數(shù)據(jù)庫主密鑰再創(chuàng)建。
?
Open master key decryption by password=’DUfei2008’
?
Select * from sys.openkeys? 顯示打開的數(shù)據(jù)庫主密鑰,然后再創(chuàng)建非對稱密鑰則可以成功,如下:
?
Create asymmetric key asy_key2 with?? algorithm=RSA_1024 ---則顯示成功。用戶也可以通過圖形界面查看一下,非對稱密鑰中已經(jīng)出現(xiàn)了我們所創(chuàng)建的密鑰。這個實驗是告訴大家,如果你刪除了服務(wù)主密鑰對數(shù)據(jù)庫主密鑰的保護,那么每次必須手動打開數(shù)據(jù)庫主密鑰,挺麻煩的,所以我們還可以恢復(fù)服務(wù)主密鑰對數(shù)據(jù)庫主密鑰的保護。
?
1)?? 恢復(fù)服務(wù)主密鑰對數(shù)據(jù)庫主密鑰的保護
Alter master key add encryption by service? master
key
?
2)?? 關(guān)閉數(shù)據(jù)庫主密鑰
Close master key?
?
下面咱們來看看使用證書對數(shù)據(jù)進行加密
?
-----------------證書對數(shù)據(jù)加密---------------
?
1)生成自簽名證書
????? --使用指定口令保護私鑰
create certificate cert1 encryption by?
password='DUfei2008' with subject='test',
start_date='01/01/2009',expiry_date='01/01/2010'
--使用數(shù)據(jù)庫主密鑰保護私鑰
create
certificate cert2 with
subject='test',start_date='01/01/2009',expiry_date='01/01/2010'?
?
2) 查看證書信息
select * from sys.certificates?
?
3)修改私鑰的口令
alter certificate cert1 with private key? (decryption by
password='DUfei2008',encryption by password='DUfei2008')?
?
4)備份證書
backup certificate cert1 to? file='c:\bak\mycert.cer' with private
key? (decryption by? password='DUfei2008',file='c:\bak\mypvt',encryption by
password='DUfei2008')
?
5)刪除私鑰
alter certificate cert1 remove private key?
?
6)增加私鑰
alter certificate cert1 with private key (file='c:\bak\mypvt',
decryption by password='DUfei2008',encryption? by password='DUfei2008')?
?
7)刪除證書
drop certificate cert1
?
8) 還原證書
create certificate cert1 from? file='c:\bak\mycert.cer' with?
private key (file='c:\bak\mypvt'? ,decryption by password='DUfei2008',encryption
by password='DUfei2008')
????? 接下來可以使用下面的小腳本來體驗一下加密的結(jié)果。
declare @atext
varchar(100),@acipher? varbinary(max)set @atext='dufei hao!'
set?
@acipher=encryptbycert(cert_id('cert1'),@atext)
select @acipher
?????
select? cast(decryptbycert(cert_id('cert1'),@acipher,N'DUfei2008')as
varchar(200) )
?
以上介紹的是SQL Server中實現(xiàn)數(shù)據(jù)加密過程,至于非對稱加密、對稱加密、混合加密的操作過程基本相同,甚至在操作過程還可以引入驗證因子防止繞過數(shù)據(jù)加密的攻擊等,使用好數(shù)據(jù)加密功能,就不用再擔(dān)心數(shù)據(jù)丟失問題了,安全無小事,時刻不能大意。
?
啟明星辰公司數(shù)據(jù)庫審計專家點評
?
本案例對加密方案介紹得十分細(xì)致。為了保障數(shù)據(jù)安全,除了完善的加密措施,還要考慮嚴(yán)格的授權(quán)控制,以防止越權(quán)訪問和權(quán)限濫用。另外,對數(shù)據(jù)庫的所有訪問要做到可事后追溯,有據(jù)可查,因此需要考慮部署獨立的審計產(chǎn)品。
版權(quán)所有:鄭州三中網(wǎng)安科技有限公司 豫ICP備2020036495號-1 ?? | 豫公網(wǎng)安備 41019702002241號 | 站點地圖 | 人才招聘 | 聯(lián)系我們 |