背景
Nacos 2.5.x 版本存在未授权漏洞问题,说是漏洞也可能不是,就是它有几个 API 接口 /nacos/v1/console/namespaces 和 /nacos/v2/console/namespace 不需要登录就能访问。
而它们是用来展示Nacos集群中存在的命名空间信息,默认是公开且不支持直接关闭或进行鉴权的。这是因为它们被设计为提供公开数据,类似云平台的Region信息,旨在允许用户查看和选择命名空间,也不算是漏洞。
解决办法
客户方漏扫认为是 Bug,需要升级。前面调研了最新版本 3.2.0 的功能,它内置了所有的数据库插件,但是实际测下来,关键功能操作有问题,感觉这是个没有准备好就发布的版本。
GitHub 上都找不到这个版本的 issues ,最后放弃了。选择了一个比较早的版本 3.1.2,自己打包 PG 数据库插件,这个版本的功能和界面跟 2.x 基本一致,只是多了 AI 几个新功能。而且官网插件也是基于这个版本的,编译一下就通过了。
编译流程
第一步,下载 nacos-plugin-develop 源码,然后修改 pom.xml 的 nacos 版本编号:
bash
<alibaba-nacos.version>3.1.2</alibaba-nacos.version>
第二步,nacos-datasource-plugin-ext 模块下的 nacos-postgresql-datasource-plugin-ext 模块打包。
第三步,拷贝 target 目录下的 original-nacos-postgresql-datasource-plugin-ext-1.0.0-SNAPSHOT.jar 原始包放到 nacos server 的 plugins 目录。这个包里面不含 PG 的驱动,可以根据目标数据库添加其他基于 PG 的数据库驱动。
第四步,拷贝 PG 驱动到 nacos server 的 plugins 目录,之所以这么麻烦是因为数据库可能不是标注的 PG,而是其他基于 PG 的产品,需要自己的驱动。
部署 nacos
第一步,数据库初始化,创建目标数据库,然后执行 conf 目录下的 pg_schema.sql 文件。需要注意,这个版本的初始化 SQL 里面缺少用户信息初始化语句。
第二步,进入 conf 目录,修改 application.properties 配置中的数据库连接信息。
bash
db.num=1
spring.datasource.platform=postgresql
db.url.0=jdbc:postgresql://xxx:xxx/nacos?tcpKeepAlive=true&reWriteBatchedInserts=true
db.user=xxx
db.password=xxx
db.pool.config.driverClassName=org.postgresql.Driver
第三步 ,进入 bin 目录,执行启动脚本:sh startup.sh -m standalone,3.x 版本默认需要开启认证,首次执行时,如果配置中没有认证信息,需要输入:

设置三个认证相关的配置后,查看启动结果。注意,nacos 3.x 版本需要 JDK 17。
访问 nacos
Nacos3.x 版本的控制台访问端口默认为 8080,首次登录访问地址为 http://IP:8080/

首次登录输入默认帐号密码 nacos/nacos 认证失败,比对 3.1.2 和最新版本 3.2.0 ,发现 初始化脚本里面缺少帐号信息的初始化语句:
bash
INSERT INTO users (username, password, enabled)
VALUES ('nacos',
'$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', true);
commit ;
执行后,再登录,除了 标注为 New 的新菜单,其他功能跟 2.5 一样,哇,熟悉的感觉!搞不懂为什么 3.2.x 新版本直接把 UI 风格完全变了!

启示录
我是 nacos 官网安装手册里面配置的链接路径下载的新版本 3.2.1 ,但是部署下来发现重要的配置管理功能在新的 UI 里面操作不了。但是以旧版本的界面打开是可以的,难道发布之前没有人测过新版的 UI 吗?还是说测试人员也看不过新版本 UI 直接点开旧版本测试的功能?
3.1.2 版本的 pg-schema.sql 里面缺少初始化帐号的脚本,之前2.x 版本是首次登录的时候,自动插入初始帐号的。新版本改动的时候把这个逻辑弄没了,又忘记更新初始化 SQL 了。
结论就是,3.1.2 版本还算稳定,客户端不动,还保留 nacos 2.x 版本基本不受影响。