一、背景
java微服务程序使用consul作为服务注册中心,而consul集群本身的访问是需要acl token的,以增强服务调用的安全性。
本文试着总结下,有哪些方法可以配置consul acl token,便于你根据具体的情况选择。
个人认为,没有最佳,只有更加建议,更适用于自身的方案。
二、设计方案
1、k8s内部的Secret
建议方案,也是本文重点阐述的一种方案。
对于敏感数据,建议使用Secret或外部秘密管理工具,并结合适当的RBAC策略来限制对这些敏感信息的访问。
2、命令行参数
在某些情况下,您可以在启动容器时通过命令行参数传递ACL Token。这种方法适用于Token不需要频繁更改,且可以通过其他安全措施(如网络隔离)来保护的场景。
consul_acl_token=xxxx-xx-xx-xxxxjava -Dspring.cloud.consul.config.acl-token=$consul_acl_token -Dspring.cloud.consul.discovery.acl-token=$consul_acl_token -Xms${Xms} -Xmx${Xmx} -jar xxx.jar
在制作docker image的时候,把acl token赋值给应用程序。
3、环境变量
在deployment.yaml文件中,显式赋值给应用程序。
见下示例:
containers:- name: {{ .Values.appName }}env:- name: spring.cloud.consul.config.acl-tokenvalue: 'xxxx-xx-xx-xxxx'- name: spring.cloud.consul.discovery.acl-tokenvalue: 'xxxx-xx-xx-xxxx'- name: APPNAMEvalue: {{ .Values.appName }}
这种方式,在yaml中就看到了环境变量的明文,很直观的同时,也恰好说明此方式不适合配置consul acl token。
4、ConfigMap
类似于Secret,ConfigMap可以用来存储非敏感的配置信息。虽然它不是为敏感数据设计的,但如果您的ACL Token不需要严格保密,您可以将其存储在ConfigMap中,并以环境变量的形式在Pod中引用。
5、文件系统挂载
如果您的集群环境支持,可以将包含ACL Token的文件挂载到Pod中。例如,如果您有一个安全的文件服务器,可以从该服务器挂载包含Token的文件到Pod的文件系统中。
6、外部Secrets管理工具
使用如HashiCorp Vault、AWS Secrets Manager、Azure Key Vault等外部秘密管理工具。这些工具提供了更高级的安全特性,如自动轮换、审计日志和更细粒度的访问控制。您可以将Consul ACL Token存储在这些工具中,并通过它们提供的Kubernetes插件或集成来在Pod中引用。
7、启动时从外部源获取
在Pod启动时,可以通过初始化容器(init container)从外部源(如HTTP API、数据库或其他服务)动态获取ACL Token。这种方法的优点是可以在运行时获取最新的Token,但需要确保外部源的安全性和可靠性。
每种方法都有其适用场景和安全考虑。在选择方法时,您应该考虑到您的安全要求、操作便利性以及Pod的运行环境。
三、secret对象
apiVersion: v1
kind: Secret
metadata:name: xx-registry-centernamespace: java-service
type: Opaque
data:consul-acl-token: xxxx-xx-xx-xxxx
四、deployment.yaml
在环境变量中读取secret,然后赋值到应用程序的环境变量里。
containers:- env:- name: CONSUL_ACL_TOKENvalueFrom:secretKeyRef:name: xx-registry-centerkey: consul-acl-token- name: spring.cloud.consul.config.acl-tokenvalue: $(CONSUL_ACL_TOKEN)- name: spring.cloud.consul.discovery.acl-tokenvalue: $(CONSUL_ACL_TOKEN)
在这里,你看到的不再是明文了,大大提高了安全性。
在“配置管理”–》“保密字典”专门管理consul acl token,集中管理与维护,不再是之前的散落状态,提高了可维护性。
五、总结
环境变量这么整下来,到底应该去哪看呢?
当进入pod容器,ps进程也看不到。
只有输入env | grep consul才能看到应用程序的环境变量。
好了,本文就总结到这里。