Можно ли создать секрет tls kubernetes, используя ресурсы данных Azure Key Vault в Terraform?

У меня есть файл сертификата и файл закрытого ключа, которые я использую для реализации зашифрованного трафика tls для нескольких разных модулей k8s, работающих под балансировщиком нагрузки NGINX ingress. Это работает нормально (т. е. веб-приложения видны и отображаются в браузере как безопасные), если я создаю секрет kubernetes.io/tls одним из следующих способов:

  1. Используйте кубектл:kubectl create secret my-tls-secret --key <path to key file> --cert <path to cert file>.
  2. Ссылайтесь на эти файлы локально в terraform:
      resource "kubernetes_secret" "my_tls_secret" {
  metadata {
    name = "my-tls-secret"
  }

  type = "kubernetes.io/tls"

  data = {
    "tls.crt" = file("${path.module}/certfile.cer"),
    "tls.key" = file("${path.module}/keyfile.key")
  }
}

Однако ни один из этих методов не является идеальным, потому что для № 1 это превращает мойterraform plan/applyшаги в двухэтапные процессы, а для № 2 я не хочу передавать файл ключа в систему управления версиями по соображениям безопасности.

Итак, мой вопрос: есть ли способ сделать это с помощью некоторой комбинации ресурсов данных Azure Key Vault (т. е. ключей, секретов или сертификатов)?

Я пробовал следующее:

  1. Скопируйте/вставьте сертификат и ключ в секреты хранилища ключей (также пробовали это с кодировкой значений base64 перед их вставкой в ​​хранилище ключей и использованием base64decode() вокруг значений tls.crt и tls.key в Terraform):
      data "azurerm_key_vault_secret" "my_private_key" {
  name         = "my-private-key"
  key_vault_id = data.azurerm_key_vault.mykv.id
}

data "azurerm_key_vault_secret" "my_certificate" {
  name         = "my-certificate"
  key_vault_id = data.azurerm_key_vault.mykv.id
}

resource "kubernetes_secret" "my_tls_secret" {
  metadata {
    name = "my-tls-secret"
  }

  type = "kubernetes.io/tls"

  data = {
    "tls.crt" = data.azurerm_key_vault_secret.my_certificate.value,
    "tls.key" = data.azurerm_key_vault_secret.my_private_key.value
  }
}
  1. Попытался импортировать сертификат как сертификат хранилища ключей Azure и получить доступ к его атрибутам следующим образом:
      data "azurerm_key_vault_certificate_data" "my_certificate_data" {
  name         = "my-certificate"
  key_vault_id = data.azurerm_key_vault.mykv.id
}

resource "kubernetes_secret" "my_tls_secret" {
  metadata {
    name = "my-tls-secret"
  }

  type = "kubernetes.io/tls"

  data = {
    "tls.crt" = data.azurerm_key_vault_certificate_data.my_certificate_data.pem,
    "tls.key" = data.azurerm_key_vault_certificate_data.my_certificate_data.key
  }
}

что приводит к ошибке в журнале входящего трафика NGINX:[lua] certificate.lua:253: call(): failed to convert private key from PEM to DER: PEM_read_bio_PrivateKey() failed, context: ssl_certificate_by_lua*, client: xx.xx.xx.xx, server: 0.0.0.0:443

Обе эти попытки закончились неудачей, и сайты в конечном итоге использовали сертификат kubernetes по умолчанию/фальшивый/acme и поэтому отображаются в браузере как небезопасные.

Я потенциально мог бы хранить файлы в контейнере для хранения и обернутьterraformкоманды в скрипте, который сначала извлекает сертификат/ключ из контейнера хранилища, а затем использует рабочий метод № 2, описанный выше, но я надеюсь, что есть способ избежать этого, который я просто упускаю. Любая помощь будет принята с благодарностью!

1 ответ

Метод № 1 из исходного поста работает — ключевой момент, который мне не хватало, — это способ получения сертификата/ключа в Azure KeyVault. Как упоминалось в посте, я копировал/вставлял текст из файлов в пользовательский интерфейс создания секрета веб-портала. При таком переводе что-то терялось. Правильный способ сделать это — использовать Azure CLI, например:

      az keyvault secret set --vault-name <vault name> --name my-private-key --file <path to key file>

az keyvault secret set --vault-name <vault name> --name my-certificate --file <path to cert file>
Другие вопросы по тегам