问题
需要定期轮换AWS上面的RDS数据库的密码,而且,需要让业务程序无感知。
思路
AWS有个一个aws-secretsmanager-jdbc库,只要在SpringBoot的基础上面集成即可,就可以使用secrets manager来定期轮换数据库的密码了。
解决步骤
这里用的是私有vpc,所以需要一些准备工作。
安全组
这里需要许可内网vpc内部能够访问Secrets Manager的REST API,所以,需要许可vpc内部的能够使用443端口进行出站。配置类似如下:
endpoint
接下来,配置vpc的Secrets Manager服务端口,保证vpc内部能够通过内网访问调用Secrets Manager接口。
注意:这里私有vpc必须是RDS同一个,这里的安全组,选择之前创建许可出站443端口的安全组即可。
Secrets Manager
参加一个密钥,并且让Secrets Manager定期轮换这个密钥的密码。后期,还需要将这个密钥集成到SpringBoot里面。创建密钥类似如下:
这里填入数据库用户名和密码。
注意:这里的数据库用户必须是数据库已经存在的用户。
注意:这里配置Lambda轮换函数,这里Lambda轮换函数也可以自动生成,默认是自动生成的,也是可以的。
直接验证
点击【立即轮换密钥】,进行密钥轮换,如下图:
然后,在执行轮换密钥的Lambda的监控CloudWatch日志组中可以发现类似日志:
finishSecret: Successfully set AWSCURRENT stage to version ...
,则表示轮换密码完成。最后,可以从【检索密钥值】中查看密码。进行登录测试,测试验证结果如下图:
上图使用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云中使用轮换密钥了。
参考:
- Amazon Secrets Manager 轮换问题排查
- 如何在私有 VPC 中轮换 AWS Secrets Manager 密钥?
- Spring Boot project using AWS RDS and Secrets Manager
- aws-secretsmanager-jdbc