前言
配置管理作为软件开发中重要的一环,肩负着连接代码和环境的职责,能很好的分离开发人员和维护人员的关注点。
Nacos 的配置管理功能就很好地满足了云原生应用对于配置管理的需求:既能做到配置和代码分离,也能做到配置的动态修改。
在 1月份,Nacos 出了一个安全漏洞,外部用户能够伪装为 Nacos-server 来获取/修改配置( https://github.com/alibaba/nacos/issues/4593 )。确认问题后,Nacos 火速修复了漏洞,而阿里云的微服务引擎(MSE)也已在 1月末将修复方案反向移植到 MSE 上的 Nacos 实例上。
在本文中,我们将会从全局视角入手,讨论如何才能保证 Nacos 配置的安全性(security),即如何保证配置信息不被恶意用户获取或者泄漏。
Nacos 配置架构
Nacos 配置部分的整体架构如下:
对于上图中的每一条链路,都需要考虑有没有两个基本的安全动作:认证(Identification)和鉴权(Authentication)。
从上图可以看到,配置信息可能的泄漏方式有:
通过 Nacos-client 获取配置。
通过控制台获取配置。
通过服务器之间的通信协议获取配置。
直接访问持久化层(比如 DB)获取配置。
可能的泄漏点如下:
认证 |
鉴权 |
|
Nacos 客户端 |
未登录用户通过客户端获取/修改配置 |
用户通过客户端获取/修改了未授权的配置 |
配置控制台 |
未登录用户通过控制台获取/修改配置 |
用户通过控制台获取/修改了未授权的配置 |
Nacos 集群内 |
用户伪装为 Nacos 集群获取/修改配置 |
不需要 |
持久化层 |
用户直接查 DB,获取/修改配置 |
不需要 |
Nacos 客户端场景的认证和鉴权
在 Nacos 客户端尝试从服务端获取配置时,服务端需要确认客户端的身份,并确认该身份有权限获取配置。
开源版本的 Nacos
在默认的 Nacos server 配置中,不会对客户端鉴权,即任何能访问 Nacos server 的用户,都可以直接获取 Nacos 中存储的配置。比如一个黑客攻进了企业内网,就能获取所有的业务配置,这样肯定会有安全隐患。
所以需要先开启 Nacos server 的鉴权。在 Nacos server 上修改 application.properties 中的 nacos.core.auth.enabled 值为 true 即可:
nacos.core.auth.enabled=true
如上设置后,Nacos 客户端获取配置时,需要设置上对应的用户名和密码,才能获取配置:
String serverAddr = "{serverAddr}";Properties properties = new Properties();properties.put("serverAddr", serverAddr);properties.put("username","nacos-readonly");properties.put("password","nacos");ConfigService configService = NacosFactory.createConfigService(properties);
上面讲了如何认证用户,即如何确定现在是哪一个用户在访问,但还需要识别用户的权限,当用户访问没有权限获取对应配置的时候,比如库存服务尝试获取支付服务的配置时,就会失败。
我们可以在开源的 Nacos 控制台上创建用户、设置权限。步骤如下:
首先,访问 localhost:8848/nacos 并登录,在 权限控制->用户列表 页面,添加用户:
在 权限控制->角色管理,绑定用户和角色: