You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Terraform中生成安全的随机字节资源?

在Terraform中生成安全受管随机字节的可靠方法

问题描述

我常用以下方式在Terraform中生成随机字节:

resource "random_id" "foo" {
  byte_length = 32
}

resource "something_else" "foo" {
  secret = sensitive(random_id.foo.b64std)
}

但random_id资源的输出未标记为敏感信息,其值会作为资源id暴露在日志中,即便在something_else中使用sensitive()函数脱敏也无济于事。

我知道random_password属于安全资源,但它无法生成原始随机字节。

请问有没有可靠的方法,在Terraform中生成受管理的安全随机字节资源?

(注:我清楚该值始终会在状态文件中可见,我们已对状态文件做了管控,目前主要担忧的是传播范围更广的输出日志文件。)

补充:曾有人提议将random_id标记为安全资源,但该提议因超出预期用途被否决。

解决方案

1. 基于random_password的编码转换方案

random_password的输出默认标记为敏感,不会在日志中泄露。我们可以利用Base64编码的特性,先生成对应长度的Base64字符串,再解码为原始字节:

resource "random_password" "secure_bytes" {
  length           = 44  # 32字节原始数据对应的Base64编码长度
  special          = false
  override_special = ""  # 避免生成特殊字符,保证Base64格式合规
}

locals {
  raw_secure_bytes = base64decode(random_password.secure_bytes.result)
}

resource "something_else" "foo" {
  secret = sensitive(local.raw_secure_bytes)
}

这种方式完全依托Terraform原生资源和函数,无需依赖外部工具,转换后的字节值会继承random_password的敏感属性,不会在日志中暴露。

2. 本地执行脚本生成方案

如果需要直接生成原始字节文件,可通过local-exec调用系统命令(如openssl)生成,再读取文件内容:

resource "null_resource" "generate_secure_bytes" {
  triggers = {
    # 修改触发器值可触发重新生成,比如用时间戳
    regenerate = timestamp()
  }

  provisioner "local-exec" {
    command = "openssl rand 32 > ./temp_secure_bytes.bin"
  }
}

data "local_file" "secure_bytes" {
  filename = "./temp_secure_bytes.bin"
  depends_on = [null_resource.generate_secure_bytes]
}

resource "something_else" "foo" {
  secret = sensitive(data.local_file.secure_bytes.content_base64)
}

使用该方案需注意:

  • 执行环境需预装openssl(Linux/macOS默认自带,Windows需额外安装)
  • 生成的临时文件需在后续步骤中清理,避免敏感数据遗留
  • 通过depends_on确保资源执行顺序正确

注意事项

  • 无论采用哪种方案,状态文件中仍会存储字节的编码值,需保持状态文件的安全管控
  • 优先推荐第一种方案,更契合Terraform的资源管理逻辑,无需额外的文件清理操作

内容的提问来源于stack exchange,提问作者eaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 14:36:22