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

ops/2024/9/25 18:41:39/

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中存在上述开关为关闭、默认值的情况,建议尽快按照以下步骤开启鉴权,修改默认用户名密码和默认值,避免风险;

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服务器,让配置生效。

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用户的密码为自定义密码;

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

nacos未授权访问风险">2.1. Nacos未授权访问风险

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

nacos-默认密码风险--nacos-默认tokensecretkey-风险--nacos-默认serveridentity风险">2.2. Nacos 默认密码风险 & Nacos 默认token.secret.key 风险 & Nacos 默认server.identity风险

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

nacos-认证绕过漏洞cve-2021-29441">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. 选择权限控制 -> 用户列表,将第三步中疑似后门用户和不使用的过期用户删除,彻底消除风险。

http://www.ppmy.cn/ops/115895.html

相关文章

专业版【命令行下载离线安装包及依赖】

UOS统信专业版命令行下载应用商店应用软件的离线安装包及依赖的相关信息。 文章目录 应用场景一、解决方案1.首先需要确认待下载应用的软件包名称。打开应用商店,找到想下载的应用,这里以【企业微信】为例:2.点击应用版本右侧切换按钮&#x…

分享一波初中级测试面试题

在公司中测试的流程是什么 在公司中进行测试的流程可能因公司的规模、行业、开发流程和项目类型等因素而有所不同。以下是一个一般性的测试流程: 1.需求分析:测试人员需要理解产品或项目的需求,以便确定要测试的范围和测试计划。 2.测试计…

uniApp 中调用安卓原生接口获取位置信息(跳过key请求限制)

一、配置 UniApp 项目 在项目的manifest.json文件中,配置定位权限: 在“App 模块配置”中找到“Maps(地图)”模块,勾选“定位(获取当前位置)”权限。 二、使用 UniApp 的原生插件 原生插件开…

iOS 项目中的多主题颜色设计与实现

引言 在现代iOS应用中,用户对个性化体验的需求越来越高,除了功能上的满足,多样的视觉风格也是提升用户体验的重要手段之一。提供多主题颜色的切换功能不仅能满足用户的审美偏好,还可以让应用更具活力,适应不同场景下的…

执行 npm报错 Cannot find module ‘../lib/cli.js‘

报错 /usr/local/node/node-v18.20.4-linux-x64/bin/npm node:internal/modules/cjs/loader:1143 throw err; ^ Error: Cannot find module ../lib/cli.js Require stack: - /usr/local/node/node-v18.20.4-linux-x64/bin/npm at Module._resolveFilename (node:inter…

Java中的位图和布隆过滤器(如果想知道Java中有关位图和布隆过滤器的知识点,那么只看这一篇就足够了!)

前言:在学习之前的数据结构的时候,我们使用的数据量都不是很大,但是在生活中,我们常常面临着要处理大量数据结果并得出最终结果,那么有没有什么数据结构可以帮助我们实现这样的功能呢? ✨✨✨这里是秋刀鱼不…

《深度学习》—— 神经网络中的调整学习率

文章目录 一、什么是调整学习率?二、使用PyTorch中的库函数进行调整学习率三种常用的方法1. StepLR2. MultiStepLR3. CosineAnnealingLR 一、什么是调整学习率? 调整学习率(Adjusting Learning Rate)是在机器学习,特别…

数据结构-2.9.双链表

一.双链表与单链表的对比&#xff1a; 二.双链表的初始化(带头结点)&#xff1a; 1.图解&#xff1a; 2.代码演示&#xff1a; #include<stdio.h> #include<stdlib.h> ​ //定义双链表结构体 typedef struct DNode {int data;struct DNode *prior;//前驱指针即指…