数据库密码定期轮换(AWS版)

问题

需要定期轮换AWS上面的RDS数据库的密码,而且,需要让业务程序无感知。

思路

AWS有个一个aws-secretsmanager-jdbc库,只要在SpringBoot的基础上面集成即可,就可以使用secrets manager来定期轮换数据库的密码了。

解决步骤

这里用的是私有vpc,所以需要一些准备工作。

安全组

这里需要许可内网vpc内部能够访问Secrets Manager的REST API,所以,需要许可vpc内部的能够使用443端口进行出入站。配置类似如下:
入站规则
在这里插入图片描述

注意:这里的出站入站规则都是内网地址,并且都是443端口的流量。

endpoint

接下来,配置vpc的Secrets Manager服务端口,保证vpc内部能够通过内网访问调用Secrets Manager接口。
endpoint配置sm
注意:这里私有vpc必须是RDS同一个,这里的安全组,选择之前创建许可出站443端口的安全组即可。

Secrets Manager

参加一个密钥,并且让Secrets Manager定期轮换这个密钥的密码。后期,还需要将这个密钥集成到SpringBoot里面。创建密钥类似如下:
创建密钥
创建RDS密钥
这里填入数据库用户名和密码。
注意:这里的数据库用户必须是数据库已经存在的用户。
配置密钥
配置轮换函数
注意:这里配置Lambda轮换函数,这里Lambda轮换函数也可以自动生成,默认是自动生成的,也是可以的。

直接验证

点击【立即轮换密钥】,进行密钥轮换,如下图:
立即轮换密码
然后,在执行轮换密钥的Lambda的监控CloudWatch日志组中可以发现类似日志:
finishSecret: Successfully set AWSCURRENT stage to version ...,则表示轮换密码完成。最后,可以从【检索密钥值】中查看密码。进行登录测试,测试验证结果如下图:
测试验证mysql登录
上图使用test用户和轮换后的密码,成功登录数据库。

aws-secretsmanager-jdbc集成

假设基础工程是SpringBoot的Maven项目。

Maven

<dependency>
    <groupId>com.amazonaws.secretsmanager</groupId>
    <artifactId>aws-secretsmanager-jdbc</artifactId>
    <version>1.0.11</version>
</dependency>

application.yml

spring:
  datasource:
    url: jdbc-secretsmanager:mysql://xxx:3306/xxx
    username: dev/test/rds
    driver-class-name: com.amazonaws.secretsmanager.sql.AWSSecretsManagerMySQLDriver

这里主要就是设置jdbc驱动类为com.amazonaws.secretsmanager.sql.AWSSecretsManagerMySQLDriver和设置数据库用户为Secrets Manager的密钥名称;url使用的jdbc-secretsmanager协议。

总结

到这里aws-secretsmanager-jdbc+Spring Boot就集成完成了,这样Spring就可以在AWS云中使用轮换密钥了。

参考: