Обнаружил тут интересную вещь при настройки CI для terraform.
Волтовый провайдер
terraform {
required_version = ">= 1.6.0"
required_providers {
elasticstack = {
source = "elastic/elasticstack"
version = "~> 0.12"
}
vault = {
source = "hashicorp/vault"
version = "~> 4.0"
}
}
}
provider "vault" {
address = var.vault_address
}Далее я получаю секреты для ELK кластера так:
data "vault_kv_secret_v2" "elastic_<cluster_name>" {
mount = "<mount>"
name = "<path/vault/env>"
}
provider "elasticstack" {
dynamic "elasticsearch" {
for_each = length(var.elasticsearch_endpoints) == 0 ? [] : [1]
content {
endpoints = var.elasticsearch_endpoints
username = data.vault_kv_secret_v2.elastic_<cluster_name>.data["username"]
password = data.vault_kv_secret_v2.elastic_<cluster_name>.data["password"]
}
}
dynamic "kibana" {
for_each = length(var.kibana_endpoints) == 0 ? [] : [1]
content {
endpoints = var.kibana_endpoints
username = data.vault_kv_secret_v2.elastic_<cluster_name>.data["username"]
password = data.vault_kv_secret_v2.elastic_<cluster_name>.data["password"]
}
}
}Локально все хорошо. В сиай мы используем ограниченную JWT роль, к который привязана политика на чтения конкретных секретов.
В итоге получаю ошибку:
URL: POST https://<vault_addr>:8200/v1/auth/token/create
Code: 403. Errors:
Проблема в том, что по дефолту провайдер волта пытается создать себе дочерний токен, чтобы его потом использовать. В политике, привязанной к роли это запрещено, чтобы использовать токен, полученный именно ей, нужно добавить в провайдер опцию
skip_child_token = true:provider "vault" {
address = var.vault_address
skip_child_token = true
}#terraform