Nacos 权限控制介绍及实战

栏目: IT技术 · 发布时间: 4年前

内容简介:作者:

转自: 阿里巴巴中间件

作者: 朱鹏飞

Nacos权限控制设计方案

方案背景

Nacos 自开源依赖,权限控制一直需求比较强烈,这也反应了用户需求将 Nacos 部署到生产环境的需求。最新发布的 Nacos 1.2.0版本已经支持了服务发现和配置管理的权限控制,保障用户安全上生产。本文主要介绍 Nacos 权限控制的设计方案和使用指南。

什么是权限控制?

在分布式服务调用时,需要对未知的或者不受信任的请求来源的请求进行识别和拒绝。权限控制一般分为两个阶段:身份识别(Authentication)和权限识别(Authorization)。身份认证主要确定访问者的身份,权限识别则判断这个访问者是否有对应资源的权限。

在 Nacos 的场景中,配置管理的权限控制指的是设置某个配置能否被某个用户读写,这个比较好理解,没有权限的用户旧无法读取或者写入对应的配置。服务发现的权限控制指的是用户是否有权限进行某个服务的注册或者订阅,这里需要注意的是服务发现的权限控制只能够控制用户是否可以从 Nacos 获取到服务的地址或者在 Nacos 上修改服务的地址。但是如果已经获取到了服务的地址, Nacos 无法在服务真正调用时进行权限控制,这个时候的权限控制需要由服务框架来完成。

Nacos 权限控制介绍及实战

常见实现方式:

认证(Authentication)

  • 用户名+密码

  • Cookie(只适用于浏览器)

  • Session

  • Token(JWT,Oauth,LDAP,SAML,OpenID)

  • AK/SK

鉴权(Authorization)

  • ACL:规定资源可以被哪些主体进行哪些操作;

  • DAC:规定资源可以被哪些主体进行哪些操作 同时,主体可以将资源的权限,授予其他主体;

  • MAC:a. 规定资源可以被哪些类别的主体进行哪些操作 。b. 规定主体可以对哪些等级的资源进行哪些操作 当一个操作,同时满足a与b时,允许操作;

  • RBAC:a. 规定角色可以对哪些资源进行哪些操作 。b. 规定主体拥有哪些角色当一个操作,同时满足a与b时,允许操作;

  • ABAC:规定哪些属性的主体可以对哪些属性的资源在哪些属性的情况下进行哪些操作。

方案详情

Nacos 的权限控制,目标是能够满足用户基本的鉴权需求,同时能够保持扩展性,可以支持去对接用户自带的用户管理系统或者鉴权系统,包括后面和 K8s 生态以及 Service   Mesh 生态能够无缝的融合。基于这样的考虑,目前 Nacos 权限控制的设计是自带一个基本的实现,然后可以支持用户扩展。具体的设计如下。

模块设计

整体的模块设计是尽量将鉴权的逻辑抽象出来,不在服务发现模块或者配置管理模块添加相关的逻辑。通过配置文件可以选择当前使用的鉴权系统。Nacos 自带的认证系统使用 JWT Token ,自带的鉴权系统使用的是 RBAC 。

Nacos 权限控制介绍及实战

认证算法

对于用户来说,不管是在控制台还是在客户端,都是上传用户名和密码来获取一个 token ,然后后续的每一次到 Nacos 的请求都会带上这个 token 来表明身份。这个 token 会有一个失效时间,对于控制台来说,只需要直接提示用户重新登录即可,对于客户端则需要有一个定期到 Nacos 刷新 token 的逻辑。

Nacos 权限控制介绍及实战

鉴权算法

Nacos 自带的鉴权系统使用的是 RBAC 模型,可以在网上查询相关的资料。

数据模型

鉴权的数据模型也是基于标准的 RBAC 来设计的,分为用户、角色和权限三部分。用户就是由用户名和密码组成的用户信息,角色则是一个逻辑上的用户组, Nacos 启动时会自带一个全局管理员的角色,只有这个全局管理员的角色可以进行添加用户、添加角色、添加授权等操作,保证安全性。而权限则是由资源+动作来组成。

Nacos 权限控制介绍及实战

接口设计

以下接口涉及到登录和鉴权的所有逻辑,这些接口除了登录接口,其他接口都只能由全局管理员来调用。

用户管理

  • 创建用户:POST

    /nacos/v1/auth/users?username=xx&password=yy

  • 删除用户:DELETE

    /nacos/v1/auth/users?username=xx&password=yy

  • 更新用户: PUT

    /nacos/v1/auth/users?username=xx&oldPassword=yy&newPassword=zz

  • 登录:POST

    /nacos/v1/auth/users/login?username=xxx&password=yyy

角色管理

  • 创建角色/绑定用户到角色:POST

    /nacos/v1/auth/roles?role=xx&username=yy

  • 删除某个用户的角色:DELETE

    /nacos/v1/auth/roles?role=xx&username=yy

  • 获取用户的所有角色:GET

    /nacos/v1/auth/roles?username=xxx

权限管理

  • 给角色添加权限:POST

    /nacos/v1/auth/permissions?role=xxx&resource=yyy&action=zzz

  • 从角色删除权限:DELETE

    /nacos/v1/auth/permissions?role=xxx&resource=yyy&action=zzz

  • 获取某个角色的权限:GET

    /nacos/v1/auth/permissions?role=xxx

Nacos权限控制实战

安装 Nacos 1.2.0

1、部署包准备。可以直接下载安装包:

https://github.com/alibaba/nacos/releases/tag/1.2.0,

也可以将 Nacos master 分支 clone 下来进行源码编译:

mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U

2、安装包解压,然后使用 distribution/nacos-mysql.sql 进行数据库初始化,主要是新增了 users, roles , permissions三张表,

standalone模式使用 distribution/schema.sql 进行初始化。

3、Server 端打开权限控制开关。修改 con/application.properties 内容:

nacos.core.auth.enabled=true

这个开关采用了热加载模式,无需重启 Server 即可生效。因此当权限控制功能使用有异常时,可以直接回滚到不鉴权的模式。

使用权限控制

1、使用管理员账号登录 Nacos 控制台(如果页面提示错误,可以情况浏览器缓存刷新页面):

Nacos 权限控制介绍及实战

可以看到,左侧边栏增加了一个父菜单和三个子菜单,分别用于权限控制里的用户创建、角色创建以及权限管理。这个菜单栏只会在管理员登录的时候显示,也就意味着只有管理员才能进行权限的管理和分配。

2、管理用户。点击“用户列表”,进入用户管理页面,可以进行用户的创建、修改和删除:

Nacos 权限控制介绍及实战

3、管理角色。因为 Nacos 的自带的权限是基于角色来进行分配的,因此需要给创建好的用户绑定一些角色:

Nacos 权限控制介绍及实战

4、管理权限。角色创建好以后,就可以给这个角色赋予特定的权限了:

Nacos 权限控制介绍及实战

在“添加资源”对话框里,可以选择绑定的角色,命名空间资源以及对应的动作类型,例如在上图中,我们给角色 role1 绑定命名空间test的读写权限。然后又因为刚刚我们是将 user1 绑定到了 role1 上,那么 user1 这个用户就可以对 test 这个命名空间的资源进行读写操作了。

5、使用 user1 登录控制台。点击控制台右上角,退出 admin 账号,然后用刚才创建的 user1 进行登录:

Nacos 权限控制介绍及实战

如上图所示,首先是左侧的权限管理菜单消失了,因为当前用户不是管理员。其次是会弹出一个鉴权失败的提示框。不用担心,这个提示框意思是 user1 没有 public 命名空间的读权限,所以会弹出,但是不影响我们将命名空间切换到 test :

Nacos 权限控制介绍及实战

如上图所示,我们可以看到 test 命名空间的配置数据了,下面我们再来介绍客户端的使用。

6、先依赖最新的 nacos 1.2.0 客户端,然后在初始化时添加如下代码:

Properties properties = new Properties();

properties.put(PropertyKeyConst.NAMESPACE, "99a791cf-41c4-4535-9e93-b0141652bad0");

properties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");

// 配置用户名:

properties.put(PropertyKeyConst.USERNAME, "user1");

// 配置密码:

properties.put(PropertyKeyConst.PASSWORD, "pwd1");

ConfigService iconfig = NacosFactory.createConfigService(properties);

7、使用客户端进行正常的读写配置操作。

我们在招人

阿里巴巴云原生基础技术中台是隶属于阿里云基础产品事业部的核心研发团队,致力于打造稳定、标准、先进的云原生应用基础平台,推动行业面向云原生技术升级与革命。目前在招聘技术专家岗位,详情可参考:

http://www.posterhr.com/html/CkgpBwD6f?from=timeline&isappinstalled=0

(可以直接投递,也可以将简历直接发送到 water.lyl@alibaba-inc.com

作者信息:

朱鹏飞,GitHub ID:@nkorange,Nacos Maintainer,Nacos 开源负责人。阿里巴巴技术专家,阿里云 EDAS 注册中心 ANS 负责人,目前主要专注于服务发现、服务管理等领域。

热文推荐

为我开发的API添加华丽的外衣

技术人的副业之道

RedisTemplate:我不背锅,是你用错了

得亏了它,我才把潜藏那么深的Bug挖出来

惊讶! 缓存刚Put再Get居然获取不到?

好机会,我要帮女同事解决Maven冲突问题

Nacos 权限控制介绍及实战 Nacos 权限控制介绍及实战

Nacos 权限控制介绍及实战

如有收获,点个在看,诚挚感谢


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

网络多人游戏架构与编程

网络多人游戏架构与编程

格雷泽 (Joshua Glazer)、马达夫 (Sanjay Madhav) / 王晓慧、张国鑫 / 人民邮电出版社 / 2017-10-1 / CNY 109.00

本书是一本深入探讨关于网络多人游戏编程的图书。 全书分为13章,从网络游戏的基本概念、互联网、伯克利套接字、对象序列化、对象复制、网络拓扑和游戏案例、延迟、抖动和可靠性、改进的延迟处理、可扩展性、安全性、真实世界的引擎、玩家服务、云托管专用服务器等方面深入介绍了网络多人游戏开发的知识,既全面又详尽地剖析了众多核心概念。 本书的多数示例基于C++编写,适合对C++有一定了解的读者阅读。本......一起来看看 《网络多人游戏架构与编程》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

SHA 加密
SHA 加密

SHA 加密工具

html转js在线工具
html转js在线工具

html转js在线工具