當前位置: 華文世界 > 科技

SaaS產品的三種常見授權架構設計:ACL、RBAC和ABAC

2024-09-05科技

在軟件工程中,就像其他很多領域一樣,設計和實作一個授權系統有很多種方法。授權系統為套用增加了一個安全和驗證的層級,讓你可以控制誰能存取哪些資源,確保只有授權的使用者才能看到特定的內容。

授權顯然是大多數系統中的關鍵功能之一,所以在設計系統時,這部份真的需要認真對待。

你可以自己發明一種授權機制,但利用利用他人已有的解決方案往往能省下不少時間和精力。

對於SaaS產品,常見的授權設計主要有以下三種。每種方案都有它的優點和不足,所以它們各自適用的場景也不同。

首先需要說明的是,這些授權模型都不是一成不變的。

這裏討論的每個例子僅僅是實作這種授權方式的一種可能方法。

存取控制列表

ACL(Access Control List,存取控制列表)可能是最簡單的授權模型了。

它透過維護一個使用者列表,來記錄哪些使用者被允許執行特定操作。

對於那些不需要特別細粒度許可權控制的簡單系統,ACL 是個有效的授權方式。

舉個例子,假如你在系統裏實作了基本的 ACL 授權,下面這個圖表就展示了你的數據庫架構可能的樣子:

圖中的標簽是「使用者」和「許可權」。一個使用者可以有0個或多個許可權。使用這種設計,許可權是比較隨意的,使用者與許可權之間的連線也很靈活。

ACL 的主要優勢在於它的簡單性。對於很多系統來說,實施和維護起來都相對快速且成本低。如果你的系統需求不復雜、規模較小,采用這種設計確實挺好,因為它不需要太多復雜的功能。

但正因為 ACL 簡單,最大的缺點恰恰是它的簡單性。隨著系統的成長和擴充套件,ACL 的簡單性可能會變成問題。

因為許可權是直接和特定使用者關聯的,所以當有新使用者加入時,可能得手動給他們分配許可權。而且,如果你需要為所有現有使用者添加或刪除許可權,這項工作也會變得很繁重。

當你的系統需求超出了簡單ACL的能力時,你可能就需要升級到更復雜的設計模式,比如 RBAC(基於角色的存取控制)。

基於角色的存取控制

RBAC(Role-Based Access Control,基於角色的存取控制)比ACL更復雜,但也更強大、更靈活,特別適合某些特定的場景。

透過RBAC,你可以為使用者分配角色,然後根據這些角色來決定他們應該被允許存取的內容。

舉個例子,你可以設定一個「財務」角色,授予該角色存取系統中財務部份的許可權,或者設定一個「支持」角色,授予其存取幫助台相關內容的許可權。

角色的具體工作方式取決於你的實作需求。你可以讓一個使用者擁有多個角色,也可以根據具體場景限制使用者只能擁有一個角色。

下面這個圖表展示了如果你實作了 RBAC,數據庫架構可能會是什麽樣子:

在這種設計中,有三個主要元素:「 使用者 」、「角色 」和「許可權 」,它們之間透過 中間表 來建立關聯。

這種結構允許一個使用者關聯多個角色,每個角色則可以分配多個許可權。許可權通常是相對廣泛的,比如「檢視報告」或「編輯使用者」,而不是針對單個資源的細粒度許可權(這更屬於 ABAC的領域,稍後會提到)。

RBAC有幾個顯著的優點,首先是實作的相對簡單性。雖然比起簡單的ACL,RBAC的設計稍微復雜一些,但它依然比ABAC和其他高級授權模型要簡單得多。這使得它更容易實作,且長期的維護和支持成本較低。

RBAC的簡單性也表現在日常使用中。因為許可權都是透過角色繫結的,你在為新使用者設定存取許可權時,通常只需要為其分配合適的角色即可,而不需要記住復雜的規則。

這和ACL 不同,ACL中可能需要手動修改使用者許可權。

RBAC的一個主要風險是可能會出現所謂的「 角色爆炸 」問題。當系統需要越來越細粒度的控制時,通常的解決方案是建立更多的角色。

這會導致兩個問題:

  1. 多角色管理的復雜性 :如果系統允許使用者同時擁有多個角色,為了滿足各種許可權需求,可能會建立大量新角色,每個角色可能只有少量的許可權。這會增加管理和維護的復雜性。
  2. 重復角色的增多 :如果系統不允許使用者擁有多個角色,那麽為了滿足不同使用者的需求,可能會導致建立大量幾乎相同但又稍有不同的角色。這不僅讓系統難以管理,還增加了角色的重復和冗余。

這兩個問題都不理想,正是因為RBAC在處理細粒度許可權方面的局限性。這也意味著,當系統需要更精細的許可權控制時,RBAC可能不再是最佳選擇,可能需要考慮更復雜的模型,如內容基存取控制(ABAC)。

基於內容的存取控制

ABAC(Attribute-Based Access Control)是一種存取控制模型,它根據使用者、資源、環境等內容來決定是否授予存取許可權。

與傳統的授權模型(如 ACL 和 RBAC)相比,ABAC 提供了更細粒度的許可權控制,允許基於上下文資訊進行動態決策。

1.核心概念

ABAC 的核心在於透過內容來控制存取許可權。這些內容可以來自於多種來源:

  • 使用者內容 :使用者的身份、角色、組織部門、職位等資訊。
  • 資源內容 :資源的類別、分類、所有者、敏感性等級等資訊。
  • 環境內容 :存取的時間、地點、器材類別等外部因素。
  • 這些內容用於制定存取控制策略,決定使用者是否可以存取特定的資源。

    2.如何工作

    在 ABAC 模型中,授權決策是基於一組定義好的存取控制策略,這些策略通常使用邏輯運算式來描述。策略的形式可以是規則、條件或邏輯運算子,結合了使用者、資源和環境的內容。例如,策略可能會規定:

  • 「只有當使用者屬於‘財務部門’並且存取的資源是‘財務報告’時,使用者才被允許存取該報告。」
  • 「在工作時間內(上午9點到下午5點),使用者才能存取敏感資訊。」
  • 3.數據庫架構範例

    實作ABAC時,數據庫通常包含以下表:

  • 使用者表 :儲存使用者的基本資訊和內容。
  • 角色表 (可選):如果系統中使用角色,還需記錄角色與內容的關系。
  • 資源表 :記錄系統中所有資源的內容。
  • 環境表 :記錄與環境相關的數據,如時間段、地理位置等。
  • 策略表 :定義存取控制策略,包括內容和條件。
  • 下面是一個可能的數據庫架構,展示了如何實作ABAC:

    ABAC非常靈活,但也充滿了主觀性。因為授權評估是基於系統中定義的內容,沒有一個通用的架構適用於所有情況。

    在上面的例子中,你可以看到有「使用者」以及「角色」、「區域」和「客戶」,還有客戶與區域以及數據的關聯。

    在這種設計下,你可能需要對使用者存取客戶數據的許可權進行控制,比如在以下條件都滿足時才允許存取:

  • 使用者具有管理員角色
  • 使用者具有客戶支持角色
  • 使用者與數據所屬的客戶在同一區域
  • 數據未被標記為敏感
  • 這些條件基於物件的內容,而不是具體的存取記錄或許可權,這正是 ABAC 的核心特征。

    雖然這種設計的實作難度更大,但它的強大之處在於,對於復雜業務邏輯的大型組織來說,ABAC通常是不可或缺的。

    ABAC的優勢在於它的靈活性。透過基於內容來建立存取策略,組織可以對誰能存取什麽資源進行非常細致的控制。而且,ABAC 的擴充套件性也非常好,因為當新使用者加入時,你只需為他們分配合適的內容,而無需修改現有的策略。這確保了他們可以存取所需的資源來執行工作。

    然而,ABAC也有其局限性。要決定是否采用 ABAC作為你的授權設計,關鍵在於權衡成本——不僅是財務上的投入,還包括時間、實作的復雜度,以及後續維護的難度。

    由於 ABAC的設計較為復雜,如果你從零開始實作,可能會耗費更多的精力。

    總結

    以上是三種不同的 SaaS 套用授權實作模型。每種模型都有自己的優缺點。

  • ACL :簡單直觀,適用於小型系統。它易於實作,但當系統規模擴大時,許可權管理可能變得繁瑣,擴充套件性較差。
  • RBAC :透過將許可權與角色關聯,解決了ACL的一些局限。它適合小型到中型系統,尤其是那些超出了ACL能力的系統。然而,RBAC在處理細粒度許可權時有所不足,可能會面臨「角色爆炸」的問題。
  • ABAC :提供了更高的靈活性和細粒度的許可權配置,適合復雜的業務需求。盡管ABAC能夠滿足高復雜度的授權需求,但其實作和維護的復雜性以及成本也較高。