你的 Nacos 可能在“裸奔“——生产环境鉴权配置完整指南

你的 Nacos 可能在“裸奔“——生产环境鉴权配置完整指南 你的 Nacos 可能在裸奔——生产环境鉴权配置完整指南文章目录你的 Nacos 可能在裸奔——生产环境鉴权配置完整指南背景为什么要关注 Nacos 鉴权30 秒验证你的 Nacos 是否在裸奔项目中 Nacos 的使用方式我们的踩坑时间线Nacos Server 端开启鉴权修改 Nacos 配置文件关键参数说明默认值的危害Docker 部署方式重启验证Spring Cloud 客户端适配配置方式本项目需要修改的模块密码安全管理Nacos 控制台用户管理修改默认密码附完整操作代码创建专用账号命名空间级别权限控制版本兼容速查安全加固 Checklist下一步背景为什么要关注 Nacos 鉴权30 秒验证你的 Nacos 是否在裸奔# 未开启鉴权时任何人可以直接拉取配置curlhttp://your-nacos:8848/nacos/v1/cs/configs?dataIdapplication-dev.yamlgroupDEFAULT_GROUPtenantdev# 返回内容可能包含# spring.datasource.passwordroot123456# spring.redis.passwordredis2024# aliyun.access-key-secretxxxxxx如果你在公网 Nacos 上执行这条命令能拿到结果现在就停下来去改然后再回来继续读。Nacos 作为微服务架构中最常用的注册中心和配置中心默认安装后鉴权是关闭的。这意味着任何人只要能访问 Nacos 的 IP 端口就能读取所有配置包括数据库密码、Redis 密码、第三方密钥等敏感信息。可以随意注册/下线服务实例造成流量劫持或服务不可用。可以修改配置直接影响线上运行行为。生产环境中这是一个严重的安全风险。本文结合一个真实的 Spring Cloud Alibaba 项目基于 YuDao Cloud 的 IoT 环境控制系统详细介绍 Nacos 鉴权的完整配置方法。项目中 Nacos 的使用方式在本项目中Nacos 同时承担注册中心和配置中心两个角色。以网关模块和业务服务为例典型配置如下# yudao-gateway/src/main/resources/application.yamlspring:cloud:nacos:server-addr:127.0.0.1:8848discovery:namespace:devconfig:namespace:dev注册/配置注册/配置注册/配置注册/配置注册/配置⚠️ 未鉴权时任何人可访问yudao-gatewayNacos Server8848yudao-module-iotkityudao-module-iotserviceyudao-module-huazhiqiaoyudao-server 攻击者我们的踩坑时间线Day 1开启nacos.core.auth.enabledtrue重启 Nacos控制台正常登录。以为搞定了下班。Day 1 晚上监控告警所有服务注册失败。日志里刷屏NacosException: ErrCode: -401, ErrMsg: unknown user!原因只改了 Server忘了给 6 个微服务客户端加username/password。Day 2客户端全部加上认证信息服务恢复。但安全团队扫描报告“Nacos 使用默认 Token 密钥存在 CVE-2021-29441 风险”。原因token.secret.key没改用的还是官方默认值。Day 3替换密钥同时发现server.identity也是默认值QVD-2023-6271。一并修复安全扫描通过。Nacos Server 端开启鉴权修改 Nacos 配置文件编辑 Nacos 安装目录下的conf/application.properties### 开启鉴权核心开关默认 false nacos.core.auth.enabledtrue ### 鉴权类型目前仅支持 nacos nacos.core.auth.system.typenacos ### 自定义 Token 密钥Base64 编码至少 32 字符原文 ### 重要必须替换默认值否则等于没开鉴权 nacos.core.auth.plugin.nacos.token.secret.keyeW91ci1jdXN0b20tc2VjcmV0LWtleS1hdC1sZWFzdC0zMi1jaGFyYWN0ZXJz ### Token 有效期秒默认 180005小时 nacos.core.auth.token.expire.seconds18000 ### 服务端身份识别 key/value集群节点间通信用 ### 同样必须自定义不能为空或使用默认值 nacos.core.auth.server.identity.keymyServerIdentity nacos.core.auth.server.identity.valuemy-unique-identity-value-2024关键参数说明参数说明注意事项nacos.core.auth.enabled鉴权总开关设为true才生效token.secret.keyJWT 签名密钥必须修改默认值Base64 编码原文 ≥ 32 字符server.identity.key/value集群间身份识别必须修改默认值防止伪造节点加入集群token.expire.secondsToken 有效期按安全策略调整不宜过长默认值的危害Nacos 1.x/2.x 历史上多次因默认密钥被利用导致安全漏洞CVE-2021-29441绕过鉴权直接访问 APIQVD-2023-6271利用默认identity绕过鉴权默认secret.keySecretKey012345678901234567890123456789012345678901234567890123456789是公开的任何人可以用它伪造 Token⚠️ 开启鉴权但不修改默认密钥 形同虚设。Docker 部署方式如果通过 Docker 部署 Nacos用环境变量配置# docker-compose.yamlservices:nacos:image:nacos/nacos-server:v2.2.3environment:-NACOS_AUTH_ENABLEtrue-NACOS_AUTH_TOKENeW91ci1jdXN0b20tc2VjcmV0LWtleS1hdC1sZWFzdC0zMi1jaGFyYWN0ZXJz-NACOS_AUTH_IDENTITY_KEYmyServerIdentity-NACOS_AUTH_IDENTITY_VALUEmy-unique-identity-value-2024ports:-8848:8848-9848:9848重启验证重启 Nacos 后直接访问http://nacos-ip:8848/nacos/v1/cs/configs?dataIdxxxgroupxxx应返回403或提示鉴权失败说明配置生效。Spring Cloud 客户端适配Nacos Server 开启鉴权后所有连接它的微服务客户端必须配置用户名和密码否则会出现NacosException: Client not connected, current status: STARTING ErrCode: -401, ErrMsg: unknown user! caused: Request nacos server failed配置方式在每个微服务的配置文件中添加username和passwordspring:cloud:nacos:server-addr:127.0.0.1:8848username:nacos# Nacos 控制台的用户名password:your-password# Nacos 控制台的用户密码discovery:namespace:devconfig:namespace:devspring: cloud: nacos: server-addr: 127.0.0.1:8848 username: ${NACOS_USERNAME:nacos} password: ${NACOS_PASSWORD:} discovery: namespace: dev config: namespace: dev​注意username/password放在spring.cloud.nacos层级下对discovery和config同时生效。也可以分别配置spring:cloud:nacos:discovery:server-addr:127.0.0.1:8848namespace:devusername:nacospassword:your-passwordconfig:server-addr:127.0.0.1:8848namespace:devusername:nacospassword:your-password本项目需要修改的模块根据项目结构以下模块都连接了 Nacos全部需要适配模块配置文件位置yudao-gatewayyudao-gateway/src/main/resources/application.yamlyudao-serveryudao-server/src/main/resources/application.yaml/application-local.yamlyudao-module-iotkit-bizsrc/main/resources/application-local.yamlyudao-module-iotservice-bizsrc/main/resources/application-local.yamlyudao-module-huazhiqiao-biz对应的application*.yaml其他微服务模块各自的application*.yaml密码安全管理不要在 Git 中明文存储 Nacos 密码。推荐方案方案一环境变量替换spring:cloud:nacos:username:${NACOS_USERNAME:nacos}password:${NACOS_PASSWORD:}启动时注入exportNACOS_USERNAMEnacosexportNACOS_PASSWORDyour-secure-passwordjava-jaryudao-gateway.jar方案二Nacos 自身配置管理bootstrap 阶段的鸡生蛋问题bootstrap 阶段需要连接 Nacos 读取配置所以 Nacos 自身的账号密码无法通过 Nacos 配置中心下发。只能用环境变量、启动参数或密钥管理服务解决。方案三Jasypt 加密spring:cloud:nacos:password:ENC(加密后的密文)配合jasypt-spring-boot使用启动时传入主密钥。Nacos 控制台用户管理开启鉴权后务必做好控制台的用户管理修改默认密码附完整操作代码方式一控制台修改推荐登录后 → 权限控制 → 用户列表 → 编辑 nacos 用户 → 修改密码方式二数据库直接修改// 生成 BCrypt 密文Spring Security 方式importorg.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;publicclassPasswordGenerator{publicstaticvoidmain(String[]args){BCryptPasswordEncoderencodernewBCryptPasswordEncoder();StringnewPasswordYourSecurePassword2024;Stringencryptedencoder.encode(newPassword);System.out.println(加密后密码encrypted);// 输出示例$2a$10$Rv3wfrJDtXxQrKw8kqTz8OpF...}}-- 更新数据库Nacos 使用内置 Derby 或外置 MySQLUPDATEusersSETpassword$2a$10$刚才生成的密文WHEREusernamenacos;-- 验证更新SELECTusername,passwordFROMusersWHEREusernamenacos;方式三使用 Nacos 官方提供的密码工具# Nacos 2.2 提供命令行工具cdnacos/binshpassword-reset.sh-unacos-pNewPassword123创建专用账号为不同服务或团队创建独立账号按需分配命名空间权限账号用途权限admin管理员全部读写app-readonlyCI/CD 或监控只读app-gateway网关服务指定 namespace 读写app-iotIoT 业务模块指定 namespace 读写命名空间级别权限控制在控制台「权限控制 → 角色管理」中可以细粒度控制每个角色对不同 namespace 的读/写权限实现最小权限原则。版本兼容速查Spring Cloud AlibabaNacos ClientNacos Server鉴权支持备注2021.0.4.02.0.4≥ 2.0.4✅ 完整本项目使用2021.0.1.02.0.1≥ 2.0.1⚠️ Token 刷新有 Bug建议升级2.2.x1.4.x1.4.x⚠️ 仅基础鉴权不推荐生产使用如果你的 Nacos Client 2.0.4开启鉴权后可能遇到 Token 过期不自动续期的问题。安全加固 Checklist复制到你的运维文档逐项打勾P0开启nacos.core.auth.enabledtrueP0替换token.secret.key不是默认的SecretKey0123P0替换server.identity.key/value不为空且非默认P0修改nacos用户默认密码不是nacosP1客户端密码通过环境变量注入不在 Git 中明文存储P1Nacos 8848/9848 端口仅限内网访问P1Nacos 控制台启用 HTTPSP2为不同服务创建独立账号P2建立密钥轮换机制P2开启访问日志审计下一步现在就去检查执行文章开头的 curl 命令确认你的 Nacos 是否裸奔按 Checklist 加固P0 项今天内完成P1 项本周内完成扩展阅读Nacos 官方鉴权手册CVE-2021-29441 分析Nacos 集群 TLS 配置如果这篇文章帮你避免了一次安全事故欢迎点赞/收藏/转发给你的运维同事