簡體   English   中英

在 Terraform 中隱藏秘密

[英]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"
}

另一種選擇是使用GPGage之類的東西加密你的 repo 中的整個 YAML 文件,使用SOPSAnsible 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM