安全配置
生产环境中,Nacos 的安全配置至关重要。本章介绍 Nacos 的认证授权机制和安全最佳实践。
安全概述
Nacos 的安全机制主要包括以下几个方面:
- 用户认证:验证用户身份
- 权限控制:控制用户对资源的访问权限
- 传输加密:保护数据传输安全
- 网络安全:限制网络访问
用户认证
开启认证
在 application.properties 中配置:
# 开启认证
nacos.core.auth.enabled=true
# 认证类型
nacos.core.auth.system.type=nacos
默认用户
Nacos 默认创建以下用户:
| 用户名 | 密码 | 角色 |
|---|---|---|
| nacos | nacos | ROLE_ADMIN |
安全警告
生产环境必须修改默认密码!
修改密码
通过控制台修改:
- 登录 Nacos 控制台
- 进入「权限控制」->「用户列表」
- 点击「修改密码」
通过 API 修改:
curl -X PUT 'http://127.0.0.1:8848/nacos/v1/auth/users' \
-H 'Authorization: Bearer <token>' \
-d 'username=nacos' \
-d 'newPassword=new_password'
创建用户
curl -X POST 'http://127.0.0.1:8848/nacos/v1/auth/users' \
-H 'Authorization: Bearer <token>' \
-d 'username=newuser' \
-d 'password=password'
Token 配置
Nacos 使用 JWT Token 进行认证,需要配置密钥:
# Token 密钥(必须修改,建议 32 位以上随机字符串)
nacos.core.auth.plugin.nacos.token.secret.key=YourSecretKey012345678901234567890123456789012345678901234567890123456789
# Token 有效期(秒),默认 18000(5 小时)
nacos.core.auth.plugin.nacos.token.expire.seconds=18000
重要
Token 密钥必须妥善保管,所有 Nacos 节点必须配置相同的密钥。密钥泄露会导致严重的安全问题。
服务端身份识别
为了防止伪造请求,配置服务端身份识别:
# 服务端身份识别 Key
nacos.core.auth.server.identity.key=nacos-server-identity
# 服务端身份识别 Value
nacos.core.auth.server.identity.value=nacos-server-identity-value
所有节点的 identity 配置必须一致。
权限控制
角色管理
Nacos 使用 RBAC(基于角色的访问控制)模型:
用户 ──关联──> 角色 ──关联──> 权限
创建角色
curl -X POST 'http://127.0.0.1:8848/nacos/v1/auth/roles' \
-H 'Authorization: Bearer <token>' \
-d 'role=ROLE_DEV' \
-d 'username=devuser'
删除角色
curl -X DELETE 'http://127.0.0.1:8848/nacos/v1/auth/roles' \
-H 'Authorization: Bearer <token>' \
-d 'role=ROLE_DEV' \
-d 'username=devuser'
权限管理
授予权限
curl -X POST 'http://127.0.0.1:8848/nacos/v1/auth/permissions' \
-H 'Authorization: Bearer <token>' \
-d 'role=ROLE_DEV' \
-d 'resource=dev:*' \
-d 'action=rw'
参数说明:
| 参数 | 说明 | 示例 |
|---|---|---|
| role | 角色名 | ROLE_DEV |
| resource | 资源标识 | dev:* 表示 dev 命名空间下所有资源 |
| action | 操作权限 | r(读)、w(写)、rw(读写) |
资源标识格式
命名空间:分组:资源类型:资源名
示例:
dev:DEFAULT_GROUP:* # dev 命名空间下 DEFAULT_GROUP 的所有资源
dev:DEFAULT_GROUP:config:* # dev 命名空间下 DEFAULT_GROUP 的所有配置
dev:*:* # dev 命名空间下所有资源
*:*:* # 所有资源
删除权限
curl -X DELETE 'http://127.0.0.1:8848/nacos/v1/auth/permissions' \
-H 'Authorization: Bearer <token>' \
-d 'role=ROLE_DEV' \
-d 'resource=dev:*' \
-d 'action=rw'
权限示例
开发环境权限配置
# 创建开发用户
curl -X POST 'http://127.0.0.1:8848/nacos/v1/auth/users' \
-d 'username=devuser' -d 'password=devpass'
# 创建开发角色
curl -X POST 'http://127.0.0.1:8848/nacos/v1/auth/roles' \
-d 'role=ROLE_DEV' -d 'username=devuser'
# 授予 dev 命名空间的读写权限
curl -X POST 'http://127.0.0.1:8848/nacos/v1/auth/permissions' \
-d 'role=ROLE_DEV' -d 'resource=dev:*' -d 'action=rw'
只读用户配置
# 创建只读用户
curl -X POST 'http://127.0.0.1:8848/nacos/v1/auth/users' \
-d 'username=viewuser' -d 'password=viewpass'
# 创建只读角色
curl -X POST 'http://127.0.0.1:8848/nacos/v1/auth/roles' \
-d 'role=ROLE_VIEWER' -d 'username=viewuser'
# 授予只读权限
curl -X POST 'http://127.0.0.1:8848/nacos/v1/auth/permissions' \
-d 'role=ROLE_VIEWER' -d 'resource=*:*' -d 'action=r'
客户端认证
Spring Cloud 配置
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
config:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
使用环境变量
敏感信息建议使用环境变量:
spring:
cloud:
nacos:
discovery:
username: ${NACOS_USERNAME:nacos}
password: ${NACOS_PASSWORD:nacos}
启动时设置环境变量:
export NACOS_USERNAME=your_username
export NACOS_PASSWORD=your_password
java -jar app.jar
API 认证
调用 Nacos Open API 时,需要在请求头中携带 Token:
# 1. 先登录获取 Token
curl -X POST 'http://127.0.0.1:8848/nacos/v1/auth/login' \
-d 'username=nacos' \
-d 'password=nacos'
# 返回:{"accessToken": "xxx.yyy.zzz", "tokenTtl": 18000}
# 2. 使用 Token 访问 API
curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/service/list' \
-H 'Authorization: Bearer xxx.yyy.zzz'
传输安全
HTTPS 配置
生成证书
# 生成密钥库
keytool -genkeypair -alias nacos -keyalg RSA -keysize 2048 \
-storetype PKCS12 -keystore nacos.p12 \
-dname "CN=nacos,OU=nacos,O=nacos,L=shanghai,ST=shanghai,C=CN" \
-validity 3650
# 导出证书
keytool -exportcert -alias nacos -keystore nacos.p12 -file nacos.cer
配置 HTTPS
将 nacos.p12 放到 conf 目录,修改 application.properties:
# SSL 配置
server.ssl.enabled=true
server.ssl.key-store=classpath:nacos.p12
server.ssl.key-store-password=your_password
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=nacos
客户端配置
spring:
cloud:
nacos:
discovery:
server-addr: https://nacos.example.com:8848
username: nacos
password: nacos
# 信任所有证书(仅用于测试)
# secure: true
内网隔离
生产环境建议将 Nacos 部署在内网,通过以下方式限制访问:
防火墙规则
# 只允许特定 IP 访问
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 8848 -j ACCEPT
iptables -A INPUT -p tcp --dport 8848 -j DROP
安全组配置(云环境)
在云服务器安全组中配置:
- 只允许内网 IP 访问 8848、9848、9849 端口
- 禁止公网直接访问
安全最佳实践
1. 密码安全
- 使用强密码(至少 12 位,包含大小写字母、数字、特殊字符)
- 定期更换密码
- 不同环境使用不同密码
- 使用密码管理工具
2. 最小权限原则
- 按需分配权限,不授予过多权限
- 开发、测试、生产环境使用不同的命名空间和用户
- 只读用户只授予读权限
3. 网络隔离
┌─────────────────────────────────────────────────────────────────┐
│ 生产环境网络架构 │
│ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ 外网区域 │ │ 内网区域 │ │
│ │ │ │ │ │
│ │ ┌────────┐ │ 不可访问 │ ┌────────┐ │ │
│ │ │ 用户 │ │ ──────────────────✕ │ │ Nacos │ │ │
│ │ └────────┘ │ │ │ 集群 │ │ │
│ │ │ │ └────────┘ │ │
│ │ │ │ ▲ │ │
│ │ │ │ │ │ │
│ │ │ │ ┌────┴───┐ │ │
│ │ │ │ │ 微服务 │ │ │
│ │ │ │ │ 集群 │ │ │
│ │ │ │ └────────┘ │ │
│ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────────┘
4. 审计日志
开启操作审计,记录所有关键操作:
# 开启审计日志
nacos.core.auth.enable.userAgentAuthWhite=false
定期检查审计日志,发现异常操作。
5. 定期安全检查
- 检查是否有弱密码用户
- 检查是否有过多权限的用户
- 检查是否有未使用的用户
- 检查 Token 密钥是否泄露
6. 敏感配置加密
对于数据库密码、API 密钥等敏感配置,建议使用加密存储:
# 使用 Jasypt 加密
spring:
datasource:
password: ENC(加密后的密码)
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
常见安全问题
1. 默认密码未修改
风险:攻击者可使用默认账号登录,获取所有配置和服务信息。
解决方案:修改默认密码,或删除默认账号。
2. Token 密钥使用默认值
风险:攻击者可伪造 Token,绕过认证。
解决方案:使用自定义的强密钥。
3. 未开启认证
风险:任何人都可以访问 Nacos,获取配置和服务信息。
解决方案:生产环境必须开启认证。
4. Nacos 暴露在公网
风险:攻击者可直接访问 Nacos,进行各种攻击。
解决方案:将 Nacos 部署在内网,通过防火墙或安全组限制访问。
5. 敏感配置明文存储
风险:配置泄露后,敏感信息直接暴露。
解决方案:使用加密存储敏感配置。
下一步
- 速查表 - Nacos 常用配置速查