Nacos 安全使用最佳实践 - 访问控制实践 | Nacos 官网
铭师堂的云原生升级实践点此了解

Nacos 安全使用最佳实践 - 访问控制实践


4月13日(周六)在北京阿里中心云原生开源沙龙北京站 中, Nacos的Committer 柳遵飞(翼严)分享了Nacos 安全零信任实践,从原理上介绍了Nacos 在 传输安全存储安全访问控制上的实践和应用。

本文在此次沙龙的基础上,更加详尽的阐述如何开启使用Nacos的访问控制、以及如何避免和修复部署环境中Nacos的访问控制风险和漏洞。

Nacos不开启鉴权&暴露公网会导致风险

Nacos属于内网核心组件不建议暴露公网,在暴露公网情况下,如果不开启Nacos的鉴权能力(访问控制)或者 开启鉴权但使用默认密钥(密码/token.secret.key/server.identity),非常容易遭受黑客攻击获取Nacos存储的信息,强烈建议关闭公网访问,或开启Nacos集群鉴权能力,正确设置密钥;

为此我们建议您的集群按照下属步骤进行及检查和开启鉴权,修改默认用户名密码,避免风险;我们根据通用场景列出了开启鉴权和修改默认账密方式步骤,请按照不同业务场景进行选择性操作,操作项比较多,建议在业务低峰期进行操作,具体操作时请做好检查和灰度,避免影响业务运行。

如果有需要也可以考虑迁移至阿里云MSE提供的Nacos云服务,可以更简单、方便的解决安全风险,不仅支持企业级鉴权能力,还支持集成配置信息加解密能力、数据传输链路TLS加密,支持 平滑迁移 ,欢迎免费试用

风险项检查和修复的步骤

0. 预检查

  1. 首先检查Nacos集群是否暴露到公网之中,若已经暴露到公网中,建议优先设置网络层面的访问限制,例如添加IP白名单。
  2. 其次检查Nacos部署的版本是否低于1.4.1版本,若低于1.4.1版本,可以先升级到新版本后,再进行开启鉴权的操作。
  3. 检查是否打开鉴权开关是否为false
    1. 非镜像部署的Nacos,配置文件一般存放在${nacos.home}/conf/application.properties,配置项为nacos.core.auth.enabled
    2. 镜像部署的Nacos,环境变量为NACOS_AUTH_ENABLE
  4. 检查是否配置了token.secret.key为默认值SecretKey012345678901234567890123456789012345678901234567890123456789
    1. 非镜像部署的Nacos,配置文件中配置项为nacos.core.auth.plugin.nacos.token.secret.keynacos.core.auth.default.token.secret.key
    2. 镜像部署的Nacos,环境变量为NACOS_AUTH_TOKEN
  5. 检查是否配置了server.identiy的默认值serverIdentitysecurity
    1. 非镜像部署的Nacos,配置文件中配置项为nacos.core.auth.server.identity.keynacos.core.auth.server.identity.value
    2. 镜像部署的Nacos,环境变量为NACOS_AUTH_IDENTITY_KEYNACOS_AUTH_IDENTITY_VALUE
  6. 检查是否使用了默认的用户名密码
    1. 通过API curl -X POST "http://${nacos.server.ip}:${nacos.server.port}/nacos/v1/auth/users/login?username=nacos" -d "password=nacos"进行测试,若登录成功,则说明使用了默认用户密码

若部署的Nacos中存在上述开关为关闭、默认值的情况,建议尽快按照以下步骤开启鉴权,修改默认用户名密码和默认值,避免风险;

1. 开启Nacos鉴权访问控制步骤

注意:开启Nacos鉴权能力,就会拦截检查所有访问请求,请提前配置好客户端鉴权信息;为减少用户在开启鉴权和修复默认值导致的风险过程中对应用造成的影响,Nacos社区提供了一个通用的操作步骤。 对于已经开启了鉴权功能,但仍然在使用的token.secret.key默认值、server.identiy默认值、默认用户名密码的用户,可以先临时关闭鉴权功能,同样使用下列步骤重新开启鉴权功能,来避免使用默认值造成的安全风险和影响。

1.1. 修改配置文件

该步骤是提前修改Nacos中token.secret.keyserver.identity的配置值,避免使用默认值防止风险。

1.1.1. 非镜像部署
  1. 【找到配置文件】找到Nacos的配置文件,一般存放在${nacos.home}/conf/application.properties
  2. 【修改token.secret.key】编辑其中的配置项nacos.core.auth.plugin.nacos.token.secret.key,将其设置为一个自定义的Base64字符串,并确保所有Nacos节点中的该配置值保持一致,同时避免使用老版本的默认值SecretKey012345678901234567890123456789012345678901234567890123456789
  3. 【修改identity.key】编辑其中的配置项nacos.core.auth.server.identity.keynacos.core.auth.server.identity.value,将其设置为一个自定义的键值对字符串,并确保所有Nacos节点中的该配置值保持一致,同时避免使用老版本的默认值serverIdentitysecurity
1.1.2. docker镜像部署
  1. 【修改token.secret.key】给容器添加环境变量NACOS_AUTH_TOKEN,将其设置为一个自定义的Base64字符串,并确保所有Nacos容器的该环境变量保持一致,同时避免使用老版本的默认值SecretKey012345678901234567890123456789012345678901234567890123456789
  2. 【修改identity.key】给容器添加环境变量NACOS_AUTH_IDENTITY_KEYNACOS_AUTH_IDENTITY_VALUE,将其设置为一个自定义的键值对字符串,并确保所有Nacos容器的该环境变量保持一致,同时避免使用老版本的默认值serverIdentitysecurity

修改完成后,重启Nacos服务器,让配置生效。

1.2. 提前为应用配置nacos用户

该步骤是提前给应用注入有权限的身份信息,避免开启鉴权后因无效信息或缺少身份信息而被拒绝访问,造成业务故障。

由于开启鉴权后,Nacos将拦截所有未带有身份信息和身份信息错误的请求,因此为了不影响业务使用,请先为应用配置正确赋权的用户和密码,默认情况下nacos提供一个标准的用户,用户名密码为nacos/nacos;若之前已经给应用配置了其他已赋权的用户名密码,则可以不进行修改。 完成配置后,重启所有应用,让用户名密码的配置生效。

1.3. 开启鉴权开关

若确认所有应用均配置了用户名密码,并重启生效之后,则可以打开Nacos的鉴权开关。

1.3.1. 非镜像部署
  1. 【找到配置文件】找到Nacos的配置文件,一般存放在${nacos.home}/conf/application.properties
  2. 【修改鉴权开关】设置配置项nacos.core.auth.enabled值为true
1.3.2. docker镜像部署
  1. 【修改鉴权开关】给容器添加环境变量NACOS_AUTH_ENABLE值为true

修改完成后,重启Nacos集群,让配置生效。

1.4. 创建新的用户名密码,替换默认用户名密码

请关注是否存在非预期的用户信息在Nacos中,请检查并且删除,防止黑客进行信息预留

若应用已经配置的是非默认用户名或密码,该步骤可以省略。

在Nacos部署完成,并开启访问控制后,需要尽快修改应用所使用的用户密码,避免使用默认用户名密码,造成风险。

  1. 【访问Nacos控制台】访问Nacos的控制台,使用默认用户名密码登录;
  2. 【新增用户并赋权】在Nacos控制台上,选择权限控制 -> 用户列表,创建新的用户名和密码,并在权限控制 -> 角色管理权限控制 -> 权限管理中为新用户赋权
  3. 【应用使用新用户】修改应用中关于nacos的用户名和密码的配置,设置为新创建的用户名和密码,并重启应用生效。

1.5. 修改默认密码

若之前已经配置的是非默认用户名或密码,该步骤可以省略。

完成上述步骤后,需要尽快修改默认的用户名密码,防止被恶意攻击者通过默认用户名密码访问Nacos,获取数据。

  1. 【修改默认用户密码】确认所有应用均使用新的用户名密码后,在Nacos控制台上,选择权限控制 -> 用户列表,在操作列表中点击修改按钮,修改nacos用户的密码为自定义密码;

2. 避免Nacos访问控制风险和修复Nacos访问控制漏洞

2.1. Nacos未授权访问风险

若您的Nacos集群存在Nacos未授权访问的风险,说明部署的Nacos集群没有开启访问控制功能,可以通过上文介绍的开启Nacos鉴权访问控制步骤,开启Nacos的访问控制能力,来避免该风险。

2.2. Nacos 默认密码风险 & Nacos 默认token.secret.key 风险 & Nacos 默认server.identity风险

若您的Nacos集群存在上述3个风险,说明您的集群中配置了对应的默认值,同样可以通过上文介绍的开启Nacos鉴权访问控制步骤的,开启Nacos的访问控制能力,来避免该风险。

2.3. Nacos 认证绕过漏洞(CVE-2021-29441)

若您的Nacos集群存在Nacos 认证绕过漏洞(CVE-2021-29441),说明部署的Nacos集群版本过低,低于1.4.1版本,建议将Nacos的版本升级到1.4.1版本以上,建议升级到最新版本,同时进行上文介绍的预检查,检查是否存在默认值的风险。

3. 如何排查和清理黑客留下的后门用户

若您的Nacos集群为新部署的集群,则可以跳过此操作。

在您的Nacos集群限制网络访问,打开鉴权,并修复访问控制的风险和漏洞后,已经有了一定的安全防护能力,消除了大多数的数据泄漏风险,最后您还需要排查一下是否存在之前黑客留下的后门用户,以及如何清理掉这部分后门用户:

  1. 登录Nacos控制台,选择权限控制 -> 用户列表,获取所有Nacos中的用户。
  2. 与应用所配置的用户列表,以及开发运维人员所使用的的用户列表进行比对,查看是否存在多余的用户;若存在多余的用户,则可能被黑客留下后门用户。
  3. 进入在权限控制 -> 角色管理,通过用户名进行过滤,查看疑似后门用户是否存在绑定的角色,若存在绑定的角色,可以在页面中先删除此用户绑定的角色(删除后该用户已经没有了访问权限),观察一段时间监控,是否存在403状态码的增加。
    1. 若403状态码大幅增加,需要排查是否在第二步时遗漏了正在使用的用户,若确认不是应用使用的,则可能是黑客的请求,需要尽快对Nacos中存储的敏感信息进行排查和替换;
    2. 若403状态码没有增加,那么说明该用户大概率是后门用户或已经不使用的过期用户,需要尽快删除
  4. 选择权限控制 -> 用户列表,将第三步中疑似后门用户和不使用的过期用户删除,彻底消除风险。