如何基于Python建設(shè)企業(yè)認(rèn)證和權(quán)限控制平臺(tái)
原創(chuàng)【51CTO.com原創(chuàng)稿件】企業(yè)內(nèi)網(wǎng),建立在企業(yè)內(nèi)部,為員工提供信息的共享和交流,為業(yè)務(wù)提供運(yùn)營(yíng)和管理的支撐,已是當(dāng)今企業(yè)信息化建設(shè)必不可少的一個(gè)項(xiàng)目。隨著企業(yè)的規(guī)模越來越大,業(yè)務(wù)越來越廣,系統(tǒng)建設(shè)就顯得尤為重要。
統(tǒng)一認(rèn)證系統(tǒng)是企業(yè)內(nèi)網(wǎng)系統(tǒng)建設(shè)的基礎(chǔ),主要實(shí)現(xiàn)用戶管理、身份認(rèn)證、權(quán)限管理和單點(diǎn)登錄等功能,以解決企業(yè)內(nèi)網(wǎng)系統(tǒng)建設(shè)過程中用戶定義模糊、用戶身份組織零亂、交叉權(quán)限管理和應(yīng)用系統(tǒng)出口多樣性等棘手的問題。
基于此,五阿哥運(yùn)維技術(shù)團(tuán)隊(duì)基于Python建設(shè)了統(tǒng)一認(rèn)證(BUC:Back User Center)和權(quán)限控制(ACL:Access Control List)平臺(tái),這個(gè)系統(tǒng)技術(shù)架構(gòu)圖如下:
一、 系統(tǒng)的功能
1.用戶管理
在企業(yè)中,每個(gè)用戶都有一個(gè)唯一的賬號(hào)進(jìn)行登錄,用戶的賬號(hào)和個(gè)人身份信息(包含姓名、郵件等公共屬性)會(huì)集中保存在內(nèi)網(wǎng)統(tǒng)一認(rèn)證系統(tǒng)里。但對(duì)于同一個(gè)用戶在外部系統(tǒng)中的賬號(hào),如微信、釘釘、Tower等第三方系統(tǒng),統(tǒng)一認(rèn)證系統(tǒng)也可以通過定時(shí)同步或?qū)崟r(shí)查詢等方式獲取到用戶的信息。
2.安全管理
對(duì)于保存在企業(yè)內(nèi)網(wǎng)中的用戶賬號(hào)進(jìn)行認(rèn)證是比較方便的,對(duì)于保存在外部系統(tǒng)中的用戶賬號(hào),可以通過定時(shí)同步或?qū)崟r(shí)驗(yàn)證等方式來驗(yàn)證用戶的鑒權(quán),最終統(tǒng)一以唯一的身份使用戶登錄進(jìn)入系統(tǒng)。
同時(shí),企業(yè)內(nèi)部存在多個(gè)不同的業(yè)務(wù)應(yīng)用,以所有應(yīng)用均接入統(tǒng)一認(rèn)證平臺(tái)為基礎(chǔ),各個(gè)業(yè)務(wù)系統(tǒng)的用戶認(rèn)證采用單點(diǎn)登錄認(rèn)證模式,一次登錄即可在各個(gè)業(yè)務(wù)子系統(tǒng)中完成自動(dòng)認(rèn)證并獲得相關(guān)授權(quán)。
3.應(yīng)用管理
不同的業(yè)務(wù)系統(tǒng)會(huì)對(duì)用戶進(jìn)行不同的角色劃分,不同的角色又會(huì)劃分出細(xì)粒度的權(quán)限。角色權(quán)限在統(tǒng)一認(rèn)證系統(tǒng)中保存,在一個(gè)地方就可以完成用戶授權(quán)信息的設(shè)定。
4.系統(tǒng)接入
支持各種技術(shù)棧的系統(tǒng)接入,包含Java和Python等,其中各技術(shù)棧的SDK可以在Github項(xiàng)目中找到。
5.三方應(yīng)用
第三方應(yīng)用,包含郵箱,VPN,無線等直接進(jìn)行SSO登錄。
6.系統(tǒng)監(jiān)控
對(duì)系統(tǒng)運(yùn)行、操作、會(huì)話進(jìn)行監(jiān)控,保障在受到外部或者內(nèi)部攻擊時(shí),能夠及時(shí)發(fā)現(xiàn),進(jìn)行實(shí)例回溯。
7.系統(tǒng)審計(jì)
對(duì)平臺(tái)所有操作進(jìn)行審計(jì),在出現(xiàn)系統(tǒng)權(quán)限錯(cuò)亂或者安全問題的時(shí)候,對(duì)平臺(tái)操作進(jìn)行審計(jì)。
二、 系統(tǒng)架構(gòu)設(shè)計(jì)
1.接口設(shè)計(jì)
企業(yè)內(nèi)網(wǎng)的統(tǒng)一認(rèn)證平臺(tái)建議基于B/S模式設(shè)計(jì),后端使用Django框架以快速開發(fā),用DB+LDAP方式完成用戶各類信息的存儲(chǔ),保障存儲(chǔ)和查詢效率。 統(tǒng)一認(rèn)證的核心問題是鑒權(quán)中心和各子系統(tǒng)之間的通信接口問題,用戶認(rèn)證接口協(xié)議可以基于標(biāo)準(zhǔn)化HTTP/HTTPS方式實(shí)現(xiàn),并對(duì)外提供不同語言的SDK(如Python CAS庫(kù)、Java Web過濾器等),使得第三方業(yè)務(wù)系統(tǒng)的接入不完全依賴于特定的開發(fā)環(huán)境。
2.安全設(shè)計(jì)
對(duì)于接入系統(tǒng),認(rèn)證中心接口協(xié)議調(diào)用采用HTTPS傳輸?shù)姆绞剑ㄐ虐踩珕栴}將轉(zhuǎn)化到HTTPS傳輸?shù)陌踩詥栴}上,而對(duì)于HTTPS通道的攻擊,可以由單獨(dú)的網(wǎng)絡(luò)掃描模塊專門負(fù)責(zé)監(jiān)控。
對(duì)于統(tǒng)一認(rèn)證和SSO接口參數(shù)的信息安全,一方面網(wǎng)站可采用專有加密算法對(duì)參數(shù)內(nèi)容進(jìn)行加密,另一方面,可以采用IP認(rèn)證策略來保證對(duì)接口雙方的信任,系統(tǒng)通過通道安全和信息加密雙保險(xiǎn)的措施來保證統(tǒng)一認(rèn)證體系的接口安全。
同時(shí)系統(tǒng)配有全方面的應(yīng)用監(jiān)控和訪問日志的審計(jì),當(dāng)機(jī)器發(fā)生異常情況或日志審計(jì)檢測(cè)到有可疑入侵行為時(shí),會(huì)自動(dòng)以多種方式通知到運(yùn)維工程師和相關(guān)負(fù)責(zé)人。
三、 BUC使用技術(shù)和實(shí)現(xiàn)
1.用戶管理
通常在企業(yè)中,每個(gè)用戶擁有一個(gè)唯一的身份標(biāo)識(shí),即用戶名。同時(shí)用戶在其他內(nèi)網(wǎng)或外部應(yīng)用也存在著對(duì)應(yīng)的用戶,如果能使用同一個(gè)用戶身份最為方便;獨(dú)立的用戶可以通過關(guān)聯(lián)不同的系統(tǒng)的用戶使之對(duì)外呈現(xiàn)為一個(gè)用戶。用戶可以在不同的應(yīng)用系統(tǒng)中使用,這一切的基礎(chǔ)是有一個(gè)中央的系統(tǒng)來保存和管理這些用戶。常見的解決方案有Windows活動(dòng)目錄和LDAP。
(1)Windows活動(dòng)目錄域服務(wù)
使用 Active Directory(R) 域服務(wù) (AD DS) 服務(wù)器角色,可以創(chuàng)建用于用戶和資源管理的可伸縮、安全及可管理的基礎(chǔ)機(jī)構(gòu),并可以提供對(duì)啟用目錄的應(yīng)用程序(如 Microsoft(R) Exchange Server)的支持。
圖-1:AD的功能,來自微軟的介紹
AD DS 提供了一個(gè)分布式數(shù)據(jù)庫(kù),該數(shù)據(jù)庫(kù)可以存儲(chǔ)和管理有關(guān)網(wǎng)絡(luò)資源的信息,以及啟用了目錄的應(yīng)用程序中特定于應(yīng)用程序的數(shù)據(jù)。 運(yùn)行 AD DS 的服務(wù)器稱為域控制器。 管理員可以使用 AD DS 將網(wǎng)絡(luò)元素(如用戶、計(jì)算機(jī)和其他設(shè)備)整理到層次內(nèi)嵌結(jié)構(gòu)。內(nèi)嵌層次結(jié)構(gòu)包括 Active Directory 林、林中的域以及每個(gè)域中的組織單位 (OU)。
域模式的最大好處就是單一的網(wǎng)絡(luò)登錄能力,用戶只要在域中有一個(gè)賬戶,就可以在整個(gè)網(wǎng)絡(luò)中漫游。活動(dòng)目錄服務(wù)增強(qiáng)了信任關(guān)系,擴(kuò)展了域目錄樹的靈活性。活動(dòng)目錄把一個(gè)域作為一個(gè)完整的目錄,域之間能夠通過一種基于Kerberos認(rèn)證的可傳遞的信任關(guān)系建立起樹狀連接,從而使單一賬戶在該樹狀結(jié)構(gòu)中的任何地方都有效,這樣在網(wǎng)絡(luò)管理和擴(kuò)展時(shí)就比較輕松。
同時(shí),活動(dòng)目錄服務(wù)把域又詳細(xì)劃分成組織單元。組織單元是一個(gè)邏輯單元,它是域中一些用戶和組、文件與打印機(jī)等資源對(duì)象的集合。組織單元中還可以再劃分下級(jí)組織單元,下級(jí)組織單元能夠繼承父單元的訪問許可權(quán)。每一個(gè)組織單元可以有自己?jiǎn)为?dú)的管理員并指定其管理權(quán)限,它們都管理著不同的任務(wù),從而實(shí)現(xiàn)了對(duì)資源和用戶的分級(jí)管理。活動(dòng)目錄服務(wù)通過這種域內(nèi)的組織單元樹和域之間的可傳遞信任樹來組織其信任對(duì)象,為動(dòng)態(tài)活動(dòng)目錄的管理和擴(kuò)展帶來了極大的方便。
(2)LDAP技術(shù)
輕型目錄存取協(xié)定(英文:Lightweight Directory Access Protocol,縮寫:LDAP)是一個(gè)開放的,中立的,工業(yè)標(biāo)準(zhǔn)的應(yīng)用協(xié)議,通過IP協(xié)議提供訪問控制和維護(hù)分布式信息的目錄信息。
目錄服務(wù)在開發(fā)內(nèi)部網(wǎng)和與互聯(lián)網(wǎng)程序共享用戶、系統(tǒng)、網(wǎng)絡(luò)、服務(wù)和應(yīng)用的過程中占據(jù)了重要地位。例如,目錄服務(wù)可能提供了組織有序的記錄集合,通常有層級(jí)結(jié)構(gòu),例如公司電子郵件目錄。同理,也可以提供包含了地址和電話號(hào)碼的電話簿。
圖-2:LDAP目錄樹圖示,來自網(wǎng)絡(luò)
LDAP協(xié)議是跨平臺(tái)的和標(biāo)準(zhǔn)的協(xié)議,因此應(yīng)用程序就不用為L(zhǎng)DAP目錄放在什么樣的服務(wù)器上操心了。實(shí)際上,LDAP得到了業(yè)界的廣泛認(rèn)可,因?yàn)樗荌nternet的標(biāo)準(zhǔn)。廠商都很愿意在產(chǎn)品中加入對(duì)LDAP的支持,因?yàn)樗麄兏静挥每紤]另一端(客戶端或服務(wù)端)是怎么樣的。
LDAP服務(wù)器可以是任何一個(gè)開放源代碼或商用的LDAP目錄服務(wù)器(或者還可能是具有LDAP界面的關(guān)系型數(shù)據(jù)庫(kù)),因?yàn)榭梢杂猛瑯拥膮f(xié)議、客戶端連接軟件包和查詢命令與LDAP服務(wù)器進(jìn)行交互。
與LDAP不同的是,如果軟件廠商想在軟件產(chǎn)品中集成對(duì)DBMS的支持,那么通常都要對(duì)每一個(gè)數(shù)據(jù)庫(kù)服務(wù)器單獨(dú)定制。不像很多商用的關(guān)系型數(shù)據(jù)庫(kù),你不必為L(zhǎng)DAP的每一個(gè)客戶端連接或許可協(xié)議付費(fèi)。大多數(shù)的LDAP服務(wù)器安裝起來很簡(jiǎn)單,也容易維護(hù)和優(yōu)化。
(3)用戶管理實(shí)踐
根據(jù)國(guó)內(nèi)企業(yè)辦公網(wǎng)絡(luò)的實(shí)際情況,用戶計(jì)算機(jī)通常為Windows系統(tǒng),通通接入到Windows活動(dòng)目錄中進(jìn)行管理。而且Windows活動(dòng)目錄兼容LDAP協(xié)議,我們使用活動(dòng)目錄作為統(tǒng)一保存用戶信息的中央系統(tǒng),再通過LDAP協(xié)議使用程序訪問域控制器將用戶信息同步到統(tǒng)一認(rèn)證服務(wù)器中。
圖-3:企業(yè)內(nèi)部系統(tǒng)基本結(jié)構(gòu)
由上圖架構(gòu)所示,一方面常見的辦公系統(tǒng)(如代碼倉(cāng)庫(kù)、Wiki等)自身即支持LDAP認(rèn)證,通過配置Windows AD中的目錄/用戶搜索規(guī)則即完成對(duì)登錄用戶的認(rèn)證;另一方面自行開發(fā)的業(yè)務(wù)系統(tǒng)通過中央認(rèn)證服務(wù)器提供的接口間接的對(duì)Windows AD進(jìn)行登錄用戶的認(rèn)證,即一個(gè)用戶,一套密碼,在多個(gè)系統(tǒng)中都可使用。
- # auth.py
- class ActiveDirectoryAuthenticationBackEnd:
- def authenticate(self, username, password, request=None):
- if not username or not password:
- return None
- try:
- # 建立同域控的連接
- server = Server(settings.AD_SERVER_NAME, use_ssl=True)
- # 驗(yàn)證用戶使用的用戶名和密碼
- conn = Connection(server, "%s\\%s" % (settings.AD_DOMAIN, username), password, auto_bind=True, authentication=NTLM)
- # 認(rèn)證通過,返回系統(tǒng)中注冊(cè)的用戶,不存在則創(chuàng)建
- user = conn.bound and self.get_or_create_user(username, conn) or None
- return user
- except LDAPBindError:
- return None
- def get_or_create_user(self, username, conn=None):
- try:
- user = User.objects.get(username=username)
- except User.DoesNotExist:
- if conn is None:
- return None
- # 從域控向中央認(rèn)證系統(tǒng)中同步注冊(cè)一個(gè)新用戶
- if conn.search(USER_BASE_DN, "(sAMAccountName=%s)" % username, SUBTREE, attributes=["sn", "givenName"]):
- result = conn.response[0]["attributes"]
- user = User(username=username)
- user.first_name = result["givenName"]
- user.last_name = result["sn"]
- user.email = "%s@%s" % (username, settings.AD_EMAIL_HOST)
- user.save()
- else:
- return None
- return user
2.身份認(rèn)證
(1)通過外部應(yīng)用認(rèn)證
外部應(yīng)用,如即時(shí)通訊軟件釘釘?shù)龋@些應(yīng)用存有單獨(dú)的一套用戶憑證,通過應(yīng)用提供的免登服務(wù),將應(yīng)用中的用戶與統(tǒng)一認(rèn)證服務(wù)器中的用戶進(jìn)行一一對(duì)應(yīng),當(dāng)用戶在外部應(yīng)用中登錄后,自動(dòng)獲得在企業(yè)內(nèi)應(yīng)用的已登錄狀態(tài)。
(2)通過TOTP動(dòng)態(tài)驗(yàn)證碼認(rèn)證
OTP (One-Time Password) ,一次性密碼,也稱動(dòng)態(tài)口令。它是使用密碼技術(shù)實(shí)現(xiàn)在客戶端和服務(wù)器之間共享秘密的一種認(rèn)證技術(shù),是一種強(qiáng)認(rèn)證技術(shù),是增強(qiáng)目前靜態(tài)口令認(rèn)證的一種非常方便的技術(shù)手段,是一種重要的雙因素認(rèn)證技術(shù)。
TOTP (Time-base One-Time Password) ,基于時(shí)間的一次性密碼,也稱時(shí)間同步的動(dòng)態(tài)密碼。當(dāng)在一些用戶不方便輸入密碼或者忘記密碼的場(chǎng)景中,我們可以使用TOTP進(jìn)行認(rèn)證。服務(wù)器和用戶各自保管共同的密鑰,通過比對(duì)基于時(shí)間分片與哈希計(jì)算出的動(dòng)態(tài)數(shù)字驗(yàn)證碼即可完成對(duì)用戶身份的認(rèn)證。主流實(shí)現(xiàn)為Google Authenticator(Google身份驗(yàn)證器),阿里的身份寶也兼容該算法。
圖-4:TOTP算法圖示
(3)雙因子認(rèn)證
雙因子認(rèn)證(Two-Factor Authentication)是指結(jié)合密碼以及實(shí)物(信用卡、SMS手機(jī)、令牌或指紋等生物標(biāo)志)兩種元素對(duì)用戶進(jìn)行認(rèn)證的方法。
圖-5:動(dòng)態(tài)驗(yàn)證碼流程圖示
結(jié)合上面使用的TOTP驗(yàn)證碼,對(duì)于安全級(jí)別較高的應(yīng)用或資源路徑、或是系統(tǒng)探測(cè)到風(fēng)險(xiǎn)較高的操作時(shí),即可以對(duì)用戶重定向至雙因子認(rèn)證頁面,進(jìn)一步保障系統(tǒng)安全。
3.單點(diǎn)登錄
主要實(shí)現(xiàn)方式:
(1)共享 cookie
利用同一域名下的cookie共享為基礎(chǔ),將session id寫入共享cookie,在實(shí)現(xiàn)了后臺(tái)session共享存儲(chǔ)和訪問后,不同的應(yīng)用之間即實(shí)現(xiàn)了單點(diǎn)登錄。
(2)Broker-based (基于經(jīng)紀(jì)人)
在一個(gè)基于經(jīng)紀(jì)人的 SSO 解決方案中,有一個(gè)集中的認(rèn)證和用戶帳號(hào)管理的服務(wù)器。經(jīng)紀(jì)人能被用于進(jìn)一步請(qǐng)求的電子的身份存取。中央數(shù)據(jù)庫(kù)的使用減少了管理的代價(jià),并為認(rèn)證提供一個(gè)公共和獨(dú)立的"第三方"。例如 Kerberos 、 Sesame 、 IBM KryptoKnight (憑證庫(kù)思想 ) 等。
(3)Agent-based(基于代理人)
在這種解決方案中,有一個(gè)自動(dòng)地為不同的應(yīng)用程序認(rèn)證用戶身份的代理程序。這個(gè)代理程序需要設(shè)計(jì)有不同的功能。比如,它可以使用口令表或加密密鑰來自動(dòng)地將認(rèn)證的負(fù)擔(dān)從用戶移開。代理人被放在服務(wù)器上面,在服務(wù)器的認(rèn)證系統(tǒng)和客戶端認(rèn)證方法之間充當(dāng)一個(gè) " 翻譯 " ,例如 SSH 等。
(4)Token-based
口令認(rèn)證,比如 FTP 、郵件服務(wù)器的登錄認(rèn)證,這是一種簡(jiǎn)單易用的方式,實(shí)現(xiàn)一個(gè)口令在多種應(yīng)用當(dāng)中使用。
- 基于網(wǎng)關(guān)
- 基于 SAML
- Ticket-based(基于票據(jù))
4.BUC實(shí)踐
在我們的內(nèi)網(wǎng)應(yīng)用中,最終選擇了CAS協(xié)議作為單點(diǎn)登錄的方案。CAS(Central Authentication Service)是 Yale 大學(xué)發(fā)起的一個(gè)企業(yè)級(jí)的、開源的項(xiàng)目,旨在為 Web 應(yīng)用系統(tǒng)提供一種可靠的單點(diǎn)登錄解決方法。CAS開始于2001年,并在2004年12月正式成為JA-SIG的一個(gè)項(xiàng)目。
CAS的主要特點(diǎn)有:
- 開源
- 支持多種認(rèn)證機(jī)制:Active Directory、JAAS、JDBC、LDAP、X.509等
- 安全策略:使用票據(jù)(Ticket)來實(shí)現(xiàn)支持的認(rèn)證協(xié)議
- 支持授權(quán):可以決定哪些服務(wù)可以請(qǐng)求和驗(yàn)證服務(wù)票據(jù)
- 提供高可用性
- 支持多種客戶端及SDK: Java, .Net,PHP,Python,nodejs 等
- 服務(wù)端也有多種語言實(shí)現(xiàn)
(1)登錄驗(yàn)證流程
圖-6:用戶、CAS客戶端、服務(wù)端三方交互過程
- # urls.py
- # 在配置文件中將/cas 路徑掛載至根路徑,即可通過/cas/login來訪問中央認(rèn)證頁面,后臺(tái)的認(rèn)證過程會(huì)通過已有的認(rèn)證服務(wù)進(jìn)行
- urlpatterns = [
- ……
- url(r"^cas/", include("mama_cas.urls", namespace="cas")),
- ……
- ]
(2)安全擴(kuò)展
當(dāng)CAS服務(wù)端完成了對(duì)用戶和CAS客戶端的驗(yàn)證之后,CAS服務(wù)端將驗(yàn)證后的用戶信息傳輸給CAS客戶端(目標(biāo)應(yīng)用),同時(shí)也可根據(jù)配置返回該應(yīng)用下的附屬用戶信息,如用戶擁有的該應(yīng)用下的角色、權(quán)限和屬性。目標(biāo)應(yīng)用根據(jù)服務(wù)器返回的用戶信息進(jìn)一步檢查用戶可訪問的資源,適當(dāng)?shù)恼故緲I(yè)務(wù)視圖。
- # settings.py
- MAMA_CAS_SERVICES = [
- {
- 'SERVICE': '.*',
- 'CALLBACKS': [
- 'base.cas_callbacks.user_profile_attributes',
- 'security.cas_callbacks.user_security_attributes',
- # 按需加入回調(diào)函數(shù)
- ]
- }
- ]
- # user_profile_attributes
- # 返回用戶的基本信息
- def user_profile_attributes(user, service):
- return {
- “username”: get_username(user),
- “name”: get_display_name(user)
- }
- # user_security_attributes.py
- # 返回用戶在該業(yè)務(wù)/服務(wù)中擁有的角色、權(quán)限和訪問路徑信息
- def user_security_attributes.py(user, service):
- return {
- “roles”: get_roles(service, user),
- “permissions”: get_permissions(service, user),
- “urls”: get_urls(service, user)
- }
四、ACL使用技術(shù)和實(shí)現(xiàn)
在現(xiàn)代企業(yè),尤其是互聯(lián)網(wǎng)企業(yè)中,產(chǎn)品業(yè)務(wù)繁多,對(duì)數(shù)據(jù)安全、訪問控制都提出了很高的要求,基于用戶組織結(jié)構(gòu)、匯報(bào)線等傳統(tǒng)的分組模式已經(jīng)無法適應(yīng)和滿足多變的互聯(lián)網(wǎng)扁平化管理模式的需要,因此我們選擇了基于角色和權(quán)限的動(dòng)態(tài)分組來設(shè)計(jì)和實(shí)現(xiàn)企業(yè)中不用應(yīng)用可以共享的安全訪問管理系統(tǒng)。
1.權(quán)限
權(quán)限是針對(duì)資源和操作層面的最小安全訪問控制單元,例如:
- 按資源分,可以設(shè)置訪問設(shè)備A、訪問設(shè)備B等。
- 按操作分,可以設(shè)置讀取文件,寫入文件等。
例-1:權(quán)限分類示意圖
2.角色
角色是針對(duì)應(yīng)用使用者來設(shè)置的,可分為管理員、技術(shù)人員,普通用戶等,也可按區(qū)域分為華北員工、華南員工等。
角色是一系列權(quán)限的集合,擁有某角色的用戶即應(yīng)當(dāng)自動(dòng)擁有該角色下包含的權(quán)限。
圖-7:角色與權(quán)限關(guān)系示意圖
3.屬性
屬性是針對(duì)用戶層面下設(shè)置的獨(dú)立的安全設(shè)置,用來擴(kuò)展和實(shí)現(xiàn)更細(xì)粒度的自定義安全設(shè)置數(shù)據(jù),如將可訪問數(shù)據(jù)細(xì)化到數(shù)據(jù)庫(kù)中的表、數(shù)據(jù)表中的行、列上。
得益于JSON的兼容性,可以很靈活的存儲(chǔ)下這些自定義的結(jié)構(gòu)化數(shù)據(jù)。
例-2:用戶屬性示意圖
4.ACL實(shí)踐
1.數(shù)據(jù)庫(kù)建模
依模型圖可以看出,一個(gè)應(yīng)用可劃分多個(gè)角色、權(quán)限、路徑和屬性,其中角色又可包含同應(yīng)用下的權(quán)限和路徑。一個(gè)用戶對(duì)應(yīng)一個(gè)ACL,通過將不同的控制單元授予用戶,即可完成用戶的訪問控制配置。
2.配套功能設(shè)計(jì)
為了使訪問控制的整套機(jī)制良好的運(yùn)轉(zhuǎn)起來,相關(guān)輔助和配套的功能也是不可缺少的,這里列舉一些我們已經(jīng)投入使用的功能:
(1) 應(yīng)用授權(quán)的分級(jí)、分組管理
不用業(yè)務(wù)應(yīng)用的負(fù)責(zé)人可以分別對(duì)自己負(fù)責(zé)的業(yè)務(wù)進(jìn)行授權(quán)管理,不會(huì)產(chǎn)生沖突和越權(quán)。
(2)應(yīng)用菜單可見性、可訪問性的集成
業(yè)務(wù)應(yīng)用中的各子功能可以和預(yù)先設(shè)置的權(quán)限一對(duì)一或一對(duì)多映射,具有相應(yīng)權(quán)限的用戶才可以訪問和使用相應(yīng)的功能,前后臺(tái)設(shè)置保持同步。
(3)應(yīng)用下角色權(quán)限申請(qǐng)?zhí)峤弧⑹跈?quán)變更、授權(quán)完成等自動(dòng)化流程
基本的權(quán)限審批流減小了業(yè)務(wù)應(yīng)用負(fù)責(zé)人和使用者之間的溝通成本,同時(shí)也記錄了權(quán)限獲取的記錄,為日后的安全審計(jì)提供了可查的數(shù)據(jù)。
(4)應(yīng)用訪問日志收集、分析、審計(jì)、報(bào)警等
應(yīng)用訪問日志記錄了更為詳細(xì)的用戶訪問和操作記錄,為安全審計(jì)提供了更完備的數(shù)據(jù)支持,同時(shí)也支持以一定的邏輯來分析和發(fā)現(xiàn)潛在的安全泄露風(fēng)險(xiǎn)。
五、總結(jié)
本文總結(jié)介紹了針對(duì)企業(yè)內(nèi)網(wǎng)門戶的統(tǒng)一用戶管理、認(rèn)證和授權(quán)管理的系統(tǒng)的組成部分和常見實(shí)現(xiàn)方法。使用開源CAS產(chǎn)品搭建的統(tǒng)一身份認(rèn)證系統(tǒng)和定制化開發(fā)的安全訪問控制系統(tǒng)在企業(yè)內(nèi)網(wǎng)平臺(tái)上得到了很好地實(shí)踐和應(yīng)用,各部門的業(yè)務(wù)系統(tǒng)也已穩(wěn)定接入并使用,目前運(yùn)行良好。隨著系統(tǒng)規(guī)模和業(yè)務(wù)的增長(zhǎng),這一套平臺(tái)仍可能會(huì)面臨新的問題和挑戰(zhàn),這也使得我們?cè)谑占脩舴答伒耐瑫r(shí)不斷的進(jìn)行重構(gòu)和增強(qiáng),以保障企業(yè)業(yè)務(wù)的穩(wěn)定發(fā)展。
項(xiàng)目地址:
https://github.com/cangelzz/cas-demo-django-server
https://github.com/cangelzz/cas-demo-flask-client
https://github.com/cangelzz/cas-demo-java-client
作者簡(jiǎn)介:
程曉飛,高級(jí)全棧開發(fā)工程師 。2016年加入五阿哥鋼鐵電商平臺(tái)(wuage.com),曾供職于知名500強(qiáng)外企,精通Python,Java等多種編程語言及軟件開發(fā)技術(shù),在企業(yè)內(nèi)部Web系統(tǒng)、自動(dòng)化工具開發(fā)方面有多年經(jīng)驗(yàn)。
最后給自己代個(gè)鹽~~歡迎大家有空時(shí)翻下我牌子(知乎專欄“開發(fā)運(yùn)維”https://zhuanlan.zhihu.com/idevops),看看之前的文章,再點(diǎn)個(gè)贊唄,順便關(guān)注下。
【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為51CTO.com】