Terraform 中的机密。它是如何处理的。项目

发布: (2025年12月25日 GMT+8 08:43)
5 分钟阅读
原文: Dev.to

抱歉,我需要您提供要翻译的具体文本内容(即文章正文)。请把您想要翻译的完整文字粘贴在这里,我会按照要求保留源链接并进行简体中文翻译。

项目 1 — AWS Secrets Manager

场景

  • 公司类型:中大型、SaaS、金融科技、电子商务、医疗健康(例如,符合 SOC2、HIPAA、PCI 合规性的客户数据)。
  • 应用:使用 RDS(MySQL/Postgres)。
  • 需求
    • 密码 不能 出现在 Git 中或对开发者可见。
    • 必须可轮换。
    • 只能由 IAM 授权的服务访问。

期望结果

创建 RDS 数据库时不硬编码密码。Terraform 应该:

  • 在运行时安全读取密码。
  • 永不在代码中存储密码。
  • 仅允许 IAM 授权的服务访问。
aws secretsmanager create-secret \
  --name prod/rds/db_password \
  --secret-string '{"password":"StrongProdPass123!"}'

注意: 该密钥是在 Terraform 之外 创建的。

Terraform 后端配置

terraform {
  backend "s3" {
    bucket         = "terraform-state-prod"
    key            = "rds/terraform.tfstate"
    region         = "us-east-1"
    dynamodb_table = "terraform-locks"
    encrypt        = true
  }
}
  • 加密状态。
  • 防止状态损坏。
  • 实现团队安全部署。

读取 Terraform 中的 secret

data "aws_secretsmanager_secret" "db" {
  name = "prod/rds/db_password"
}

data "aws_secretsmanager_secret_version" "db" {
  secret_id = data.aws_secretsmanager_secret.db.id
}

Terraform 会创建该 secret;它只会读取它。

RDS 实例资源

resource "aws_db_instance" "prod" {
  engine         = "mysql"
  instance_class = "db.t3.micro"
  username       = "admin"
  password = jsondecode(
    data.aws_secretsmanager_secret_version.db.secret_string
  )["password"]
}
  • 支持密码轮换。
  • 通过 IAM 进行审计。
  • 符合安全合规要求。
  • 在 Git 中零密钥泄露。

在生产环境中,数据库密码存储在 AWS Secrets Manager 中。Terraform 在运行时使用 IAM 权限读取这些密码,避免硬编码的密钥,并支持轮换和合规性。

场景:简单 EC2 Secrets(SSM 参数存储)

目标

安全地将机密传递给 EC2 实例,而不暴露它们。

aws ssm put-parameter \
  --name /prod/app/api_key \
  --type SecureString \
  --value "api-key-123"

创建具有 ssm:GetParameter 权限的 IAM 角色并将其附加到 EC2 实例。

data "aws_ssm_parameter" "api_key" {
  name            = "/prod/app/api_key"
  with_decryption = true
}

EC2 用户数据示例

# For simple secrets, we use SSM SecureString. EC2 IAM roles allow secure access without exposing secrets in scripts or repositories.

CI‑驱动的秘密注入

背景

  • 现代 DevOps、远程团队、平台工程。
  • Terraform 在 CI 中运行;开发者本地不应拥有 AWS 密钥。

示例

variable "db_password" {
  sensitive = true
}

CI 环境变量(例如 GitHub Actions):

env:
  TF_VAR_db_password: ${{ secrets.DB_PASSWORD }}
  • 没有本地秘密。
  • 零信任模型。
  • 审计日志和一致的部署。

Terraform 仅在 CI 流水线中运行。秘密在运行时从 CI 秘密管理器注入,防止本地泄露。

集中式 Terraform 执行(Terraform Cloud)

  • 集中执行并对敏感变量进行加密存储。
  • 提供状态锁定、加密存储和远程运行。
  • 为团队成员消除本地 Terraform 安装需求。

Terraform Cloud 集中执行并安全地存储敏感变量,使协作更加安全。

动态密钥与 Vault

  • 适用于高安全性环境(银行、FinTech、企业)。
  • Vault 发放短期 DB 凭证。
  • Terraform 读取动态凭证;它们会自动过期。

Vault 提供动态密钥,通过发放有时间限制的凭证来降低冲击范围。

Tool Summary

ToolTypical Use Case
AWS Secrets Manager生产数据库(高价值密钥)
AWS SSM Parameter Store简单的 EC2 密钥(SecureString)
CI secret stores流水线级别的密钥注入
Terraform Cloud集中式团队执行
HashiCorp Vault高安全性、动态密钥生成
Back to Blog

相关文章

阅读更多 »