如何使用 Infisical 管理 Terraform 中的密钥

  • infisical
  • 发布于 2026-01-30 10:42
  • 阅读 83

文章围绕 Terraform 中的密钥管理展开,指出密钥在 plan、apply 和 state 持久化三个阶段最容易泄露,常见风险来自 .tfvars、环境变量、provider 配置和模块输入。

Blog image

核心要点

  • Terraform 不提供原生的密钥存储或生命周期管理,这可能导致凭据在日志、状态文件和版本控制中暴露。
  • 在没有外部密钥管理器的情况下,密钥在 planapplystate 持久化过程中风险最高。
  • 使用 .tfvars 文件和环境变量等常见方法会增加密钥泄露的可能性。
  • Infisical 可与 Terraform 集成,在运行时安全地注入密钥,并实现中心化访问控制。
  • 临时密钥(ephemeral secrets)和自动轮换可以缩小影响范围,并帮助满足合规性要求。
  • 将 Infisical 与 Terraform 结合使用可以提高安全性,同时不会拖慢开发人员的工作流。

管理密钥是使用基础设施即代码(IaC)时最棘手的部分之一。挑战在于平衡安全性与可访问性。对云服务提供商凭据、数据库密码或 API Token 处理不当,可能会导致密钥泄露到 Git 历史记录、状态文件或 CI/CD 日志中,从而产生严重的安全漏洞,并可能导致未经授权的访问或数据泄露。

在过去几年里,HashiCorp 的 Terraform 已成为 IaC 的广泛采用标准,但它默认并不提供安全、中心化的密钥存储。

这正是 Infisical 发挥作用的地方。Infisical 提供了一个灵活的平台,可在团队和基础设施中安全地管理密钥。本指南将展示如何将 Infisical 接入 Terraform,以便在运行时获取密钥,从而减少密钥进入 VCS、日志、plan 文件或 state 文件的可能性。

Terraform 工作流中的密钥管理挑战

各组织已广泛将基础设施即代码(IaC)作为开发工作流中的标准组成部分。这一根本性转变使团队能够在一个中心代码仓库中,为基础设施的各个层面创建标准化蓝图。

这种基础设施部署方式的转变带来了一个核心挑战:如何在兼顾效率与安全实践的同时,存储和检索部署基础设施代码所必需的敏感数据?

虽然 Terraform 在基础设施资源编排方面表现出色,但它缺乏内置的密钥管理能力。相反,Terraform 的架构旨在与外部密钥管理平台集成,这意味着保护敏感凭据和 API 密钥的责任落在用户身上。

Terraform 暴露密钥的关键点

在 Terraform 的生命周期中,有三个关键时刻必须处理敏感信息:

  1. 规划基础设施部署时:在 terraform plan 期间,Terraform 会从变量、.tfvars 文件或环境变量中加载密钥,以验证配置并准备执行计划。在此阶段,密钥可能会被创建或访问;如果处理不当,可能会出现在 plan 输出或日志中。如果没有正确标记为 sensitive,它们还可能出现在控制台输出或日志里。
  2. 应用更改时:在 terraform apply 期间,密钥会被实际访问并用于配置资源。这包括向云服务提供商进行身份验证、配置服务,或将凭据传递给 API。确保这些密钥通过外部密钥管理系统被安全地检索和处理至关重要。此阶段的错误配置可能导致凭据在日志或 API 调用中被意外暴露。
  3. 持久化状态时:Terraform 的状态文件 terraform.tfstate 可能包含明文密钥,无论是存储在本地还是远程后端。存储在状态文件中的密钥必须经过加密并受到严格控制,以防被未授权人员访问。如果缺乏加密和严格的访问控制,这将成为一个关键攻击面。

在这些阶段中,密钥可能会出现在 Terraform 工作流的多个位置:

  • 变量:在 variables.tf 中定义并通过 .tfvars 文件或环境变量赋值,如果没有明确标记为敏感,它们很容易出现在状态文件或日志中。即使变量被标记为 sensitive = true,Provider 仍可能在状态中存储密钥。
  • Provider 块:通常直接在配置中包含 API 密钥、Token 或凭据。Terraform 通常会将这些值以未加密形式存储在状态中。
  • 模块输入:传递到模块中的任何敏感值,都会自动传播到根模块的状态中,除非显式标记为敏感。

应避免的高风险密钥管理实践

IaC 中不当密钥管理的风险并非纸上谈兵。GitGuardian 的《2025 年密钥蔓延状况报告》显示,泄露密钥的中位修复时间约为三个月,这给攻击者留下了较长的可利用窗口。在大多数情况下,这种暴露与其说源于复杂的零日漏洞,不如说源于团队在日常基础设施工作流中处理密钥的方式。

在实践中,这些风险往往首先出现在基础设施即代码工作流中。大多数团队在 Terraform 中处理密钥所依赖的机制,如 .tfvars 文件和环境变量,都存在明显弱点。

.tfvars 文件虽然易于使用,但也同样容易泄露到版本控制中,导致凭据暴露在 Git 历史记录里。环境变量虽然更具临时性,但在共享环境中可能被其他进程查看,也可能被记录到崩溃报告或调试输出中,或被意外打印到构建日志里。

一些团队会转向传统密钥库或手动加密方法来获得额外的安全性。虽然这些方法在理论上提供了强有力的保护,但往往也会引入运维上的摩擦,影响开发人员的生产效率和部署速度。这些方式通常需要额外的身份验证步骤、复杂的工具集成,以及手动的密钥轮换流程。

满足监管合规和审计要求

对于受 SOC 2ISO 27001HIPAAGDPR 约束的组织来说,仅仅安全地存储密钥是不够的。组织还必须做到:

  1. 严格的访问控制
  2. 记录每一次访问事件
  3. 证明定期进行密钥轮换
  4. 确保敏感数据绝不会出现在未受保护的日志或文件中

Terraform 可以强制执行基础设施变更,但它本身无法证明谁访问了某个密钥、何时访问,也无法原生强制执行基于 TTL 的过期机制。

如何在 Terraform 中管理密钥

解决方案不是强迫 Terraform 自己管理密钥,而是将其与专为安全密钥生命周期管理而设计的系统集成。

Infisical 通过中心化存储系统和细粒度访问控制填补了这一空白。它允许团队控制人类用户和 Machine Identity 的访问,支持中心化访问,并可与 DevOps 团队和工具集成。

除了基础密钥管理外,Infisical 还支持整个密钥生命周期——从轮换和动态凭据生成,到证书管理和安全审计。它支持动态密钥和自动轮换,可显著降低风险。

Terraform 用户的主要优势

对于 Terraform 用户来说,Infisical 提供的不仅仅是一个安全存储凭据的地方。它可以直接集成到工作流中,以便在运行时注入密钥。Infisical 能够安全地注入密钥,而无需创建临时文件、将敏感数据提交到版本控制中,或添加样板式的 Provider 配置。

其基于环境的组织方式使开发、预发布和生产凭据的隔离变得更加容易。基于角色的访问控制(RBAC)审计日志内置轮换策略可帮助团队在不增加额外工具层的情况下满足合规要求。

将 Infisical 与 Terraform 集成

前提条件

在开始集成之前,请确保你具备以下条件:

  • 已在本地机器上安装 Terraform CLI
  • 拥有一个至少配置了一个项目的 Infisical 账户
  • 已安装并正确完成身份验证的 Infisical CLI

第 1 步:配置 Infisical Provider

将 Infisical Provider 添加到你的 Terraform 配置文件中:

terraform {
  # 仅针对临时资源,最低使用 1.10+ 版本
  required_version = ">= 1.11.0"

  required_providers {
    infisical = {
      source  = "infisical/infisical"
      version = "~> 0.15.0"
    }
  }
}

第 2 步:设置身份验证

使用 Machine Identity,通过 OIDC AuthUniversal Auth 安全地将 Terraform 连接到 Infisical:

## 使用 Universal Auth 的 Provider 配置
provider "infisical" {
  host = "https://app.infisical.com"

  auth {
    universal_auth {
      client_id     = var.infisical_client_id
      client_secret = var.infisical_client_secret
    }
  }
}

## 变量定义
variable "infisical_client_id" {
  description = "Infisical Machine Identity Client ID"
  type        = string
  sensitive   = true
}

variable "infisical_client_secret" {
  description = "Infisical Machine Identity Client Secret"
  type        = string
  sensitive   = true
}

variable "infisical_project_id" {
  description = "Infisical Project ID (formerly workspace_id)"
  type        = string
}

第 3 步:选择你的密钥访问方式

选项 1:临时资源(Ephemeral Resources,推荐)

临时资源(Terraform 1.10+ 可用)会在运行时获取密钥,旨在避免将密钥值持久化到 Terraform 状态文件中。

terraform {
  required_version = ">= 1.10.0"

  required_providers {
    infisical = {
      source  = "infisical/infisical"
      version = "~> 0.15.0"
    }
  }
}

provider "infisical" {
  auth {
    universal_auth {
      client_id     = var.infisical_client_id
      client_secret = var.infisical_client_secret
    }
  }
}

## 在运行时获取密钥,且不将其值写入状态文件 (Terraform 1.10+)
ephemeral "infisical_secret" "db_password" {
  name        = "DB_PASSWORD"
  project_id  = var.infisical_project_id
  env_slug    = var.infisical_env_slug
  folder_path = "/app"
}

## 示例用法:传递给某些资源而不输出它
resource "null_resource" "example" {
  triggers = {
    example = "ok"
  }

  provisioner "local-exec" {
    command = "echo 'Secret fetched at runtime (not printed).'"
    environment = {
      DB_PASSWORD = ephemeral.infisical_secret.db_password.value
    }
  }
}

选项 2:传统数据源(Data Sources)

对于较旧版本的 Terraform,或必须从状态中引用密钥值的场景:

## 通过传统数据源获取密钥
data "infisical_secret" "db_password" {
  name        = "DB_PASSWORD"
  project_id  = var.infisical_project_id
  env_slug    = var.infisical_env_slug
  folder_path = "/app"
}

## 最佳实践:仅将其作为敏感输出暴露(仍会存在于状态文件中)
output "db_password" {
  value     = data.infisical_secret.db_password.value
  sensitive = true
}

警告: 使用数据源时,密钥值会存储在 Terraform 的状态文件中。请始终确保状态文件已加密,并使用适当的权限限制访问。

实际应用场景:结合 Terraform 和 Infisical

云资源配置

在创建 AWSGCPAzure 资源时,Infisical 可以安全地存储并将这些凭据注入到 Terraform 工作流中,帮助你避免供应商锁定。

数据库部署

Infisical 不再依赖嵌入静态数据库凭据,而是使用动态密钥按需生成短期数据库凭据。这些凭据会自动过期和轮换,从而减少凭据蔓延。

CI/CD 流水线集成

在自动化流水线中,Infisical 有助于安全地注入密钥、控制访问,并防止源代码和其他 DevOps 工具中的密钥泄露。

密钥管理最佳实践

为了在结合使用 Infisical 和 Terraform 时确保最高级别的安全性:

  • 避免泄露:使用临时资源,将变量标记为敏感,并实施扫描技术,以检测和防止配置文件和源代码中的密钥泄露。
  • 实施 RBAC:通过基于角色的控制限制访问,使安全团队能够确保只有授权用户和 Machine Identity 才能访问密钥。
  • 自动化更新:配置流水线以在部署期间获取最新密钥,并利用动态密钥来降低与静态凭据相关的风险。
  • 跟踪更改:使用版本历史记录进行全面的审计追踪和密钥访问监控。

结论

在 Terraform 中管理密钥,并不意味着必须在变量文件之间周旋,或冒着状态文件泄露的风险。Infisical 提供了一种安全且对开发人员友好的密钥管理方法,可与 Terraform 无缝集成,帮助团队在跨多个环境和云服务提供商加速部署的同时保持安全性。

  • 原文链接: infisical.com/blog/how-t...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
infisical
infisical
江湖只有他的大名,没有他的介绍。