在 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.result
sensitive = true # 防止明文泄露
}
高级安全实践
1. 自动加密存储
# 使用阿里云KMS加密密码
resource "alicloud_kms_ciphertext" "encrypted_pwd" {
key_id = "kms-key-id" # 替换为实际KMS Key ID
plaintext = 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 : 16
special = 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******" # 加密后的密文
通过该方案,您将获得:
✅ 符合企业级安全标准的密码生成机制
✅ 全生命周期的密码安全管理
✅ 自动化密码轮换能力