Bootstrap

Nacos配置安全最佳实践


前言



配置管理作为软件开发中重要的一环,肩负着连接代码和环境的职责,能很好的分离开发人员和维护人员的关注点。

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 并登录,在 权限控制->用户列表 页面,添加用户:

权限控制->角色管理,绑定用户和角色:


悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;