[英]Hide secret in Terraform
我正在嘗試使用 Terraform 在帕洛阿爾托創建 IPSEC 隧道。 代碼將通過管道推送。 我希望隧道的所有信息都是可讀的,除了pre_shared_key
。 我了解如何為一個實例加密它,但是由於將有多個隧道,如何加密密鑰並將 map 加密到它的實例?
vpns.yml:
vpns:
- name: "Test"
template: "template_name"
ip_type: "IP"
ip_remote: "1.1.1.1"
firewall_interface: "vlan.xxxx"
local_ip: "public_ip/24"
ikev2_profile: "VerySecure"
tunnel_interface: "tunnel1"
pre_shared_key: "*******"
我迭代的隧道模塊如下所示:
locals {
tunnel = yamldecode(file(var.vpn_file))
}
resource "panos_panorama_ike_gateway" "gateway" {
for_each = { for e in local.tunnel : e.Name => e }
name = each.value.name
template = each.value.template
version = "ikev2-preferred"
peer_ip_type = each.value.ip_type
peer_ip_value = each.value.ip_remote
interface = each.value.firewall_interface
local_ip_address_type = "ip"
local_ip_address_value = each.value.local_ip
pre_shared_key = each.value.pre_shared_key
ikev2_crypto_profile = each.value.ikev2_profile
enable_dead_peer_detection = true
dead_peer_detection_interval = "10"
dead_peer_detection_retry = "3"
liveness_check_interval = "5"
}
Gruntwork 的機密管理指南涵蓋了很多內容,因此可能值得一讀。
理想情況下,您將使用外部密鑰管理器(例如 Hashicorp Vault 或 AWS SSM Parameter Store/Secrets Manager)並使用random_password
生成密鑰,將其存儲在隧道一側的密鑰存儲中,然后在應用時從密鑰存儲中檢索它隧道的另一邊。
如果您打算使用單個terraform apply
程序創建隧道的兩側(例如,您將兩者的配置保存在同一目錄中),那么您甚至不需要秘密存儲並且可以只依賴於秘密僅曾經存儲在 Terraform state 中,並且永遠不會存儲在只有random_password
資源輸入的存儲庫中。
在您的情況下,您將擁有以下內容:
locals {
tunnel = {
"vpns" = [
{
"firewall_interface" = "vlan.xxxx"
"ikev2_profile" = "VerySecure"
"ip_remote" = "1.1.1.1"
"ip_type" = "IP"
"local_ip" = "public_ip/24"
"name" = "TestLeft"
"template" = "template_name"
"tunnel_interface" = "tunnel1"
},
{
"firewall_interface" = "vlan.xxxx"
"ikev2_profile" = "VerySecure"
"ip_remote" = "2.2.2.2"
"ip_type" = "IP"
"local_ip" = "public_ip/24"
"name" = "TestRight"
"template" = "template_name"
"tunnel_interface" = "tunnel1"
},
]
}
}
resource "random_password" "pre_shared_key" {
length = 32
}
resource "panos_panorama_ike_gateway" "gateway" {
for_each = { for e in local.tunnel : e.Name => e }
name = each.value.name
template = each.value.template
version = "ikev2-preferred"
peer_ip_type = each.value.ip_type
peer_ip_value = each.value.ip_remote
interface = each.value.firewall_interface
local_ip_address_type = "ip"
local_ip_address_value = each.value.local_ip
pre_shared_key = random_password.pre_shared_key.result
ikev2_crypto_profile = each.value.ikev2_profile
enable_dead_peer_detection = true
dead_peer_detection_interval = "10"
dead_peer_detection_retry = "3"
liveness_check_interval = "5"
}
另一種選擇是使用GPG或age之類的東西加密你的 repo 中的整個 YAML 文件,使用SOPS或Ansible Vault之類的東西選擇性地加密文件的一部分,或者將秘密分離到另一個完全加密的文件中以上任何選項,將非機密配置的 rest 保留為純文本。 然后,您可以在運行 Terraform 命令之前解密相關密鑰。
您需要確保安全訪問並加密 Terraform state 文件,因為這些文件將以純文本形式保存秘密。 Terraform 遠程 state 后端通常提供執行此操作的方法,例如指定用於加密 S3 中的 state 文件的 KMS 密鑰。
從 Terraform 0.14 起,您還可以將變量標記為敏感,這將在將它們寫入標准輸出時屏蔽它們。 使用上述使用random_password
的模式會自動為您處理,但如果您要將預共享密鑰作為變量輸入,那么您需要明確地將其標記為敏感:
variable "pre_shared_key" {
description = "The pre-shared key for the VPN tunnel"
type = string
sensitive = true
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.