1. 程式人生 > >系統許可權控制體系

系統許可權控制體系


文 / 阿里P7工程師   嚴明明

目錄

  • 訪問控制的本質:

  • 訪問控制需要完成的兩個任務:

  • 訪問控制理論模型:

  • Java常用訪問控制框架:

  • 許可權系統的演變歷史:

  • 1: 標準的JAAS 時代;

  • 2: 單點登入(SSO)+介面鑑權時代;

  • 3: 統一登入(分散式Session) + 介面鑑權時代;

在 Web 應用開發中,安全一直是非常重要的一個方面。安全雖然屬於應用的非功能性需求,但是應該在應用開發的初期就考慮進來。

比如我們開放的功能頁面需要登入授權之後才能訪問,一些功能需要具備特定許可權的人才能操作;再比如我們開放了資料API介面,如果不做訪問控制,那麼任何人都可以呼叫,當被不法分子操作時將給我們帶來巨大的麻煩。

那麼在Java 整個體系中訪問控制是否有一套理論技術支撐呢

,我們是否可以做一個通用性的訪問控制系統來完成分散式系統架構下的複雜的許可權控制?

接下來會一一介紹。

訪問控制的本質

系統許可權控制 本質上是訪問控制(Access Control),那訪問控制的本質又是什麼呢?

其實就是合法的訪問受保護的資源,通俗的解釋就是“【誰】是否有可以對某個【資源】進行某種【操作】”;可以看出訪問控制的三個基本要素:主體(請求實體)、客體(資源實體)、控制策略(屬性集合)。

訪問控制需要完成的兩個任務

識別和確認訪問系統的使用者。 

決定該使用者可以對某一系統資源進行何種型別的訪問。

訪問控制理論模型
  • DAC&MAC模型

    • DAC:自主訪問控制;

    • MAC:強制訪問控制,一般用於多級安全軍事系統;

  • IBAC模型:

    • 基於身份的訪問控制模型

    • 舉例:登入驗證

    • 比如Java中使用cookie、session儲存回話標識;

  • RBAC模型:

    • 基於角色的訪問控制(Role-Based Access Control)

    • 使用者、角色、許可權

    • RBAC是ABAC的一種單屬性特例;

    • 1992年David F.Ferraiolo & D.Richard Kuhn在第十五屆國家電腦保安會議上提出;

    • 論文:https://csrc.nist.gov/projects/role-based-access-control

    • 舉例:豐趣-小二後臺的認證授權模型設計;

    • Spring Security、Apache Shiro、Ali ACL

  • ABAC模型:

    • https://csrc.nist.gov/projects/attribute-based-access-control

    • https://link.springer.com/chapter/10.1007/978-3-319-25645-0_14

    • http://profsandhu.com/dissert/xin_slides.pdf

    • 基於屬性的訪問控制模型 (Attribute Based Access Control)

    • 舉例:阿里雲、AWS;

    • 論文:

示意圖: 


基於RBAC許可權模型的常見資料庫模型設計:


設計的核心主題: 使用者、許可權、角色、使用者角色、角色許可權、使用者組、使用者組角色、操作審計 阿里巴巴登入鑑權與審計的三駕馬車:BUC、ACL、OpLog。

Java常用訪問控制框架
  • JAAS框架:

    • Authentication(鑑別), Authorization(授權),Accounting(計費);

    • Java認證和授權服務(Java Authentication and Authorization Service,簡稱JAAS)

    • 支援的框架:LDAP

    • 特點:面世時間早,使用受限,不建議使用;

  • Spring Security框架

  • Apache Shiro框架

許可權系統的演變歷史

1: 標準的JAAS 時代;

J2ee時代,Java提出了標準的鑑權服務,即jaas;通過簡單的容器配置和檔案配置,通過一個LDAP(可以用資料庫,只是效率不高),就可以提供一個極為高效便捷的許可權管控服務。這個模式不僅支援頁面管控,還支援ejb服務介面管控。其鑑權因為ldap的數倍於資料庫的查詢效率而無需任何快取,速度很快。但是伴隨著分散式服務化程序,應用的數量無限度增長,這種散落在各個容器的配置給容災和修改,都帶來了極大的挑戰,ldap的可讀化差,修改和編輯極為不便,當需求一旦個性化超過了樹能夠表達的模型便很難在適應。並且當ldap的資料爆炸式增長,且呈現28規律時(資料冷熱不均),或者如果需要頻繁的寫ldap,查詢效率會陡然下降。雖然這種方式目前並不流行的,但是由於歷史原因,還存留著使用這種方式的管控方式,所以我們在Spring Security或者阿里的ACL中都還能看到對JAAS的支援。

2: 單點登入(SSO)+介面鑑權時代;

把分散在各個系統的登入認證服務統一到一個系統中來,統一管控登入授權業務,使用者只要在一個系統中登入了,在其它系統中就沒必要再次登入了,這就是SSO。簡單的實現是登入授權系統部署在一臺機器上,不涉登入系統的多機部署,此架構具有單點風險;任何具備高可用思維的架構師都不會允許此風險存在,原因有二:1. 統一登入中心後,SSO成為極為核心的應用,如果SSO系統掛了,那麼需要登入的任何伺服器都無法正常提供服務;2. 單臺機器不具備抵抗登入風暴的能力; 所以SSO系統必須成為叢集部署模式。其次,在訪問控制模型上,也必須放棄JAAS方式,轉而使用RBAC模型;

3: 統一登入(分散式Session) + 介面鑑權時代;

SSO系統叢集部署後,面臨的首要問題就是Session的共享問題,比如使用者在sso-1 機器上登入了,下次訪問sso-2機器時,也必須是登入態的。分散式Session使用較多的方案為:Session集中管理;比如阿里巴巴基於Tair 快取體系的共享session體系tbsession。如果採用了session + cookie的方案,並且服務端叢集是多域名共享登入的話,那麼還需要提供cookie跨域同步的能力(解決cookie不能跨域的問題)。

-END-

開課吧西湖開始建立Java進階技術交流群,並邀請到BAT等一線企業資深工程師入群,大家有機會跟他們直接對話,獲得一手前沿技術及學習心得。入群方式:後臺回覆【加群】獲得入群二維碼更有阿里大量免費乾貨資源提供