權限控制速覽

背景

科普權限設計和原理。

資源權限控制,涉及到幾個方面

  1. 顆粒度
  2. 控制邏輯
  3. 組織架構

業內通用術語

術語 全稱 作用
XACML eXtensible Access Control Markup Language 定義了一種聲明性細粒度、基於屬性的訪問控制策略語言、架構和描述如何根據策略中定義的規則評估訪問請求的處理模型。

XACML 的目標之一是促進多個供應商的訪問控制實現之間的通用術語和互操作性。

XACML 主要是一種基於屬性的訪問控制系統 (ABAC),也稱爲基於策略的訪問控制 (PBAC) 系統,其中與用戶或操作或資源相關聯的屬性(數據位)被輸入到決定是否給定用戶可以以特定方式訪問給定資源。

基於角色的訪問控制(RBAC) 也可以在 XACML 中實現,作爲 ABAC 的特化
ABAC Attribute-based access control  訪問權限通過使用這些屬性結合在一起的政策,授予用戶。策略可以使用任何類型的屬性(用戶屬性、資源屬性、對象、環境屬性等)。此模型支持布爾邏輯,其中規則包含有關誰在發出請求、資源和操作的“IF, THEN”語句。
PBAC Policy-based access control 同上
@cols=1:RBAC @cols=1:role-based access control  @cols=1:是一種限制授權用戶訪問系統的方法。它是一種實現強制訪問控制(MAC)或自由訪問控制(DAC)的方法,關鍵是角色和組來控制,其中組是用戶的集合而不是權限的集合;三大原則

  1. 最小權限原則
  2. 責任分離原則
  3. 數據抽象

同類技術對比

方法 場景 @cols=1:結構 @cols=1:例子 優勢 劣勢
ABAC/PBAC
  1. api和微服務安全
  2. 應用安全
  3. 數據庫安全
  4. 數據安全
  5. 大數據安全
  6. 文件服務安全
@cols=1:
  1. 對象:用戶 ID、用戶職位、部門、入職時間、是否通過試用期等等
  2. 資源:資源創建日期、資源最新更新時間、資源類型(文件、訂單詳情數據)、資源分類(訂單管理、文章管理等)等
  3. 操作:新增、查看、刪除等
  4. 環境:IP 地址、時間等
@cols=1:初級前端工程師(對象)可以下載(操作)內網中的(環境)GitLab 前端源代碼(資源)
  1. 靈活
  2. 顆粒度小
  3. 除了角色和組,還可以通過用戶,資源(部門,分類等),行動,上下文(時間,位置,ip等)
  1. 基於 XACML 實現的 ABAC 模型在執行 效率、語法結構等方面存在不足
  2. 策略制定麻煩
  3. 靈活帶來複雜性,比如用戶id配置權限會破壞原來角色策略,難以控制權限訪問
RBAC 單系統或者應用如計算機用戶權限控制 @cols=1:權限→角色→用戶 @cols=1:notion image
  1. 穩定:從管理角度出發,角色是爲了解決特定問題而被創造的,也就是解決分工問題,而用戶的變動幾率比系統裏的角色大多了,角色這一定義相對會更加穩定一些。
  2. 簡單:用戶與權限的邏輯分離,使得權限只和角色相關。而根據上文,角色是被相關干係人或行業直接創造出來的,以角色爲核心的權限管理體系的理解成本和學習成本相對於新造概念會少上很多,非常利於在內部推廣。
因爲權限控制都和角色有關,會遇到一下問題:

  1. 臨時需要新增權限就只能新增角色,可能導致角色爆炸膨脹,難以管理;
  2. 新增資源也可能需要更改大部分角色配置,難以管理

授權框架

OPA @cols=1:Casbin
OPA @cols=1:Casbin
--- --- ------
定義 策略引擎,有自己的語言Rego @cols=1:權限控制庫,支持RBAC,ABAC,ACL等多種模型
架構特點 integration.png
@cols=1:Casbin架構.png
支持模型 Access Control

  1. RBAC
  2. ABAC
Envoy

  1. jwt
  2. url
  3. roles
Kubernetes

  1. label
  2. image safety
  3. ingress conflicts
有案例

代碼演練
@cols=1:ACL
ACL with superuser
ACL without users
ACL without resources
RBAC
RBAC with resource roles
RBAC with domains/tenants
ABAC
RESTful
Deny-override
Allow-and-deny
Priority
Explicit Priority
Subject-Priority


案例和代碼演練
@cols=1:在線演練 @cols=1:https://casbin.org/en/editor/ @cols=1:https://play.openpolicyagent.org/
@cols=1:定義語法 @cols=1:Rego,簡單 @cols=1:config語法,簡單

Snipaste_2021-12-28_16-23-33.png
@cols=1:接入形式 @cols=1:服務或者庫 @cols=1:庫
@cols=1:支持接入語言 @cols=1:主流語言 @cols=1:主流語言
@cols=1:策略讀取方式 @cols=1:bundle
@cols=1:csv,數據庫等,主要看adapter的使用
@cols=1:系統接入 @cols=1:kubernetes,envoy,ceph,kafka等 @cols=1:kubernetes,envoy
@cols=1:IDE支持 @cols=1:支持IDEA和vsc @cols=1:支持IDEA和vsc
可維護性 開源,golang編寫,6K stars,社羣活躍 @cols=1:開源,golang編寫,11K stars,社羣活躍
性能 @cols=1:Snipaste_2021-12-28_18-36-35.png
控制顆粒度 可根據需要定義 @cols=1:可根據需要定義
易用性 需要學習Rego語言,不過大概一個小時可以入門,上手快 @cols=1:需要熟悉config配置語法,加上內置函數之類,一個小時入門,上手快
@cols=1:接入istio難度 @cols=1:根據官方教程,設置邊車,然後通過添加標籤的形式接入,架構如下
envoy-ext-authz-flow.png特點:

  1. 通過標籤可以方便接入
  2. 標籤下的pod有一個opa邊車,避免單點故障,並且高性能,有緩存
  3. 可以通過設置bundle服務動態加載模型和數據
@cols=1:官方例子已經對接好Envoy的ext_authz,只需要修改裏面的讀取token和用戶信息的方式,就能直接替換掉原本PDP服務;

另外,文檔中提到的請求頭也不需要處理,因爲新版RequestAuthentication可以傳遞token過去;

另外例子沒有詳細說明可以怎麼接,可以參照opa的模型,也可以單獨一個PDP服務


參考

  1. XACML
  2. ABAC
  3. RBAC
  4. Linux 權限管理與訪問控制詳解(1)——基本概念和 DAC
  5. 關於 RBAC 和 ABAC 兩種權限設計的優缺點
  6. 使用 ABAC 鑑權