如何通过Terraform安全构建Azure Key Vault且不明文存储密钥
解决方案
以下两种方案均无需手动预先创建独立Key Vault,完全符合基础设施即代码的理念,不会出现密钥明文存储的问题:
方案一:Azure DevOps保密变量传递(最推荐,轻量无额外依赖)
- 在Azure DevOps对应流水线的变量组/运行时变量中录入所有需要填充到Key Vault的敏感值,勾选保密选项,Azure DevOps会对这些值做加密存储,日志输出时自动掩码,不会明文泄露。
- 在Terraform代码中定义敏感类型的变量接收密钥,示例如下:
# 定义存储密钥的敏感变量 variable "key_vault_secrets" { type = map(string) sensitive = true description = "Secrets to be stored in the target Key Vault" } # 创建Key Vault资源 resource "azurerm_key_vault" "target" { # 常规配置省略 } # 填充密钥到Key Vault resource "azurerm_key_vault_secret" "secrets" { for_each = var.key_vault_secrets name = each.key value = each.value key_vault_id = azurerm_key_vault.target.id }
- 在流水线执行Terraform命令的阶段,通过
TF_VAR_前缀的环境变量将Azure DevOps的保密变量传递给Terraform,不需要将密钥写入任何配置文件或提交到git。整个传递过程仅在流水线运行时的内存中生效,无明文落盘风险。
方案二:SOPS加密配置文件(适合多密钥、多环境批量管理场景)
如果确实需要将密钥配置文件存入源代码管理,可通过以下方式实现无需手动前置部署Key Vault:
- 拆分Terraform部署为两个流水线阶段:第一阶段仅部署用于加密解密的根Key Vault,同时为Azure DevOps服务主体授予该根Key Vault的密钥加密/解密权限,该阶段完全自动化执行,不需要手动操作,符合IaC规范。
- 用SOPS工具配合根Key Vault的加密密钥加密所有敏感配置文件,加密后的文件可直接签入git,无明文泄露风险。
- 第二阶段部署业务用Key Vault时,流水线先通过Azure DevOps的服务身份自动解密配置文件,Terraform读取解密后的内容填充到业务Key Vault,解密内容仅在运行时内存中生效,不会持久化存储。
通用注意事项
无论采用哪种方案,都需要将Terraform状态文件存储在开启了服务端加密的Azure Blob Storage中,严格限制Blob的访问权限,避免状态文件中泄露敏感值。
Terraform代码中所有和密钥相关的变量、输出都要标记sensitive = true,避免相关值被打印到流水线日志中。
内容的提问来源于stack exchange,提问作者wishiwasabigdataguy
相关产品推荐
相关产品推荐

