在前面的一些文章中,我们介绍了如何在云上安全的存放配置数据,但是上面的方法都是有代码侵入性的,也就是说需要修改应用程序,本文会讲解如何使用 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