应用运行时数据库密码无损轮转:0 代码改造方案解析

无需代码修改,实现应用运行时数据库密码的无损轮转方案!基于 MSE Nacos、阿里云 KMS 和 Druid,秒级切换,安全高效。

原文标题:0 代码改造实现应用运行时数据库密码无损轮转

原文作者:阿里云开发者

冷月清谈:

本文深入探讨了应用在运行时如何实现数据库密码的无损轮转,有效降低密码泄露风险和运维成本。文章核心在于介绍如何通过整合 MSE Nacos、阿里云 KMS、Apache Druid 以及 Spring Cloud Alibaba,构建一套完整的解决方案,实现数据库账号密码的安全管理和动态轮转。该方案通过 Nacos 统一托管配置,KMS 进行密钥管理,Druid 实现连接池的动态刷新,以及 Spring Cloud Alibaba 简化接入,最终实现无需重启应用即可完成密码的自动更换。显著提升了安全性和效率,尤其在应对密码泄露时,可将线上应用密码切换时间从数小时缩短至秒级。此外,该方案还支持数据库连接池大小、超时参数以及数据库地址的动态更新,为应用性能调优和灵活切换数据库提供了便利。未来,Nacos+KMS+X 架构将扩展到更多数据源组件,提供更全面的安全和易用性服务。

怜星夜思:

1、文章中提到使用 KMS 进行密钥管理,感觉引入了额外的组件和配置,相比于直接在 Nacos 中存储加密后的密码,这种方案的优势是什么?
2、文章中提到“运行时无损轮转”,这个“无损”具体体现在哪些方面?例如,是否有连接中断、数据丢失的风险?如何保证在轮转期间业务的连续性?
3、文章中提到该方案未来会扩展到 NoSQL、MQ 等更多数据源组件,你认为在这些场景下,密码轮转的需求和挑战会有哪些不同?

原文内容

阿里妹导读


本文详细探讨了在现代应用程序中,特别是涉及数据库访问时,如何通过整合 MSE Nacos、阿里云KMS 以及 Apache Druid 等技术组件,实现对敏感数据(如数据库账号密码)的安全管理和动态轮转。


一、敏感数据的安全风险


在应用程序中,访问数据库几乎是必须的,是实现业务功能的基础普遍场景,应用程序访问数据库,需要设置数据库的地址,端口,账号及密码。密码的安全性非常重要,业界密码泄漏导致资损的事件时有发生,根据相关统计,单次泄漏事件的发生平均导致 488 万美元(约合人民币 3542 万),每条泄漏的数据记录平均导致 169 美元(约合人民币 1226 元,除了直观的资金损失外,对企业的形象和舆论也会造成不良影响。

数据参考《IBM发布的第19期年度数据泄露成本研究报告》


国家在 2019 年颁布了《国家安全二级等保等保2.0标准(GB/T 22239-2019)》,明确了对于不同类型的企业所需要实现的安全防护等级,特别是涉及银行,金融类的企业 IT 系统中存储的业务数据涉及大量的个人敏感数据,这些数据泄漏往往直接造成经济损失,高级别的合规性要求,深刻影响着企业运营和社会稳定。


二、如何降低账密泄漏风险


Nacos 是国内被广泛使用的 IT 系统应用的配置中心,对于线上的 IT 系统应用,我们可以从多个方面来提升应用访问数据库帐密的安全性,比如增加密码的强度,帐密统一管理,设置访问权限,帐密传输加密等等。



Nacos 可以统一托管应用程序中的配置参数,并且从访问控制,传输安全,存储安全三个方面的措施有效降低帐密泄漏的风险,但是没有解决以下两个方面的问题:


  • 帐密人工维护:运维人员需要将账密手动设置在 nacos 加密配置中,过程中人为的参与带来了泄漏的隐患。
  • 运行期轮转成本高:当帐密泄漏时替换的成本较大,需要创建新帐密,并且在应用程序中重启替换,时间和人力消耗巨大,具体的修复时间和应用集群规模相关,通常需要数小时才能完成,当集群规模达到 100+ 时,修复时间更长,另外大批量的应用重启可能会带来稳定性风险。


三、不重启应用实现密码无损轮转


在应用侧访问数据库通常会结合各类应用侧数据库连接池框架,比如 HikariCP,Apache Druid,C3P0 等,除了连接数据库的地址及帐密之外,还可以设置应用侧连接池大小,超时时间等参数,以实现业务系统可用性和性能的最大化。


为了解决上一节中提到的两个问题,MSE Nacos 联合阿里云密钥管理服务 KMS,开源数据库连接池框架 Druid 以及开源 Spring Cloud Alibaba 社区推出了面向应用侧的数据源运行期动态轮转方案。



可以根据上图中的数字代表的步骤顺序了解整体的工作流程。


其中各个组件的职责如下:


1. MSE Nacos-动态配置中心


a. 提供应用侧数据源配置的统一管理平台
b. 整合 KMS 实现帐密->应用侧配置的转化
c. 提供数据源配置的运行期推送的基础能力

2. Spring Cloud Alibaba-开源应用侧框架

a. 整合 nacos-client 和 druid 组件协作,屏蔽接入复杂性
b. 配置化接入数据源 druid 以及配置变更时触发 druid 数据源运行时轮转

3. Apache Druid-开源应用侧数据库连接池

a. 应用程序内数据库连接池统一管理,支持运行时连接池大小,超时等参数调整
b. 运行时动态刷新,实现旧帐密连接->新帐密连接的优雅刷新,保证业务无损。
c. 运行期异常保护,比如错误帐密,错误地址的预检,保证存量连接稳定。

4. KMS-阿里云密钥管理服务
a. 提供数据源底层加密配置的加密和解密服务
b. 提供云上数据库的账号密码托管和定时轮转功能
c. 帐密泄漏时可进行帐密立即轮转,实现一键快速止损


以上方案实现了:


  • 加密配置统一托管 :应用程序侧访问数据库的配置统一加密存储在 Nacos 中。
  • 帐密全托管:KMS 实现了对数据库实例账号密码的全托管。
  • 双层权限管控:应用程序侧对加密配置的查询及加密进行双层权限认证。
  • 帐密秘文存储及传输:在全链路中明文只存在于应用内存中,存储和传输中均为加密配置。
  • 运行时无损轮转:当数据库帐密变更时,应用侧实时感知并且连接优雅切换。


当帐密泄露后,线上应用帐密的切换时间由之前的数小时优化到只需一秒!相比之前重启替换小时级别,大大提升安全性和效率。


动态数据源接入方案无代码侵入性,全程 0 代码改造,详细接入步骤请参照官方文档:《MSE Nacos数据源管理

https://help.aliyun.com/zh/mse/user-guide/data-source-management?utm_content=g_1000404951


除了支持运行期更新账密功能外,同时也支持数据库连接池大小,超时参数,数据库地址及数据库名的动态更新。可以实现运行期调整连接池性能以及切库等高阶功能。



四、Nacos+KMS+X

数据源类通用解决方案


MSE Nacos + KMS +Druid 的方案实现了数据库帐密的运行期动态轮转,未来 MSE Nacos 和 KMS 会对接更多的数据源类的组件,比如 NoSql (Redis/Tair),MQ(RocketMQ,Kafka),ScheduleX,OSS 等,以下是将数据库 druid 泛化为通用组件X的架构图,除了进行帐密的托管及动态轮转之外,面向应用侧会进行组件初始化及轮转的逻辑封装,实现 0 代码改造、配置化接入,降低应用侧的复杂性。



Nacos作为国内被广泛使用的配置中心,已经成为应用侧的基础设施产品,近年来安全问题被更多关注,这是中国国内软件行业逐渐迈向成熟的体现,也是必经之路,Nacos 提供配置加密存储-运行时轮转的核心安全能力,将在应用安全领域承担更多职责。当前正在加速迈向 AI 时代,AI 领域的安全问题也同样重要,比如 Agent 访问大模型 LLM,MCP Server 的配置也同样面临传统微服务应用中类似的安全性和易用性问题,Nacos 会全面拥抱 AI 时代,面向应用侧提供一站式安全-易用-稳定的服务,配置,AI Registry 平台。



相关链接:


[1] Nacos 官网

https://nacos.io


[2] Nacos Github 主仓库

https://github.com/alibaba/nacos


[3] 生态组仓库

https://github.com/nacos-group


[4] Spring Cloud Alibaba

https://sca.aliyun.com/docs/2023/user-guide/nacos/quick-start/


Nacos 多语言生态仓库:


[1] Nacos-GO-SDK

https://github.com/nacos-group/nacos-sdk-go


[2] Nacos-Python-SDK

https://github.com/nacos-group/nacos-sdk-python


[3] Nacos-Rust-SDK

https://github.com/nacos-group/nacos-sdk-rust


[4] Nacos C# SDK

https://github.com/nacos-group/nacos-sdk-csharp


[5] Nacos C++ SDK

https://github.com/nacos-group/nacos-sdk-cpp


[6] Nacos PHP-SDK

https://github.com/nacos-group/nacos-sdk-php


[7] Rust Nacos Server

https://github.com/nacos-group/r-nacos


云上高可用架构


从企业上云最基础的需求出发,面向可能遇到的单点故障风险,介绍了经典的“业务上云高可用架构”方案设计。    


点击阅读原文查看详情。



脑洞一下,如果把这个思路用到 AI 大模型上,Agent 访问 LLM 也需要权限控制,那是不是也可以用类似的方案实现 Agent 访问密钥的动态轮转?感觉很有潜力!

“无损”主要体现在业务的连续性上。Druid 连接池会在后台建立新的连接,使用新的密码。在所有新连接建立完毕后,才逐步关闭旧的连接。这种方式可以最大限度地减少连接中断,避免影响业务。当然,理论上仍然存在极短时间的连接切换,对于非常敏感的业务,可能需要做一些额外的容错处理。

好问题!对于 NoSQL 数据库,例如 Redis,可能更关注的是连接池的管理和认证方式。很多 NoSQL 数据库支持基于角色的访问控制,密码轮转可能涉及到用户权限的更新。而对于 MQ,例如 Kafka,可能更关注的是客户端的认证和授权,以及 Topic 级别的权限控制。挑战在于,不同数据源组件的特性差异很大,需要针对不同的组件进行适配。

我觉得最大的挑战是各种组件的API不一样,需要做大量适配工作。另外,像消息队列,可能需要考虑消息的顺序性,在密码轮转期间,如何保证消息不丢失、不重复也是一个需要考虑的问题。

从合规性角度来看,KMS 通常符合更高级别的安全标准,更容易满足金融、银行等行业对数据安全的要求。如果你的应用对安全性要求非常高,使用 KMS 是一个更稳妥的选择。当然,如果只是个人项目或者对安全性要求不高的场景,直接在 Nacos 中存储加密密码也未尝不可。