1 引言 信息對于取得成功是非常重要的,但是如果信息被破壞或被錯誤利用,就會給成功帶來威脅。oracle提供了廣泛的安全特性以保護用戶的信息免受未經授權的訪問及有意或無意的破壞。這種安全性是在用戶到用戶,權限到權限的基礎上通過授予或撤消權限來提供的,并且是附加于(獨立于)用戶的計算機系統本身已有的安全機制之上。在實現了權限分配的基礎上,我們又面臨著實時跟蹤被使用的系統資源與數據庫資源,監測用戶對數據庫的行為的問題,這就是大型數據庫管理系統所必需的審計功能。在這里,我們將共同探討orale用戶權限分配以及審計的實現思想與方法。 2 用戶管理模式 dbms:database management system,數據庫管理系統,對數據進行集中統一的管理和操縱。現在主要的dbms包括:oracle sql server,sybase adaptive server 11,microsoft sql server 6.x,7.x等,在這些dbms中,都有自己完整的用戶管理模式,一般都以下列方式進行: 登錄用戶:dbo,主要用來提供連接到數據庫服務的; 角色用戶:將登錄用戶劃分為某些組,這些組擁有各種不同的數據庫操作權限,而一個登錄用戶可以扮演不同的角色; dbms提供了這些用戶管理的基本方式,并各自對表、視圖、過程、觸發器等有各自的審計及管理的方法。 在實際的應用中,如果實際情況允許,可以對實際的所有用戶建立一個登錄用戶(帳號),并對所有的帳號進行嚴密的權限管理。但是,如果用戶的數量是不固定的,而且可能有上百個,那管理的復雜程度及難度就可想而知了。 這就是所謂的單用戶-多用戶模式。它是指數據庫的登錄用戶模式,所有應用都以統一的用戶登錄,該用戶擁有所有表、視圖、過程、函數等的所有操作權限,而這些對象都被dbo所創建和擁有,可以將這些用戶稱為應用用戶(存放在某表中);而登錄到數據庫的這個用戶即為模式用戶。實際上,為了防止系統外數據登錄,可增加一個聯接用戶,該用戶只能讀取一張表,該表記錄了模式用戶的登錄參數(具體部分可以加密存放); 這種單-多用戶方式在大型的mis系統中,由于其實現簡單,思路清晰,所以應用是相當多的,其優點是明顯的: (1) 設置簡單,特別是授權,可以比較輕松地實現; (2) 管理簡單,只要維護一個模式用戶就可以了; (3) 對開發人員是透明的,即開發用戶以dbo方式登錄就可以了; 3 設計思想 當前比較可行的方法的要點是: (1) 所有的實體(表、視圖等等)都由一個登錄用戶建立(dbo)、但是該用戶不擁有連接及操作這些實體的權限(insert,delete,update等等); (2) 對所有的實際用戶進行分類,歸納為幾個具體的角色(實際角色); (3) 一種實際角色對應一個登錄用戶,建立帳號系統,進行角色分配、權限設置; (4) 在application中,某用戶連接時,根據所扮演的實際角色,以對應的登錄用戶登錄; (5) 根據對應表中對該用戶的可用模塊(功能),進行適當處理,使用戶只在定制的、允許的范圍內進行功能操作及數據庫操作。 (6)建立審計所需要的表,用于詳細記載要跟蹤的數據庫行為用戶的機器屬性、所擁有的權限與角色、每一次訪問數據庫的起始和截止時間、表級訪問對象、數據操作方式、數據操作對象及具體的動作、操作前后的記錄值等等。 根據以上幾點,在一個具體的應用中,涉及到的開發工作包括: 表設計: (1) 實際角色(組)分析; (2) 建立應用用戶帳戶表,該表記錄了該用戶所屬的組,建立用戶組表; (3) 建立一個通用連接用戶(只能檢索用戶帳戶表),所有的應用用戶初始都以該用戶連接數據庫,然后檢索根據實際登錄的用戶及用戶所屬組,以該組對應的登錄用戶進行連接; (4) 建立模塊(功能)表,建立用戶、用戶組與該表的對應表,即某用戶到底能夠進行什么樣的操作。 權限分配功能設計: (1) 建立模塊(功能)管理器,管理所有可用模塊的相關信息; (2) 建立用戶,用戶組權限管理器,管理某用戶(組)能夠使用的功能。 用戶啟動應用錄時,將按照以下過程進行: (1) 所有用戶都以固定的連接用戶進行初始連接; (2) 用戶輸入自己的代碼及口令,根據帳戶表確認該用戶; (3) 得到該用戶所屬的組(即可以連接到數據庫的登錄用戶名稱)等信息; (4) 重新連接到數據庫,分配角色; (5) 根據角色,進行動態數據分片; (6) 檢索該用戶所屬組及該用戶可用的模塊信息及布置,調整菜單或界面; (7) 打開主窗口,結束。 審計功能設計: 一個成熟的審計系統,需要解決很多問題,比如確定審計區域、如何記錄審計跟蹤文件、收集什么樣的審計信息、確定多少系統資源和人力資源專門用于審計功能、性能降低多少是最大可承受限度、誰負責監視審計結果、數據庫被破壞后應采取什么行為、如何執行數據庫毀壞報告、使用什么方法來修復毀壞了的數據、多長時間重新審核一次審計方法等等。我們在這里只是簡單談談如何確定審計區域以及收集和管理審計信息。 根據審計區域來劃分,審計主要分為語句審計、特權審計、模式對象審計和資源審計。 語句審計是指監視一個或者多個特定用戶或者所有用戶提交的sql語句;特權審計是指監視一個或者多個特定用戶或者所有用戶使用的系統特權;模式對象審計是指監視一個模式里在一個或者多個對象上發生的行為;資源審計是指監視分配給每個用戶的資源數量。我們這里談的主要是模式對象審計。 (1) 模式對象審計的整體思想 實現審計功能,可以選用oracle數據庫中sys模式下的三個審計表做審計支持,分別是aud$(記錄審計信息)、audit$()和audit_actions(存儲審計跟蹤行為類型代碼的描述),雖然這種oracle審計可以捕獲誰做了更改和什么時候做了更改,但捕獲數據更改是非常困難的和費時的。所以我們采用的是人工創建審計信息表,并且通過建立觸發器的方式記錄數據更改情況。 (2) 根據需要,建立審計模塊(功能)管理器(審計信息表),管理所有可用審計模塊的相關信息,包括用戶id和用戶名、會話標識符、被訪問的模式對象名(表、存儲過程、索引、觸發器等)、被執行或者企圖執行的操作、操作的完全代碼、時間和日期戳以及使用的系統特權等等。 審計信息表的結構是: "修改表名" (20),"動作種類" (10),"舊身份號" (18),"舊姓名" (40), "新身份號"(18),"新姓名"(40),"機器名"(20),"用戶"(20),"客戶信息" (50),"時間"date,"修改字段名1"(20),"字段名舊值1"(50),"字段名新值1"(50),"修改字段名2" (20),"字段名舊值2" (50), "字段名新值2" (50),"會話號"number(*),"序號" number(*)。 根據實際需要,可以調整賡續字段的數量。 (3) 由具有dba權限的數據庫管理員使用和維護審計程序,并負責維護審計信息及定期歸檔,以及在數據庫遇到災難時的數據庫恢復。 4 具體實現中的幾個難點 (1) 由登錄用戶創建角色用戶 圖1顯示的是由登錄用戶gbase創建角色用戶gbsj的界面,在這里還可以控制gbsj用戶對所有數據庫表的讀寫權限,同時可以詢問是否將表結構及數據復制到當前用戶。
(2) 數據分片技術 首先要說明的是什么是數據分片。在oracle的用戶權限分配中,只提供對表、函數、同義詞、視圖、包等的insert,update,select,delete,execute等操作,并未提供字段級的權限設置(實際上,對大型數據庫進行字段級的權限設置雖然帶來了安全性方面的好處,但對于性能的存在一定的影響),因此,對于大型mis系統,進行數據的分片是在所難免的。 一般地,一個典型的mis數據庫平臺設計是這樣的,如圖2。
圖2 對用戶權限的分配是通過對oracle臨時系統表來實現的: ① 在需要分片的表(customer)中建立相關字段,如sgrant_num number(20)及所屬部門 sunit_id varchar(10), ② 對該表創建動態視圖 customer_pv select * from customer a where cd_warehouse.sunit_id is null or exists (select * from customer b where a.sunit_id = b.sunit_id and ( b.sgrant_num >= to_number(substr(userenv('client_info'), 1, 10)) and ( b.sgrant_num <= to_number(substr(userenv('client_info'),11,10)))) ③ 在用戶登錄系統時修改用戶環境 client_info 中的分片號; ④ 這樣,對設計者,不存在分片問題,對最終用戶,可定義該用戶的組織分片號來約束該用戶能夠存取的數據。 原理圖如圖3。
圖3 這樣進行數據分片的優點是: ① 由服務器自動完成,對設計無任何影響; ② 速度快,對巨量數據無明顯影響; 缺點是: ① 只能根據組織(或其他)進行縱向分片,不夠靈活; ② 技術實現復雜,主表的更改將直接影響視圖(需要重新生成); ③ 一旦組織機構變化,則分片需要重新設置。 (3)審計功能實現的過程中無法捕獲行為用戶的客戶信息和行為動作信息以及動作前后的數據 ①捕獲客戶信息的方法: 經過仔細查閱oracle數據庫文檔,終于發現了可以通過調用oracle本身的userenv函數實現此項功能。捕獲機器名的方法是userenv('terminal'),捕獲登錄計算機的用戶名的方法是userenv('client_info'),捕獲登錄數據庫的用戶名的方法是直接讀出oracle的user值。 ②捕獲行為動作的方法: 捕獲當前會話標識符的方法是userenv('sessionid')。 ③捕獲行為動作前后的數據的方法: 在數據庫中建觸發器,針對行為動作的表,實時地將動作前后的數據插入審計表中。 審計的控制界面見圖4:
圖4 在這個控制界面下,我們能夠實現按機器名、用戶和會話監視和管理審計信息,瀏覽當前活動會話的會話信息,并可通過條件過濾出審計信息,同時完成審計信息歸檔和打印等功能,而且通過審計信息切換功能,可以瀏覽已歸檔審計信息。 目前,這個模式審計功能已經實現,并已經應用在某大型系統中,取得了令人滿意的效果。 5 結束語 oracle用戶權限分配與維護以及審計都是很復雜的課題,一段時間內,無論對數據庫管理員還是程序設計人員來說,都將是一個很大的挑戰。解決好這個問題,是保證大型數據庫系統的數據安全性、準確性、方便性、靈活性以及可移植性將為企業信息化建設的基礎。由于筆者水平及精力有限,尚不能在此領域有更高的建樹,只希望藉此文與大家共同研討。 |
新聞熱點
疑難解答