利用角色增強應用系統安全性
2024-07-21 02:38:17
供稿:網友
數據安全性是指保護數據以防止非法的使用,避免造成數據有意或無意的丟失、泄露或破壞。由于數據庫系統中集中存放有大量的數據,這些數據又為眾多用戶所共享,所以安全約束是一個極為突出的問題。
----Oracle數據庫系統在實現數據庫安全性治理方面采取的基本措施有:
通過驗證用戶名稱和口令,防止非ORACLE用戶注冊到ORACLE數據庫,對數據庫進行非法存取操作。
授予用戶一定的權限,例如CONNECT,RESOURCE等,限制用戶操縱數據庫的權力。
授予用戶對數據庫實體(如表、表空間、過程等)的存取執行權限,阻止用戶訪問非授權數據。
提供數據庫實體存取審計機制,使數據庫治理員可以監視數據庫中數據的存取情況和系統資源的使用情況。
采用視圖機制,限制存取基表的行和列集合。
----在實際應用中,許多系統往往采用假用戶(即非數據庫用戶)身份來治理,而真實用戶的身份和登錄口令就隱藏在應用系統中,或經過各種壓縮加密等處理的配置文件中。但這樣往往留下隱患,只要從分析應用程序入手,最終會分析出系統使用的數據庫用戶和口令,那么其安全性也就消失了。另一方面,系統代碼是程序員寫出來的,假如程序員有破壞意圖,這種模式沒有一絲的安全,因為他通過自己把握的代碼不經分析就輕而易舉的獲得登錄用的數據庫用戶和口令。
----而采用真實數據庫用戶,存在著權限分配上的難度,非凡是用戶數和應用表數都很多時,這時必然要使用角色來治理應用權限的分配。當然不能直接將權限或角色直接分配給用戶,否則用戶可以不同過應用系統,而采用SQL*PLUS等前端工具進入系統,進行一些沒有經過應用系統檢查的操作,產生的結果可能不符合應用邏輯。
----我們在實踐中發現,可以采用另一種方式利用角色功能,來防止上面出現的安全“漏洞”。在這種方式下,用戶采用自己的標識和口令注冊,但在未得到授權的角色前,是沒有操縱數據庫的任何權限。而授權用戶使用的角色是埋在應用程序中的,只有應用程序才知道角色的名稱和口令,從而激活角色,使用戶擁有相應的權限。在應用系統之外,用戶可以連接到ORACLE,但沒有激活相應的角色,他是不能做任何事情的,而開發人員不知道用戶的標識和口令,他沒有辦法登錄到ORACLE,即使他能夠推算出角色的標識和口令。
----下面根據一個例子給出具體的實現過程:
----我們假設用戶xiaoli在工作中能夠對工資表account.paytable(account是表paytable的擁有者)有查詢和更新的權限,而這些權限我們不直接授予xiaoli,而是構造一個角色(比如考勤員checkerrole),這個角色恰好適合于xiaoli,再將角色授予xiaoli,但角色在激活時需要口令,該口令不對xiaoli公開。每個用戶需要一個缺省的角色,是用戶連接到ORACLE時的缺省角色。這個角色只有CONNECT權限,我們假為defaultrole。
----下面給出具體的操作SQL:
(1)設定各種角色,及其權限
CREATE ROLE checkerrole IDENTIFIEDBYxm361001;
CREATE ROLE defaultrole IDENTIFIEDBYdefaultrole;
GRANTSELECT,UPDATEONaccount.paytableTOcheckerrole;
GRANTCONNECTTOdefaultrole;
(2)創建用戶
CREATEUSERxiaoliIDENTIFIEDBYxiaoli;
(3)授權
GRANTcheckerroleTOxiaoli;
GRANTdefaultroleTOxiaoli;
(4)設定用戶缺省的角色
ALTERUSERxiaoliDEFAULTROLEdefaultrole;
(5)注冊過程
CONNECTxiaoli/xiaoli@oracle
此時用戶只有其缺省角色的權限。
(6)激活角色
SETROLEcheckerroleIDENTIFIEDBYxm361001;
----操作成功后,xiaoli擁有checkerrole的權限。
----這里的角色和口令是固定的,在應用系統中可以由應用治理人員自行設置則更為方便安全。
----上面給出的是在SQL*PLUS下的操作過程,在實際中還是要與應用系統聯系在一起。我們不討論用戶和角色的創建怎樣在應用開發語言中的實現過程,在這里給出用戶登錄時的PowerBuilder代碼,理解了這個例子,前者的實現也不難。
Transactiongtr_Oracle7
gtr_Oracle7=createTransaction
gtr_Oracle7.DBMS="O73"
gtr_Oracle7.database=""
gtr_Oracle7.UserID=ls_UserID
//通過對話框取得的用戶標識
gtr_Oracle7.DBPass=ls_Passwd
//通過對話框取得的用戶口令
gtr_Oracle7.LogID=ls_UserID
gtr_Oracle7.LogPass=ls_Passwd
gtr_Oracle7.ServerName="@oracle"
//在SQL*NET中創建的別名
gtr_Oracle7.DBParm=""
ConnectUsinggtr_Oracle7;
ifgtr_Orale7.sqlcode=-1then
MessageBox("錯誤","沒有注冊到數據庫系統!")
return-1
endif
//ls_Role和ls_RolePasswd為從配置文件中
或通過其它途徑獲得的用戶的角色名和口令
ExecuteImmediate"SETROLE"+ls_Role+
"IDENTIFIEDBY"+ls_RolePasswd
Usinggtr_Oracle7;
Ifgtr_Oracle7.sqlcode<>0then
MessageBox("錯誤","沒有激活相應的數據庫系統角色!")
DisconnectUsinggtr_Oracle7;
return-1
Endif
Return1//成功注冊并激活角色!