在前面的一些文章中,我们介绍了如何在云上安全的存放配置数据,但是上面的方法都是有代码侵入性的,也就是说需要修改应用程序,本文会讲解如何使用 confd+ACM 在不修改代码的情况下动态修改应用所需的配置,并且可以重新启动应用加载最新的配置。这样做可以在无代码侵入的情况下加强应用程序的安全性和运维效率:
- 安全性:应用程序的数据可能是敏感数据,ACM 具有健壮的访问控制机制,可以对敏感数据进行加密来安全的保存密码、API 密钥、证书等敏感信息;
- 运维效率:当需要修改应用的某些配置内容时,如果只有一两台机器可以手工操作,但是当涉及几十上百台数量的时候,confd+ACM 可以通过配置的发布批量进行配置修改和重启操作;
- 无代码侵入:通过 confd+ACM 的组合可以做到无需修改应用代码即可达到让应用配置动态生效的效果
下面以应用的数据库配置为例讲解如何使用 confd+ACM 安全管理应用配置
准备工作
在操作本文的示例之前需要配置好开通 ACM 和对 confd 的使用有基本概念,ACM 的开通及其基本使用可以参考:这里
confd 的基本使用可以参考:这里
创建 confd 配置文件
创建 confd 所需的 toml 格式配置文件
vim /etc/confd/conf.d/myapp.toml
指定模版文件,
ACM 中的加密配置需要以 /cipher- 开头
check_cmd 用于检验配置的正确性,防止错误配置导致应用加载失败
reload_cmd 用于重启应用或者让应用动态加载配置
[template]
src = "jdbc.properties.tmpl"
dest = "/tmp/jdbc.properties"
keys = ["/cipher-myapp/database/jdbc",]
#check_cmd = "check config is correct"
reload_cmd = "restart app"
创建模版文件
vim /etc/confd/templates/jdbc.properties.tmpl
getv 从 ACM 中获取对应 dataId 的配置:
/cipher-myapp/database/jdbc 对应的 dataId 为 cipher-myapp.database.jdbc
confd 基于 kms 会自动对 /cipher- 开头的配置进行解密
{{$data := json (getv "/cipher-myapp/database/jdbc")}}
jdbc.url={{$data.url}}
jdbc.username={{$data.username}}
jdbc.password={{$data.password}}
在 ACM 上创建所需的配置文件
创建 dataId 为 cipher-myapp.database.jdbc 的配置文件,group 使用默认的 DEFAULT_GROUP 即可,配置内容为
{
"url":"jdbc:mysql://localhost:3306/dbName",
"username":"testuser",
"password":"testpassword"
}
启动 confd
和官网文档不同的是,要支持解密功能,需要设置 confd 的 -openKMS 开关,并且设置 kms 服务的 regionId,这个信息可以从示例代码中获得
confd -backend nacos -endpoint {endpoint}:8080 -namespace {namespace} -accessKey {accessKey} -secretKey {secretKey} -openKMS true -regionId {regionId} -watch
生成配置文件
查看生成的 /tmp/jdbc.properties 配置文件,如果生成了该文件,并且文件内容如下则说明整个流程运行正常
jdbc.url=jdbc:mysql://localhost:3306/dbName
jdbc.username=testuser
jdbc.password=testpassword
变更 ACM 配置内容
当需要修改数据库的连接串的时候,直接在 ACM 上修改 cipher-myapp.database.jdbc 配置,confd 会重新生成数据库配置文件,并让应用加载最新配置。当然在实际生产环境中,可以使用 ACM 的 Beta 功能对几台机器先进行灰度发布,检验没问题再继续全量发布
本文演示了如何使用 confd+ACM 安全管理敏感数据,ACM 安全配置更多信息还可以参考:这里
本文作者:风卿,Nacos 社区 Committer
本文作者:中间件小哥
阅读原文
本文为云栖社区原创内容,未经允许不得转载。