为了 Nacos 提升安全能力,更好满足生产要求,需要设计账号权限体系,又要能兼容云上和阿里 内部场景。避免后续代码无法融合。 这块的挑战是要做好抽象,不然没法和不同账号权限体系打通。 默认我们提供⼀个简单的实现,当有类似于 RAM 这样的权限体系后,直接对接即可。
目前用的比较多的是 ABAC 和 RBAC 体系。目前阿里云采用 ABAC 体系,阿里内部采用 RBAC 体系。无论哪个体系,最终都是让账号有有限资源的权限,已达到访问控制的目的。不同的是关联 的方法,相同的都是抽象好 Nacos 的 Resource 和 Opers 。鉴权模块可以抽象可插拔,实现两种 都可以支持。
namespace+group+dataId 组成某⼀个授权资源,是最细能做到的水准,但是这么细的授权粒度, 会导致权限数据暴涨,有多少配置(100w),就会有多少授权数据,这样在分布式权限系统中是不 能搞定的,因为要有 100w 授权数据,意味着我每个 nacos 节点要监听 100w 个权限数据。因此权 限管控粒度在实际生产环境,只能控制到 group 级别。namespace+group。或者 namespace 级 别。
acs:config:region:namespace:group
acs: access controller system 缩写
config:产品名或者模块名
region:区域
namespace:命名空间
group:分组
授权⼀个命名空间下所有数据权限 acs:config:region:namespace:*
授权多个命名空间下⼀个分组权限 acs:config:region:*:group
由于使用 nacos 本质是读写数据,监听也是⼀种为了读取的行为。因此对于具体某⼀个数据,只要区分到读或者写(w/r)即可。
acs:config:region:namespace:group w/r
所有的数据请求,都走鉴权切面。 切面里面抽象好 spi,实现上面的鉴权行为。 不同权限模型,不 同场景,插拔不同的 spi。
rbac 账号体系由 账号 角色 权限,三元组构成,下面介绍该体系模型下,nacos 权限模型的最佳 实践。
应用账号与应用负责人能用⼀个账号吗?
不可以,因为人会流动,权限变动比较大。 因此⼀个应用的权限和应用开发负责人权限是分开的, 用不同的账号。 应用有开发,测试,owner,其实他们有对应应用使用资源的不同权限。因此应用 负责人与应用的权限也不对等,不能共用⼀个账号。
随着 Nacos 在生产使用,用户要求权限管理机制。考虑到做完整的账号权限管理机制,需要比较 大的代价。因此先做⼀个管理员账号的登录管理,从而降低安全风险。
需求
目前开源框架主要有 Spring Security 和 Apache Shiro,下面进行⼀下简单对比。 由于 Nacos 本身就是⼀个 spring-boot 的项目,为了更好的能适应外部的多种 sso 需求,和更细 粒度的权限控制台能力,选择 spring security。
登录流程现在主要有两种模式,⼀种是 session 模式,⼀种是 jwt 模式。为了更好的解决多端(移 动端等)和分布式会话保持,采用 jwt 模式。
目前看 jjwt 框架的 star 和 commiter 比较多: http://andaily.com/blog/?p=956
会话默认 30 分钟超时,暂时不可配置。
目前仅支持 LDAP,后续让社区贡献,如 SMAL。
登录成功之后,右上角显示登录用户名,和退出按钮。 点击退出,这个 session 失效。
目前发 sso 的时候我们 console server 都跑在⼀个进程里面。调用的接口都是 naming/config 的 openapi。 这些接口登录 filter 是不能拦截的,因为拦截需要登录,会影响 server 调用。 不 拦截,控制台的数据请求又拦截不了,登录请求也控制不了。
默认开启登录功能,可配置不开启登录功能,以便部分企业研发自己控制台,使用我们 console 的 openapi。
登录目前大部分都是 https,nacos 默认不支持 https,如果需要使用 https 功能,在 nacos 前 面配置 nginx,nginx 上做 443 端口转后端 8848 端口,nginx 上管理证书。