朱清華
(中國國際石油化工聯合有限責任公司 北京市 100728)
訪問控制是系統保密性、完整性、可用性和合法使用性的重要基礎,是網絡安全防范和資源保護的關鍵策略之一,通常用于系統管理員控制用戶對服務器、目錄、文件等網絡資源的訪問。如果把是否允許連接數據庫也作為一種資源,那么本文要介紹的是一種如何嚴格控制訪問這種資源的手段。
目前,Oracle數據庫依然是市場份額最大,流行度最高的關系型數據庫管理系統。并且,當前網絡安全形勢不容樂觀,如技術人員刪庫跑路、內部人員泄露數據、外部人員竊取數據等安全事件時有發生。一旦發生此類事件,從小的方面來說會影響企業形象,從大的方面來說則關系企業存亡。然而,嚴格控制允許連接數據庫的終端,則能較大降低發生此類事件的風險。因此,討論訪問控制技術具有現實意義。
在數據庫訪問控制方面,Oracle數據庫管理系統可以通過在sqlnet.ora文件中配置IP地址列表從而只允許列表中的IP連接數據庫,此方法是依靠Oracle數據庫監聽程序判斷TCP連接的源IP,如源IP在允許連接之列,則允許連接,否則斷開連接。此方法配置簡單,無需程序開發,但只有IP地址一個因素,校驗因素太少,且IP地址有被冒用的風險。那如何提高校驗因素質量,且校驗因素泄露,也不會造成冒用風險,從而保證只有已授權的終端能連接數據庫?這就是本文要研究和實踐的內容。
本文所介紹的方法是,構建一個獨立于應用程序的驗證程序,用于驗證應用程序所在計算機的軟硬件信息。該驗證程序運行在應用程序所在的計算機(客戶端計算機),用于實時獲取客戶端計算機的軟硬件信息,并與數據庫服務器交互,將客戶端計算機軟硬件信息提交至數據庫服務器以供驗證,驗證通過則允許數據庫連接,否則斷開數據庫連接。數據庫服務器依據什么數據完成驗證?那么就需要注冊程序,將允許訪問數據庫的軟硬件信息注冊到數據庫表中,為數據庫驗證提供數據基礎。進一步,當已注冊的軟硬件信息不再被允許連接數據庫時,需要刪除注冊信息,那么就需要解注冊程序。本文所介紹的方法的具體實現采用Pro*C編寫驗證程序和注冊、解注冊程序,利用after logon on database觸發器完成驗證邏輯,驗證程序與觸發器之間通過DBMS_PIPE交互信息。
(1)注冊程序功能分為兩部分:一是注冊計算機,授權計算機連接數據庫,本文代碼登記客戶端計算機軟硬件信息以唯一標識計算機;二是授權應用程序及允許其使用的數據庫用戶,本文代碼登記了應用程序的路徑及大小、以及允許其使用的數據庫用戶。用于存儲已注冊計算機和已授權應用程序及數據庫用戶的表結構分別如下:


(2)解注冊程序與注冊程序的功能相反,分為兩部分功能:一是撤銷已授權的應用程序及允許其使用的數據庫用戶;二是撤銷已注冊的計算機,將同時撤銷該計算機上已授權的應用程序及相應的數據庫用戶。
(3)驗證程序的功能是與after logon on database觸發器通信,按照觸發器的驗證邏輯實時獲取客戶端計算機的軟硬件信息并提交至服務器,協助服務器完成驗證。
(1)因注冊程序需向數據庫表中插入數據,數據庫管理員應授權注冊程序使用的數據庫用戶插入、查詢以上數據庫表的權限。注冊程序具有授權計算機和應用程序訪問數據庫的權限,因此必須為注冊程序設置密碼,只有密碼通過驗證才能繼續注冊操作。重要代碼實現和解釋如下,代碼均為Pro*C代碼:

接下來,獲取客戶端計算機軟硬件信息。以下獲取磁盤描述的代碼中,_popen()函數創建一個管道并執行一條系統命令,用法請參考微軟官方文檔。wmic DISKDRIVE get caption | find /i /v "caption"獲取磁盤描述信息,wmic DISKDRIVE get size | find /i /v "size"獲取磁盤容量,wmic cpu get caption | find /i /v "caption"獲取CPU描述信息,wmic cpu get ProcessorId | find /i /v "ProcessorId"獲取CPU ID 信息,wmic bios get SerialNumber | find /i /v "SerialNumber"獲取bios序列號信息,wmic os get InstallDate | find /i /v "InstallDate"獲取OS安裝時間信息,wmic nicconfig get IPAddress, MACAddress, IPEnabled | find /i “True”獲取IP、MAC地址等信息。除本文使用的命令外,也可以使用其他命令獲取軟硬件信息。

接下來,連接數據庫,注冊計算機。代碼首先獲取客戶端計算機軟硬信息的MD5值,其中sys.md5()是數據庫服務器上已創建好的,用于計算字符串MD5值的函數。

接下來,授權應用程序及允許其使用的數據庫用戶。本文采用類似Oracle授權的命令行格式,如:grant execute on C:AppFolderAppExecutable.exe to username,其中C:AppFolderAppExecutable.exe是應用程序路徑,username是數據庫用戶。代碼從正確的格式中抽取應用程序路徑,然后打開文件并獲取大小;緊接著,獲取應用程序路徑、數據庫用戶名的MD5值(此處不包含文件大小),插入相應的表進行授權。

(2)解注冊程序與注冊程序的功能相反,其邏輯是:通過命令行獲取需撤銷授權的應用程序及數據庫用戶,從數據庫表中刪除信息以撤銷授權。如需解除已注冊客戶端計算機,則獲取客戶端計算機軟硬件信息后,從數據庫表中刪除已注冊計算機及關聯的應用程序和數據庫用戶。代碼不在此贅述。
(3)驗證程序與after logon on database觸發器配合驗證應用程序(下稱待驗證程序)訪問數據庫的步驟如下,按順序大致包括:驗證程序連接數據庫,待驗證程序試圖連接數據庫,觸發器發起客戶端計算機驗證,驗證程序收集客戶端計算機軟硬件信息并反饋,觸發器驗證并反饋驗證結果,觸發器發起應用程序驗證,驗證程序收集應用程序信息并反饋,觸發器驗證并反饋驗證結果。觸發器在驗證過程中未拋出任何異常,則驗證通過。
Step 1: 驗證程序連接到數據庫,為驗證做好準備。
Step 2: 待驗證程序試圖連接數據庫,但必須通過觸發器的驗證邏輯才能真正連接到數據庫,否則觸發器將結束待驗證程序的連接。
Step 3:觸發器利用待驗證程序所在計算機的IP、OS用戶名、計算機名,并結合驗證程序名稱及其連接數據庫的用戶,在所有數據庫會話中,確定待驗證程序所在計算機上的驗證程序的會話,以便與相應的驗證程序通信。可以明確的是:驗證程序和待驗證程序運行在同一臺客戶端計算機上,兩者具有相同的IP、OS用戶名、計算機名。另外,驗證程序具有特定的名稱和使用特定的數據庫用戶,比如authenticate.exe和UserToAuth(本文使用此名稱和用戶名)。這樣,通過以上五項信息就可以唯一確定待驗證程序所對應的驗證程序。此外,由于在v$session中默認不記錄會話的源IP,為便于確定驗證程序的數據庫會話,需要將每個會話的IP地址記錄到client_info字段。

Step 4:觸發器生成兩個管道名稱用于傳遞消息,一個管道用于觸發器向驗證程序發送消息,一個管道用于驗證程序向觸發器回復消息,管道名稱以字母M開頭。為保證正確傳遞消息,管道名稱需保持唯一性。觸發器生成驗證程序回復消息的管道名稱并發送給驗證程序,發起對客戶端計算機的驗證。

Step 5: 觸發器將回復消息管道的名稱發送給驗證程序。

Step 6: 驗證程序按照同樣的規則得到觸發器發送消息的管道名稱,并從中獲取回復消息的管道名稱。


Step 7: 驗證程序按照與注冊程序一致的邏輯獲取客戶端計算機軟硬件信息并通過回復管道發送給觸發器。

Step 8: 觸發器從回復管道中獲取驗證程序發送的客戶端計算機軟硬件信息并驗證,如通過則向驗證程序發送驗證通過的消息,否則拋出異常結束待驗證程序的會話。

Step 9: 驗證程序從發送管道中獲取觸發器發送的驗證結果。

Step 10: 客戶端計算機軟硬件信息通過驗證后,觸發器發起對應用程序及數據庫用戶的驗證。為清晰起見,本文采用兩個新的管道傳遞消息。生成兩個管道名稱用于傳遞消息,管道名稱以字母F開頭。


Step 11:觸發器將待驗證程序在客戶端計算機的進程號、回復管道的名稱發送給驗證程序。

Step 12: 驗證程序按照同樣的規則得到觸發器發送消息的管道名稱,并從中獲取待驗證程序進程號、回復消息的管道名稱。

Step 13: 驗證程序根據待驗證程序在客戶端計算機上的進程號獲取待驗證程序的完整路徑,進而獲取文件大小。

Step 14: 驗證程序獲取到待驗證程序的完整路徑及大小后,將信息通過回復管道發送給觸發器。

Step 15: 觸發器從回復管道中獲取驗證程序發送的待驗證程序的文件信息并驗證,如通過則向驗證程序發送驗證通過的消息(此時客戶端計算機和應用程序及數據庫用戶均通過驗證),否則拋出異常結束待驗證程序的會話。


Step 16: 驗證程序從發送管道中獲取觸發器發送的驗證結果。

本文針對Oracle數據庫管理系統,介紹了一種基于軟硬件特征的訪問控制方法及其實現。本實現包含:注冊程序用于注冊客戶端計算機、授權應用程序及允許其使用的數據庫用戶;解注冊程序用于撤銷已注冊的計算機、撤銷已授權的應用程序及允許其使用的數據庫用戶;驗證程序用于實時獲取計算機軟硬件信息及待驗證程序文件信息,配合數據庫觸發器完成驗證;數據庫觸發器利用驗證程序獲取的信息驗證待驗證程序。本實現能確保:只允許已注冊計算機上的已授權應用程序使用已授權數據庫用戶連接數據庫。本實現所驗證的計算機軟硬件信息包括:磁盤描述及容量、CPU描述及ID、BIOS序列號、計算機名稱、OS安裝時間、IP地址、MAC地址、應用程序的路徑及大小和允許其使用的數據用戶等信息。本訪問控制方法及其實現極大的提高了對數據庫訪問的控制,進而極大的保障了數據訪問安全。