宜春的网站建设公司/手机网页设计制作网站
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 资源模型
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
具体实例
工程实现
所有的数据请求,都走鉴权切面。 切面里面抽象好 spi,实现上面的鉴权行为。 不同权限模型,不 同场景,插拔不同的 spi。
RBAC 设计实现
RBAC 账号权限组成
rbac 账号体系由 账号 角色 权限,三元组构成,下面介绍该体系模型下,nacos 权限模型的最佳 实践。
角色
首先从角色讲起,以便把账号,权限做⼀个大致的区分。
默认账号
账号体系映射
身份识别
账号区别
应用账号与应用负责人能用⼀个账号吗?
不可以,因为人会流动,权限变动比较大。 因此⼀个应用的权限和应用开发负责人权限是分开的, 用不同的账号。 应用有开发,测试,owner,其实他们有对应应用使用资源的不同权限。因此应用 负责人与应用的权限也不对等,不能共用⼀个账号。
Nacos 认证机制
随着 Nacos 在生产使用,用户要求权限管理机制。考虑到做完整的账号权限管理机制,需要比较 大的代价。因此先做⼀个管理员账号的登录管理,从而降低安全风险。
需求
- 支持定制启用或不启用登录系统,默认启动登录功能(有人自己做控制台,不想启用登录能力)
- SSO 支持 LDAP 即可(通过扩展机制)
- 用户退出
安全架构选型
目前开源框架主要有 Spring Security 和 Apache Shiro,下面进行⼀下简单对比。 由于 Nacos 本身就是⼀个 spring-boot 的项目,为了更好的能适应外部的多种 sso 需求,和更细 粒度的权限控制台能力,选择 spring security。
会话管理
登录流程现在主要有两种模式,⼀种是 session 模式,⼀种是 jwt 模式。为了更好的解决多端(移 动端等)和分布式会话保持,采用 jwt 模式。
Session 登录流程
Token 登录流程
jwt 框架选型
目前看 jjwt 框架的 star 和 commiter 比较多: http://andaily.com/blog/?p=956
会话超时
会话默认 30 分钟超时,暂时不可配置。
SSO 支持
目前仅支持 LDAP,后续让社区贡献,如 SMAL。
UI 设计
登录成功之后,右上角显示登录用户名,和退出按钮。 点击退出,这个 session 失效。
接口设计
接口信息:
数据库表设计
users 表:
roles 表:
Filter 拦截请求
目前发 sso 的时候我们 console server 都跑在⼀个进程里面。调用的接口都是 naming/config 的 openapi。 这些接口登录 filter 是不能拦截的,因为拦截需要登录,会影响 server 调用。 不 拦截,控制台的数据请求又拦截不了,登录请求也控制不了。
关于这个问题,有三个方案:
配置开关
默认开启登录功能,可配置不开启登录功能,以便部分企业研发自己控制台,使用我们 console 的 openapi。
传输通道
登录目前大部分都是 https,nacos 默认不支持 https,如果需要使用 https 功能,在 nacos 前 面配置 nginx,nginx 上做 443 端口转后端 8848 端口,nginx 上管理证书。