默认情况下获取 Nacos 中的配置是不需要权限认证的, 这个估计是由其使用场景决定的(绝大多数都是仅内网可访问).
今天调查了下如何在获取配置时增加权限验证以提高其安全性.
只要 nacos.core.auth.enabled 设置为 true
就行了.
### If turn on auth system:
nacos.core.auth.enabled=true
默认的用户 nacos 绑定的角色是 ROLE_ADMIN , 权限比较大, 最好是新增一个只读的用户用来读取对应命名空间(namespace)的配置.
合理的使用 namespace 和 group 来隔离配置文件, 再辅以用户的角色、权限控制, 组合的权限策略还是比较灵活的, 应该能满足大多数项目的安全需求.
创建好用户后可以通过 curl 命令验证一下效果.
curl -XGET 'http://localhost:8848/nacos/v1/cs/configs?dataId=test.yaml&group=DEFAULT_GROUP&tenant=&username=test&password=123456'
这里需要注意的是默认的 public 命名空间对应的值是空字符串, 而不是 public .
在 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!
在 bootstrap.yml 中添加 spring.cloud.nacos.config.username 和 spring.cloud.nacos.config.password 配置项 .
如果不仅使用了配置中心, 还使用了 Nacos 的注册中心功能, 那么同时还要配置 spring.cloud.nacos.discovery.username 和 spring.cloud.nacos.discovery.password 配置项, 而且必须使用默认的 ROLE_ADMIN 角色的用户.
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
查到有文章说需要在配置文件中指定 spring.cloud.nacos.config.context-path
的值为 /nacos
, 这里使用的 1.2.1 版没有这个问题 .
附一下正在使用的项目依赖. spring-cloud-starter-alibaba-nacos-discovery 和 spring-cloud-starter-alibaba-nacos-config 使用的均是 2.2.1.RELEASE 版.
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
2.2.1.RELEASE
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
2.2.1.RELEASE
命名空间(namespace) 和 租户(tenant)
这两个貌似是同一个概念.
查资料的时候看到今年年初的时候有报道说 1.4.1 版本有安全漏洞.
关于如何更加安全的使用 Nacos, 官方的公众号文章给出了一个比较全面的方案: Nacos配置安全最佳实践 .
文中推的阿里云微服务引擎(MSE)也是一个不错的方案, 安全性比较高, 看了下价格, 相比买 ECS 自己搭建集群, 价格上还是有些优势的.