場景舉例
企業IT管理員一般都能為系統定義角色,給使用者分配角色。這就是最常見的基于角色訪問控製。場景舉例:
1,給張三賦予“人力資源經理”角色,“人力資源經理”具有“查詢員工”、“增加員工”、“修改員工”和“移除員工”許可權。此時張三能夠進入系統,則可以進行這些操作;
2,去掉李四的“人力資源經理”角色,此時李四就不能夠進行系統進行這些操作了。
以上舉例,局限于功能訪問許可權。還有一些更加豐富、更加細膩的許可權管理。比如:
1,因為張三是北京分公司的“人力資源經理”,所以他能夠也隻能夠管理北京分公司員工和北京分公司下屬的子公司(海淀子公司、朝陽子公司、西城子公司、東城子公司等)的員工;

2,因為王五是海淀子公司的“人力資源經理”,所以他能夠也隻能夠管理海淀子公司的員工;
3,普通審查員審查財務資料的許可權是:在零售行業審核最高限額是¥50萬,在鋼鐵行業最高限額是¥1000萬;高級審查員不受該限額限製;
4,ATM取款每次取款額不能超過¥5000元,每天取款總額不能超過¥20000元。
這些許可權管理和資料(可以統稱為資源)直接相關,又稱為資料級許可權管理、細粒度許可權管理或者內容許可權管理。
具體分類
從控製力度來看,可以將許可權管理分為兩大類:
1,功能級許可權管理;
2,資料級許可權管理。
從控製方向來看,也可以將許可權管理分為兩大類:
1,從系統獲取資料,比如查詢訂單、查詢客戶資料;
2,向系統提交資料,比如移除訂單、修改客戶資料。
基本概念
使用者身份識別,根本就不屬于許可權管理範疇。使用者身份識別,是要解決這樣的問題:使用者告訴系統“我是誰”,系統就問使用者憑什麽證明你就是“誰”呢?對于採用使用者名稱、密碼驗證的系統,那麽就是出示密碼。當使用者名稱和密碼匹配,則證明當前使用者是誰;對于採用指紋等系統,則出示指紋;對于硬體Key等刷卡系統,則需要刷卡。
密碼加密,是隸屬使用者身份識別領域,不屬于許可權管理範疇。
系統管理,一般是系統的一個模組。而且該模組一般還含有許可權管理子模組。因此,很多人誤認為許可權管理系統隻是系統的一個小小的子模組。系統管理裏面的許可權管理模組,隻是一個操作介面,讓企業IT管理員能夠設定角色等安全策略。系統背後還有很多許可權驗證邏輯,這些都並不屬于該模組。整體來說,該模組相當于給許可權管理模組提供了一些資料,比如:張三是人力資源經理等。
更多混淆概念,請參考:《對許可權管理認識的一些誤區》。
技術實現
按照許可權管理的力度,逐步介紹許可權管理實現技術。
功能許可權
功能許可權管理技術,一般就使用基于角色訪問控製技術RBAC(Role Based Access Control)。該技術被廣泛運用于各個系統,非常容易掌握。該技術模型如下圖示:RBAC許可權模型

許可權設定
一般來說,系統提供如下功能:
1,角色管理介面,由使用者定義角色,給角色賦許可權;
2,使用者角色管理介面,由使用者給系統使用者賦予角色。
3,一些優秀系統,還支持使用者定義許可權,這樣新增功能的時候,可以將需要保護的功能增加到系統。
這裏,我們談談Spring Security架構。它將訪問角色固化到程式代碼裏面。那麽這種控製就相當于由軟體開發人員完成,而不是最終使用者。這從實施角度來看,是完全錯誤的。更多閱讀,可以查看《Spring Security優劣之我見》。
許可權驗證
功能級的許可權驗證邏輯非常簡單。查看該當前登錄使用者的角色是否包含該功能的許可權。如果有,則表示有權訪問,否則表示無權訪問。
對于WEB系統,一般定義一個Filter就可以完成許可權驗證,無需在各個程式入口進行許可權判斷。程式偽代碼如下:
// 獲取訪問功能
String url=request.getRequestPath();
// 進行許可權驗證
User user=request.getSession().get(user);
boolean permit=PrivilegeManager.permit( user, url );
if( permit ) {
chain.doFilter( request, response );
} else {
// 可以轉到提示介面
}
資料許可權
目前,資料級許可權管理領域,一直沒有統一的技術。大體上,軟體開發人員採用如下技術:
1,硬編碼,也就是將這種邏輯以if/else等形式與業務代碼耦合在一起,這種情況居多;
2,使用規則引擎,也有一些企業將這種邏輯以規則形式提出來,並使用規則引擎解析規則;
3,使用第三方專業軟體,有開源中間件Ralasafe;開源架構Spring Security;商業產品Oracle Entitlements Server,IBM Tivoli Access Manager,UPMS通用使用者許可權系統等。
硬編碼形式弊端是非常顯然的。耦合性強,難以測試;系統組件復用率低;系統後期改動代價非常大,牽一發而動全身。
使用規則引擎可以解決很多問題,學習難度尚可。但規則引擎並不是專業用于許可權管理的,所以對于復雜一些的許可權管理,就顯得力不從心。
Ralasafe和Oracle、IBM的商業產品一樣,都是中間件形式。對套用系統和套用資料庫結構沒有要求。都有管理介面進行直接操控管理,而且都能線上進行測試。相比較,Ralasafe還可以控製查詢許可權(即從系統查詢訂單、查詢客戶等),Oracle、IBM的商業產品沒有這方面功能;從產品學習難度來看,Ralasafe隻要有一些IT經驗,就能快速上手;Oracle、IBM產品即使是專業人員,也難以掌握。
Spring Security是架構,需要對你的套用系統進行改動,你的系統必須在該架構進行設計編寫。它隻是幫助開發人員將許可權提取出來了,但資料級許可權還需要開發人員開發Voter。而且配置工作巨大,難以測試。
雖然上述提到的產品,都是Java產品。但Ralasfe和Oracle、IBM的商業產品,以中間件形式,可以部署在獨立伺服器上,使用web service等方式與非Java系統互動。
實施介紹
許可權控製
這是很多系統都能做到的。讓系統使用者(一般是企業IT管理員)定義角色,給使用者分配角色。成功實施該步驟,使用者能在功能級進行許可權管理。整個過程無需軟體開發商參與。
5.2,部分預定義好的資料級許可權
有些復雜一點的系統,提供了一些規則和管理介面,可以讓系統使用者(一般是企業IT管理員)輸入規則參數。比如普通審查員審查財務資料的金額區間,勾選某使用者能夠查詢哪些組織機構的訂單資料。
這是給企業提供了部分控製資料級許可權的能力。但該能力還非常弱,僅限于已定義好的策略,不能適應安全策略變化。而,企業需求肯定會隨著業務發展、時間推移,發生變化。比如:普通審查員審查區間由原來的單一設定區間,改為按照行業、按照地域來設定不同的區間。使用者查詢訂單不僅和組織機構有關,還和訂單業務領域(體育、食品等)有關。當這些需求發生的時候,企業還要求助于軟體開發商進行修改。
掌控策略
企業完整掌控安全策略,應該包括2個方面內容:1,功能級許可權管理完全自我掌控;2,資料級許可權管理完全自我掌控。實現這方面需要,還需要考慮企業的IT能力:IT能力沒有軟體開發商強,而且許可權管理涉及整個系統安全,關系重大。因此軟體必須是這樣的:1,圖形化、集中管理的,便于企業管理;2,可線上測試的,定製策略後在不影響業務的情況下,進行測試,確保無誤。
目前,就Ralasafe和Oracle、IBM產品滿足要求。
許可權管理
一、系統的默認使用者
java代碼
sys;//系統管理員,擁有最高許可權
system;//在地管理員,次高許可權
scott;//普通使用者,密碼默認為tiger,默認未解鎖
二、登入
Java代碼
sqlplus conn / as sysdba;//登入sys帳戶
sqlplus sys as sysdba;//同上
sqlplus scott/tiger;//登入普通使用者scott
三、管理使用者
Java代碼
create user zhangsan;//在管理員帳戶下,建立使用者zhangsan
alert user scott identified by tiger;//修改密碼
四,授予許可權
1、默認的普通使用者scott默認未解鎖,不能進行那個使用,新增的使用者也沒有任何許可權,必須授予許可權
Java代碼
/*管理員授權*/
grant create session to zhangsan;//授予zhangsan使用者建立session的許可權,即登入許可權
grant unlimited session to zhangsan;//授予zhangsan使用者使用表空間的許可權
grant create table to zhangsan;//授予建立表的許可權
grant drop table to zhangsan;//授予移除表的許可權
grant insert table to zhangsan;//插入表的許可權
grant update table to zhangsan;//修改表的許可權
grant all to public;//這條比較重要,授予所有許可權(all)給所有使用者(public)
2、oralce對許可權管理比較嚴謹,普通使用者之間也是默認不能互相訪問的,需要互相授權
Java代碼
/*oralce對許可權管理比較嚴謹,普通使用者之間也是默認不能互相訪問的*/
grant select on tablename to zhangsan;//授予zhangsan使用者查看指定表的許可權
grant drop on tablename to zhangsan;//授予移除表的許可權
grant insert on tablename to zhangsan;//授予插入的許可權
grant update on tablename to zhangsan;//授予修改表的許可權
grant insert(id) on tablename to zhangsan;
grant update(id) on tablename to zhangsan;//授予對指定表特定欄位的插入和修改許可權,註意,隻能是insert和update
grant alert all table to zhangsan;//授予zhangsan使用者alert任意表的許可權
五、復原許可權
Java代碼
基本文法同grant,關鍵字為revoke
六、查看許可權
Java代碼
select * from user_sys_PRivs;//查看當前使用者所有許可權
select * from user_tab_privs;//查看所用使用者對表的許可權
七、操作表的使用者的表
Java代碼
/*需要在表名前加上使用者名稱,如下*/
select * from zhangsan.tablename
八、許可權傳遞
即使用者A將許可權授予B,B可以將操作的許可權再授予C,命令如下:
Java代碼
grant alert table on tablename to zhangsan with admin option;//關鍵字 with admin option
grant alert table on tablename to zhangsan with grant option;//關鍵字 with grant option效果和admin類似
九、角色
角色即許可權的集合,可以把一個角色授予給使用者
Java代碼
create role myrole;//建立角色
grant create session to myrole;//將建立session的許可權授予myrole
grant myrole to zhangsan;//授予zhangsan使用者myrole的角色
drop role myrole;移除角色
/*但是有些許可權是不能授予給角色的,比如unlimited tablespace和any關鍵字*/
管理員許可權
方法一
為Windows7的右鍵選單增加取得所有權的選單:具體實現的方法不難,將以下內容另外儲存為文本檔案,然後修改該檔案的擴展名為.reg ,雙擊導入註冊表即可。
Windows Registry Editor Version 5.00#
[HKEY_CLASSES_ROOT\*\shell\runas]
@=“管理員取得所有權”
“NoWorkingDirectory”=“”
[HKEY_CLASSES_ROOT\*\shell\runas\command]
@=“cmd.exe /c takeown /f \”%1\“ && icacls \”%1\“ /grant administrators:F”
“IsolatedCommand”=“cmd.exe /c takeown /f \”%1\“ && icacls \”%1\“ /grant administrators:F”
[HKEY_CLASSES_ROOT\exefile\shell\runas2]
@=“管理員取得所有權”
“NoWorkingDirectory”=“”
[HKEY_CLASSES_ROOT\exefile\shell\runas2\command]
@=“cmd.exe /c takeown /f \”%1\“ && icacls \”%1\“ /grant administrators:F”
“IsolatedCommand”=“cmd.exe /c takeown /f \”%1\“ && icacls \”%1\“ /grant administrators:F”
[HKEY_CLASSES_ROOT\Directory\shell\runas]
@=“管理員取得所有權”
“NoWorkingDirectory”=“”
[HKEY_CLASSES_ROOT\Directory\shell\runas\command]
@=“cmd.exe /c takeown /f \”%1\“ /r /d y && icacls \”%1\“ /grant administrators:F /t”
“IsolatedCommand”=“cmd.exe /c takeown /f \”%1\“ /r /d y && icacls \”%1\“ /grant administrators:F /t”
方法二
利用專業的最佳化工具,設定右鍵選單。這裏說的最佳化工具有很多種,一般支持WindowsVista的最佳化工具,都能用來最佳化WIndows7,比如Win7最佳化大師等等。這些工具中的系統設定中,右鍵設定都有增加獲得管理員許可權的功能,大家自己找一下即可。
註意問題
不良的許可權管理系統,必然留下系統漏洞,給黑客可趁之機。很多軟體可以輕松通過URL侵入、SQL註入等模式,輕松越權獲得未授權資料。甚至對系統資料進行修改、移除,造成巨大損失。
很多系統,尤其是採用硬編碼方式的系統,存在許可權邏輯與業務代碼緊密耦合,同時又分散在系統各個地方。系統漏洞勢必非常多,而且隨著系統不斷修改,漏洞逐步增多。 好的系統,應該將許可權邏輯集中起來,由專業的安全引擎進行設定、解析。業務邏輯調用安全引擎,獲得許可權結果,不再使用非專業模式。這種轉變,如圖示:許可權由緊密分散,轉換為集中專業管理