适用场景
本文适用于使用 Nacos 作为配置中心或服务注册中心的微服务团队,尤其是以下高风险场景:Nacos 控制台通过公网可达、使用默认密钥 SecretKey012345678901234567890123456789012345678901234567890123456789、版本低于 2.2.1、未开启任何认证。Nacos 未授权访问一旦被利用,攻击者可读取数据库密码、中间件口令等全部配置,属于必须立即处理的高危风险。
前置条件
- 具备 Nacos 所在服务器 root 或管理员权限
- 可访问 Nacos 控制台(默认端口 8848,gRPC 端口 9848)
- 已确认 Nacos 版本:执行
curl http://127.0.0.1:8848/nacos/v1/console/health/readiness或查看conf/application.properties
原理说明
Nacos 在 2.2.1 之前的版本中,控制台鉴权默认关闭,且历史上存在 CVE-2021-29441(AuthFilter 过滤器绕过,User-Agent: Nacos-Server 即可绕过鉴权)、CVE-2021-29442 等漏洞。攻击者未授权访问控制台后可:读取全部配置文件(含数据库密码)、篡改服务注册信息、利用 nacos-core 反序列化或 SQL 注入执行任意命令。即使开启认证,若未修改 nacos.core.auth.plugin.nacos.token.secret.key 默认值,攻击者仍可用默认密钥伪造 admin JWT 直接登录。
操作步骤
步骤一:升级 Nacos 至安全版本
将服务端升级到 2.2.1+(推荐 2.3.x / 2.4.x),该版本默认开启鉴权开关,并修复已知绕过漏洞:
# 下载并替换(以 2.3.2 为例)
cd /opt
wget https://github.com/alibaba/nacos/releases/download/2.3.2/nacos-server-2.3.2.tar.gz
tar -zxvf nacos-server-2.3.2.tar.gz
# 停服后替换,再启动
cd /opt/nacos/bin
sh shutdown.sh && sh startup.sh -m standalone
步骤二:开启认证并修改默认密钥
编辑 conf/application.properties:
# 开启鉴权
nacos.core.auth.enabled=true
# 关闭默认 token,使用随机生成的 32+ 位 base64 密钥
nacos.core.auth.plugin.nacos.token.secret.key=
# 生成随机密钥
openssl rand -base64 32
将生成的随机串填入 token.secret.key 后重启:
cd /opt/nacos/bin && sh shutdown.sh && sh startup.sh -m standalone
步骤三:配置服务端身份标识
为防止服务端之间的请求被仿冒,在 application.properties 中配置身份标识(2.2.1+ 支持):
nacos.core.auth.server.identity.key=nacos-server-id
nacos.core.auth.server.identity.value=your-random-identity-value
同时所有客户端 application.yml 需同步配置:
spring:
cloud:
nacos:
username: nacos
password: your-strong-password
server-addr: 10.0.0.5:8848
步骤四:限制访问来源
使用防火墙仅允许内网与运维 IP 访问 8848 / 9848 端口:
# iptables 方式
iptables -A INPUT -p tcp --dport 8848 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 8848 -j DROP
iptables -A INPUT -p tcp --dport 9848 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 9848 -j DROP
service iptables save
# firewalld 方式(按需选择其一)
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=10.0.0.0/8 port port=8848 protocol=tcp accept'
firewall-cmd --reload
若控制台需对公网开放,务必叠加 IP 白名单 + 强密码 + 双因素认证,或通过 VPN 访问。
配置验证
# 1. 未授权访问应被拒绝(返回 403/401 而非数据)
curl -s http://your-nacos:8848/nacos/v1/cs/configs?dataId=test -w "
HTTP %{http_code}
"
# 2. 认证接口正常
TOKEN=$(curl -s -X POST "http://your-nacos:8848/nacos/v1/auth/users/login" -d "username=nacos&password=your-strong-password" | python3 -c "import sys,json;print(json.load(sys.stdin)['accessToken'])")
# 3. 携带 token 访问正常
curl -s "http://your-nacos:8848/nacos/v1/cs/configs?dataId=test&accessToken=$TOKEN" -w "
HTTP %{http_code}
"
常见问题
Q1:开启认证后客户端报 403 Forbidden,如何排查?
依次检查:① 客户端是否配置了 username/password;② 客户端与服务端版本是否一致(旧客户端不兼容新鉴权接口);③ 服务端 nacos.log 中是否有 token is expired 或 identity invalid 日志,确认服务端身份标识两端配置一致。
Q2:修改 token.secret.key 后已有客户端全部失效?
默认密钥被修改后,所有旧 token 立即失效,属于预期行为。建议在业务低峰期操作,并提前通过 spring.cloud.nacos.config.refresh-enabled=true 让客户端自动重连获取新 token;若客户端数量大,可采用灰度重启方式分批验证。
总结
Nacos 未授权访问是微服务架构中危害最大的默认配置问题之一。完成”升级版本、开启认证、替换默认密钥、限制来源 IP”四步后,配置中心将从”裸奔”状态变为可审计的安全服务。建议同时将控制台访问纳入堡垒机审计,并定期轮换 token.secret.key 与管理员密码,形成长效机制。