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