terraform-contour-mirror/modules/vault-platform-secrets/main.tf

1273 lines
48 KiB
HCL

locals {
regcred_input = try(var.common.regcred, {})
regcred_manual = try(trimspace(local.regcred_input.dockerconfigjson), "")
regcred_generate = try(local.regcred_input.generate, false)
regcred_server = try(local.regcred_input.server, "https://index.docker.io/v1/")
regcred_username = try(local.regcred_input.username, "")
regcred_password_input = try(local.regcred_input.password, "")
regcred_email = try(local.regcred_input.email, "")
regcred_password = local.regcred_password_input != "" ? local.regcred_password_input : try(random_password.regcred_password[0].result, "")
regcred_auth = base64encode("${local.regcred_username}:${local.regcred_password}")
regcred_generated = jsonencode({
auths = {
(local.regcred_server) = {
username = local.regcred_username
password = local.regcred_password
email = local.regcred_email
auth = local.regcred_auth
}
}
})
regcred_value = local.regcred_manual != "" ? local.regcred_manual : (
local.regcred_generate ? local.regcred_generated : "CHANGE_ME"
)
smtp_input = merge(try(var.common.smtp_secret, {}), try(var.common.smtp_auth, {}))
smtp_manual = try(trimspace(local.smtp_input.env_json), "")
smtp_generate = try(local.smtp_input.generate, false)
smtp_password_input = try(local.smtp_input.password, "")
smtp_password = local.smtp_password_input != "" ? local.smtp_password_input : try(random_password.smtp_password[0].result, "")
smtp_generated_obj = {
SMTP_HOST = try(local.smtp_input.host, "smtp.placeholder.local")
SMTP_PORT = tostring(try(local.smtp_input.port, 587))
SMTP_USERNAME = try(local.smtp_input.username, "placeholder")
SMTP_PASSWORD = local.smtp_password
SMTP_FROM_EMAIL = try(local.smtp_input.from_email, "noreply@example.local")
SMTP_USE_TLS = tostring(try(local.smtp_input.use_tls, true))
}
smtp_generated = jsonencode(local.smtp_generated_obj)
smtp_value = local.smtp_manual != "" ? local.smtp_manual : (
local.smtp_generate ? local.smtp_generated : "{}"
)
django_input = try(var.common.django_auth, {})
django_manual = try(trimspace(local.django_input.token), "")
django_generate = try(local.django_input.generate, false)
django_extra = try(local.django_input.extra, {})
django_token = local.django_manual != "" ? local.django_manual : (
local.django_generate ? try(random_password.django_token[0].result, "") : "CHANGE_ME"
)
django_username_manual = try(trimspace(local.django_input.username), "")
django_password_manual = try(trimspace(local.django_input.password), "")
django_token_decoded = can(base64decode(local.django_token)) ? base64decode(local.django_token) : ""
django_token_parts = local.django_token_decoded != "" ? split(":", local.django_token_decoded) : []
django_username = local.django_username_manual != "" ? local.django_username_manual : (
length(local.django_token_parts) > 0 ? local.django_token_parts[0] : ""
)
django_password = local.django_password_manual != "" ? local.django_password_manual : (
length(local.django_token_parts) > 1 ? join(":", slice(local.django_token_parts, 1, length(local.django_token_parts))) : ""
)
rsa_input = try(var.common.rsa_keys, {})
rsa_generate = try(local.rsa_input.generate, false)
rsa_bits = try(local.rsa_input.bits, var.default_rsa_bits)
rsa_public_manual = try(trimspace(local.rsa_input.public_key), "")
rsa_private_manual = try(trimspace(local.rsa_input.private_key), "")
rsa_public = local.rsa_public_manual != "" ? local.rsa_public_manual : (
local.rsa_generate ? try(tls_private_key.rsa_keys[0].public_key_pem, "") : "CHANGE_ME_PUBLIC"
)
rsa_private = local.rsa_private_manual != "" ? local.rsa_private_manual : (
local.rsa_generate ? try(tls_private_key.rsa_keys[0].private_key_pem, "") : "CHANGE_ME_PRIVATE"
)
infra_defaults = {
postgresql = {
enabled = true
admin = {
enabled = true
generate = false
postgres_password = ""
}
s3 = {
enabled = false
bucket = ""
endpoint = "https://storage.yandexcloud.net"
region = "ru-central1"
access_key = ""
secret_key = ""
}
users = {
enabled = true
generate = false
values = {}
}
apps = {}
role = {
enabled = true
name = "postgresql"
service_account_names = ["postgresql"]
service_account_namespaces = ["postgresql"]
token_ttl = "24h"
}
}
rabbitmq = {
enabled = true
auth = {
enabled = true
generate = false
username = ""
password = ""
}
apps = {}
role = {
enabled = true
name = "rabbitmq"
service_account_names = ["rabbitmq"]
service_account_namespaces = ["rabbitmq"]
token_ttl = "24h"
}
}
minio = {
enabled = true
admin = {
enabled = true
generate = false
root_user = ""
root_password = ""
}
apps = {}
role = {
enabled = true
name = "minio"
service_account_names = ["minio-sa"]
service_account_namespaces = ["minio"]
token_ttl = "24h"
}
}
kafka = {
enabled = true
bootstrap = {
enabled = true
generate = false
cluster_id = ""
controller_password = ""
inter_broker_password = ""
}
apps = {}
role = {
enabled = true
name = "kafka"
service_account_names = ["kafka-kafka-contour"]
service_account_namespaces = ["kafka"]
token_ttl = "24h"
}
}
zitadel = {
enabled = true
postgresql = {
enabled = true
generate = false
password = ""
}
role = {
enabled = true
name = "zitadel"
service_account_names = ["zitadel-idp-contour"]
service_account_namespaces = ["zitadel"]
token_ttl = "24h"
}
}
camunda = {
enabled = true
identity_components = {
enabled = true
generate = false
values = {}
}
identity_firstuser = {
enabled = true
generate = false
identity_firstuser_password = ""
}
keycloak_admin = {
enabled = true
generate = false
admin_password = ""
}
postgresql = {
enabled = true
generate = false
password = ""
postgres_password = ""
}
role = {
enabled = true
name = "camunda"
service_account_names = ["camunda-connectors", "camunda-identity", "camunda-operate", "camunda-optimize", "camunda-tasklist", "camunda-postgresql", "camunda-keycloak", "camunda-identity-postgresql"]
service_account_namespaces = ["camunda"]
token_ttl = "24h"
}
}
keycloak = {
enabled = false
admin = {
enabled = true
generate = false
password = ""
}
postgresql = {
enabled = true
generate = false
host = ""
port = ""
user = ""
database = ""
password = ""
}
role = {
enabled = true
name = "keycloak"
service_account_names = ["keycloak-keycloak-contour"]
service_account_namespaces = ["keycloak"]
token_ttl = "24h"
}
}
}
infra = {
for name, cfg in local.infra_defaults :
name => merge(cfg, try(var.infra[name], {}))
}
postgresql_cfg = local.infra.postgresql
rabbitmq_cfg = local.infra.rabbitmq
minio_cfg = local.infra.minio
kafka_cfg = local.infra.kafka
zitadel_cfg = local.infra.zitadel
camunda_cfg = local.infra.camunda
keycloak_cfg = local.infra.keycloak
postgresql_admin_cfg = merge(try(local.postgresql_cfg.admin, {}), try(var.infra.postgresql.admin, {}))
postgresql_s3_cfg = merge(try(local.postgresql_cfg.s3, {}), try(var.infra.postgresql.s3, {}))
postgresql_users_cfg = merge(try(local.postgresql_cfg.users, {}), try(var.infra.postgresql.users, {}))
postgresql_apps_cfg = try(local.postgresql_cfg.apps, {})
rabbitmq_auth_cfg = merge(try(local.rabbitmq_cfg.auth, {}), try(var.infra.rabbitmq.auth, {}))
rabbitmq_apps_cfg = try(local.rabbitmq_cfg.apps, {})
minio_admin_cfg = merge(try(local.minio_cfg.admin, {}), try(var.infra.minio.admin, {}))
minio_apps_cfg = try(local.minio_cfg.apps, {})
kafka_bootstrap_cfg = merge(try(local.kafka_cfg.bootstrap, {}), try(var.infra.kafka.bootstrap, {}))
kafka_apps_cfg = try(local.kafka_cfg.apps, {})
zitadel_pg_cfg = merge(try(local.zitadel_cfg.postgresql, {}), try(var.infra.zitadel.postgresql, {}))
camunda_identity_components_cfg = merge(try(local.camunda_cfg.identity_components, {}), try(var.infra.camunda.identity_components, {}))
camunda_identity_firstuser_cfg = merge(try(local.camunda_cfg.identity_firstuser, {}), try(var.infra.camunda.identity_firstuser, {}))
camunda_keycloak_cfg = merge(try(local.camunda_cfg.keycloak_admin, {}), try(var.infra.camunda.keycloak_admin, {}))
camunda_pg_cfg = merge(try(local.camunda_cfg.postgresql, {}), try(var.infra.camunda.postgresql, {}))
keycloak_admin_cfg = merge(try(local.keycloak_cfg.admin, {}), try(var.infra.keycloak.admin, {}))
keycloak_pg_cfg = merge(try(local.keycloak_cfg.postgresql, {}), try(var.infra.keycloak.postgresql, {}))
postgresql_admin_password = trimspace(try(local.postgresql_admin_cfg.postgres_password, "")) != "" ? trimspace(local.postgresql_admin_cfg.postgres_password) : (
try(local.postgresql_admin_cfg.generate, false) ? try(random_password.postgresql_admin_password[0].result, "") : ""
)
postgresql_apps = {
for app, cfg in local.postgresql_apps_cfg :
app => merge(
{
enabled = true
generate = false
username = ""
password = ""
password_key = ""
},
cfg,
{
username = trimspace(try(cfg.username, "")) != "" ? trimspace(try(cfg.username, "")) : app
password_key = trimspace(try(cfg.password_key, "")) != "" ? trimspace(try(cfg.password_key, "")) : app
password = trimspace(try(cfg.password, "")) != "" ? trimspace(try(cfg.password, "")) : (
try(cfg.generate, false) ? try(random_password.postgresql_app_password[app].result, "") : ""
)
}
)
}
postgresql_app_user_values = {
for app, cfg in local.postgresql_apps :
try(cfg.password_key, app) => try(cfg.password, "")
if try(cfg.enabled, true) && (
try(local.postgresql_apps_cfg[app].generate, false) ||
trimspace(try(local.postgresql_apps_cfg[app].password, "")) != ""
)
}
postgresql_users_values = merge(
try(local.postgresql_users_cfg.values, {}),
local.postgresql_app_user_values,
)
postgresql_users_has_values = (
length(keys(try(local.postgresql_users_cfg.values, {}))) > 0 ||
length(keys({
for app, cfg in local.postgresql_apps_cfg :
app => cfg
if try(cfg.enabled, true) && (
try(cfg.generate, false) ||
trimspace(try(cfg.password, "")) != ""
)
})) > 0
)
rabbitmq_password = trimspace(try(local.rabbitmq_auth_cfg.password, "")) != "" ? trimspace(local.rabbitmq_auth_cfg.password) : (
try(local.rabbitmq_auth_cfg.generate, false) ? try(random_password.rabbitmq_password[0].result, "") : ""
)
rabbitmq_apps = {
for app, cfg in local.rabbitmq_apps_cfg :
app => merge(
{
enabled = true
generate = false
username = ""
password = ""
vhost = "/"
permissions = {
configure = ".*"
write = ".*"
read = ".*"
}
vhosts = []
},
cfg,
{
username = trimspace(try(cfg.username, "")) != "" ? trimspace(try(cfg.username, "")) : app
password = trimspace(try(cfg.password, "")) != "" ? trimspace(try(cfg.password, "")) : (
try(cfg.generate, false) ? try(random_password.rabbitmq_app_password[app].result, "") : ""
)
vhost = trimspace(try(cfg.vhost, "")) != "" ? trimspace(try(cfg.vhost, "")) : "/"
permissions = merge(
{
configure = ".*"
write = ".*"
read = ".*"
},
try(cfg.permissions, {})
)
vhosts = length(try(cfg.vhosts, [])) > 0 ? [
for vh in try(cfg.vhosts, []) : {
name = trimspace(try(vh.name, "")) != "" ? trimspace(try(vh.name, "")) : (trimspace(try(cfg.vhost, "")) != "" ? trimspace(try(cfg.vhost, "")) : "/")
permissions = merge(
{
configure = ".*"
write = ".*"
read = ".*"
},
try(vh.permissions, {})
)
}
] : []
}
)
}
minio_root_user = trimspace(try(local.minio_admin_cfg.root_user, "")) != "" ? trimspace(local.minio_admin_cfg.root_user) : (
try(local.minio_admin_cfg.generate, false) ? try(random_password.minio_root_user[0].result, "") : ""
)
minio_root_password = trimspace(try(local.minio_admin_cfg.root_password, "")) != "" ? trimspace(local.minio_admin_cfg.root_password) : (
try(local.minio_admin_cfg.generate, false) ? try(random_password.minio_root_password[0].result, "") : ""
)
minio_apps = {
for app, cfg in local.minio_apps_cfg :
app => merge(
{
enabled = true
generate = false
username = ""
password = ""
access_key = ""
secret_key = ""
policy = "readwrite"
buckets = []
client = {
endpoint = "http://minio.minio.svc.cluster.local:9000"
region = "us-east-1"
}
},
cfg,
{
username = trimspace(try(cfg.username, "")) != "" ? trimspace(try(cfg.username, "")) : app
password = trimspace(try(cfg.password, "")) != "" ? trimspace(try(cfg.password, "")) : (
try(cfg.generate, false) ? try(random_password.minio_app_password[app].result, "") : ""
)
access_key = trimspace(try(cfg.access_key, "")) != "" ? trimspace(try(cfg.access_key, "")) : (
trimspace(try(cfg.username, "")) != "" ? trimspace(try(cfg.username, "")) : app
)
secret_key = trimspace(try(cfg.secret_key, "")) != "" ? trimspace(try(cfg.secret_key, "")) : (
trimspace(try(cfg.password, "")) != "" ? trimspace(try(cfg.password, "")) : (
try(cfg.generate, false) ? try(random_password.minio_app_password[app].result, "") : ""
)
)
buckets = [
for bucket in try(cfg.buckets, []) : (
can(bucket.name) ? merge(
{
name = ""
policy = "private"
versioning = false
},
bucket
) : {
name = tostring(bucket)
policy = "private"
versioning = false
}
)
if trimspace(can(bucket.name) ? try(bucket.name, "") : tostring(bucket)) != ""
]
client = merge(
{
endpoint = "http://minio.minio.svc.cluster.local:9000"
region = "us-east-1"
},
try(cfg.client, {})
)
}
)
}
kafka_cluster_id = trimspace(try(local.kafka_bootstrap_cfg.cluster_id, "")) != "" ? trimspace(local.kafka_bootstrap_cfg.cluster_id) : (
try(local.kafka_bootstrap_cfg.generate, false) ? try(random_password.kafka_cluster_id[0].result, "") : ""
)
kafka_controller_password = trimspace(try(local.kafka_bootstrap_cfg.controller_password, "")) != "" ? trimspace(local.kafka_bootstrap_cfg.controller_password) : (
try(local.kafka_bootstrap_cfg.generate, false) ? try(random_password.kafka_controller_password[0].result, "") : ""
)
kafka_inter_broker_password = trimspace(try(local.kafka_bootstrap_cfg.inter_broker_password, "")) != "" ? trimspace(local.kafka_bootstrap_cfg.inter_broker_password) : (
try(local.kafka_bootstrap_cfg.generate, false) ? try(random_password.kafka_inter_broker_password[0].result, "") : ""
)
kafka_apps = {
for app, cfg in local.kafka_apps_cfg :
app => merge(
{
enabled = true
generate = false
username = ""
password = ""
auth = {
bootstrap_servers = "kafka-kafka-contour-controller-headless.kafka.svc.cluster.local:9094"
security_protocol = "SASL_PLAINTEXT"
sasl_mechanism = "SCRAM-SHA-512"
}
topics = []
},
cfg,
{
username = trimspace(try(cfg.username, "")) != "" ? trimspace(try(cfg.username, "")) : app
password = trimspace(try(cfg.password, "")) != "" ? trimspace(try(cfg.password, "")) : (
try(cfg.generate, false) ? try(random_password.kafka_app_password[app].result, "") : ""
)
auth = merge(
{
bootstrap_servers = "kafka-kafka-contour-controller-headless.kafka.svc.cluster.local:9094"
security_protocol = "SASL_PLAINTEXT"
sasl_mechanism = "SCRAM-SHA-512"
},
try(cfg.auth, {})
)
topics = [
for topic in try(cfg.topics, []) : merge(
{
name = ""
partitions = 3
replication_factor = 1
configs = {}
},
topic
)
if trimspace(try(topic.name, "")) != ""
]
}
)
}
zitadel_pg_password = trimspace(try(local.zitadel_pg_cfg.password, "")) != "" ? trimspace(local.zitadel_pg_cfg.password) : (
trimspace(try(local.postgresql_users_values["zitadel"], "")) != "" ? trimspace(try(local.postgresql_users_values["zitadel"], "")) : (
try(local.zitadel_pg_cfg.generate, false) ? try(random_password.zitadel_pg_password[0].result, "") : ""
)
)
camunda_keycloak_admin_password = trimspace(try(local.camunda_keycloak_cfg.admin_password, "")) != "" ? trimspace(local.camunda_keycloak_cfg.admin_password) : (
try(local.camunda_keycloak_cfg.generate, false) ? try(random_password.camunda_keycloak_admin_password[0].result, "") : ""
)
camunda_identity_components = {
"connectors-secret" = try(local.camunda_identity_components_cfg.values["connectors-secret"], "") != "" ? local.camunda_identity_components_cfg.values["connectors-secret"] : (try(local.camunda_identity_components_cfg.generate, false) ? try(random_password.camunda_connectors_secret[0].result, "") : "")
"console-secret" = try(local.camunda_identity_components_cfg.values["console-secret"], "") != "" ? local.camunda_identity_components_cfg.values["console-secret"] : (try(local.camunda_identity_components_cfg.generate, false) ? try(random_password.camunda_console_secret[0].result, "") : "")
"keycloak-secret" = try(local.camunda_identity_components_cfg.values["keycloak-secret"], "") != "" ? local.camunda_identity_components_cfg.values["keycloak-secret"] : (try(local.camunda_identity_components_cfg.generate, false) ? try(random_password.camunda_keycloak_secret[0].result, "") : "")
"operate-secret" = try(local.camunda_identity_components_cfg.values["operate-secret"], "") != "" ? local.camunda_identity_components_cfg.values["operate-secret"] : (try(local.camunda_identity_components_cfg.generate, false) ? try(random_password.camunda_operate_secret[0].result, "") : "")
"optimize-secret" = try(local.camunda_identity_components_cfg.values["optimize-secret"], "") != "" ? local.camunda_identity_components_cfg.values["optimize-secret"] : (try(local.camunda_identity_components_cfg.generate, false) ? try(random_password.camunda_optimize_secret[0].result, "") : "")
"tasklist-secret" = try(local.camunda_identity_components_cfg.values["tasklist-secret"], "") != "" ? local.camunda_identity_components_cfg.values["tasklist-secret"] : (try(local.camunda_identity_components_cfg.generate, false) ? try(random_password.camunda_tasklist_secret[0].result, "") : "")
"zeebe-secret" = try(local.camunda_identity_components_cfg.values["zeebe-secret"], "") != "" ? local.camunda_identity_components_cfg.values["zeebe-secret"] : (try(local.camunda_identity_components_cfg.generate, false) ? try(random_password.camunda_zeebe_secret[0].result, "") : "")
}
camunda_identity_firstuser_password = trimspace(try(local.camunda_identity_firstuser_cfg.identity_firstuser_password, "")) != "" ? trimspace(local.camunda_identity_firstuser_cfg.identity_firstuser_password) : (
try(local.camunda_identity_firstuser_cfg.generate, false) ? try(random_password.camunda_identity_firstuser_password[0].result, "") : ""
)
camunda_pg_password = trimspace(try(local.camunda_pg_cfg.password, "")) != "" ? trimspace(local.camunda_pg_cfg.password) : (
try(local.camunda_pg_cfg.generate, false) ? try(random_password.camunda_pg_password[0].result, "") : ""
)
camunda_pg_postgres_password = trimspace(try(local.camunda_pg_cfg.postgres_password, "")) != "" ? trimspace(local.camunda_pg_cfg.postgres_password) : (
try(local.camunda_pg_cfg.generate, false) ? try(random_password.camunda_pg_postgres_password[0].result, "") : ""
)
keycloak_admin_password = trimspace(try(local.keycloak_admin_cfg.password, "")) != "" ? trimspace(local.keycloak_admin_cfg.password) : (
try(local.keycloak_admin_cfg.generate, false) ? try(random_password.keycloak_admin_password[0].result, "") : ""
)
keycloak_pg_password = trimspace(try(local.keycloak_pg_cfg.password, "")) != "" ? trimspace(local.keycloak_pg_cfg.password) : (
trimspace(try(local.postgresql_users_values["keycloak"], "")) != "" ? trimspace(try(local.postgresql_users_values["keycloak"], "")) : (
try(local.keycloak_pg_cfg.generate, false) ? try(random_password.keycloak_pg_password[0].result, "") : ""
)
)
policy_docs = {
postgresql = <<-EOT
path "${var.vault_kv_mount}/data/postgresql/admin" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/metadata/postgresql/admin" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/data/postgresql/users" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/metadata/postgresql/users" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/data/postgresql/s3" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/metadata/postgresql/s3" {
capabilities = ["read"]
}
EOT
rabbitmq = <<-EOT
path "${var.vault_kv_mount}/data/rabbitmq/auth" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/metadata/rabbitmq/auth" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/data/rabbitmq/apps/*" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/metadata/rabbitmq/apps" {
capabilities = ["list", "read"]
}
path "${var.vault_kv_mount}/metadata/rabbitmq/apps/*" {
capabilities = ["read"]
}
EOT
minio = <<-EOT
path "${var.vault_kv_mount}/data/minio/admin" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/metadata/minio/admin" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/data/minio/apps/*" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/metadata/minio/apps" {
capabilities = ["list", "read"]
}
path "${var.vault_kv_mount}/metadata/minio/apps/*" {
capabilities = ["read"]
}
EOT
kafka = <<-EOT
path "${var.vault_kv_mount}/data/kafka/bootstrap" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/metadata/kafka/bootstrap" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/data/kafka/apps/*" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/metadata/kafka/apps" {
capabilities = ["list", "read"]
}
path "${var.vault_kv_mount}/metadata/kafka/apps/*" {
capabilities = ["read"]
}
EOT
zitadel = <<-EOT
path "${var.vault_kv_mount}/data/zitadel/postgresql" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/metadata/zitadel/postgresql" {
capabilities = ["read"]
}
EOT
camunda = <<-EOT
path "${var.vault_kv_mount}/data/camunda/identity-components" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/metadata/camunda/identity-components" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/data/camunda/identity-firstuser" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/metadata/camunda/identity-firstuser" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/data/camunda/keycloak-admin" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/metadata/camunda/keycloak-admin" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/data/camunda/postgresql" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/metadata/camunda/postgresql" {
capabilities = ["read"]
}
EOT
keycloak = <<-EOT
path "${var.vault_kv_mount}/data/keycloak/admin" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/metadata/keycloak/admin" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/data/keycloak/postgresql" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/metadata/keycloak/postgresql" {
capabilities = ["read"]
}
EOT
}
policy_enabled = {
postgresql = try(local.postgresql_cfg.enabled, true)
rabbitmq = try(local.rabbitmq_cfg.enabled, true)
minio = try(local.minio_cfg.enabled, true)
kafka = try(local.kafka_cfg.enabled, true)
zitadel = try(local.zitadel_cfg.enabled, true)
camunda = try(local.camunda_cfg.enabled, true)
keycloak = try(local.keycloak_cfg.enabled, true)
}
role_cfgs = {
postgresql = merge(try(local.postgresql_cfg.role, {}), try(var.infra.postgresql.role, {}))
rabbitmq = merge(try(local.rabbitmq_cfg.role, {}), try(var.infra.rabbitmq.role, {}))
minio = merge(try(local.minio_cfg.role, {}), try(var.infra.minio.role, {}))
kafka = merge(try(local.kafka_cfg.role, {}), try(var.infra.kafka.role, {}))
zitadel = merge(try(local.zitadel_cfg.role, {}), try(var.infra.zitadel.role, {}))
camunda = merge(try(local.camunda_cfg.role, {}), try(var.infra.camunda.role, {}))
keycloak = merge(try(local.keycloak_cfg.role, {}), try(var.infra.keycloak.role, {}))
}
app_cfgs = {
for app, cfg in try(var.applications, {}) :
app => merge(
{
enabled = true
policy_name = app
role_name = app
service_account_names = [app]
service_account_namespaces = [app]
token_ttl = "24h"
read_paths = []
secret_path = ""
secret_data = {}
},
cfg,
{
secret_path = trimspace(try(cfg.secret_path, ""))
secret_data = try(cfg.secret_data, {})
read_paths = distinct(compact(concat(
[for path in try(cfg.read_paths, []) : trimspace(path)],
trimspace(try(cfg.secret_path, "")) != "" ? [trimspace(try(cfg.secret_path, ""))] : []
)))
}
)
if try(cfg.enabled, true)
}
app_policy_docs = {
for app, cfg in local.app_cfgs :
app => trimspace(join("\n\n", [
for path in cfg.read_paths : <<-EOT
path "${var.vault_kv_mount}/data/${path}" {
capabilities = ["read"]
}
path "${var.vault_kv_mount}/metadata/${path}" {
capabilities = ["read"]
}
EOT
]))
}
}
resource "random_password" "regcred_password" {
count = var.create_regcred && local.regcred_generate && local.regcred_password_input == "" ? 1 : 0
length = 40
special = false
}
resource "random_password" "smtp_password" {
count = var.create_smtp_auth && local.smtp_generate && local.smtp_password_input == "" ? 1 : 0
length = 40
special = false
}
resource "random_password" "django_token" {
count = var.create_django_auth && local.django_generate && local.django_manual == "" ? 1 : 0
length = 40
special = false
}
resource "tls_private_key" "rsa_keys" {
count = var.create_rsa_keys && local.rsa_generate && local.rsa_public_manual == "" && local.rsa_private_manual == "" ? 1 : 0
algorithm = "RSA"
rsa_bits = local.rsa_bits
}
resource "random_password" "postgresql_admin_password" {
count = var.create_infra_secrets && try(local.postgresql_cfg.enabled, true) && try(local.postgresql_admin_cfg.enabled, true) && try(local.postgresql_admin_cfg.generate, false) && trimspace(try(local.postgresql_admin_cfg.postgres_password, "")) == "" ? 1 : 0
length = 32
special = false
}
resource "random_password" "postgresql_app_password" {
for_each = {
for app, cfg in local.postgresql_apps_cfg :
app => cfg if var.create_infra_secrets && try(local.postgresql_cfg.enabled, true) && try(cfg.enabled, true) && try(cfg.generate, false) && trimspace(try(cfg.password, "")) == ""
}
length = 32
special = false
}
resource "random_password" "rabbitmq_password" {
count = var.create_infra_secrets && try(local.rabbitmq_cfg.enabled, true) && try(local.rabbitmq_auth_cfg.enabled, true) && try(local.rabbitmq_auth_cfg.generate, false) && trimspace(try(local.rabbitmq_auth_cfg.password, "")) == "" ? 1 : 0
length = 32
special = false
}
resource "random_password" "rabbitmq_app_password" {
for_each = {
for app, cfg in local.rabbitmq_apps_cfg :
app => cfg if var.create_infra_secrets && try(local.rabbitmq_cfg.enabled, true) && try(cfg.enabled, true) && try(cfg.generate, false) && trimspace(try(cfg.password, "")) == ""
}
length = 32
special = false
}
resource "random_password" "minio_root_user" {
count = var.create_infra_secrets && try(local.minio_cfg.enabled, true) && try(local.minio_admin_cfg.enabled, true) && try(local.minio_admin_cfg.generate, false) && trimspace(try(local.minio_admin_cfg.root_user, "")) == "" ? 1 : 0
length = 20
special = false
}
resource "random_password" "minio_root_password" {
count = var.create_infra_secrets && try(local.minio_cfg.enabled, true) && try(local.minio_admin_cfg.enabled, true) && try(local.minio_admin_cfg.generate, false) && trimspace(try(local.minio_admin_cfg.root_password, "")) == "" ? 1 : 0
length = 40
special = false
}
resource "random_password" "minio_app_password" {
for_each = {
for app, cfg in local.minio_apps_cfg :
app => cfg if var.create_infra_secrets && try(local.minio_cfg.enabled, true) && try(cfg.enabled, true) && try(cfg.generate, false) && trimspace(try(cfg.password, "")) == ""
}
length = 32
special = false
}
resource "random_password" "kafka_cluster_id" {
count = var.create_infra_secrets && try(local.kafka_cfg.enabled, true) && try(local.kafka_bootstrap_cfg.enabled, true) && try(local.kafka_bootstrap_cfg.generate, false) && trimspace(try(local.kafka_bootstrap_cfg.cluster_id, "")) == "" ? 1 : 0
length = 22
special = false
}
resource "random_password" "kafka_controller_password" {
count = var.create_infra_secrets && try(local.kafka_cfg.enabled, true) && try(local.kafka_bootstrap_cfg.enabled, true) && try(local.kafka_bootstrap_cfg.generate, false) && trimspace(try(local.kafka_bootstrap_cfg.controller_password, "")) == "" ? 1 : 0
length = 20
special = false
}
resource "random_password" "kafka_inter_broker_password" {
count = var.create_infra_secrets && try(local.kafka_cfg.enabled, true) && try(local.kafka_bootstrap_cfg.enabled, true) && try(local.kafka_bootstrap_cfg.generate, false) && trimspace(try(local.kafka_bootstrap_cfg.inter_broker_password, "")) == "" ? 1 : 0
length = 20
special = false
}
resource "random_password" "kafka_app_password" {
for_each = {
for app, cfg in local.kafka_apps_cfg :
app => cfg if var.create_infra_secrets && try(local.kafka_cfg.enabled, true) && try(cfg.enabled, true) && try(cfg.generate, false) && trimspace(try(cfg.password, "")) == ""
}
length = 32
special = false
}
resource "random_password" "zitadel_pg_password" {
count = var.create_infra_secrets && try(local.zitadel_cfg.enabled, true) && try(local.zitadel_pg_cfg.enabled, true) && try(local.zitadel_pg_cfg.generate, false) && trimspace(try(local.zitadel_pg_cfg.password, "")) == "" ? 1 : 0
length = 32
special = false
}
resource "random_password" "camunda_keycloak_admin_password" {
count = var.create_infra_secrets && try(local.camunda_cfg.enabled, true) && try(local.camunda_keycloak_cfg.enabled, true) && try(local.camunda_keycloak_cfg.generate, false) && trimspace(try(local.camunda_keycloak_cfg.admin_password, "")) == "" ? 1 : 0
length = 32
special = false
}
resource "random_password" "camunda_connectors_secret" {
count = var.create_infra_secrets && try(local.camunda_cfg.enabled, true) && try(local.camunda_identity_components_cfg.enabled, true) && try(local.camunda_identity_components_cfg.generate, false) && try(local.camunda_identity_components_cfg.values["connectors-secret"], "") == "" ? 1 : 0
length = 32
special = false
}
resource "random_password" "camunda_console_secret" {
count = var.create_infra_secrets && try(local.camunda_cfg.enabled, true) && try(local.camunda_identity_components_cfg.enabled, true) && try(local.camunda_identity_components_cfg.generate, false) && try(local.camunda_identity_components_cfg.values["console-secret"], "") == "" ? 1 : 0
length = 32
special = false
}
resource "random_password" "camunda_keycloak_secret" {
count = var.create_infra_secrets && try(local.camunda_cfg.enabled, true) && try(local.camunda_identity_components_cfg.enabled, true) && try(local.camunda_identity_components_cfg.generate, false) && try(local.camunda_identity_components_cfg.values["keycloak-secret"], "") == "" ? 1 : 0
length = 32
special = false
}
resource "random_password" "camunda_operate_secret" {
count = var.create_infra_secrets && try(local.camunda_cfg.enabled, true) && try(local.camunda_identity_components_cfg.enabled, true) && try(local.camunda_identity_components_cfg.generate, false) && try(local.camunda_identity_components_cfg.values["operate-secret"], "") == "" ? 1 : 0
length = 32
special = false
}
resource "random_password" "camunda_optimize_secret" {
count = var.create_infra_secrets && try(local.camunda_cfg.enabled, true) && try(local.camunda_identity_components_cfg.enabled, true) && try(local.camunda_identity_components_cfg.generate, false) && try(local.camunda_identity_components_cfg.values["optimize-secret"], "") == "" ? 1 : 0
length = 32
special = false
}
resource "random_password" "camunda_tasklist_secret" {
count = var.create_infra_secrets && try(local.camunda_cfg.enabled, true) && try(local.camunda_identity_components_cfg.enabled, true) && try(local.camunda_identity_components_cfg.generate, false) && try(local.camunda_identity_components_cfg.values["tasklist-secret"], "") == "" ? 1 : 0
length = 32
special = false
}
resource "random_password" "camunda_zeebe_secret" {
count = var.create_infra_secrets && try(local.camunda_cfg.enabled, true) && try(local.camunda_identity_components_cfg.enabled, true) && try(local.camunda_identity_components_cfg.generate, false) && try(local.camunda_identity_components_cfg.values["zeebe-secret"], "") == "" ? 1 : 0
length = 32
special = false
}
resource "random_password" "camunda_identity_firstuser_password" {
count = var.create_infra_secrets && try(local.camunda_cfg.enabled, true) && try(local.camunda_identity_firstuser_cfg.enabled, true) && try(local.camunda_identity_firstuser_cfg.generate, false) && trimspace(try(local.camunda_identity_firstuser_cfg.identity_firstuser_password, "")) == "" ? 1 : 0
length = 32
special = false
}
resource "random_password" "camunda_pg_password" {
count = var.create_infra_secrets && try(local.camunda_cfg.enabled, true) && try(local.camunda_pg_cfg.enabled, true) && try(local.camunda_pg_cfg.generate, false) && trimspace(try(local.camunda_pg_cfg.password, "")) == "" ? 1 : 0
length = 32
special = false
}
resource "random_password" "camunda_pg_postgres_password" {
count = var.create_infra_secrets && try(local.camunda_cfg.enabled, true) && try(local.camunda_pg_cfg.enabled, true) && try(local.camunda_pg_cfg.generate, false) && trimspace(try(local.camunda_pg_cfg.postgres_password, "")) == "" ? 1 : 0
length = 32
special = false
}
resource "random_password" "keycloak_admin_password" {
count = var.create_infra_secrets && try(local.keycloak_cfg.enabled, true) && try(local.keycloak_admin_cfg.enabled, true) && try(local.keycloak_admin_cfg.generate, false) && trimspace(try(local.keycloak_admin_cfg.password, "")) == "" ? 1 : 0
length = 20
special = false
}
resource "random_password" "keycloak_pg_password" {
count = var.create_infra_secrets && try(local.keycloak_cfg.enabled, true) && try(local.keycloak_pg_cfg.enabled, true) && trimspace(try(local.keycloak_pg_cfg.password, "")) == "" && try(local.keycloak_pg_cfg.generate, false) ? 1 : 0
length = 32
special = false
}
resource "vault_kv_secret_v2" "common_regcred" {
count = var.create_regcred ? 1 : 0
mount = var.vault_kv_mount
name = "${var.path_prefix}/common/regcred"
data_json = jsonencode({
type = "kubernetes.io/dockerconfigjson"
".dockerconfigjson" = local.regcred_value
})
}
resource "vault_kv_secret_v2" "common_smtp_auth" {
count = var.create_smtp_auth ? 1 : 0
mount = var.vault_kv_mount
name = "${var.path_prefix}/common/smtp_auth"
data_json = jsonencode({
"env.json" = local.smtp_value
})
}
resource "vault_kv_secret_v2" "common_django_auth" {
count = var.create_django_auth ? 1 : 0
mount = var.vault_kv_mount
name = "${var.path_prefix}/common/django_auth"
data_json = jsonencode(merge(
{
"django-auth.json" = jsonencode({
token = local.django_token
})
key = local.django_token
username = local.django_username
password = local.django_password
},
local.django_extra
))
}
resource "vault_kv_secret_v2" "common_rsa_keys" {
count = var.create_rsa_keys ? 1 : 0
mount = var.vault_kv_mount
name = "${var.path_prefix}/common/rsa_keys"
data_json = jsonencode({
public_key = local.rsa_public
private_key = local.rsa_private
})
}
resource "vault_kv_secret_v2" "postgresql_admin" {
count = var.create_infra_secrets && try(local.postgresql_cfg.enabled, true) && try(local.postgresql_admin_cfg.enabled, true) ? 1 : 0
mount = var.vault_kv_mount
name = "postgresql/admin"
data_json = jsonencode({
"postgres-password" = local.postgresql_admin_password
})
}
resource "vault_kv_secret_v2" "postgresql_users" {
count = var.create_infra_secrets && try(local.postgresql_cfg.enabled, true) && try(local.postgresql_users_cfg.enabled, true) && local.postgresql_users_has_values ? 1 : 0
mount = var.vault_kv_mount
name = "postgresql/users"
data_json = jsonencode(local.postgresql_users_values)
}
resource "vault_kv_secret_v2" "postgresql_s3" {
count = var.create_infra_secrets && try(local.postgresql_cfg.enabled, true) && try(local.postgresql_s3_cfg.enabled, false) ? 1 : 0
mount = var.vault_kv_mount
name = "postgresql/s3"
data_json = jsonencode({
bucket = trimspace(try(local.postgresql_s3_cfg.bucket, ""))
endpoint = trimspace(try(local.postgresql_s3_cfg.endpoint, "https://storage.yandexcloud.net"))
region = trimspace(try(local.postgresql_s3_cfg.region, "ru-central1"))
access_key = trimspace(try(local.postgresql_s3_cfg.access_key, ""))
secret_key = trimspace(try(local.postgresql_s3_cfg.secret_key, ""))
})
}
resource "vault_kv_secret_v2" "postgresql_apps" {
for_each = {
for app, cfg in local.postgresql_apps :
app => cfg if var.create_infra_secrets && try(local.postgresql_cfg.enabled, true) && try(cfg.enabled, true)
}
mount = var.vault_kv_mount
name = "postgresql/apps/${each.key}"
data_json = jsonencode({
username = try(each.value.username, each.key)
password = try(each.value.password, "")
password_key = try(each.value.password_key, each.key)
})
}
resource "vault_kv_secret_v2" "rabbitmq_auth" {
count = var.create_infra_secrets && try(local.rabbitmq_cfg.enabled, true) && try(local.rabbitmq_auth_cfg.enabled, true) ? 1 : 0
mount = var.vault_kv_mount
name = "rabbitmq/auth"
data_json = jsonencode({
username = try(local.rabbitmq_auth_cfg.username, "")
password = local.rabbitmq_password
})
}
resource "vault_kv_secret_v2" "rabbitmq_apps" {
for_each = {
for app, cfg in local.rabbitmq_apps :
app => cfg if var.create_infra_secrets && try(local.rabbitmq_cfg.enabled, true) && try(cfg.enabled, true)
}
mount = var.vault_kv_mount
name = "rabbitmq/apps/${each.key}"
data_json = jsonencode({
username = try(each.value.username, each.key)
password = try(each.value.password, "")
vhost = try(each.value.vhost, "/")
permissions = try(each.value.permissions, { configure = ".*", write = ".*", read = ".*" })
vhosts = try(each.value.vhosts, [])
})
}
resource "vault_kv_secret_v2" "minio_admin" {
count = var.create_infra_secrets && try(local.minio_cfg.enabled, true) && try(local.minio_admin_cfg.enabled, true) ? 1 : 0
mount = var.vault_kv_mount
name = "minio/admin"
data_json = jsonencode({
rootUser = local.minio_root_user
rootPassword = local.minio_root_password
})
}
resource "vault_kv_secret_v2" "minio_apps" {
for_each = {
for app, cfg in local.minio_apps :
app => cfg if var.create_infra_secrets && try(local.minio_cfg.enabled, true) && try(cfg.enabled, true)
}
mount = var.vault_kv_mount
name = "minio/apps/${each.key}"
data_json = jsonencode({
username = try(each.value.username, each.key)
password = try(each.value.password, "")
access_key = try(each.value.access_key, try(each.value.username, each.key))
secret_key = try(each.value.secret_key, try(each.value.password, ""))
policy = try(each.value.policy, "readwrite")
buckets = try(each.value.buckets, [])
client = try(each.value.client, {})
})
}
resource "vault_kv_secret_v2" "kafka_bootstrap" {
count = var.create_infra_secrets && try(local.kafka_cfg.enabled, true) && try(local.kafka_bootstrap_cfg.enabled, true) ? 1 : 0
mount = var.vault_kv_mount
name = "kafka/bootstrap"
data_json = jsonencode({
clusterId = local.kafka_cluster_id
controllerPassword = local.kafka_controller_password
interBrokerPassword = local.kafka_inter_broker_password
})
}
resource "vault_kv_secret_v2" "kafka_apps" {
for_each = {
for app, cfg in local.kafka_apps :
app => cfg if var.create_infra_secrets && try(local.kafka_cfg.enabled, true) && try(cfg.enabled, true)
}
mount = var.vault_kv_mount
name = "kafka/apps/${each.key}"
data_json = jsonencode({
username = try(each.value.username, each.key)
password = try(each.value.password, "")
auth = try(each.value.auth, {})
topics = try(each.value.topics, [])
})
}
resource "vault_kv_secret_v2" "zitadel_postgresql" {
count = var.create_infra_secrets && try(local.zitadel_cfg.enabled, true) && try(local.zitadel_pg_cfg.enabled, true) ? 1 : 0
mount = var.vault_kv_mount
name = "zitadel/postgresql"
data_json = jsonencode({
password = local.zitadel_pg_password
})
}
resource "vault_kv_secret_v2" "camunda_keycloak_admin" {
count = var.create_infra_secrets && try(local.camunda_cfg.enabled, true) && try(local.camunda_keycloak_cfg.enabled, true) ? 1 : 0
mount = var.vault_kv_mount
name = "camunda/keycloak-admin"
data_json = jsonencode({
"admin-password" = local.camunda_keycloak_admin_password
})
}
resource "vault_kv_secret_v2" "camunda_identity_components" {
count = var.create_infra_secrets && try(local.camunda_cfg.enabled, true) && try(local.camunda_identity_components_cfg.enabled, true) ? 1 : 0
mount = var.vault_kv_mount
name = "camunda/identity-components"
data_json = jsonencode(local.camunda_identity_components)
}
resource "vault_kv_secret_v2" "camunda_identity_firstuser" {
count = var.create_infra_secrets && try(local.camunda_cfg.enabled, true) && try(local.camunda_identity_firstuser_cfg.enabled, true) ? 1 : 0
mount = var.vault_kv_mount
name = "camunda/identity-firstuser"
data_json = jsonencode({
"identity-firstuser-password" = local.camunda_identity_firstuser_password
})
}
resource "vault_kv_secret_v2" "camunda_postgresql" {
count = var.create_infra_secrets && try(local.camunda_cfg.enabled, true) && try(local.camunda_pg_cfg.enabled, true) ? 1 : 0
mount = var.vault_kv_mount
name = "camunda/postgresql"
data_json = jsonencode({
password = local.camunda_pg_password
"postgres-password" = local.camunda_pg_postgres_password
})
}
resource "vault_kv_secret_v2" "keycloak_admin" {
count = var.create_infra_secrets && try(local.keycloak_cfg.enabled, true) && try(local.keycloak_admin_cfg.enabled, true) ? 1 : 0
mount = var.vault_kv_mount
name = "keycloak/admin"
data_json = jsonencode({
password = local.keycloak_admin_password
})
}
resource "vault_kv_secret_v2" "keycloak_postgresql" {
count = var.create_infra_secrets && try(local.keycloak_cfg.enabled, true) && try(local.keycloak_pg_cfg.enabled, true) ? 1 : 0
mount = var.vault_kv_mount
name = "keycloak/postgresql"
data_json = jsonencode({
host = try(local.keycloak_pg_cfg.host, "")
port = tostring(try(local.keycloak_pg_cfg.port, ""))
user = try(local.keycloak_pg_cfg.user, "")
database = try(local.keycloak_pg_cfg.database, "")
password = local.keycloak_pg_password
})
}
resource "vault_policy" "infra" {
for_each = {
for name, enabled in local.policy_enabled :
name => name if var.create_infra_policies && enabled
}
name = each.value
policy = local.policy_docs[each.value]
}
resource "vault_kubernetes_auth_backend_role" "infra" {
for_each = {
for name, role in local.role_cfgs :
name => role if var.create_infra_roles && try(local.policy_enabled[name], true) && try(role.enabled, true)
}
backend = var.kubernetes_auth_backend
role_name = try(each.value.name, each.key)
bound_service_account_names = try(each.value.service_account_names, [])
bound_service_account_namespaces = try(each.value.service_account_namespaces, [])
token_ttl = can(tonumber(try(each.value.token_ttl, ""))) ? tonumber(each.value.token_ttl) : 86400
token_policies = [try(each.value.name, each.key)]
}
resource "vault_kv_secret_v2" "application" {
for_each = {
for app, cfg in local.app_cfgs :
app => cfg if(var.create_app_policies || var.create_app_roles) && trimspace(try(cfg.secret_path, "")) != "" && length(keys(try(cfg.secret_data, {}))) > 0
}
mount = var.vault_kv_mount
name = each.value.secret_path
data_json = jsonencode(each.value.secret_data)
}
resource "vault_policy" "app" {
for_each = {
for app, cfg in local.app_cfgs :
app => cfg if var.create_app_policies && length(cfg.read_paths) > 0
}
name = try(each.value.policy_name, each.key)
policy = local.app_policy_docs[each.key]
}
resource "vault_kubernetes_auth_backend_role" "app" {
for_each = {
for app, cfg in local.app_cfgs :
app => cfg if var.create_app_roles && length(cfg.read_paths) > 0
}
backend = var.kubernetes_auth_backend
role_name = try(each.value.role_name, each.key)
bound_service_account_names = try(each.value.service_account_names, [])
bound_service_account_namespaces = try(each.value.service_account_namespaces, [])
token_ttl = can(tonumber(try(each.value.token_ttl, ""))) ? tonumber(each.value.token_ttl) : 86400
token_policies = [try(each.value.policy_name, each.key)]
}