1. 程式人生 > >企業級專案|用Python進行web開發企業統一使用者認證和許可權控制平臺

企業級專案|用Python進行web開發企業統一使用者認證和許可權控制平臺

目前大家對Python的瞭解更多來源是資料分析、Ai、運維工具開發,在行業中使用Python進行web開發,同樣也是非常受歡迎的,例如:FaceBook,豆瓣,知乎,餓了麼等等,本文主要是介紹是利用Python進行web開發企業統一使用者認證和許可權控制平臺,提供使用者管理、認證和許可權接入的能力,避免各個系統重複建設造成資源的浪費。如果本文對你在python的進階中有幫助,希望多些點贊和關注是給作者最好的鼓勵 !

企業內網,建立在企業內部,為員工提供資訊的共享和交流,為業務提供運營和管理的支撐,已是當今企業資訊化建設必不可少的一個專案。隨著企業的規模越來越大,業務越來越廣,系統建設就顯得尤為重要。

統一認證系統是企業內網系統建設的基礎,主要實現使用者管理、身份認證、許可權管理和單點登入等功能,以解決企業內網系統建設過程中使用者定義模糊、使用者身份組織零亂、交叉許可權管理和應用系統出口多樣性等棘手的問題。

基於此,五阿哥運維技術團隊基於Python建設了統一認證(BUC:Back User Center)和許可權控制(ACL:Access Control List)平臺,這個系統技術架構圖如下:

企業級專案|用Python進行web開發企業統一使用者認證和許可權控制平臺

更多Python視訊、原始碼、資料加群960410445免費獲取

系統的功能

1.使用者管理

在企業中,每個使用者都有一個唯一的賬號進行登入,使用者的賬號和個人身份資訊(包含姓名、郵件等公共屬性)會集中儲存在內網統一認證系統裡。但對於同一個使用者在外部系統中的賬號,如微信、釘釘、Tower等第三方系統,統一認證系統也可以通過定時同步或實時查詢等方式獲取到使用者的資訊。

2.安全管理

對於儲存在企業內網中的使用者賬號進行認證是比較方便的,對於儲存在外部系統中的使用者賬號,可以通過定時同步或實時驗證等方式來驗證使用者的鑑權,最終統一以唯一的身份使使用者登入進入系統。

同時,企業內部存在多個不同的業務應用,以所有應用均接入統一認證平臺為基礎,各個業務系統的使用者認證採用單點登入認證模式,一次登入即可在各個業務子系統中完成自動認證並獲得相關授權。

3.應用管理

不同的業務系統會對使用者進行不同的角色劃分,不同的角色又會劃分出細粒度的許可權。角色許可權在統一認證系統中儲存,在一個地方就可以完成使用者授權資訊的設定。

4.系統接入

支援各種技術棧的系統接入,包含Java和Python等,其中各技術棧的SDK可以在Github專案中找到。

5.三方應用

第三方應用,包含郵箱,VPN,無線等直接進行SSO登入。

6.系統監控

對系統執行、操作、會話進行監控,保障在受到外部或者內部攻擊時,能夠及時發現,進行例項回溯。

7.系統審計

對平臺所有操作進行審計,在出現系統許可權錯亂或者安全問題的時候,對平臺操作進行審計。

系統架構設計

1.介面設計

企業內網的統一認證平臺建議基於B/S模式設計,後端使用Django框架以快速開發,用DB+LDAP方式完成使用者各類資訊的儲存,保障儲存和查詢效率。 統一認證的核心問題是鑑權中心和各子系統之間的通訊介面問題,使用者認證介面協議可以基於標準化HTTP/HTTPS方式實現,並對外提供不同語言的SDK(如Python CAS庫、Java Web過濾器等),使得第三方業務系統的接入不完全依賴於特定的開發環境。

2.安全設計

對於接入系統,認證中心介面協議呼叫採用HTTPS傳輸的方式,通訊安全問題將轉化到HTTPS傳輸的安全性問題上,而對於HTTPS通道的攻擊,可以由單獨的網路掃描模組專門負責監控。

對於統一認證和SSO介面引數的資訊保安,一方面網站可採用專有加密演算法對引數內容進行加密,另一方面,可以採用IP認證策略來保證對介面雙方的信任,系統通過通道安全和資訊加密雙保險的措施來保證統一認證體系的介面安全。

同時系統配有全方面的應用監控和訪問日誌的審計,當機器發生異常情況或日誌審計檢測到有可疑入侵行為時,會自動以多種方式通知到運維工程師和相關負責人。

BUC使用技術和實現

1.使用者管理

通常在企業中,每個使用者擁有一個唯一的身份標識,即使用者名稱。同時使用者在其他內網或外部應用也存在著對應的使用者,如果能使用同一個使用者身份最為方便;獨立的使用者可以通過關聯不同的系統的使用者使之對外呈現為一個使用者。使用者可以在不同的應用系統中使用,這一切的基礎是有一箇中央的系統來儲存和管理這些使用者。常見的解決方案有Windows活動目錄和LDAP。

(1)Windows活動目錄域服務

使用 Active Directory(R) 域服務 (AD DS) 伺服器角色,可以建立用於使用者和資源管理的可伸縮、安全及可管理的基礎機構,並可以提供對啟用目錄的應用程式(如 Microsoft(R) Exchange Server)的支援。

企業級專案|用Python進行web開發企業統一使用者認證和許可權控制平臺

 

AD的功能,來自微軟的介紹

AD DS 提供了一個分散式資料庫,該資料庫可以儲存和管理有關網路資源的資訊,以及啟用了目錄的應用程式中特定於應用程式的資料。 執行 AD DS 的伺服器稱為域控制器。 管理員可以使用 AD DS 將網路元素(如使用者、計算機和其他裝置)整理到層次內嵌結構。內嵌層次結構包括 Active Directory 林、林中的域以及每個域中的組織單位 (OU)。

域模式的最大好處就是單一的網路登入能力,使用者只要在域中有一個賬戶,就可以在整個網路中漫遊。活動目錄服務增強了信任關係,擴充套件了域目錄樹的靈活性。活動目錄把一個域作為一個完整的目錄,域之間能夠通過一種基於Kerberos認證的可傳遞的信任關係建立起樹狀連線,從而使單一賬戶在該樹狀結構中的任何地方都有效,這樣在網路管理和擴充套件時就比較輕鬆。

同時,活動目錄服務把域又詳細劃分成組織單元。組織單元是一個邏輯單元,它是域中一些使用者和組、檔案與印表機等資源物件的集合。組織單元中還可以再劃分下級組織單元,下級組織單元能夠繼承父單元的訪問許可權。每一個組織單元可以有自己單獨的管理員並指定其管理許可權,它們都管理著不同的任務,從而實現了對資源和使用者的分級管理。活動目錄服務通過這種域內的組織單元樹和域之間的可傳遞信任樹來組織其信任物件,為動態活動目錄的管理和擴充套件帶來了極大的方便。

(2)LDAP技術

輕型目錄存取協定(英文:Lightweight Directory Access Protocol,縮寫:LDAP)是一個開放的,中立的,工業標準的應用協議,通過IP協議提供訪問控制和維護分散式資訊的目錄資訊。

目錄服務在開發內部網和與網際網路程式共享使用者、系統、網路、服務和應用的過程中佔據了重要地位。例如,目錄服務可能提供了組織有序的記錄集合,通常有層級結構,例如公司電子郵件目錄。同理,也可以提供包含了地址和電話號碼的電話簿。

企業級專案|用Python進行web開發企業統一使用者認證和許可權控制平臺

LDAP目錄樹圖示,來自網路

LDAP協議是跨平臺的和標準的協議,因此應用程式就不用為LDAP目錄放在什麼樣的伺服器上操心了。實際上,LDAP得到了業界的廣泛認可,因為它是Internet的標準。廠商都很願意在產品中加入對LDAP的支援,因為他們根本不用考慮另一端(客戶端或服務端)是怎麼樣的。

LDAP伺服器可以是任何一個開放原始碼或商用的LDAP目錄伺服器(或者還可能是具有LDAP介面的關係型資料庫),因為可以用同樣的協議、客戶端連線軟體包和查詢命令與LDAP伺服器進行互動。

與LDAP不同的是,如果軟體廠商想在軟體產品中整合對DBMS的支援,那麼通常都要對每一個數據庫伺服器單獨定製。不像很多商用的關係型資料庫,你不必為LDAP的每一個客戶端連線或許可協議付費。大多數的LDAP伺服器安裝起來很簡單,也容易維護和優化。

(3)使用者管理實踐

根據國內企業辦公網路的實際情況,使用者計算機通常為Windows系統,通通接入到Windows活動目錄中進行管理。而且Windows活動目錄相容LDAP協議,我們使用活動目錄作為統一儲存使用者資訊的中央系統,再通過LDAP協議使用程式訪問域控制器將使用者資訊同步到統一認證伺服器中。

企業級專案|用Python進行web開發企業統一使用者認證和許可權控制平臺

企業內部系統基本結構

由上圖架構所示,一方面常見的辦公系統(如程式碼倉庫、Wiki等)自身即支援LDAP認證,通過配置Windows AD中的目錄/使用者搜尋規則即完成對登入使用者的認證;另一方面自行開發的業務系統通過中央認證伺服器提供的介面間接的對Windows AD進行登入使用者的認證,即一個使用者,一套密碼,在多個系統中都可使用。

企業級專案|用Python進行web開發企業統一使用者認證和許可權控制平臺

 

2.身份認證

(1)通過外部應用認證

外部應用,如即時通訊軟體釘釘等,這些應用存有單獨的一套使用者憑證,通過應用提供的免登服務,將應用中的使用者與統一認證伺服器中的使用者進行一一對應,當用戶在外部應用中登入後,自動獲得在企業內應用的已登入狀態。

(2)通過TOTP動態驗證碼認證

OTP (One-Time Password) ,一次性密碼,也稱動態口令。它是使用密碼技術實現在客戶端和伺服器之間共享祕密的一種認證技術,是一種強認證技術,是增強目前靜態口令認證的一種非常方便的技術手段,是一種重要的雙因素認證技術。

TOTP (Time-base One-Time Password) ,基於時間的一次性密碼,也稱時間同步的動態密碼。當在一些使用者不方便輸入密碼或者忘記密碼的場景中,我們可以使用TOTP進行認證。伺服器和使用者各自保管共同的金鑰,通過比對基於時間分片與雜湊計算出的動態數字驗證碼即可完成對使用者身份的認證。主流實現為Google Authenticator(Google身份驗證器),阿里的身份寶也相容該演算法。

企業級專案|用Python進行web開發企業統一使用者認證和許可權控制平臺

TOTP演算法圖示

(3)雙因子認證

雙因子認證(Two-Factor Authentication)是指結合密碼以及實物(信用卡、SMS手機、令牌或指紋等生物標誌)兩種元素對使用者進行認證的方法。

企業級專案|用Python進行web開發企業統一使用者認證和許可權控制平臺

動態驗證碼流程圖示

結合上面使用的TOTP驗證碼,對於安全級別較高的應用或資源路徑、或是系統探測到風險較高的操作時,即可以對使用者重定向至雙因子認證頁面,進一步保障系統安全。

3.單點登入

主要實現方式:

(1)共享 cookie

利用同一域名下的cookie共享為基礎,將session id寫入共享cookie,在實現了後臺session共享儲存和訪問後,不同的應用之間即實現了單點登入。

(2)Broker-based (基於經紀人)

在一個基於經紀人的 SSO 解決方案中,有一個集中的認證和使用者帳號管理的伺服器。經紀人能被用於進一步請求的電子的身份存取。中央資料庫的使用減少了管理的代價,併為認證提供一個公共和獨立的"第三方"。例如 Kerberos 、 Sesame 、 IBM KryptoKnight (憑證庫思想 ) 等。

(3)Agent-based(基於代理人)

在這種解決方案中,有一個自動地為不同的應用程式認證使用者身份的代理程式。這個代理程式需要設計有不同的功能。比如,它可以使用口令表或加密金鑰來自動地將認證的負擔從使用者移開。代理人被放在伺服器上面,在伺服器的認證系統和客戶端認證方法之間充當一個 " 翻譯 " ,例如 SSH 等。

(4)Token-based

口令認證,比如 FTP 、郵件伺服器的登入認證,這是一種簡單易用的方式,實現一個口令在多種應用當中使用。

  • 基於閘道器基於 SAMLTicket-based(基於票據)

4.BUC實踐

在我們的內網應用中,最終選擇了CAS協議作為單點登入的方案。CAS(Central Authentication Service)是 Yale 大學發起的一個企業級的、開源的專案,旨在為 Web 應用系統提供一種可靠的單點登入解決方法。CAS開始於2001年,並在2004年12月正式成為JA-SIG的一個專案。

CAS的主要特點有:

  • 開源支援多種認證機制:Active Directory、JAAS、JDBC、LDAP、X.509等安全策略:使用票據(Ticket)來實現支援的認證協議支援授權:可以決定哪些服務可以請求和驗證服務票據提供高可用性支援多種客戶端及SDK: Java, .Net,PHP,Python,nodejs 等服務端也有多種語言實現

(1)登入驗證流程

企業級專案|用Python進行web開發企業統一使用者認證和許可權控制平臺

使用者、CAS客戶端、服務端三方互動過程

企業級專案|用Python進行web開發企業統一使用者認證和許可權控制平臺

 

(2)安全擴充套件

當CAS服務端完成了對使用者和CAS客戶端的驗證之後,CAS服務端將驗證後的使用者資訊傳輸給CAS客戶端(目標應用),同時也可根據配置返回該應用下的附屬使用者資訊,如使用者擁有的該應用下的角色、許可權和屬性。目標應用根據伺服器返回的使用者資訊進一步檢查使用者可訪問的資源,適當的展示業務檢視。

企業級專案|用Python進行web開發企業統一使用者認證和許可權控制平臺

 

四、ACL使用技術和實現

在現代企業,尤其是網際網路企業中,產品業務繁多,對資料安全、訪問控制都提出了很高的要求,基於使用者組織結構、彙報線等傳統的分組模式已經無法適應和滿足多變的網際網路扁平化管理模式的需要,因此我們選擇了基於角色和許可權的動態分組來設計和實現企業中不用應用可以共享的安全訪問管理系統。

1.許可權

許可權是針對資源和操作層面的最小安全訪問控制單元,例如:

  • 按資源分,可以設定訪問裝置A、訪問裝置B等。按操作分,可以設定讀取檔案,寫入檔案等。

企業級專案|用Python進行web開發企業統一使用者認證和許可權控制平臺

例-1:許可權分類示意圖

2.角色

角色是針對應用使用者來設定的,可分為管理員、技術人員,普通使用者等,也可按區域分為華北員工、華南員工等。

角色是一系列許可權的集合,擁有某角色的使用者即應當自動擁有該角色下包含的許可權。

企業級專案|用Python進行web開發企業統一使用者認證和許可權控制平臺

圖-7:角色與許可權關係示意圖

3.屬性

屬性是針對使用者層面下設定的獨立的安全設定,用來擴充套件和實現更細粒度的自定義安全設定資料,如將可訪問資料細化到資料庫中的表、資料表中的行、列上。

得益於JSON的相容性,可以很靈活的儲存下這些自定義的結構化資料。

企業級專案|用Python進行web開發企業統一使用者認證和許可權控制平臺

使用者屬性示意圖

ACL實踐

資料庫建模

企業級專案|用Python進行web開發企業統一使用者認證和許可權控制平臺

 

依模型圖可以看出,一個應用可劃分多個角色、許可權、路徑和屬性,其中角色又可包含同應用下的許可權和路徑。一個使用者對應一個ACL,通過將不同的控制單元授予使用者,即可完成使用者的訪問控制配置。

配套功能設計

為了使訪問控制的整套機制良好的運轉起來,相關輔助和配套的功能也是不可缺少的,這裡列舉一些我們已經投入使用的功能:

(1)應用授權的分級、分組管理

不用業務應用的負責人可以分別對自己負責的業務進行授權管理,不會產生衝突和越權。

(2)應用選單可見性、可訪問性的整合

業務應用中的各子功能可以和預先設定的許可權一對一或一對多對映,具有相應許可權的使用者才可以訪問和使用相應的功能,前後臺設定保持同步。

(3)應用下角色許可權申請提交、授權變更、授權完成等自動化流程

基本的許可權審批流減小了業務應用負責人和使用者之間的溝通成本,同時也記錄了許可權獲取的記錄,為日後的安全審計提供了可查的資料。

(4)應用訪問日誌收集、分析、審計、報警等

應用訪問日誌記錄了更為詳細的使用者訪問和操作記錄,為安全審計提供了更完備的資料支援,同時也支援以一定的邏輯來分析和發現潛在的安全洩露風險。

五、總結

本文總結介紹了針對企業內網門戶的統一使用者管理、認證和授權管理的系統的組成部分和常見實現方法。使用開源CAS產品搭建的統一身份認證系統和定製化開發的安全訪問控制系統在企業內網平臺上得到了很好地實踐和應用,各部門的業務系統也已穩定接入並使用,目前執行良好。隨著系統規模和業務的增長,這一套平臺仍可能會面臨新的問題和挑戰,這也使得我們在收集使用者反饋的同時不斷的進行重構和增強,以保障企業業務的穩定發展。

專案地址:

https://github.com/cangelzz/cas-demo-django-server

https://github.com/cangelzz/cas-demo-flask-client

https://github.com/cangelzz/cas-demo-java-client