本文档介绍如何在Spring应用中实现RDS数据源账密的运行时轮转,通过集成KMS与Nacos,实现数据库凭据的加密托管、动态更新与无缝切换,保障应用在凭据变更过程中的安全与稳定。
方案概览
如果您的应用侧主要使用Java语言,使用Spring Boot或者Spring Cloud框架开发,并且应用中大量访问数据库,比如Mysql,Sql Server,PostgreSQL,MariaDB等,推荐采用运行时数据源轮转方案提升安全性。方案架构如下图所示:
该方案的核心思想就是通过KMS对数据库账号密码进行加密托管,并结合Nacos实现动态配置管理,最终由Druid管理数据库连接。方案支持以下特性:
数据源配置统一托管及加密存储&传输:实现数据库连接信息的集中管理,并通过加密手段保障配置数据在存储与传输过程中的安全。
账密全托管双层权限管控:数据库账号密码由系统全托管,结合双层权限认证机制,提升访问安全性。
账密运行时定时轮转与秒级泄漏修复:支持数据库凭据在运行期间按策略自动轮换,并可在发现泄漏后实现快速修复,降低安全风险。
运行期账号无损切换:在不中断业务的前提下,动态切换数据库访问账号,保障系统高可用性与维护灵活性。
应用侧数据库性能参数调优:支持连接池大小、超时时间等关键性能参数的灵活调整,提升系统稳定性与响应能力。
异常参数保护机制 :对关键参数进行校验与保护,防止误配置导致业务中断,确保变更过程安全可控。
前提条件
开通云数据库RDS,创建实例。
开通密钥管理服务(KMS),创建KMS专属版实例,完成KMS密钥KeyId创建。
开通MSE,创建企业版实例。
创建KMS凭据
前往密钥管理服务的凭据管理页面,选择数据库凭据。
然后选择实例ID,单击
。在创建数据库凭据面板选择RDS凭据的数据库类型,输入凭据名称,选择关联的RDS实例。
选择双账号托管,输入定制账号名,选择数据库,指定权限。
选择加密主密钥,设置轮转周期,最后单击确定。
KMS凭据会自动创建访问数据库账号及密码,并且保证密码强度。
创建数据源
数据源功能底层基于Nacos配置中心实现,数据源配置将以加密配置形式存储在配置中心中。
前往MSE注册配置中心控制台的实例列表页面,在顶部菜单栏选择地域。
单击目标企业版实例名称。在左侧导航栏选择数据源管理。
如果实例没有绑定KME密钥,请按照弹窗提示完成密钥绑定。
在数据源管理页面,选择目标命名空间,然后单击创建数据源。
在创建数据源面板,配置数据源相关参数。参数详情,请参见创建数据源。
单击确定,在确认创建数据源弹框中,再单击确定,提交数据源。
凭据账密轮转
数据源的帐密轮转功能由KMS密钥管理服务提供,有两种轮转方式:
定时轮转:创建凭据时可以设置定时轮转周期,到时会自动轮转
立即轮转:当出现帐密泄漏或者其他需要实时轮转时可以KMS凭据管理控制台进行立即轮转。
当KMS凭据发生定时或者主动轮转时,会通知MSE Nacos进行加密数据源配置的更新,Nacos会实时推送应用侧进行账号密码的更新,Druid会优雅进行在线连接的替换,保证对业务无损。
账号密码的轮转由KMS凭据管家托管,通过RDS控制台、OpenAPI或数据库内高权限账号直接修改托管账号的密码无法实时推送至应用侧。
应用侧接入
单击数据源详情页的应用侧接入,查看每个数据源的接入步骤。
参数配置请以控制台应用侧接入的实际设置为准,控制台中每一步的参数均与目标实例及数据源的绑定关系和动态适配规则直接关联。
Step 1: 版本升级
Spring Cloud 版本升级 2023.0.3.3 版本以上。
Druid 升级至 1.2.25版本以上。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.25</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2023.0.3.3</version>
</dependency>
Step2: 修改配置
修改
application.properties
,配置开启动态数据源轮转及指定数据源对应的Nacos配置。
#将数据源配置导入Spring,初始化数据源
spring.config.import[0]=optional:nacos:cipher-kms-aes-256-proxy-spring-{resourceName}.properties?group=nacos-datasource
#指定Nacos地址,此处默认为公网地址,请按需修改
spring.cloud.nacos.config.server-addr={nacos server}
#指定命名空间
spring.cloud.nacos.config.namespace={命名空间ID}
#指定kms region id
spring.cloud.nacos.config.kms_region_id={实例region}
#打开druid数据源托管开关并指定轮转加密配置dataId
spring.nacos.config.proxy.druid.enabled=true
spring.nacos.config.proxy.druid.data-id={dataID}
Step3 设置访问凭证
数据源对应的加密配置需要在应用运行时进行内存解密,因此需预先设置可解密配置的凭证。该解密过程支持两种凭证管理方式:
无AK形式访问凭证(推荐)
如果应用运行时在阿里云ECS或者ACK上,推荐使用无AK形式。设置JVM参数:
ECSRAMRole形式:
-Dspring.cloud.nacos.config.ramRoleName=${ramRoleName}
OIDCRoleARN形式:
-Dspring.cloud.nacos.config.alibabaCloudRoleSessionName=${sessionName}
传统AK/SK形式
设置JVM参数:
-Dspring.cloud.nacos.config.accessKey=${accessKey}
-Dspring.cloud.nacos.config.secretKey=${secretKey}
${accessKey}和${secretKey}请替换为实际的accessKey及secretKey。
无论选择哪种访问凭证,都需要为凭证进行授权,为对应账号或者角色授予“针对 KMS 加密的解密权限”,才能正常在应用侧内存中将加密配置解密为明文。
进入当前实例页面,单击客户端配置访问凭证。
,授权粒度选择针对 KMS 加密的解密权限,按照指引完成授权。更多的凭证形式可参考常见问题
1. KMS的凭据轮转什么时候会对旧账密进行失效处理呢?
KMS在凭据轮转时会通知MSE更新账密,并且保留两个版本的账密生效,2个版本前账密会失效,未来会对接具体数据源的会话管理,当旧账密不存在在线连接才会失效,进一步保证稳定性。
2. 当应用侧触发异常保护机制时,有办法感知吗?
在Nacos的推送机制中,当应用侧数据连接池触发异常保护机制时,会告知nacos通知失败,可以通过nacos的config.log查看notify-error关键字感知异常保护事件的发生,未来在nacos的新版本中会上报客户端监听期的回调状态,在监听查询功能中可以直接看到客户端的回调失败的状态。