Я хотел опубликовать это как запрос функции, но я хотел узнать, нашел ли кто-нибудь еще какой-нибудь умный способ сделать это, прежде чем я опубликую. Или, может быть, кто-нибудь из Hashicorp скажет мне, что это будет функция в ближайшем будущем.
Я искал способ замаскировать переменные с консоли при запуске terraform apply/show. Предпочтительно пытаться замаскировать переменные с помощью инициатора local-exec при передаче переменных в сценарий.
Инструмент под названием Terrahelp - единственное, что я могу найти, который сделает это, но он будет применяться только к переменным в файле tfvars, который не допускает интерполяции. Это не помогает, поскольку мы пытаемся использовать Vault, чтобы хранить секреты вне файлов терраформирования.
Current Versions
Terraform v0.11.7
provider.null v1.0.0
provider.template v1.0.0
provider.vault v1.3.1
provider.vsphere v1.8.1
Сценарий использования
provisioner "local-exec" {
command = "&'${path.module}\\scripts\\script.ps1' -name ${var.node_name} -pass '${var.pass}' -user ${var.user} -server ${var.server}"
interpreter = ["Powershell", "-Command"]
}
Попытки решения
Я использую Vault, чтобы хранить секреты в файлах Terraform, поэтому я использую поставщика хранилища и вызываю данные из него. Я попытался создать модуль и вывести секреты со значением sensitive = true, а затем вызвать этот модуль, чтобы использовать секреты, которые все еще отображаются в консоли.
Предложение
Разрешить какое-то чувствительное значение, похожее на вывод в переменные в Terraform. Поэтому, если сценарии, подобные приведенным выше, вызываются в консоли, они не будут отображать конфиденциальную информацию о переменных.
использованная литература https://github.com/hashicorp/terraform/issues/16114https://github.com/hashicorp/terraform/issues/16643
Если вы используете Vault, вы можете настроить одноразовые пароли. Тогда не имеет значения, есть ли они в журналах или нет, поскольку они недействительны после того, как были использованы (или с истекшим сроком действия).





Благодарим за отзыв, пароли не могут быть установлены для одноразового использования, поскольку некоторые из них являются учетными записями служб в AD, которые выполняют другие действия, которые эти приложения не могут обрабатывать постоянными изменениями пароля.
Мы нашли решение с помощью другого продукта - Azure / Azure DevOps. Мы храним учетные данные в хранилищах ключей в Azure, к которым у Azure DevOps есть доступ, и используем конвейеры Azure DevOps для отправки кода терраформирования на наш сервер сборки. Кажется, что Azure DevOps действует как оболочка, скрывающая любые секреты от консоли, и работает очень хорошо. Я бы порекомендовал его всем, кто также хочет скрыть секреты из файлов терраформ / командной строки.
Вот как я это делаю для нескольких локальных сервисов:
1 - var.password фактически не хранит пароль. Скорее, он хранит имя переменной окружения.
2 - Мои сценарии получают пароли из этих переменных среды.
3 - У меня есть небольшая программа, которая загружает секреты в среду и очищает их для terraform apply.
В конце концов, я просто обхожу Terraform за секреты, используемые скриптами. Не идеально, но и лучшего решения я не нашел.
Я думаю, что https://github.com/cloudposse/tfmask может быть тем, что вы ищете:
Command line utility to mask sensitive output from a transform plan or terraform apply.
Сначала вы устанавливаете переменную среды для фильтрации замаскированных ключей (по общему признанию, здесь требуется некоторая ручная работа):
export TFMASK_VALUES_REGEX = "(?i)^.*(secret|password|oauth|token|key).*$"
А затем пропустите команды терраформирования через tfmask, в результате чего получится замаскированный вывод:
terraform plan | tfmask
Я не могу точно сказать, является ли это вашим вариантом использования или нет, но одна стратегия, которую мы использовали с чувствительными переменными, - это использовать поведение Terraform по умолчанию для использования переменные среды для установки переменных TF, например,
variable "sensitive_variable" {
type = "string"
}
sensitive_var=$(curl url/with/remote/value)
export TF_VAR_sensitive_variable=$sensitive_var
terraform apply
Terraform 13 был выпущен после того, как был задан этот вопрос, и позволяет помечать переменные как sensitive и не показывать их в консоли.
https://www.terraform.io/docs/configuration/outputs.html#sensitive-suppressing-values-in-cli-output
Можем ли мы отметить это как принятый ответ?
Вы пробовали ресурс
aws_ssm_parameterи его вывод, он уже отмечен (value: <sensitive>), возможно, вы сможете получить от него какие-то подсказки.