Terraform azurerm_virtual_machine remote-exec敏感值抑制输出解决方法
在Azure平台使用Terraform部署MongoDB集群时,通过remote-exec provisioner在虚拟机创建阶段执行集群初始化脚本,需要查看脚本输出验证配置有效性,但执行时日志被强制屏蔽,提示如下:
module.MongoInstall.azurerm_virtual_machine.MongoVirtualMachine[2] (remote-exec): (output suppressed due to sensitive value in config)
无法查看脚本实际执行内容,难以定位集群初始化问题。
原有核心配置如下:
- remote-exec与连接配置
provisioner "remote-exec" { inline = [ "chmod +x /tmp/mongo-activate.sh", "cd /tmp", "sudo ./mongo-activate.sh ${var.username} ${var.vmpassword} ${var.mongopassword} ${local.isCluster} ${join("," ,azurerm_public_ip.MongoPublicIpAddress.*.fqdn)} ${var.hasArbiter}", "rm mongo-activate.sh", ] connection { type = "ssh" host = "${element(azurerm_public_ip.MongoPublicIpAddress.*.ip_address, 0)}" user = "${var.username}" password = var.vmpassword timeout = "15m" } }
- 变量定义示例
variable "vmpassword" { default = "testtesttest" //psw:mongo VM }
Terraform 0.14及之后版本内置敏感值保护机制:只要remote-exec的inline命令、执行参数中直接拼接了被标记为敏感类型的变量(如配置中的虚拟机密码、MongoDB密码),为防止敏感信息泄露到执行日志,Terraform会直接抑制该provisioner的全部标准输出、标准错误内容,和脚本本身是否正常执行无关。connection块中引用的密码字段属于Terraform识别的内置敏感配置项,不会触发输出抑制,本次问题的核心触发点是inline命令中直接拼接了明文密码参数。
额外说明:原有配置将密码作为命令行位置参数传递本身存在安全风险,同机其他用户可通过ps、进程审计日志直接读取到明文密码。
方案1:优化参数传递方式(生产环境推荐,同时修复安全隐患)
不要将敏感值直接拼接在inline命令字符串中,改为通过remote-exec内置的environment块传递环境变量,初始化脚本改为从环境变量读取参数,从根源上避免敏感值出现在命令行拼接逻辑中,既不会触发日志抑制,也消除了命令行传密的安全风险。
修改后的配置示例:
provisioner "remote-exec" { inline = [ "chmod +x /tmp/mongo-activate.sh", "cd /tmp", "sudo ./mongo-activate.sh", "rm mongo-activate.sh", ] # 通过环境变量传递所有参数,敏感值不会触发inline字符串的敏感标记 environment = { VM_USERNAME = var.username VM_PASSWORD = var.vmpassword MONGO_PASSWORD = var.mongopassword IS_CLUSTER = local.isCluster MONGO_FQDNS = join(",", azurerm_public_ip.MongoPublicIpAddress.*.fqdn) HAS_ARBITER = var.hasArbiter } connection { type = "ssh" host = element(azurerm_public_ip.MongoPublicIpAddress.*.ip_address, 0) user = var.username password = var.vmpassword timeout = "15m" } }
对应修改mongo-activate.sh脚本,将原来读取位置参数$1/$2/...的逻辑,改为读取对应名称的环境变量即可。
方案2:临时关闭敏感值掩码(仅本地测试环境排查使用)
如果暂时不想调整脚本和配置,仅需要临时查看日志排查问题,可以在执行Terraform命令时添加环境变量关闭敏感值掩码功能:
TF_LOG_SENSITIVE_MASKING=false terraform apply
注意:该模式下所有敏感值(包括密码、密钥)会明文打印到终端和日志文件中,严禁在生产环境、公共CI/CD流水线中使用,排查完成后立即去掉该参数,避免敏感信息泄露。
内容的提问来源于stack exchange,提问作者Igor

