Spring应用RDS数据源账密运行时轮转

本文档介绍如何在Spring应用中实现RDS数据源账密的运行时轮转,通过集成KMSNacos,实现数据库凭据的加密托管、动态更新与无缝切换,保障应用在凭据变更过程中的安全与稳定。

方案概览

如果您的应用侧主要使用Java语言,使用Spring Boot或者Spring Cloud框架开发,并且应用中大量访问数据库,比如Mysql,Sql Server,PostgreSQL,MariaDB等,推荐采用运行时数据源轮转方案提升安全性。方案架构如下图所示:

image

该方案的核心思想就是通过KMS对数据库账号密码进行加密托管,并结合Nacos实现动态配置管理,最终由Druid管理数据库连接。方案支持以下特性:

  • 数据源配置统一托管及加密存储&传输:实现数据库连接信息的集中管理,并通过加密手段保障配置数据在存储与传输过程中的安全。

  • 账密全托管双层权限管控:数据库账号密码由系统全托管,结合双层权限认证机制,提升访问安全性。

  • 账密运行时定时轮转与秒级泄漏修复:支持数据库凭据在运行期间按策略自动轮换,并可在发现泄漏后实现快速修复,降低安全风险。

  • 运行期账号无损切换:在不中断业务的前提下,动态切换数据库访问账号,保障系统高可用性与维护灵活性。

  • 应用侧数据库性能参数调优:支持连接池大小、超时时间等关键性能参数的灵活调整,提升系统稳定性与响应能力。

  • 异常参数保护机制 :对关键参数进行校验与保护,防止误配置导致业务中断,确保变更过程安全可控。

前提条件

  • 开通云数据库RDS,创建实例。

    操作步骤

    开通云数据库RDS后,若您无可用实例,请参考此处步骤创建一个实例,如需详细了解创建配置请参见创建RDS MySQL实例

    点此打开RDS实例新版创建页面,完成下述基础配置,其他配置保持默认即可:

    1. 计费方式:短期测试建议您选择按量付费

    2. 所属地域:请选择合适的阿里云地域,创建后不可修改。

    3. 产品系列:选择基础系列,性价比高,用于学习或测试。故障恢复和重启耗时较长。

  • 开通密钥管理服务(KMS),创建KMS专属版实例,完成KMS密钥KeyId创建。

    创建KMS专属版实例操作步骤

    开通密钥管理服务(KMS)后,若您无可用实例,请参考此处步骤创建一个实例,如需详细了解创建配置请参见创建KMS专属版实例

    前往密钥管理服务控制台的实例管理页面,在顶部菜单栏选择地域后,单击创建实例,请选择合适的阿里云地域,其他配置保持默认即可。

    创建KMS密钥KeyId

    若您无可以用密钥,请参考此处步骤创建一个实例,如需详细了解创建配置请参见管理密钥

    前往密钥管理服务控制台的密钥管理页面,在顶部菜单栏选择地域后,单击默认密钥页签,单击主密钥操作列的启用,完成下述基础配置,其他配置保持默认即可:

    1. 密钥别名:密钥的别名标识符。

    2. 高级设置:密钥材料来源。

      • 阿里云KMS:密钥材料将由KMS生成。

      • 外部:KMS不会生成密钥材料,您需要自行导入密钥材料。更多信息,请参见导入对称密钥材料

      请仔细阅读并选中我了解使用外部密钥材料的方法和意义
  • 开通MSE,创建企业版实例。

    创建企业版实例

    开通MSE微服务引擎后,若您无可用实例,请参考此处步骤创建一个实例,如需详细了解创建配置请参见创建实例

    前往MSE微服务引擎控制台的实例列表页面,在顶部菜单栏选择地域后,单击创建实例,完成下述基础配置,其他配置保持默认即可:

    1. 计费方式:短期测试建议您选择按量付费

    2. 所属地域:请选择合适的阿里云地域,创建后不可修改。

    3. 产品版本:选择企业版。

      MSE Nacos企业版支持,专业版与开发版暂不支持此功能。
    4. 实例名称:设置名称,名称在阿里云地域内全局唯一,创建后不可修改。

创建KMS凭据

  1. 前往密钥管理服务的凭据管理页面,选择数据库凭据

  2. 然后选择实例ID,单击创建凭据 > 创建单个凭据

  3. 创建数据库凭据面板选择RDS凭据数据库类型,输入凭据名称,选择关联的RDS实例

    image

  4. 选择双账号托管,输入定制账号名选择数据库指定权限

    image

  5. 选择加密主密钥,设置轮转周期,最后单击确定

KMS凭据会自动创建访问数据库账号及密码,并且保证密码强度。

创建数据源

说明

数据源功能底层基于Nacos配置中心实现,数据源配置将以加密配置形式存储在配置中心中。

  1. 前往MSE注册配置中心控制台的实例列表页面,在顶部菜单栏选择地域。

  2. 单击目标企业版实例名称。在左侧导航栏选择数据源管理

    如果实例没有绑定KME密钥,请按照弹窗提示完成密钥绑定。
  3. 数据源管理页面,选择目标命名空间,然后单击创建数据源

  4. 创建数据源面板,配置数据源相关参数。参数详情,请参见创建数据源

    image

  1. 单击确定,在确认创建数据源弹框中,再单击确定,提交数据源。

凭据账密轮转

数据源的帐密轮转功能由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}请替换为实际的accessKeysecretKey。

无论选择哪种访问凭证,都需要为凭证进行授权,为对应账号或者角色授予“针对 KMS 加密的解密权限”,才能正常在应用侧内存中将加密配置解密为明文。

进入当前实例页面,单击安全防护 > 认证鉴权 > 客户端鉴权 ,授权粒度选择针对 KMS 加密的解密权限,按照指引完成授权。更多的凭证形式可参考客户端配置访问凭证

常见问题

1. KMS的凭据轮转什么时候会对旧账密进行失效处理呢?

KMS在凭据轮转时会通知MSE更新账密,并且保留两个版本的账密生效,2个版本前账密会失效,未来会对接具体数据源的会话管理,当旧账密不存在在线连接才会失效,进一步保证稳定性。

2. 当应用侧触发异常保护机制时,有办法感知吗?

Nacos的推送机制中,当应用侧数据连接池触发异常保护机制时,会告知nacos通知失败,可以通过nacosconfig.log查看notify-error关键字感知异常保护事件的发生,未来在nacos的新版本中会上报客户端监听期的回调状态,在监听查询功能中可以直接看到客户端的回调失败的状态。