nacos架构和原理(十一)——鉴权插件

nacos架构和原理(十一)——鉴权插件

  • Nacos 账号权限体系
    • 账号体系
  • 账号实体映射
  • 方案
    • Nacos 资源模型
    • Nacos 授权 resource
    • 授权 resource 组成
    • 不同级别授权资源组成
    • Nacos 授权 Opers
    • Nacos 具体权限定义
      • Opers 组成
      • 具体实例
      • 工程实现
  • RBAC 设计实现
    • RBAC 账号权限组成
    • 角色
    • 默认账号
    • 账号体系映射
    • 身份识别
    • 账号区别
  • Nacos 认证机制
    • 安全架构选型
    • 会话管理
    • Session 登录流程
    • Token 登录流程
    • jwt 框架选型
    • 会话超时
    • SSO 支持
    • UI 设计
    • 接口设计
    • 数据库表设计
    • Filter 拦截请求
    • 配置开关
    • 传输通道


Nacos 账号权限体系

为了 Nacos 提升安全能力,更好满足生产要求,需要设计账号权限体系,又要能兼容云上和阿里 内部场景。避免后续代码无法融合。 这块的挑战是要做好抽象,不然没法和不同账号权限体系打通。 默认我们提供⼀个简单的实现,当有类似于 RAM 这样的权限体系后,直接对接即可。

账号体系

目前用的比较多的是 ABAC 和 RBAC 体系。目前阿里云采用 ABAC 体系,阿里内部采用 RBAC 体系。无论哪个体系,最终都是让账号有有限资源的权限,已达到访问控制的目的。不同的是关联 的方法,相同的都是抽象好 Nacos 的 Resource 和 Opers 。鉴权模块可以抽象可插拔,实现两种 都可以支持。

nacos架构和原理(十一)——鉴权插件_第1张图片

账号实体映射

nacos架构和原理(十一)——鉴权插件_第2张图片

方案

Nacos 资源模型

nacos架构和原理(十一)——鉴权插件_第3张图片

Nacos 授权 resource

namespace+group+dataId 组成某⼀个授权资源,是最细能做到的水准,但是这么细的授权粒度, 会导致权限数据暴涨,有多少配置(100w),就会有多少授权数据,这样在分布式权限系统中是不 能搞定的,因为要有 100w 授权数据,意味着我每个 nacos 节点要监听 100w 个权限数据。因此权 限管控粒度在实际生产环境,只能控制到 group 级别。namespace+group。或者 namespace 级 别。

授权 resource 组成

acs:config:region:namespace:group
acs: access controller system 缩写
config:产品名或者模块名
region:区域
namespace:命名空间
group:分组

不同级别授权资源组成

授权⼀个命名空间下所有数据权限 acs:config:region:namespace:*
授权多个命名空间下⼀个分组权限 acs:config:region:*:group

Nacos 授权 Opers

由于使用 nacos 本质是读写数据,监听也是⼀种为了读取的行为。因此对于具体某⼀个数据,只要区分到读或者写(w/r)即可。

Nacos 具体权限定义

Opers 组成

acs:config:region:namespace:group w/r

具体实例

nacos架构和原理(十一)——鉴权插件_第4张图片

工程实现

所有的数据请求,都走鉴权切面。 切面里面抽象好 spi,实现上面的鉴权行为。 不同权限模型,不 同场景,插拔不同的 spi。

RBAC 设计实现

RBAC 账号权限组成

rbac 账号体系由 账号 角色 权限,三元组构成,下面介绍该体系模型下,nacos 权限模型的最佳 实践。

角色

首先从角色讲起,以便把账号,权限做⼀个大致的区分。
nacos架构和原理(十一)——鉴权插件_第5张图片

默认账号

nacos架构和原理(十一)——鉴权插件_第6张图片

账号体系映射

nacos架构和原理(十一)——鉴权插件_第7张图片

身份识别

nacos架构和原理(十一)——鉴权插件_第8张图片

账号区别

应用账号与应用负责人能用⼀个账号吗?

不可以,因为人会流动,权限变动比较大。 因此⼀个应用的权限和应用开发负责人权限是分开的, 用不同的账号。 应用有开发,测试,owner,其实他们有对应应用使用资源的不同权限。因此应用 负责人与应用的权限也不对等,不能共用⼀个账号。

Nacos 认证机制

随着 Nacos 在生产使用,用户要求权限管理机制。考虑到做完整的账号权限管理机制,需要比较 大的代价。因此先做⼀个管理员账号的登录管理,从而降低安全风险。

需求

  1. 支持定制启用或不启用登录系统,默认启动登录功能(有人自己做控制台,不想启用登录能力)
  2. SSO 支持 LDAP 即可(通过扩展机制)
  3. 用户退出

安全架构选型

目前开源框架主要有 Spring Security 和 Apache Shiro,下面进行⼀下简单对比。 由于 Nacos 本身就是⼀个 spring-boot 的项目,为了更好的能适应外部的多种 sso 需求,和更细 粒度的权限控制台能力,选择 spring security。

nacos架构和原理(十一)——鉴权插件_第9张图片

会话管理

登录流程现在主要有两种模式,⼀种是 session 模式,⼀种是 jwt 模式。为了更好的解决多端(移 动端等)和分布式会话保持,采用 jwt 模式。
nacos架构和原理(十一)——鉴权插件_第10张图片

Session 登录流程

nacos架构和原理(十一)——鉴权插件_第11张图片

Token 登录流程

nacos架构和原理(十一)——鉴权插件_第12张图片

jwt 框架选型

目前看 jjwt 框架的 star 和 commiter 比较多: http://andaily.com/blog/?p=956

会话超时

会话默认 30 分钟超时,暂时不可配置。

SSO 支持

目前仅支持 LDAP,后续让社区贡献,如 SMAL。

UI 设计

nacos架构和原理(十一)——鉴权插件_第13张图片

登录成功之后,右上角显示登录用户名,和退出按钮。 点击退出,这个 session 失效。

接口设计

接口信息:
nacos架构和原理(十一)——鉴权插件_第14张图片

数据库表设计

users 表:
nacos架构和原理(十一)——鉴权插件_第15张图片
roles 表:
nacos架构和原理(十一)——鉴权插件_第16张图片

Filter 拦截请求

目前发 sso 的时候我们 console server 都跑在⼀个进程里面。调用的接口都是 naming/config 的 openapi。 这些接口登录 filter 是不能拦截的,因为拦截需要登录,会影响 server 调用。 不 拦截,控制台的数据请求又拦截不了,登录请求也控制不了。

关于这个问题,有三个方案:
nacos架构和原理(十一)——鉴权插件_第17张图片

配置开关

默认开启登录功能,可配置不开启登录功能,以便部分企业研发自己控制台,使用我们 console 的 openapi。

传输通道

登录目前大部分都是 https,nacos 默认不支持 https,如果需要使用 https 功能,在 nacos 前 面配置 nginx,nginx 上做 443 端口转后端 8848 端口,nginx 上管理证书。

你可能感兴趣的:(架构,java,运维)