跳到主要内容

安全配置

生产环境中,Nacos 的安全配置至关重要。本章介绍 Nacos 的认证授权机制和安全最佳实践。

安全概述

Nacos 的安全机制主要包括以下几个方面:

  • 用户认证:验证用户身份
  • 权限控制:控制用户对资源的访问权限
  • 传输加密:保护数据传输安全
  • 网络安全:限制网络访问

用户认证

开启认证

application.properties 中配置:

# 开启认证
nacos.core.auth.enabled=true

# 认证类型
nacos.core.auth.system.type=nacos

默认用户

Nacos 默认创建以下用户:

用户名密码角色
nacosnacosROLE_ADMIN
安全警告

生产环境必须修改默认密码!

修改密码

通过控制台修改:

  1. 登录 Nacos 控制台
  2. 进入「权限控制」->「用户列表」
  3. 点击「修改密码」

通过 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. 敏感配置明文存储

风险:配置泄露后,敏感信息直接暴露。

解决方案:使用加密存储敏感配置。

下一步