今天讲下如何在Spring应用中实现RDS数据源账密的运行时轮转,通过集成KMS与Nacos,实现数据库凭据的加密托管、动态更新与无缝切换,保障应用在凭据变更过程中的安全与稳定。
如果您的应用侧主要使用Java语言,使用Spring Boot或者Spring Cloud框架开发,并且应用中大量访问数据库,比如Mysql,Sql Server,PostgreSQL,MariaDB等,推荐采用运行时数据源轮转方案提升安全性。
方案架构如下图所示:
该方案的核心思想就是通过KMS对数据库账号密码进行加密托管,并结合Nacos实现动态配置管理,最终由Druid管理数据库连接。
准备工作:
已拥有阿里云账号,若在上云或数据库迁移上云过程中有不懂的,可寻翼龙云@yilongcloud助力免卡上云用云。
开通云数据库RDS,创建实例;还不会创建实例的友友可以去看小编之前的教程。
开通密钥管理服务(KMS),创建KMS专属版实例,完成KMS密钥KeyId创建。
开通MSE,创建企业版实例。
步骤一:创建KMS凭据
- 前往密钥管理服务的凭据管理页面,选择数据库凭据。
- 然后选择实例ID,单击创建凭据 > 创建单个凭据。
- 在创建数据库凭据面板选择RDS凭据的数据库类型,输入凭据名称,选择关联的RDS实例。
4..选择双账号托管,输入定制账号名,选择数据库,指定权限
5.选择加密主密钥,设置轮转周期,最后单击确定。
KMS凭据会自动创建访问数据库账号及密码,并且保证密码强度。
步骤二:创建数据源
说明:数据源功能底层基于Nacos配置中心实现,数据源配置将以加密配置形式存储在配置中心中。
- 前往MSE注册配置中心控制台的实例列表页面,在顶部菜单栏选择地域。
- 单击目标企业版实例名称。在左侧导航栏选择数据源管理。
如果实例没有绑定KME密钥,请按照弹窗提示完成密钥绑定。 - 在数据源管理页面,选择目标命名空间,然后单击创建数据源。
- 在创建数据源面板,配置数据源相关参数。
5.单击确定,在确认创建数据源弹框中,再单击确定,提交数据源。
步骤三:凭据账密轮转
数据源的帐密轮转功能由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的新版本中会上报客户端监听期的回调状态,在监听查询功能中可以直接看到客户端的回调失败的状态。