四種常用的權(quán)限模型,你都了解嗎?
今天咱們一起聊聊權(quán)限系統(tǒng)。
以大家熟知的電商場景舉例:
- 用戶可以分為普通用戶、VIP用戶:我們需要控制不同角色用戶的訪問范圍。比如,京東的PLUS會員,可以進(jìn)入會員專區(qū),而且能夠使用禮金領(lǐng)取優(yōu)惠券,但是普通會員沒有這項功能;
- 用戶還可以范圍顧客、商家:顧客可以從APP下單,可以查看自己所有的訂單,這些訂單屬于不同的商家;商家可以從后臺看到自己店鋪的所有訂單,這些訂單分屬不同的顧客。
對于一個閉環(huán)的系統(tǒng)來說,無論是ToC還是ToB,權(quán)限系統(tǒng)都是基礎(chǔ)組件,用于保障用戶在權(quán)限范圍內(nèi)操作有權(quán)限的數(shù)據(jù)。
如何控制權(quán)限
既然要控制權(quán)限,那我首先需要清楚需要控制的因素有哪些?
第一是控制維度,用戶可以做什么(Operation),在哪些對象(Object)操作:
- 比如:對某個數(shù)據(jù)的查詢、編輯、刪除。我們可以將之稱為功能權(quán)限。功能權(quán)限又可以細(xì)化為,看到菜單、打開頁面、頁面中有哪些按鈕、可以訪問哪些請求等。
- 比如:A可以管理甲乙丙三個店鋪;B可以管理丁一個店鋪。我們可以稱之為數(shù)據(jù)權(quán)限。數(shù)據(jù)權(quán)限可以細(xì)化為:單點(diǎn)、級聯(lián)、遞歸等。
控制維度
第二是控制粒度,我們的權(quán)限可以控制到一組人員,還是控制到一類人員:
- 按組區(qū)分:按照人員的角色進(jìn)行劃分,比如,A、B、C是同一個部門,具備的權(quán)限都是一樣的,相同的功能權(quán)限、數(shù)據(jù)權(quán)限;
- 按類區(qū)分:按照用戶的特征進(jìn)行劃分,比如,A、B、C是同一個部門,數(shù)據(jù)權(quán)限相同。但是A是正式員工,可以有刪除權(quán)限;B是正式員工,但是上個月績效太低,刪除權(quán)限被收回;C是實(shí)習(xí)生,只能有查詢權(quán)限,而且只能看到一個店鋪的數(shù)據(jù)。
兩種方式正好對應(yīng)的業(yè)界常用的兩種權(quán)限模型:基于角色的訪問控制(Role-based access control,簡稱 RBAC)、基于屬性的訪問控制(Attribute-Based Access Control,簡稱 ABAC)。
什么是 RBAC
顧名思義,基于角色的訪問控制,就是給用戶定義角色,通過角色來控制權(quán)限。目前來說,基于角色權(quán)限控制模型是應(yīng)用較廣的一個。
在RBAC中,包含用戶(User)、角色(Role)、權(quán)限(Permission),權(quán)限又分為對象(Object)、操作(Operation),總共五個基本元素。考慮到多種系統(tǒng)集合或者不同場景,還引入了會話(Session)。
用戶與角色之間是多對多,一個用戶有多個角色,比如既可以員工也可以是小組長;一個角色可以有多個用戶,比如公司所有人都是員工。
一個角色可以多種權(quán)限,這個很好理解。每個角色可以有查看、編輯等多種權(quán)限。
權(quán)限分為操作權(quán)限和對象權(quán)限,有的地方也稱為功能權(quán)限和數(shù)據(jù)權(quán)限。一個對應(yīng)著可以執(zhí)行的動作,一個對應(yīng)著動作的數(shù)據(jù)范圍。
在這個模型中,還會細(xì)分為4個等級:
RBAC0
RBAC0
RBAC0包含了RBAC的所有元素,是RBAC的基本模型。幾個元素之間,就是簡單的多對多的關(guān)系。我們在市面上見到的大多數(shù)RBAC模型都是處于這個階段。
用戶根據(jù)會話選擇對應(yīng)的角色,然后根據(jù)角色配置的操作權(quán)限,可以在系統(tǒng)中看到菜單、頁面、按鈕等,根據(jù)角色對應(yīng)的數(shù)據(jù)權(quán)限,可以從對應(yīng)的頁面看到對應(yīng)的數(shù)據(jù)。
RBAC1
RBAC1
RBAC1是基于RBAC0,引入了角色繼承能力。比如有員工角色,可以瀏覽內(nèi)部系統(tǒng)的公開信息,然后有老板角色,可以繼承員工角色,也就具備瀏覽內(nèi)部系統(tǒng)的公開信息的能力。從用戶體驗上沒有差別,但是從事物認(rèn)知上,更加符合我們的習(xí)慣。
RBAC2
RBAC2
RBAC2也是基于RBAC0,與RBAC1不同,RBAC2是增加了對角色的控制:
- 靜態(tài)職責(zé)分離(Static Separation of Duty,簡稱SSD):
互斥角色:用戶只能分配一組互斥角色集合中的一種,比如會計和出納;
基數(shù)約束:一個角色可以被分配給有限的用戶,一個用戶可擁有有限的角色,一個角色對應(yīng)有限的權(quán)限;
先決條件角色:想獲得較高的權(quán)限,要首先擁有低一級的權(quán)限。
- 動態(tài)職責(zé)分離(Dynamic Separation of Duty,簡稱DSD)
- 運(yùn)行時互斥:一個用戶可以具備兩個角色,但是這兩個角色不能同時激活。
RBAC3
RBAC3
RBAC1和RBAC2具備兩種不同的思想,我們都想要,于是有了RBAC3。
實(shí)踐中的使用
一般來說,上面幾種模型可以覆蓋我們大多數(shù)的場景。有時候,我們還可以針對自己系統(tǒng)特點(diǎn),還可以做一些擴(kuò)展。
對于用戶比較多的系統(tǒng),相同角色的用戶可能比較多,比如有100個用戶都有角色1和角色2,某一天系統(tǒng)升級,增加了新功能,創(chuàng)建了角色3,于是需要給這100個人都增加角色3,操作起來不太方便。我們可以增加用戶組的概念,擁有相同角色的用戶添加到一個用戶組中,用戶組與角色綁定,當(dāng)需要給一部分用戶增加或減少角色的時候,只需要修改用戶組與角色的關(guān)系即可。
用戶組
權(quán)限分為操作和對象,一般在實(shí)踐中中,也會將角色分為操作角色和對象角色,兩者彼此分離。
角色
還有一種場景是,針對某些對象,可以有查看和編輯的權(quán)限,針對另外的對象,只有查看權(quán)限。這個時候,我們需要建立三者關(guān)系,角色、操作權(quán)限、數(shù)據(jù)權(quán)限。用戶具備角色一,角色一可以操作對象一、對象二,對對象一可以查看和編輯,對對象二可以查看。這種場景是更加細(xì)粒度的控制。只有在管控非常嚴(yán)格的系統(tǒng)中才會看到,比如,財務(wù)系統(tǒng)。
角色/操作/對象
什么是 ABAC
上面提到的最后一種場景中,我們能夠看到用戶在對象權(quán)限和操作權(quán)限上的靈活配置。本節(jié)我們介紹一種更加靈活的模型:基于屬性的訪問控制(Attribute-Based Access Control,簡稱 ABAC),它的原理是通過屬性組合動態(tài)判斷一個操作是否可以被允許。
考慮ABAC的模型時,我們需要一個更加復(fù)雜的場景:OA系統(tǒng)中的文檔系統(tǒng)(下面例子靈感來源于Authing官網(wǎng))。
- 授權(quán)員工張三有《xxx公告》的編輯權(quán)限;
- 當(dāng)《xxx公告》的所屬部門跟李四的部門相同時,李四可以訪問這個文檔;
- 當(dāng)王五是《xxx公告》的擁有者并且《xxx公告》的狀態(tài)是草稿時,王五可以編輯這個文檔;
- 早上九點(diǎn)前禁止 A 部門的人訪問《xxx公告》;
- 在除了上海以外的地方禁止以管理員身份訪問 A 系統(tǒng)。
從上面這個例子中,我們可以看到ABAC模型與RBAC模型的區(qū)別:RBAC是靜態(tài)的,用戶具備的權(quán)限只與關(guān)聯(lián)角色相關(guān),不隨自身特征變化而改變;ABAC是動態(tài)的,時移世易,隨著用戶特征值的變化,權(quán)限也隨之變化。如果將角色看做一種特征值,那RBAC就是一維的ABAC。
ABAC
在 ABAC 模型中,一個操作是否被允許是基于對象、資源、操作和環(huán)境信息共同動態(tài)計算決定的:
- 對象是當(dāng)前請求訪問資源的用戶,用戶的屬性包括ID、員工性質(zhì)(正式、實(shí)習(xí)、外包等)、員工類型(普通、銷售、一線等)、崗位角色、所在部門、辦公地點(diǎn)、組織成員身份等;
- 資源是當(dāng)前用戶要訪問的資產(chǎn)或?qū)ο?,例如文件、?shù)據(jù)、服務(wù)器、API等;
- 操作是用戶試圖對資源進(jìn)行的操作,常見的操作包括查詢、編輯(新增、修改)、復(fù)制、刪除、導(dǎo)出等;
- 環(huán)境是每個訪問請求的上下文,環(huán)境屬性包含訪問的時間、位置,對象的設(shè)備,通信協(xié)議和加密強(qiáng)度等。
在 ABAC模型 的決策語句的執(zhí)行過程中,決策引擎會根據(jù)定義好的決策語句,結(jié)合對象、資源、操作、環(huán)境等因素動態(tài)計算出決策結(jié)果。每當(dāng)發(fā)生訪問請求時,ABAC模型決策系統(tǒng)都會分析屬性值是否與已建立的策略匹配。如果有匹配的策略,訪問請求就會被通過。
DAC與MAC
為了本文的完整,這里在介紹一下常見但是不常用的兩個模型:
- 自主訪問控制(Discretionary Access Control,簡稱DAC):被操作對象,根據(jù)訪問控制規(guī)則(權(quán)限控制列表(ACL: Access Control List)或者權(quán)限控制矩陣(ACL: Access Control Matrix)),來判斷操作主體可對操作對象做哪些操作,比如只讀或者是可寫的權(quán)限。而自主的含義,則是擁有某種權(quán)限的用戶,可以把權(quán)限賦予其他用戶。
- 強(qiáng)制訪問控制(MAC: Mandatory Access Control):被操作對象及用戶兩方均有各自的權(quán)限標(biāo)識,用戶能否對對象進(jìn)行操作,取決于雙方的權(quán)限標(biāo)識的關(guān)系,這個限制判斷通常是由系統(tǒng)硬性限制的。這種模型多用于等級制度明顯,信息訪問安全性要求高的場景,比如軍事。
文末總結(jié)
本文一共介紹了四種常見權(quán)限模型:基于角色的訪問控制(Role-based access control,簡稱 RBAC)、基于屬性的訪問控制(Attribute-Based Access Control,簡稱 ABAC)、自主訪問控制(Discretionary Access Control,簡稱DAC)、強(qiáng)制訪問控制(MAC: Mandatory Access Control)。模型是死的,業(yè)務(wù)是活的。在實(shí)踐過程中,還會有很多的變體,萬變不離其宗,只要掌握了這幾種模型的核心,任何變體都可以隨心所欲。