如何在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
相关产品推荐
相关产品推荐

