在 Terraform 中生成 SSH 密钥本质上是不安全的,因为它存储在 tfstate 文件中,但是我有一个类似的问题要解决,并认为最安全/可用的是使用秘密管理服务 + 使用云存储桶作为后端:
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "4.3.0"
}
}
backend "gcs" {
bucket = "tfstatebucket"
prefix = "terraform/production"
}
}
//Import Ansible private key from Google Secrets Manager
resource "google_secret_manager_secret" "ansible_private_key" {
secret_id = var.ansible_private_key_secret_id
replication {
automatic = true
}
}
data "google_secret_manager_secret_version" "ansible_private_key"{
secret = google_secret_manager_secret.ansible_private_key.secret_id
version = var.ansible_private_key_secret_id_version_number
}
resource "local_file" "ansible_imported_local_private_key" {
sensitive_content = data.google_secret_manager_secret_version.ansible_private_key.secret_data
filename = var.ansible_imported_local_private_key_filename
file_permission = "0600"
}
在 GCP 的情况下,我会在 Google Secrets Manager 中添加密钥,然后terraform import
在密钥上使用,然后将其写入后端存储桶。这样它就不会以纯文本形式存储在 Git 中,您可以将密钥文件保存在项目本地(.terraform 不应受版本控制),并且可以说它在存储桶中更安全。
所以工作流程本质上是:
Human --> Secret Manager
Secret Manager --> Terraform Import --> GCS Bucket Backend
|--> Create .terraform/ssh_key
.terraform/ssh_key --> Terraform/Ansible/Whatever
Hashicorp Vault 将是解决此问题的另一种方法