王 紅,陳功平
(六安職業(yè)技術學院 信息工程系,安徽 六安237158)
網(wǎng)絡應用技術的發(fā)展,讓人們可以隨時隨地與好友交流、上網(wǎng)購物、管理網(wǎng)上銀行等業(yè)務,你登錄各種賬戶所用到的用戶名、密碼以及你所管理的各項業(yè)務的數(shù)據(jù)都存儲在網(wǎng)絡中的某個節(jié)點計算機上。
計算機時代,使用數(shù)據(jù)庫技術來存儲和管理龐大的數(shù)據(jù),如何保證數(shù)據(jù)庫中的數(shù)據(jù)安全有效的運行,能夠自我保護[1],同時免疫外界的覬覦,這些都屬于數(shù)據(jù)庫安全要解決的問題。
數(shù)據(jù)庫管理系統(tǒng)開發(fā)者在設計時都會考慮到數(shù)據(jù)庫安全保護機制方面的需求,設計許多的安全管理接口,同時用戶也可以根據(jù)需求自己配置數(shù)據(jù)庫安全措施。本文以微軟的SQL Server數(shù)據(jù)庫管理系統(tǒng)為例,介紹其在數(shù)據(jù)庫安全機制方面的接口以及實現(xiàn)方法。
微軟產品的市場占有率非常高,SQL Server作為微軟最核心、復雜的商業(yè)數(shù)據(jù)庫管理系統(tǒng)軟件,得到了許多用戶的支持,版本更新很快,管理能力強,在安全配置方面有著獨特的機制和實現(xiàn)方法。
微軟的數(shù)據(jù)庫產品很多,Visual FoxPro和ACCESS數(shù)據(jù)庫的數(shù)據(jù)以文件形式直接存儲在計算機中,Visual FoxPro數(shù)據(jù)庫文件擴展名為“.dbf”,ACCESS數(shù)據(jù)庫文件的擴展名為“.mdb”,只要用對應的軟件就可以將文件打開,即使文件設置了密碼,也很容易破解,文件打開后,所有的數(shù)據(jù)都可以展示在用戶面前,數(shù)據(jù)的隱私性無從談起,因此它們在商業(yè)運用中較少。SQL Server數(shù)據(jù)庫在操作系統(tǒng)中也是以文件形式存儲,文件分為數(shù)據(jù)文件和日志文件兩種類型。
(1)數(shù)據(jù)文件
SQL Server中的數(shù)據(jù)文件又分為“主數(shù)據(jù)文件”和“次數(shù)據(jù)文件”兩類,數(shù)據(jù)庫必須有且只能有一個主數(shù)據(jù)文件,次數(shù)據(jù)文件可以沒有,也可以有多個,它們共同存儲所有數(shù)據(jù)庫對象,但用戶無法得知每個數(shù)據(jù)庫對象存儲在哪個文件中,這有利于保護數(shù)據(jù)。
主數(shù)據(jù)文件的推薦擴展名為“.mdf”,次數(shù)據(jù)文件的推薦擴展名為“.ndf”,若用戶在創(chuàng)建數(shù)據(jù)庫或為數(shù)據(jù)庫添加文件時,沒有使用推薦擴展名,使用其他字符作擴展名或未使用擴展名,都不影響數(shù)據(jù)庫的運行。
(2)日志文件
日志文件存儲用戶對數(shù)據(jù)庫的所有操作,推薦擴展名為“.ldf”,數(shù)據(jù)庫至少要有一個日志文件。
當數(shù)據(jù)庫在SQL Serve系統(tǒng)中存在時,即使關閉SQL Server軟件,但SQL Server服務是啟動狀態(tài)時,該數(shù)據(jù)庫所屬的各個數(shù)據(jù)庫文件都不能被拷貝、刪除,除非你將數(shù)據(jù)庫從管理系統(tǒng)中分離或停止、暫停SQL Server服務,才能夠實現(xiàn)數(shù)據(jù)庫文件的拷貝、刪除等操作。這是數(shù)據(jù)庫文件的自我安全保護機制之一,防止用戶無意中刪除文件而使得數(shù)據(jù)庫不可用,同時也防止不法人員拷貝文件而獲取信息。
當用戶獲取到數(shù)據(jù)庫文件后,即使系統(tǒng)安裝了相應的數(shù)據(jù)庫軟件,也無法直接雙擊打開數(shù)據(jù)庫文件,只有將數(shù)據(jù)庫文件在數(shù)據(jù)庫系統(tǒng)中附加或還原后方可查看數(shù)據(jù)庫中的數(shù)據(jù),若你得到的數(shù)據(jù)文件有缺失,附加和還原操作也將不能進行,這是數(shù)據(jù)庫文件的自我安全保護機制之二,防止用戶得到部分文件后造成信息泄露。
同時,數(shù)據(jù)庫文件的擴展名用戶可以自己定義,這是數(shù)據(jù)庫文件的自我安全保護機制之三,可以起到隱藏身份的作用。
數(shù)據(jù)庫文件只有在數(shù)據(jù)庫系統(tǒng)中才可以查看、修改和配置,受到層層保護??梢詫?shù)據(jù)庫中的數(shù)據(jù)比作博物館中的藏品,不法分子要想得到藏品,首先要能夠進入博物館大門,然后要能夠進入藏品的房間,最后還要看你是否有得到藏品的權限,基于此原理,SQL Server軟件為數(shù)據(jù)庫中的數(shù)據(jù)設置了3道關卡。
第1關,用戶必須登錄到SQL Server的服務器實例上。要登錄到服務器實例,首先要有一個登錄賬戶,即登錄名。SQL Server提供了一個不能被刪除、修改且權限最大的登錄名“sa”,可以為“sa”配置密碼或取消其登錄資格來保護數(shù)據(jù)庫。
第2關,登錄服務器后,登錄名在數(shù)據(jù)庫中要有對應的用戶賬號,才有訪問數(shù)據(jù)庫的資格,否則無法打開用戶數(shù)據(jù)庫。默認情況下,每個數(shù)據(jù)庫中都有一個權限最高的用戶賬戶dbo,它對應“sa”的登錄名。
第3關,連接到數(shù)據(jù)庫后,要管理數(shù)據(jù)庫中的對象,用戶賬戶要具有相應的權限。
安全驗證機制是針對3道關卡中的第1關,有“Windows驗證機制”和“SQL Server驗證機制”兩種。
用戶在登錄操作系統(tǒng)時需要提供身份驗證信息,因此Windows驗證機制是借助Windows的驗證機制,只要指用戶通過操作系統(tǒng)即可使用數(shù)據(jù)庫系統(tǒng);SQL Server驗證機制是數(shù)據(jù)庫系統(tǒng)自帶的驗證機制,如1.2中介紹的“sa”登錄名以及對應的用戶賬戶,屬于SQL Server的驗證機制[2]。
在2種安全驗證機制的基礎上,SQL Server數(shù)據(jù)庫系統(tǒng)提供了“僅Windows身份驗證模式”和“混合驗證模式”2種身份驗證模式[3]。
將SQL Server服務器設置為“僅Windows身份驗證模式”后,只能采用“Windows驗證機制”來驗證用戶的身份;“混合驗證模式”指既可以使用“Windows驗證機制”又可以使用“SQL Server驗證機制”來驗證用戶身份。
根據(jù)3道關卡、2種安全機制和2種身份驗證模式的安全機制,SQL Server能夠實現(xiàn)由大到小、由粗到細的不同級別的安全保護措施。
SQL Server是以服務的形式保證數(shù)據(jù)庫的運行,用戶可以在一臺計算機上安裝多個名字不同的服務器實例,每個服務器實例獨立存在,可以擁有各自的數(shù)據(jù)庫及數(shù)據(jù)庫對象。服務器級的安全影響范圍最廣,設計時要慎重。
(1)登錄賬戶
“登錄賬戶”是打開數(shù)據(jù)庫服務器的鑰匙,成功登錄服務器后,可以在“安全性”的“登錄名”項下看到當前服務器中所有登錄賬戶,如圖1所示。
可以在登錄賬戶中創(chuàng)建新的登錄名,新建時會詢問你選擇何種驗證機制,如果是“Windows驗證機制”,必須基于操作系統(tǒng)中的用戶方可建立,如果是“SQL Server驗證機制”,需要用戶輸入登錄密碼。
圖1 登錄賬戶信息
有登錄名后就可以在連接到服務器的“數(shù)據(jù)庫引擎”服務時時選擇“身份驗證”機制,正確時就可以連接到服務器,如圖2所示。
圖2 用登錄名連接到服務器
通過登錄名的屬性面板中的“狀態(tài)”項,可以“啟用”和“禁用”登錄名,禁用那些高權限的登錄名也可以起到保護數(shù)據(jù)庫安全的作用。
(2)服務器角色
服務器角色有9種,每個角色的操作權限不一樣,所有登錄賬戶都必須屬于“public”服務器角色,可以為public角色賦予權限,方便讓所有賬戶具備統(tǒng)一功能,默認情況下“public”角色只可登錄服務器,不具備訪問用戶數(shù)據(jù)庫的權限。服務器各角色及其功能如表1所示。
表1 服務器角色及功能描述
在新建登錄賬戶或配置登錄賬戶屬性時,賦予賬戶服務器角色,簡化用戶的設置,其中“sysadmin”服務器角色的權限最高,若登錄賬戶是該角色成員,即使沒有在數(shù)據(jù)庫中創(chuàng)建“數(shù)據(jù)庫用戶”,因具備最高權限,可執(zhí)行任何操作。
(1)數(shù)據(jù)庫用戶
數(shù)據(jù)庫用戶是登錄名在數(shù)據(jù)庫中的映射,若登錄名不屬于“sysadmin”角色,通常都要在數(shù)據(jù)庫中為登錄名創(chuàng)建對應用戶,否則登錄名不能訪問用戶數(shù)據(jù)庫,數(shù)據(jù)庫用戶在“安全性”中的“用戶”項下,如圖3所示。
在數(shù)據(jù)庫的“用戶”項中可以創(chuàng)建用戶,創(chuàng)建時要選擇用戶所基于的“登錄名”,同時也可以設置用戶的“數(shù)據(jù)庫角色”。
(2)數(shù)據(jù)庫角色
數(shù)據(jù)庫設計者可以新建“數(shù)據(jù)庫角色”,開發(fā)者也為數(shù)據(jù)庫設計了10種固定數(shù)據(jù)庫角色,如圖4所示。
圖3 數(shù)據(jù)庫用戶
圖4 固定數(shù)據(jù)庫角色
固定數(shù)據(jù)庫角色名及說明見表2所示。
表2 固定數(shù)據(jù)庫角色一覽表
“db_owner”角色擁有數(shù)據(jù)庫級的最高權限,賦予用戶角色時要慎重。
用戶創(chuàng)建的角色稱為“用戶自定義數(shù)據(jù)庫角色”,創(chuàng)建角色時要賦予角色相應的權限,實現(xiàn)角色的功能。
(3)權限
權限是數(shù)據(jù)庫安全管理最細致的一項,不同的對象所具備的權限不同,常用的權限如表3所示。
表3 常用的權限
可以將權限授予角色、數(shù)據(jù)庫用戶。使用權限設置用戶或角色的功能可以更好的保護數(shù)據(jù)庫安全,同時要求設計者要具備良好的權限認知能力。
第2節(jié)介紹的登錄名、用戶、權限、角色能夠起到保護數(shù)據(jù)的作用,但仍無法避免數(shù)據(jù)被獲取。SQL Server從2000版本開始提供數(shù)據(jù)加密,在2005版本中又增加了列級加密,2008版本引入了透明數(shù)據(jù)加密(TDE),有了數(shù)據(jù)加密技術,即使得到數(shù)據(jù),也要解密才可以查看到正確信息,為數(shù)據(jù)安全加了一層保護[4]。
SQL Server支持對稱加密(Symmetric Key Encryption)和非對稱加密(Asymmetric Key Encryption)兩種,對稱加密是指加密和解密的密鑰相同,SQL Server提供RC4、RC2、DES和AES等加密算法,非對稱加密是指加密和解密的密鑰不同,如RSA加密算法、數(shù)字證書等。
與1.2節(jié)介紹的3道關卡一樣,數(shù)據(jù)加密在數(shù)據(jù)庫管理系統(tǒng)中也是分層級的,從加密影響范圍的廣窄依次為服務主密鑰(Service Master Key)、數(shù)據(jù)庫主密鑰(Database Master Key)、對稱密鑰或非對稱密鑰或證書,服務主密鑰影響整個的服務器實例,在安裝服務器實例時自動生成。
數(shù)據(jù)庫主密鑰由服務主密鑰進行加密,每個數(shù)據(jù)庫只能有一個數(shù)據(jù)庫主密鑰,可以用于為創(chuàng)建數(shù)據(jù)庫級別的證書或非對稱密鑰提供加密[5],只能通過T-SQL語句創(chuàng)建。
如下T-SQL語句創(chuàng)建密碼為“123456”的數(shù)據(jù)庫主密鑰。
CREATE MASTER KEY ENCRYPTION BY PASSWORD ='123456'
創(chuàng)建成功后,數(shù)據(jù)庫主密鑰由“123456”的密碼和服務主密鑰共同保護。刪除數(shù)據(jù)庫主密鑰的T-SQL語句如下。
當數(shù)據(jù)庫主密鑰創(chuàng)建成功后,我們就可以使用這個密鑰創(chuàng)建對稱密鑰,非對稱密鑰和證書。
(1)創(chuàng)建證書
證書是一個數(shù)據(jù)庫級的安全對象,可以基于數(shù)據(jù)庫主密鑰創(chuàng)建,也可以在無數(shù)據(jù)庫主密鑰的情況下創(chuàng)建證書。
下面語句的作用是創(chuàng)建名為Cer_1的證書,它的私鑰是由密碼“123”來保護,該語句可以在無數(shù)據(jù)庫主密鑰的數(shù)據(jù)庫中創(chuàng)建證書。
CREATE CERTIFICATE Cer_1ENCRYPTION BY PASSWORD=′123′WITH SUBJECT =′Cer1′
WITH SUBJECT項表示證書的“主題”,是指證書的元數(shù)據(jù)中的字段。
如下語句是創(chuàng)建名為Cer_2的證書,該語句創(chuàng)建的證書必須基于數(shù)據(jù)庫主密鑰方可實現(xiàn)。
(2)非對稱密鑰
創(chuàng)建名為Asy_1基于RSA_2048算法的非對稱密鑰,使用密碼“111”保護私鑰,可以在無數(shù)據(jù)庫主密鑰的數(shù)據(jù)庫中實現(xiàn),語句如下。
如下語句是創(chuàng)建名為Asy_2基于RSA_512算法的非對稱密鑰,該語句只能在有數(shù)據(jù)庫主密鑰的數(shù)據(jù)庫中方可實現(xiàn)。
(3)對稱密鑰
對稱密鑰不能直接基于數(shù)據(jù)庫主密鑰創(chuàng)建,可以基于密碼、非對稱密鑰、對稱密鑰、證書等。
創(chuàng)建名為Sym_1基于AES_256算法的對稱密鑰,使用密碼“321”保護私鑰,可以在無數(shù)據(jù)庫主密鑰的數(shù)據(jù)庫中實現(xiàn),語句如下。
創(chuàng)建名為Sym_2的對稱密鑰,使用證書Cer_1對該對稱密鑰進行加密,語句如下。
創(chuàng)建后,可以在數(shù)據(jù)庫的“安全性”選項下查看創(chuàng)建成功的非對稱密鑰、證書和對稱密鑰,并可以執(zhí)行“刪除”等操作,如圖5所示。
圖5 查看非對稱密鑰、證書和對稱密鑰
SQL Server在2005版本引入了列加密的功能,可以利用證書,對稱密鑰和非對稱密鑰對需要保護的列進行加密,根據(jù)加密解密的方式不同,內置了4對函數(shù)用于加密解密[6],如表4所示。
表4 列級加密解密函數(shù)
列級加密和解密時首先需要將列數(shù)據(jù)類型轉換成VARBINARY類型,且需要將加密和解密的密鑰打開,打開Sym_2密鑰的命令如下。
密鑰打開后,利用INSERT或UPDATE操作加密數(shù)據(jù),假定表student中的“密碼”列的數(shù)據(jù)類型為VARBINARY,加密語句如下。
UPDATE student SET 密碼= EncryptByKey(Key_GUID(′abc′),′123′)where 1<>1
INSERT student(密碼)values(EncryptByKey(KEY_GUID(′aa′),′123′))
列被加密后,直接查詢查看不到數(shù)據(jù),必須解密后才可以看到實際內容;也無法直接錄入數(shù)據(jù)到該列。
觸發(fā)器是SQL Server數(shù)據(jù)庫中的一類特殊的數(shù)據(jù)庫對象,當用戶執(zhí)行某項操作時會觸發(fā)某些操作,觸發(fā)器內容用戶可以自己定義。
SQL Server中的觸發(fā)器分為數(shù)據(jù)操縱(DML)觸發(fā)器和數(shù)據(jù)定義(DDL)觸發(fā)器兩類。INSERT、UPDATE、DELETE關鍵字可定義DML觸發(fā)器,CREATE、ALTER、DROP關鍵字可定義DDL觸發(fā)器。
使用觸發(fā)器保護數(shù)據(jù)屬于鞏固性質的,可以屏蔽數(shù)據(jù)庫中的某些操作,讓非法用戶的操作不能被正確執(zhí)行。
DML觸發(fā)器根據(jù)功能的不同,分為AFTER和INSTEAD OF兩種類型[7]。AFTER型先執(zhí)行INSERT、UPDATE、DELETE語句,然后再執(zhí)行觸發(fā)器語句;INSTEAD OF觸發(fā)器也叫做替代觸發(fā)器,如果INSERT、UPDATE、DELETE語句定義了INSTEAD OF觸發(fā)器,當執(zhí)行INSERT、UPDATE、DELETE語句時,真正被執(zhí)行的是觸發(fā)器語句,而非執(zhí)行增、改、刪。這類觸發(fā)器在保護數(shù)據(jù)表方面有一定的作用。
用AFTER型觸發(fā)器保護數(shù)據(jù)的常用方法是在觸發(fā)器語句中定義事務回滾,以阻止語句被真正執(zhí)行;INSTEAD OF型觸發(fā)器可以將表記錄的增加、修改、刪除操作引向觸發(fā)器語句,阻止操作被真正執(zhí)行。由此可見,DML觸發(fā)器保護數(shù)據(jù)限制多、功能單一,只能作為補充。創(chuàng)建觸發(fā)器的命令格式如下。
CREATE TRIGGER觸發(fā)器名稱
ON {表|視圖}{FOR|AFTER|INSTEAD OF}{[INSERT][,][UPDATE][,][DELETE]}
AS
觸發(fā)器語句
FOR與AFTER關鍵字定義的觸發(fā)器執(zhí)行方式相同。下列代碼所創(chuàng)建觸發(fā)器的功能可防止student表中的記錄被刪除。
CREATE TRIGGER tr_student_delete ON student FOR DELETE
AS
ROLLBACK TRANSACTION--事務回滾
DDL觸發(fā)器只有AFTER類型,沒有INSTEAD OF型,創(chuàng)建DDL觸發(fā)器的語句格式如下。
CREATE TRIGGER觸發(fā)器名ON{All Server|DATABASE}{FOR|AFTER}{DDL觸發(fā)語句}
AS
觸發(fā)器語句
說明:ON關鍵字后若是DATABASE,表示數(shù)據(jù)庫級觸發(fā)器,即將觸發(fā)器作用到當前數(shù)據(jù)庫,該數(shù)據(jù)庫執(zhí)行DDL觸發(fā)語句時將觸發(fā)該觸發(fā)器;若為ALL SERVER,表示服務器級觸發(fā)器,即將觸發(fā)器作用到當前服務器上,因此當服務器上任何一個數(shù)據(jù)庫的DDL出發(fā)語句都能激活該觸發(fā)器。常用的DDL觸發(fā)語句見表5所示。
下列觸發(fā)器TR_DDL_1的功能可阻止在當前數(shù)據(jù)庫中刪除數(shù)據(jù)表和修改數(shù)據(jù)表。
CREATE TRIGGER TR_DDL_1ON DATABASE FOR DROP_TABLE,ALTER_TABLE
AS
ROLLBACK TRANSACTION
下列觸發(fā)器TR_DDL_2的功能可阻止在當前服務器實例中創(chuàng)建數(shù)據(jù)表和修改數(shù)據(jù)表。
CREATE TRIGGER TR_DDL_2ON ALL SERVER FOR CREATE_TABLE,ALTER_TABLE
AS
ROLLBACK TRANSACTION
表5 常用的DDL觸發(fā)語句
數(shù)據(jù)庫設計者和使用者要將保護數(shù)據(jù)的安全性放在第一位,在設計和配置數(shù)據(jù)庫時,應采用各種方式合理的保護數(shù)據(jù)庫,既要合理的防止合法用戶的誤操作,更要有效的防止非法用戶的惡意竊取。
[1] 吳溥峰,張玉清.數(shù)據(jù)庫安全綜述[J].計算機工程,2006,32(12):85-88.
[2] 王鳳玲.SQL數(shù)據(jù)庫安全性研究[J].電子技術,2012,39(6):19-20.
[3] 何斌穎,劉榮.Oracel和SQL Server數(shù)據(jù)庫安全基線審查[J].云南大學學報(自然科學版),2013,35(S2):63-68.
[4] 李光師,孟祥茹.Oracle中矢量數(shù)據(jù)安全保護方法[J].計算機工程,2012,38(10):102-104.
[5] 郝文寧,趙恩來,劉玉棟,黃亞,劉軍濤.異構數(shù)據(jù)庫加解密系統(tǒng)的關鍵技術研究與實現(xiàn)[J].計算機應用,2010,30(9):2339-2343.
[6] Erez Shmueli,Ronen Vaisenberg,Ehud Gudes,Yuval Elovici.Implementing a database encryption solution,design and implementation issues[J].Computers &Security,2014,44(3):33-50.
[7] Wai Yin Mok,Charles F.Hickman,Christopher D.Allport.Implementing Business Processes:A Database Trigger Approach[J].IGI Global Journal,2013,3(2):671-687.