前言

在1个多用户系统中,系统安全是必须要考虑的问题。

不同用户在系统中的职责不同,能够访问的资源和可以执行的操作也不一样,例如普通用户可能只能查看数据,而管理员则可以修改或删除数据。

如果系统不对这些操作进行限制,就可能出现未授权访问、误操作甚至数据泄露等问题,因此出于系统安全考虑,大多数多用户系统都会引入权限控制机制

权限控制的核心是在用户访问当前系统的资源时,根据用户身份和系统中的权限规则,判断该用户是否有权执行某个操作,从而保证系统资源只被授权用户访问。

权限控制机制包含两类数据:用户身份信息权限策略信息,数据来源通常如下:

数据数据来源
用户身份信息 JWT / SSO / 用户系统
权限策略 权限数据库 / Casbin policy

权限控制是将用户身份信息与权限策略数据结合,通过权限判断流程决定是否允许访问资源。(基于数据做决策)

概念英文中文
AuthN Authentication 身份认证
AuthZ Authorization 授权
鉴权 Authorization check 权限校验

权限控制系统,有了用户身份信息和权限策略信息之后,就可以基于数据对当前用户访问当前系统资源的操作行为进行决策,标准流程如下:

请求进入系统
    ↓
AuthN(认证)
验证JWT token
    ↓
获取用户 identity
user = zhangsan
    ↓
AuthZ(鉴权/权限判断)
是否允许访问资源
   ↓
Casbin判断
   ↓
allow / deny

一、RBAC权限控制模型

RBAC即Role-Based Access Control基于角色的访问控制。

RBAC权限控制的关键是角色,权限不会直接分配到用户,而是通过角色间接分配到用户

系统不认用户身份,根据用户的角色授予用户不同的权限;

1.RBAC的4大模型

RBAC根据这套模型功能的复杂程度不同,由简单到复杂又可以分为RBAC-0、RBAC-1、RBAC-2、RBAC-3四个层级

1.1.RBAC-0

RBAC-0是最基础的,就是在用户与角色、角色与权限间建立关系,每种关系均为多对多。

1.2.RBAC-1

RBAC-1是在RBAC-0的基础上,增加了继承关系。就是一个角色只能有另一角色的部分权限,这个角色的权限大小受另一角色权限影响
简单说,角色2由角色1派生,那么角色2所有得权限必然小于角色1,角色1拥有权限1,2,而角色2只有拥有权限。

角色分级

 

1.3.RBAC-2

RBAC-2模型,其实就是通过限制滥用角色,防止角色冲突。

一个简单例子,你不能即是老板也是老板秘书,这样关系就乱了

这里就是用户3不能同时拥有角色2,3。

1.4.RBAC-3

RBAC-3是RBAC-1与RBAC-2的结合,就是既有继承关系,又有限制条件,基础都一样。

二、ABAC权限控制模型

当前90%的企业都在使用RBAC,但实际使用之后会有如下问题:

  • 1.角色爆炸(RoleExplosion)
  • 岗位一多,角色就指数级增长,管理员、部门管理员、项目管理员、只读管理员、临时管理员…最后角色比用户还多,根本管不住。
  • 2.权限控制僵硬不灵活,不支持动态判断
  • RBAC只看当前用户是什么角色,是啥角色就有啥权限,不支持:时间(上班才能访问)地点(内网才能访问)设备(必须是公司设备)数据属性(只能看自己部门的数据)→ 现代零信任、微服务完全不够用。
  • 3.权限颗粒度太粗
  • 想控制到:某个人只能看某条数据/某个接口只能调用几次,RBAC 做不到,只能硬加角色,越搞越乱。
  • 4.最小权限原则无法落地不安全
  • 职责划分模糊,易出现权限过大,为了省事,直接给管理员角色。最小权限原则很难落地。
  • 5.不支持基于资源属性隔离
  • 云原生场景租户、项目、环境一多,RBAC 组合爆炸,无法基于资源属性做隔离。
  • 6.权限维护成本极高
  • 人员变动、组织结构调整时:要删角色、建角色、重新绑定…运维成本巨大。

Attribute-Based Access Control基于属性的访问控制,即基于当前用户用于的权限属性进行随机应变。

1.Casbin权限检查引擎

ABAC的核心优势是多维度属性动态授权,但如果把这些属性判断逻辑硬编码到业务代码里,会导致代码耦合高、规则难维护、变更成本大。

而Casbin正是为解决这个痛点而生的工具,Casbin把ABAC的权限规则从业务代码中抽离出来,变成可配置、可管理的策略规则。

Casbin本质是一个通用的访问控制框架,而非单纯的ABAC实现,它的核心价值是:

  • 权限规则与代码解耦:把 谁(主体属性)在什么条件(环境属性)下对什么(资源属性)做什么(动作属性 的判断逻辑,从业务代码中抽离成策略规则(支持文件 / 数据库存储)。
  • 提供标准化的ABAC模型定义:通过Model文件定义ABAC的核心要素(主体、资源、动作、环境属性),策略规则基于Model动态配置,无需修改代码。
  • 灵活的规则引擎:内置表达式解析能力,支持复杂的属性判断(如时间、IP、数据归属、用户职级等),无需硬编码 if-else。

Casbin可以动态读取权限策略规则,是判断当前用户是否有权限做某事的引擎,不授予权限,只负责裁决也不需要自己写代码进行权限规则判断。

Casbin支持一下主流编程语言

image

2.LNMP架构权限管理

早期LNMP/Tomcat集群架构中,Nginx后面的多个后端程序(PHP/Java),通过共用1个Redis实例共享Session。

image

在LNMP架构下,所有PHP节点都连同1个Redis,每1次请求进来,都要去Redis查1次session,然后拿到用户信息、权限,再判断能不能访问。、

3.微服务架构权限管理

用户请求统一经过微服务API网关,网关负责校验JWT Token合法性,完成用户身份认证

用户请求
    ↓
API 网关(统一认证 & 路由)
    ↓
┌─────────┬─────────┬─────────┐
微服务A    微服务B    微服务C
│         │         │         |
本地权限 本地权限 本地权限 └─────────┴─────────┴─────────┘ ↑ 权限中心(统一配置)

网关解析出user_id、tenant_id等用户身份信息,通过请求头向下游透传。

权限策略在权限中心集中管理权限,并通过缓存/消息推送至各微服务本地。

微服务A→B→C 调用链路上,每个服务仅从请求头获取用户身份,基于本地缓存或Casbin等引擎完成本地权限判断,不再远程调用权限中心或Redis。

 

 

 

 

 

 

Casbin官网

posted on 2017-09-22 15:42  运维开发之路  阅读(12846)  评论(1)    收藏  举报