我使用Hashicorp Vault在KV secrets引擎中存储多个机密,其中一个是数据库连接字符串-用户名、密码、主机ip和端口。我有多个微服务,需要使用这个数据库机密来连接数据库。
请澄清以下哪种集成模式有效:
- 与Vault直接集成:每个微服务都将与Vault直接连接,以获取操作所需的机密。所有微服务都将配置用于访问保险库的保险库令牌(在K8s机密中(
- 通过另一个微服务检索机密:是否应该有一个抽象层,即一个单独的用于Vault交互的微服务,所有其他微服务都将调用该Vault微服务的API来获取他们想要的机密。保险库令牌(在K8s Secrets中(将只能由一个微服务访问
另一个微服务是一个抽象层。这是一项额外的工作,可能会让你在未来更改秘密提供者。
除非您能够证明编写和维护抽象层是合理的(因为您希望在某些部署中使用Vault,在其他部署中使用AWS Secrets Manager(,否则不要麻烦。
另一个问题是,尽管Vault的KV存储非常常见,而且还有其他几种实现,但如果您想使用Transit、PKI或SSH CA,该怎么办?这些服务存在于其他地方(例如AWS(,但它们没有功能对等性。您可能不想在抽象层中支持这些差异。
允许将实现与代码解耦的低成本替代方案是在代码中使用简单的KVSecrets类包装Vault API类,这种软件设计模式称为门面。但请记住,除非您用两个服务测试您的类,否则您不能保证有一天可以迁移到另一个服务。
因此,考虑到所有这一切,只需直接调用API或使用Vault库作为编程语言即可。