Skip to content

Nacos 获取配置时启用权限认证

🏷️ Nacos

默认情况下获取 Nacos 中的配置是不需要权限认证的,这个估计是由其使用场景决定的 (绝大多数都是仅内网可访问).

今天调查了下如何在获取配置时增加权限验证以提高其安全性。

1. 启用 Nacos 的权限认证

只要 nacos.core.auth.enabled 设置为 true 就行了。

properties
### If turn on auth system:
nacos.core.auth.enabled=true

2. 添加 Nacos 用户

默认的用户 nacos 绑定的角色是 ROLE_ADMIN , 权限比较大,最好是新增一个只读的用户用来读取对应命名空间 (namespace) 的配置。

  1. 权限控制 -> 用户列表 中新增用户
  2. 权限控制 -> 角色管理 中新增用户对应的角色
    一个用户可以绑定多个角色。
  3. 权限控制 -> 权限管理 中新增角色对应的权限
    可以设置角色对应的命名空间 (页面上名称为资源), 在动作下拉框中指定读写权限 (只读\只写\读写).
    一个角色可以配置多个权限。

合理的使用 namespacegroup 来隔离配置文件,再辅以用户的角色、权限控制,组合的权限策略还是比较灵活的,应该能满足大多数项目的安全需求。

创建好用户后可以通过 curl 命令验证一下效果。

shell
curl -XGET 'http://localhost:8848/nacos/v1/cs/configs?dataId=test.yaml&group=DEFAULT_GROUP&tenant=&username=test&password=123456'

这里需要注意的是默认的 public 命名空间对应的值是空字符串,而不是 public .

PowerShell 中对应的命令:

powershell
curl -Uri 'http://localhost:8848/nacos/v1/cs/configs?dataId=test.yaml&group=DEFAULT_GROUP&tenant=&username=test&password=123456'

当请求中的用户不存在时,会返回 unknown user! 错误。

com.alibaba.nacos.api.exception.NacosException:

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Wed Jul 28 10:58:15 CST 2021
There was an unexpected error (type=Forbidden, status=403).
unknown user!

当请求中的用户没有绑定角色或角色没有配置对应的权限时,会返回 authorization failed! 错误。

com.alibaba.nacos.api.exception.NacosException:

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Wed Jul 28 11:43:43 CST 2021
There was an unexpected error (type=Forbidden, status=403).
authorization failed!

3. 修改 Spring Boot 配置文件

bootstrap.yml 中添加 spring.cloud.nacos.config.usernamespring.cloud.nacos.config.password 配置项 .

如果不仅使用了配置中心,还使用了 Nacos 的注册中心功能,那么同时还要配置 spring.cloud.nacos.discovery.usernamespring.cloud.nacos.discovery.password 配置项,而且必须使用默认的 ROLE_ADMIN 角色的用户。

yaml
spring:
  cloud:
    nacos:
      config:
        namespace:
        server-addr: 127.0.0.1:8848
        username: test
        password: 123456
        group: DEFAULT_GROUP
        prefix: test
        file-extension: yaml
      discovery:
        namespace: 
        server-addr: 127.0.0.1:8848
        username: nacos
        password: nacos

附录

  1. 查到有文章说需要在配置文件中指定 spring.cloud.nacos.config.context-path 的值为 /nacos , 这里使用的 1.2.1 版没有这个问题 .

    附一下正在使用的项目依赖。spring-cloud-starter-alibaba-nacos-discoveryspring-cloud-starter-alibaba-nacos-config 使用的均是 2.2.1.RELEASE 版。

    xml
    <!-- Nacos -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.2.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        <version>2.2.1.RELEASE</version>
    </dependency>
  2. 命名空间 (namespace) 和 租户 (tenant)

    这两个貌似是同一个概念。

  3. 查资料的时候看到今年年初的时候有报道说 1.4.1 版本有安全漏洞。

    关于如何更加安全的使用 Nacos, 官方的公众号文章给出了一个比较全面的方案:Nacos 配置安全最佳实践 .
    文中推的阿里云微服务引擎 (MSE) 也是一个不错的方案,安全性比较高,看了下价格,相比买 ECS 自己搭建集群,价格上还是有些优势的。