Pama

Nomad + Vault 集成

HashiCorp 的 Nomad 是一款轻量级的工作负载编排工具,能够高效地调度和管理容器化及非容器化的应用程序。Vault 是 HashiCorp 的另一款产品,专注于安全地存储和访问机密数据。将 Nomad 与 Vault 集成,可以实现对应用程序机密的安全管理和动态注入。

集成概述

Nomad 与 Vault 的集成主要通过以下方式实现:

  1. 动态机密注入: Nomad 作业可以通过 Vault 动态获取机密,如数据库凭证、API 密钥等。这使得应用程序在运行时能够安全地获取所需的机密,而无需在代码中硬编码或在配置文件中存储静态机密。
  2. 模板渲染: 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 的审计日志功能,监控对机密的访问和操作,以便及时发现和响应潜在的安全事件。