Nomad + Vault 集成
· 约 3 分钟读完
HashiCorp 的 Nomad 是一款轻量级的工作负载编排工具,能够高效地调度和管理容器化及非容器化的应用程序。Vault 是 HashiCorp 的另一款产品,专注于安全地存储和访问机密数据。将 Nomad 与 Vault 集成,可以实现对应用程序机密的安全管理和动态注入。
集成概述
Nomad 与 Vault 的集成主要通过以下方式实现:
- 动态机密注入: Nomad 作业可以通过 Vault 动态获取机密,如数据库凭证、API 密钥等。这使得应用程序在运行时能够安全地获取所需的机密,而无需在代码中硬编码或在配置文件中存储静态机密。
- 模板渲染: Nomad 的模板功能(基于 Consul Template)允许在任务启动时从 Vault 获取机密,并将其渲染到配置文件中。这使得应用程序能够在启动时获取最新的配置和机密信息。
技术细节
1. Vault 配置
- 启用机密引擎: 在 Vault 中,首先需要启用适当的机密引擎(如数据库引擎、KV 引擎等),并配置相应的策略和角色,以控制对机密的访问权限。
- 配置访问控制列表(ACL): Vault 的 ACL 系统用于保护集群免受未经授权的访问。在启用时,Nomad 和 Vault 必须正确配置,以确保集成的正常工作。
2. Nomad 配置
- 启用 Vault 集成: 在 Nomad 的配置文件中,需要启用 Vault 集成,并配置 Vault 的地址和认证方式。这使得 Nomad 能够与 Vault 通信,获取所需的机密。
- 配置任务模板: 在 Nomad 作业规范中,可以使用模板块(template stanza)来定义从 Vault 获取机密的方式。这些模板会在任务启动时被渲染,生成包含机密的配置文件。
3. 任务运行时
- 机密注入: 当 Nomad 启动任务时,它会与 Vault 交互,获取所需的机密,并将其注入到任务的环境变量或配置文件中。这确保了应用程序在运行时能够安全地访问所需的机密。
- 机密更新: 如果 Vault 中的机密发生变化,Nomad 可以通过其内置的机制,确保任务获取到最新的机密信息。这使得应用程序能够动态响应机密的变化,而无需重新部署。
实践示例
以下示例展示如何在 Nomad 作业中使用 Vault 动态获取数据库凭证:
job "example" {
datacenters = ["dc1"]
type = "service"
group "web" {
count = 1
task "web" {
driver = "docker"
config {
image = "nginx:latest"
}
template {
data = <<EOF
database_url = "postgresql://{{ with secret "database/creds/my-role" }}{{ .Data.username }}:{{ .Data.password }}@{{ .Data.host }}:{{ .Data.port }}{{ end }}"
EOF
destination = "secrets/database_url.conf"
}
resources {
cpu = 500 # 0.5 CPU
memory = 256 # 256MB memory
}
}
}
}在上述示例中:
template块用于从 Vault 的database/creds/my-role路径获取动态生成的数据库凭证,并将其渲染到secrets/database_url.conf文件中。database_url.conf文件包含数据库的连接信息,供应用程序在运行时使用。
最佳实践
- 最小权限原则: 在 Vault 中,为 Nomad 配置的角色应仅具有访问所需机密的权限,避免过度授权。
- 机密轮换: 定期轮换 Vault 中的机密,并确保 Nomad 能够处理机密的更新,以增强安全性。
- 监控与审计: 启用 Vault 的审计日志功能,监控对机密的访问和操作,以便及时发现和响应潜在的安全事件。