引言
自從1992年Ferraiolo和Juhn正式提出RBAC\\(role-based access control\\)模型以來,其直觀、完善、經濟的特性迅速獲得了企業信息系統中常用的訪問控制解決方案的青睞,由于RBAC模型在商業和政府領域的成功應用,ANSI和INCITS于2004年2月正式接受RBAC模型為國家標準.RBAC模型直接將企業管理特征映射到了權限管理,在解決企業和政府部門統一資源訪問控制方面具有很大的優勢.
核心RBAC模型的概念包含用戶User、角色Role、操 作Operation、對 象Object、權 限Permis-sion、會話Session.用戶與特定的一個或多個角色相聯系,角色的概念源于實際工作中的職務崗位,一個職務具有處理工作中某些事務的權限,因此角色就與一個或多個訪問權限相聯系.邏輯分離的用戶和權限由角色相關聯,通過將角色指派給用戶使之獲得一定權限,而每個會話是一個用戶到多個角色的一次映射.而大型企業通常部門用戶眾多、職務變動頻繁、業務對象龐雜,核心RBAC模型僅依靠調整角色的定義來改變授權,雖有效減少了授權管理的復雜性,但仍難適應于企業復雜業務需求的變化.
為此,本文在核心RBAC模型的基礎上,提出一種對用戶和角色混合授權的RBAC改進模型.
1 RBAC改進模型
1.1 模型概念和特點
針對核心RBAC模型的問題,再結合國內企業通常有直接對用戶授權的實際客戶需求,筆者在核心RBAC模型的基礎上引入了用戶權限指派,采用了對用戶和角色混合授權的折中方法,簡化了用戶操作,降低了角色數量,也避免了角色定義、用戶職責與業務功能變更所帶來的諸多問題.圖1即是對用戶和角色混合授權的RBAC改進模型.【圖1】
相對于核心RBAC模型,增強后的RBAC改進模型具有如下結構特點:
1\\)可直接對用戶進行授權.除了可以對角色進行授權外,也可針對用戶直接進行授權,即將權限直接授予用戶.角色授權仍然是權限管理的核心,直接用戶授權則是在角色授權基礎上的補充完善,其主要用于處理一些難以用角色授權實現的臨時性、特殊性的權限需求.當用戶因業務要求需暫時擁有某些權限時,可直接對用戶賦予相應的權限,無需增加新的角色,以此改善了授權的靈活性.
2\\)針對用戶權限加入繼承約束.針對某業務對象的某一操作權限,繼承約束用于實現在角色權限和用戶權限間進行切換.“繼承”指繼承使用用戶所擁有的角色的權限,而不使用直接對用戶授予的權限;“不繼承”指使用對用戶直接授予的權限,而不繼承用戶所屬的角色的權限.針對某業務對象的某一操作權限進行用戶直接授權后,欲啟用該權限,還需設置權限為“不繼承”;當不再需要該權限時,無需撤銷用戶權限,只需設置權限為“繼承”即可.也就是說模型的臨時授權是依靠繼承約束來開啟和禁止的,繼承約束避免了角色授權和用戶授權同時有效時所帶來的權限沖突問題,也降低了添加和刪除臨時授權過程的復雜度.
3\\)針對角色加入優先級約束.用戶擁有多個角色時,角色間的權限可能發生沖突,如對某一資源的某一操作,一個角色為“允許”,另一個角色卻為“禁止”.為了解決多角色間的權限沖突,在角色中引入優先級屬性,即權限沖突時,以優先級高的角色為準.優先級是對某一用戶所屬的某一角色而言,可針對不同用戶分別設定不同的優先級,即同一角色對于不同的用戶會有不同的優先級.優先級約束使得無需額外引入沖突解決算法就解決了具有沖突關系的兩個角色不能同時賦予同一用戶的問題,降低了訪問控制模型的復雜度,簡化了權限管理模塊的編程實現.
1.2 模型要素
RBAC改進模型的形式化描述如下:
定義1用戶會話\\(US:Sessions→Users\\):映射每個會話到一個用戶.
定義2角色會話\\(SR:Sessions→2Roles\\):映射每個會話到一組角色.
模型中的主要集合包括:
1\\)用戶集Users={u1,u2,…,un},表示所有用戶的集合.
2\\)角色集Roles={r1,r2,…,rn},表示所有角色的集合.
3\\)權限集Perms={p1,p2,…,pn},權限pi是一個二元組\\(obi,opi\\),obi表示業務對象,opi表示操作.
4\\)會話集Sessions={s1,s2,…,sn},表示所有會話的集合.
模型中的主要函數關系包括:
1\\)用戶角色指派AssignedUsersRoles:Users→2Roles,為用戶u∈Users分派一組角色集.
2\\)角色權限指派AssignedRolesPerms:Roles→2Perms,為角色r∈Roles分派一組權限集.
優先級約束設置SetPriority\\(ui,rj,priority\\),針對某一用戶的某一角色可以設置優先級約束,以消除多角色間的權限沖突.
3\\)用戶權限指派AssignedUsersPerms:Users→2Perms,直接為用戶u∈Users分派一組權限集.繼承約束設置SetExtend\\(ui,pj,true|false\\),在用戶權限指派時,針對某一用戶的某一權限還需設置繼承約束,即對此用戶是否啟用該權限.
4\\)用戶角色激活ActiveRoles:Sessions× Us-ers→2Roles,在一個會話期s∈Sessions內,激活用戶u∈Users被指派的一組角色.
5\\)用戶權限合成UsersPermsComposite:Ses-sions× Users→2Perms,其中{p∈Perms,Perms\ue01bAssignedRolesPerms\\(Perms\\)|AssignedUsersPer-ms\\(Perms\\)},即會話s∈Sessions中用戶u∈Users的權限合成是用戶角色權限或用戶直接權限.
6\\)對象訪問控制ObjectsAccessControl:Ses-sions× Users→2{\\(ob,op\\)},其中{\\(ob,op\\)∈Assigne-dRolesPerms\\(ob,op\\)|AssignedUsersPerms\\(ob,op\\)},即會話s∈Sessions中用戶u∈Users的對象訪問控制,針對同一業務對象ob,用戶角色權限op或用戶直接權限op只有其一有效.
以上主要函數關系基本上也闡述了RBAC改進模型的授權算法,因此以下只給出其認證算法:
算法HasPermission\\(u,ob,op\\)
輸入:用戶u,業務對象ob和操作權限op
輸出:flag,即用戶u對業務對象ob是否有操作權限op
flag←false
Ptmp←AssignedPerms\\(u\\)/*查找直接授予用戶的權限集*/
if\\(ob,op\\)∈ Ptmp
if GetExtend\\(ob,op\\)/*如果 “不繼承”角色權限*/
flag←true
return flag
endif
endif
Ri←AssignedRoles\\(u\\)/*查找分 配 給 用 戶 的 角 色*/
Rj←OrderByPriority\\(Ri\\)
for all r∈Rjdo/*依照角色優先級依次查找授權*/
Pr←AssignedPerms\\(r\\)
if\\(ob,op\\)∈Pr
flag←true
endif
endfor
returnflag
算法首先查找系統是否直接對用戶進行過授權AssignedPerms\\(u\\),即是否設置了臨時授權Ptmp;然后確認該權限是否為“不繼承”GetExtend\\(ob,op\\),即臨時授權是否啟用.如果以上條件都不滿足則不使用臨時授權,而使用角色授權,此時為了解決多角色間的權限沖突,先將角色按優先級排序,再依序查找核對,以確認是否有對應權限.
2 RBAC改進模型的UML建模
由于RBAC模型的抽象性、形式性,它通常難以被軟件開發者所理解,為了縮短理論安全模型和實際應用開發間的鴻溝,本文采用統一建模語言\\(UML\\)對RBAC改進模型進行了靜態和動態建模,以面向對象的方法對模型做了分析和設計.以下先進行靜態建模,即給出模型的實體類圖,再分別對授權與認證功能進行動態建模,給出授權與認證功能的活動圖.
2.1 模型的靜態建模
根據RBAC改進模型構造的實體類圖如圖2所示,圖中給出了模型的實體類、類間的關聯關系以及關聯的基數特征,領域對象具體有用戶User、角色Role、用戶角色關系UsersRoles、模塊Module、權限Permission及訪問控制列表ACL.用戶指企業工作人員;模塊即RBAC模型中的業務對象,其表示企業應用中的功能模塊,模塊可以有一個父模塊或多個子模塊;用戶對每個模塊的訪問受到權限的約束,權限指對某一模塊所擁有的“CRUD”操作;角色代表一組權限;用戶角色關系表明用戶所被賦予的角色,即間接指明了用戶具有的權限;一個ACL對象表明一個角色或用戶\\(只能是其一\\)對一個模塊所能執行的CRUD操作,一個用戶的全部ACL對象即表達了該用戶在系統中所具有的權限集合.
用戶對模塊的操作包括CRUD四種,每一種操作都對應一個的“允許/禁止”標識.最直觀的設計是ACL類針對每種操作都設置一個屬性和一個“允許/禁止”標識.但這種設計靈活性較差,比如隨著需求的變更,可能需添加其他的操作類型,這就必須在ACL類中增加新的屬性才能滿足需求.為了適應于未來的需求,設計操作及其“允許/禁止”標識為:在ACL對象中引入一個int類型的屬性“授權狀態”,用int類型的32位分別表示32種操作,如第0位表示“C”;第1位表示“R”;第2位表示“U”;第3位表示“D”,位的值\\(對于“位”來說,只能取值0或1\\)用來表示“允許/禁止”\\(0表示禁止,1表示允許\\).在該設計中,操作類型及其“允許/禁止”標識合二為一,能支持將來可能增加的多達32種的操作類型,因此顯著提高了系統的可維護性和可擴展性.【圖2】
2.2 授權功能的動態建模
授權指將權限授予角色或用戶,通常情況下應先對角色分配模塊的權限,再為用戶分配相應的角色,如此實現了用戶和權限的邏輯分離,簡化了權限管理,而用戶權限指派則用于臨時性的或特殊情況下的授權管理.
圖3的活動圖描述了模型的授權算法,授權活動分為角色授權和用戶直接授權,角色授權指根據AssignedRolesPerms和AssignedUsersRoles進行角色權限指派和用戶角色指派,角色授權還需針對用戶設置每個角色的優先級,若角色間的授權發生沖突時,則以優先級高的角色為準.
用戶直接授權指根據AssignedUsersPerms進行用戶權限指派,用戶直接授權需設定權限的繼承約束,繼承約束表現為權限的一個屬性,其決定是否啟用直接指派的用戶權限,若啟用,則直接指派的用戶權限屏蔽用戶的角色權限;若不啟用,則以用戶的角色權限為準.【圖3】
2.3 認證功能的動態建模
認證指當用戶對某個模塊執行某個操作時,系統根據用戶的授權以確認用戶能否操作.為了控制用戶對模塊的增刪改查操作,需要決定是否顯示相應的按鈕或鏈接,即判斷用戶對某個模塊的某個操作是否被允許,這就需要執行認證算法以確認.
圖4的活動圖描述了模型的認證算法,用戶會話訪問資源之前,需根據用戶信息提取用戶直接權限或用戶角色權限,即使用UsersPermsComposite獲取用戶的有效權限.獲取用戶直接權限的前提是曾針對該資源指派過用戶權限且啟用了該用戶權限\\(不繼承角色權限\\).否則就提取用戶角色權限,此時使用ActiveRoles獲取用戶的角色列表,并按優先級對角色降序排序,然后依序在角色中查找是否有對該資源的明確授權,若有授權則立即返回,否則繼續在下一個角色中查找.找到對應資源授權后,根據ObjectsAccessControl對象訪問控制顯示按鈕、鏈接等相關操作組件.【圖4】
3 結論
對 角色和用戶混合授權的RBAC改進模型無需引入額外的沖突檢測算法,避免了角色、用戶間的權限沖突;同時解決了臨時授權管理繁瑣的問題,有效彌補了核心RBAC模型僅依賴角色授權的不足和局限,提高了權限管理的嚴密性、靈活性和可維護性,也更符合國內企業的實際應用情況.
通過基于UML表述RBAC改進模型,使軟件開發者更直觀的理解RBAC模型和更易于建立基于角色的信息系統,該模型在基于Java EE的實際企業應用中取到了良好的效果,因其具有一定的通用性,也避免了企業應用中權限管理模塊的重復開發.