Можно ли создать секрет tls kubernetes, используя ресурсы данных Azure Key Vault в Terraform?
У меня есть файл сертификата и файл закрытого ключа, которые я использую для реализации зашифрованного трафика tls для нескольких разных модулей k8s, работающих под балансировщиком нагрузки NGINX ingress. Это работает нормально (т. е. веб-приложения видны и отображаются в браузере как безопасные), если я создаю секрет kubernetes.io/tls одним из следующих способов:
- Используйте кубектл:
kubectl create secret my-tls-secret --key <path to key file> --cert <path to cert file>
. - Ссылайтесь на эти файлы локально в 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 (т. е. ключей, секретов или сертификатов)?
Я пробовал следующее:
- Скопируйте/вставьте сертификат и ключ в секреты хранилища ключей (также пробовали это с кодировкой значений 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
}
}
- Попытался импортировать сертификат как сертификат хранилища ключей 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>