王鋒 張新建
中國電子科技集團公司第二十八研究所 江蘇 210007
數據庫系統作為各類信息系統中的數據支撐軟件發揮著越來越重要的作用。隨著大型信息系統建設中數據共享程度的不斷提高,數據訪問的安全成為一個比較突出的問題擺在我們的面前。雖然各種數據庫管理系統本身提供了一整套的信息安全管理策略,但在某些保密要求高的特殊信息系統建設環境下,僅僅單純利用這些安全管理策略是不夠的;另一方面,作為特殊的信息系統,如何防止應用以及系統管理人員(包括數據庫管理人員)對數據庫中信息的隨意訪問也是至關重要的。本文基于虛擬用戶管理的概念介紹了一種有效解決以上問題的數據庫系統口令安全解決方案的設計。
創建和實施安全的過程有助于保護工程中最重要的財富---數據。數據安全性是信息系統建設中數據庫使用范疇要考慮的重要因素。數據安全的含義包括信息不應該透露給未經授權的用戶、只允許授權用戶可以修改數據、用戶不允許存取不必要的數據。這三個方面在建立數據庫安全系統時是最基本的考慮因素。
(1) 數據安全包括在對象級控制數據庫訪問和使用的機制;
(2) 數據安全策略主要由你想要為你的數據庫數據建立的安全等級決定;
(3) 數據的安全性考慮應該基于數據的重要性;
(4) 數據安全的一些實現方法包括系統對象特權以及角色管理;
(5) 細粒度存取控制。細粒度存取控制最簡單的情況是在SQL語句中加了一個WHERE條件,用它來限制用戶對表和視圖里面的行數據的存取;
(6) 應用程序上下文控制。應用程序上下文是一個安全數據緩沖,用來存儲存取控制決定的信息。
用戶安全策略指一般用戶、最終用戶、管理員、應用程序開發員和應用程序管理員的安全策略。
(1) 一般用戶的安全性。如果用戶是通過數據庫進行用戶身份驗證,那么建議使用口令加密的方式與數據庫進行連接。為了更好地保護口令的機密性,可以為客戶/服務器和服務器/服務器連接配置加密口令;
(2) 最終用戶的安全性。可以使用“角色”對最終用戶進行特權管理;
(3) 數據庫管理員安全性策略。保護作為 sys和 system用戶的連接;保護管理員與數據庫的連接;使用角色對管理員特權進行管理;
(4) 應用程序開發者的安全性策略。安全管理員可以授權應用程序開發者建立所需要的對象,或只將建立對象的特權授予某個數據庫管理員,讓他負責建立對象。這要依賴于應用程序所遵循的模式是自由開發還是受控開發;管理員通過建立角色,給角色授權來管理典型應用程序開發者所需要的特權,但同時應注意到對象權限很少授予應用程序開發者。
數據庫安全系統依賴于口令,要求口令任何時候都保持秘密。但口令經常遭到偷竊、偽造和誤用。一般采用的安全策略是概要文件控制。概要文件是一個規定了資源限度的數據庫實體,它可以控制數據庫和系統資源的使用。
數據庫審計與操作系統審計的功能一樣。審計跟蹤記錄操作、登錄、非法請求并分析它們。同時它也檢測錯誤的違反和補償。數據庫具有審計發生在其內部的所有操作的能力。它使得數據庫能夠記錄何時發生的操作以及是誰在使用該操作等信息。利用這些信息,可以跟蹤是誰在破壞數據庫,是誰的誤操作以及是誰對數據庫進行操作。數據庫具有審計發生在其內部的所有操作---包括注冊企圖、對象訪問和數據庫操作的能力,審計的結果存儲在數據庫的審計表中。
在上面的介紹中不難發現商用數據庫管理系統一整套的安全管理策略中,口令管理策略實際上處于核心地位,因為如果口令管理不好的話,任何人可以以任何身份訪問系統的數據庫,從而造成信息的泄露;另一方面,從數據庫系統管理本身而言,無法防止應用開發人員訪問不必要的數據。
縱觀現有主流商用數據庫管理系統本身的口令管理方式,基本上是在數據庫中創建一個schema/user時指定對應的口令,這種口令將會以加密的形式存儲在數據庫的數據字典目錄中,以后如果需要修改,只能通過底層SQL語句進行。這種口令存儲與管理機制可以理解為“死口令”或者“靜態口令”。在應用程序訪問數據時,需要預先知道對應模式/用戶的口令,如果沒有動態獲取口令的方法,只能在程序中人為寫死,如果以后數據庫口令發生變化,應用程序則需要重新編譯,給軟件維護帶來一定的不便,更無法達到具有某些特殊應用的系統對數據庫信息安全要求的高度,因為口令有可能會被創建 schema/user的系統管理人員無意或者有意的泄露。基于此,在數據庫原有口令管理策略的基礎上引入虛擬用戶管理的概念來實現更高級別的口令安全和應用訪問的靈活性。
虛擬用戶設計的初衷是為了隱蔽數據庫用戶,使應用層數據庫程序訪問數據庫時使用的用戶(姑且稱為“偽用戶或者應用層用戶”)與數據庫用戶分離,通過創建映射表建立數據庫真實用戶與虛擬用戶之間的對應關系。在使用數據庫應用訪問數據庫時,只需給出應用層用戶,然后由虛擬用戶代理軟件根據提供的應用層用戶去“動態獲取”由守護進程虛擬用戶服務管理的滯留在內存中的動態的數據庫用戶與口令以及相應的連接字符串信息。
應用層用戶與數據庫用戶(代理用戶)的映射關系及其管理由虛擬用戶管理軟件實現。應用層用戶與代理用戶映射關系的修改通過編制特定的軟件調用虛擬用戶管理軟件的API接口實現,應用層用戶對代理用戶的用戶名和口令一無所知,在生成新的應用層用戶的同時在數據庫中生成一代理用戶并建立兩者之間的映射關系,通過虛擬用戶管理軟件API接口將映射關系寫入映射表。代理用戶的用戶名和口令由虛擬用戶軟件通過特定的算法隨機生成并通過特定加密算法進行加密,其用戶名和口令均長達 30位,由于應用層用戶并不直接接觸數據庫,也不知道對應的代理用戶的用戶名和口令,因此杜絕了應用層用戶直接登錄數據庫的可能性,同時屏蔽了數據庫的真實用戶名和口令。
基于虛擬用戶管理的用見圖1。

圖1 基于虛擬用戶管理的應用示例
如圖1所示,應用程序在訪問數據庫之前,通過虛擬用戶服務程序獲取存儲在映射表中的代理用戶及其相應的連接信息,在這個過程中,連接信息的細節對應用層是透明的。
虛擬用戶管理軟件分為三部分:一部分為虛擬用戶管理服務,其以守護進程的方式駐留在數據庫服務器上運行,主要任務是接收來自于虛擬用戶管理服務代理接口的請求,對映射表進行操作,并將執行結果返回虛擬用戶管理服務代理接口;一部分為虛擬用戶管理代理API,由應用開發人員調用,主要任務是接收來自客戶端的請求并轉發至虛擬用戶管理服務,同時將結果返回至客戶端;另一部分是虛擬用戶初始化模塊,主要完成虛擬用戶的初始化創建,構建映射表,再生成映射關系以及口令管理。虛擬用戶管理代理接口與虛擬用戶管理服務之間通過SOCKET進行通信。
虛擬用戶管理軟件的組成見圖2。

圖2 虛擬用戶管理軟件的組成
2.2.1 虛擬用戶管理服務
由于映射表中存放有虛擬用戶的用戶名和口令,因此,其密級比較高,對于它的管理也非常嚴格。映射表應集中存放在數據庫服務器上,在操作系統級對該文件的存取權限進行控制,保證只有超級用戶對該文件具有讀寫權限。映射表采用加密方式存放。映射表中存放的基本信息應包含應用層用戶、代理用戶(數據庫用戶)、口令、網絡服務名稱以及其他的一些連接信息。虛擬用戶管理服務的處理流程見圖3。

圖3 虛擬用戶管理服務的處理流程
內部接口及描述(如表1):
調用方:虛擬用戶管理服務
接口格式(函數接口):

表1 虛擬用戶管理服務的內部處理接口
2.2.2 虛擬用戶管理代理API
虛擬用戶管理代理API提供一套訪問虛擬用戶服務的函數接口,主要由應用程序在每次連接數據庫之前調用以便獲取必要的連接信息。管理代理API被調用后試圖通過socket與數據庫服務器上駐留的虛擬用戶管理服務建立連接,并將相關應用層用戶名傳給虛擬用戶管理服務進程,虛擬用戶服務進程根據獲得的應用層用戶名搜尋映射表找出對應的映射關系條目,然后將該條目下對應的數據庫用戶的真實用戶名、口令、網絡服務名以及其他的一些連接信息返回給虛擬用戶管理代理API,進而返回給應用調用者。
虛擬用戶管理代理API的處理流程見圖4。

圖4 用戶管理代理API處理流程
接口及描述:
在虛擬用戶管理代理API提供的接口中,最核心的就是獲取連接信息的接口。
int GetDBConnInfo(char *keyvalue,char *username,char*agentuser,char *password,char *netservice )。
該接口在windows和unix環境上依賴不同的庫都可以運行。為了進一步加強該接口的調用安全,在參數中增加注冊碼驗證參數,確保調用此接口的應用已獲得安全授權。
2.2.3 虛擬用戶初始化
虛擬用戶初始化模塊主要完成虛擬用戶與真實用戶映射關系的生成及再生成。該模塊的運行結果將會生成虛擬用戶管理服務運行時所需讀取的映射表文件。另外,該模塊也可以定期重新生成映射關系從而定期更改數據庫用戶的口令。
虛擬用戶初始化的處理流程見圖5。

圖5 虛擬用戶初始化
以上詳細介紹了基于虛擬用戶服務以及虛擬用戶代理API的數據庫連接信息獲取機制,這種方式使數據庫用戶的口令完全由虛擬用戶服務管理與維護,對應用開發人員透明。應用開發人員在開發數據庫應用時,只需調用提供的虛擬用戶代理API來獲取連接信息即可。口令被映射關系儲存與管理,使用人員無法獲取口令,無法使用SQL*PLUS等數據庫訪問軟件從底層訪問數據庫。映射關系及口令可由系統維護人員定期運行映射表初始化軟件更新,在此過程中,由于系統維護人員使用的是模塊化的維護工具,所以他們也無法獲取映射關系與口令信息。保證獲取口令(以及其它必要的連接信息)的惟一途徑是基于虛擬用戶管理服務的虛擬用戶代理API。
基于虛擬用戶思想的數據庫用戶/口令管理機制可以很好的實現數據庫底層用戶與應用層用戶的分離,實現了對數據庫口令進行動態管理,為很多數據庫應用在連庫環節提供了更高的安全性和更好的靈活性,同時也能杜絕一般用戶試圖通過SQL*PLUS或者Toad等第三方商用軟件隨意訪問數據庫的可能性,為大型信息系統建設中數據庫的安全訪問提供了比較可靠的解決方案。
[1]Thomas Kyte著,袁勤勇,張玉魁等譯.Oracle專家高級編程[M].北京:清華大學出版社.2002.
[2]Thomas Kyte著,鐘鳴,郝玉潔等譯.Oracle高效設計[M].北京:機械工業出版社.2006.
[3]Doug Stuns,Matthew Weishan 著,趙軍鎖,孫文明,鄧波等譯.Oracle9i DBA基礎Ⅱ學習指南.北京:電子工業出版社.2002.
[4]談竹奎,況志軍著.Oracle9i數據庫管理員高級技術指南.北京:中國鐵道出版社.2003.