terraform生成随机密码
在 Terraform 中生成安全随机密码可以通过 random_password
资源实现,以下是完整实现方案及安全实践:
基础实现 (生成随机密码)
terraform {required_providers {random = {source = "hashicorp/random"version = "~> 3.5.1" # 使用最新稳定版本}}
}# 生成随机密码
resource "random_password" "db_password" {length = 16 # 密码长度special = true # 包含特殊字符override_special = "!@#$%&*()-_=+[]{}<>:?" # 允许的特殊字符
}# 输出敏感值(自动隐藏)
output "database_password" {value = random_password.db_password.resultsensitive = true # 防止明文泄露
}
高级安全实践
1. 自动加密存储
# 使用阿里云KMS加密密码
resource "alicloud_kms_ciphertext" "encrypted_pwd" {key_id = "kms-key-id" # 替换为实际KMS Key IDplaintext = random_password.db_password.result
}# 输出加密后的密文
output "encrypted_password" {value = alicloud_kms_ciphertext.encrypted_pwd.ciphertext_blob
}
2. 密码策略验证
# 自定义密码规则检查
locals {password_validation = [length(var.password) >= 12,can(regex("[A-Z]", var.password)),can(regex("[a-z]", var.password)),can(regex("[0-9]", var.password)),can(regex("[!@#$%^&*]", var.password))]
}# 密码复杂度验证
resource "null_resource" "password_check" {count = alltrue(local.password_validation) ? 1 : 0
}
3. 动态密码生成
# 根据环境变量生成不同强度的密码
resource "random_password" "dynamic_password" {length = var.env == "prod" ? 24 : 16special = var.env == "prod"min_special = var.env == "prod" ? 4 : 2
}
使用示例
# 创建RDS实例时注入密码
resource "alicloud_db_instance" "mysql" {engine = "MySQL"engine_version = "8.0"instance_type = "rds.mysql.s2.large"instance_storage = "20"password = random_password.db_password.result # 注入密码
}
安全操作流程
查看加密密码
terraform output -raw encrypted_password | base64 --decode > pwd.enc
解密密码(生产环境操作)
alicloud kms Decrypt \--CiphertextBlob $(cat pwd.enc) \--KeyId kms-key-id
最佳实践建议
状态文件保护
-
使用加密的远程 Backend(如 OSS + KMS)
-
禁止将
.tfstate
文件提交到版本控制
访问控制
# 通过RAM限制密码访问权限
data "alicloud_ram_policy_document" "password_access" {statement {actions = ["terraform:output:get"]resources = ["acs:terraform:*:*:output/database_password"]}
}
密码轮转策略
# 每30天自动轮转密码
resource "time_rotating" "password_rotation" {rotation_days = 30
}resource "random_password" "rotating_password" {keepers = {rotation_time = time_rotating.password_rotation.id}# 其他参数...
}
输出结果示例
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.Outputs:database_password = <sensitive> # 安全隐藏
encrypted_password = "ODJjNzAyYjgt******" # 加密后的密文
通过该方案,您将获得:
✅ 符合企业级安全标准的密码生成机制
✅ 全生命周期的密码安全管理
✅ 自动化密码轮换能力