简介: 本文讨论了自建Nacos和阿里云MSE的配置安全原理。并提出配置安全最佳实践。
作者:鲁严波
前言
配置管理作为软件开发中重要的一环,肩负着连接代码和环境的职责,能很好的分离开发人员和维护人员的关注点。
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);
上面讲了如何认证用户,即如何确定现在是哪一个用户在访问,但还需要识别用户的权限,当用户访问没有权限获取对应配置的时候,比如库存服务尝试获取支付服务的配置时,就会失败。
<