背景与漏洞分析
近期生产环境因Nacos控制台存在​​身份验证绕过漏洞​​(CVE-2023-6271)被扫描告警。该漏洞源于Nacos默认配置未修改secret.key,攻击者可通过默认密钥生成JWT Token绕过鉴权访问敏感接口。官方在2.2.3版本修复了此问题,但升级涉及权限体系重构和数据库表结构变更,需谨慎操作以避免服务中断。以下是完整升级流程与关键注意事项。


一、升级前准备

  1. 环境检查

    • 确认当前Nacos版本:通过指令查看容器镜像标签(2.0.3)

      docker ps
      
    • 备份数据:数据库和本地挂载的配置文件

      # 数据库备份
      mysqldump -uroot -p
      nacos_config > /var/lib/mysql/nacos_config20240407.sql
      
    • 停止旧容器:

      docker stop nacos-server && docker rm nacos-server
      
  2. 版本兼容性说明
    官方建议从2.0.3直接升级到2.2.3,但需​​手动执行数据库变更脚本​​(若跳过中间版本可能引发字段缺失问题)。


二、升级操作步骤

1. 拉取镜像与参数配置

由于Docker官方镜像拉取较慢,建议使用国内镜像源加速:

docker pull docker.1ms.run/nacos/nacos-server:v2.2.3

启动命令关键参数解析

docker run -d --name nacos-server \
  -p 8848:8848 \
  -e MODE=standalone \
  -e NACOS_AUTH_ENABLE=true \          # 强制开启鉴权
  -e NACOS_AUTH_TOKEN=base64编码后的密钥 \  # 需≥32字符原始字符串经Base64处理
  -e NACOS_AUTH_IDENTITY_KEY=XXX \     # 身份标识键(避免特殊字符!)
  -e NACOS_AUTH_IDENTITY_VALUE=XXX \   # 身份标识值(避免特殊字符!)
  -v /path/to/config:/home/nacos/conf \
  nacos/nacos-server:v2.2.3
2. 数据库表结构变更

执行以下SQL(从2.0.3升级需全部执行):

-- 新增加密字段与扩展信息
ALTER TABLE config_info ADD COLUMN encrypted_data_key VARCHAR(1024) DEFAULT '';
ALTER TABLE config_info_beta ADD COLUMN encrypted_data_key VARCHAR(1024) DEFAULT '';
ALTER TABLE his_config_info ADD COLUMN encrypted_data_key VARCHAR(1024) DEFAULT '';
ALTER TABLE his_config_info ADD COLUMN publish_type VARCHAR(50) DEFAULT 'formal';
ALTER TABLE his_config_info ADD COLUMN gray_name VARCHAR(50) DEFAULT NULL;
ALTER TABLE his_config_info ADD COLUMN ext_info LONGTEXT;
3. 客户端配置调整

在微服务中(以Spring Cloud为例),需添加鉴权信息:

yaml

复制

spring:
  cloud:
    nacos:
      discovery:
        username: nacos_user  # 自定义用户(非默认nacos!)
        password: strong_password
      config:
        username: ${spring.cloud.nacos.discovery.username}
        password: ${spring.cloud.nacos.discovery.password}

三、关键避坑指南

1. NACOS_AUTH_TOKEN配置
  • 原始字符串要求:需至少32位随机字符串(如openssl rand -hex 16生成),再经Base64编码。
  • 编码验证:可通过echo -n "原始密钥" | base64检查是否含换行符(需去除)。
2. 身份标识参数的特殊字符
  • 问题现象:客户端注册失败(如Seata报403错误),日志提示权限校验失败
  • 原因分析NACOS_AUTH_IDENTITY_KEY/VALUE#&等字符时,HTTP传输中会被转义,导致服务端解析不一致。这也是困扰题主很久的问题,排查了两天
  • 解决方案:仅使用字母、数字、下划线组合(如app_iddev_env)。
3. 数据库字段缺失报错

若启动后出现Unknown column 'encrypted_data_key'错误,说明表结构未更新,需重新执行SQL并重启服务。


四、升级验证

  1. 控制台访问
    访问http://localhost:8848/nacos,应强制跳转登录页,使用自定义账号登录(非默认nacos/nacos)。
  2. 客户端注册检查
    在服务日志中搜索Registering service... success,确认微服务正常注册。
  3. 漏洞修复验证
    尝试未授权访问/nacos/v1/auth/users?pageNo=1&pageSize=10,应返回403状态码
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐