Přeskočit obsah

Terraform Provider pro MazeVault

MazeVault Terraform Provider umožňuje spravovat celou organizaci MazeVault, projekty, tajemství, certifikáty, rotace, integrace a řízení přístupu jako kód. Provider je postaven na Terraform Plugin Framework a cílí na Terraform 1.5+.


Instalace

terraform {
  required_version = ">= 1.5"
  required_providers {
    mazevault = {
      source  = "MazeVault/mazevault"
      version = "~> 1.0"
    }
  }
}

Konfigurace provideru

provider "mazevault" {
  server_url    = "https://vault.example.com"
  api_token     = var.mazevault_api_token   # doporučeno: použijte proměnnou, nikdy nezadávejte přímo
  # Volitelně: přihlašovací údaje servisního účtu (alternativa k api_token)
  # client_id     = var.mazevault_client_id
  # client_secret = var.mazevault_client_secret
  timeout        = "30s"
  skip_tls_verify = false  # nastavte true pouze ve vývojovém prostředí
}

Argumenty provideru

Argument Typ Povinný Popis
server_url string Ne URL MazeVault serveru. Výchozí hodnota z proměnné prostředí MAZEVAULT_SERVER_URL.
api_token string Ne API token pro autentizaci. Citlivé. Výchozí hodnota z MAZEVAULT_API_TOKEN.
client_id string Ne Client ID servisního účtu. Alternativa k api_token.
client_secret string Ne Client secret servisního účtu. Citlivé.
timeout string Ne Timeout API požadavků (např. 30s, 1m). Výchozí: 30s.
skip_tls_verify bool Ne Přeskočit ověření TLS. Pouze pro vývoj — nikdy nepovolujte v produkci.

Nakládání s tajemstvími

Nikdy nevkládejte přihlašovací údaje přímo do souborů .tf. Použijte proměnné prostředí (MAZEVAULT_API_TOKEN) nebo backend pro tajemství (Vault, Azure Key Vault) pro injekci citlivých hodnot v čase plan/apply.


Metody autentizace

API Token (doporučeno pro automatizaci)

export MAZEVAULT_API_TOKEN="mv_pat_xxxxx"
export MAZEVAULT_SERVER_URL="https://vault.example.com"

Tokeny generujte v sekci Admin → API Tokeny nebo přes resource mazevault_api_token.

Servisní účet (CI/CD pipeline)

provider "mazevault" {
  server_url    = var.server_url
  client_id     = var.client_id
  client_secret = var.client_secret
}

Resources

mazevault_organization

Spravuje konfiguraci nejvyšší organizace.

resource "mazevault_organization" "main" {
  name = "Acme s.r.o."
}
Atribut Typ Povinný Popis
id string Computed UUID organizace.
name string Ano Název organizace.
created_at string Computed Čas vytvoření (ISO 8601).

mazevault_project

Seskupuje tajemství a certifikáty pod logickou hranici s vlastním RBAC.

resource "mazevault_project" "backend" {
  organization_id = mazevault_organization.main.id
  name            = "Backend Services"
  environment     = "production"
}
Atribut Typ Povinný Popis
id string Computed UUID projektu.
organization_id string Ano ID nadřazené organizace.
name string Ano Název projektu.
environment string Ne Primární label prostředí.
created_at string Computed Čas vytvoření.

mazevault_secret

Spravuje šifrované tajemství uvnitř projektu. Hodnota je uložena jako AES-256-GCM šifrovaný blob v MazeVault a je v Terraform stavu označena jako citlivá.

resource "mazevault_secret" "db_password" {
  project_id  = mazevault_project.backend.id
  key         = "DB_PASSWORD"
  value       = var.db_password
  environment = "production"

  ttl_hours = 8760  # 1 rok

  metadata = {
    owner = "backend-team"
    tier  = "critical"
  }

  rotation {
    enabled       = true
    interval_days = 90
    notification_emails = ["ops@example.com"]
  }
}
Atribut Typ Povinný Popis
id string Computed UUID tajemství.
project_id string Ano ID nadřazeného projektu.
key string Ano Název/klíč tajemství (např. DB_PASSWORD).
value string Ano Hodnota tajemství. Citlivé.
environment string Ano Prostředí (dev, staging, production, …).
ttl_hours number Ne Platnost v hodinách. Bez hodnoty = bez vypršení.
metadata map(string) Ne Libovolné klíč/hodnota labely.
version number Computed Aktuální číslo verze.
status string Computed Stav životního cyklu tajemství.
created_at string Computed Čas vytvoření.

Blok rotation

Atribut Typ Povinný Popis
enabled bool Ano Aktivovat automatickou rotaci.
schedule string Ne Cron výraz pro plán rotace.
interval_days number Ne Interval rotace ve dnech (alternativa k cron).
notification_emails list(string) Ne Adresy pro notifikaci při selhání rotace.

Orchestrator Mode

Když je MazeVault nakonfigurován v Orchestrator Mode, hodnota v poli value je předána přímo do nakonfigurovaného externího správce tajemství (Azure Key Vault, AWS Secrets Manager nebo HashiCorp Vault). Hodnota není uložena lokálně.


Propojí tajemství s integrací tak, aby rotace zapsala novou hodnotu do externího systému (databáze, Kubernetes secret, proměnná DevOps pipeline atd.).

resource "mazevault_secret_link" "db_link" {
  secret_id      = mazevault_secret.db_password.id
  integration_id = mazevault_integration.azure_kv.id
  link_type      = "database"
  metadata = {
    db_user = "app_user"
    db_host = "db.prod.example.com"
  }
}
Atribut Typ Povinný Popis
id string Computed UUID linku.
secret_id string Ano Propojené tajemství.
integration_id string Ano Cílová integrace.
link_type string Ne database, agent, devops nebo generic.
metadata map(string) Ne Konfigurace specifická pro integraci.

mazevault_rotation_config

Definuje úplný rotační pipeline pro tajemství, včetně vstupů reconcileru, grace period a přesměrování zápisu.

resource "mazevault_rotation_config" "db_rotation" {
  secret_id            = mazevault_secret.db_password.id
  environment          = "production"
  ttl_hours            = 720            # 30 dní
  rotation_strategy    = "rolling"
  grace_period_minutes = 60

  workflow_steps_json = jsonencode([
    {
      type   = "postgres_rotation"
      config = {
        host     = "db.prod.example.com"
        port     = 5432
        database = "appdb"
        username = "app_user"
      }
    }
  ])
}
Atribut Typ Povinný Popis
id string Computed UUID konfigurace rotace.
secret_id string Ano Tajemství k rotaci.
environment string Ano Prostředí, pro které konfigurace platí.
ttl_hours number Ano Interval rotace v hodinách.
rotation_strategy string Ne rolling, immediate nebo blue-green.
target_environment string Ne Přepíše cílové prostředí pro zápis. Výchozí = environment.
scope string Ne project (výchozí) nebo organization.
grace_period_minutes number Ne Minuty, po které zůstává stará hodnota platná po rotaci (0 = tvrdé přepnutí).
workflow_steps_json string Ne JSON pole konfigurací rotačních kroků.

mazevault_rotation_workflow

Vytvoří rotační workflow přímo pro tajemství (jednodušší alternativa k mazevault_rotation_config pro jednoduchý případ).

resource "mazevault_rotation_workflow" "api_key" {
  secret_id   = mazevault_secret.api_key.id
  environment = "production"
  schedule    = "0 2 * * 1"  # Každé pondělí ve 02:00
}
Atribut Typ Povinný Popis
id string Computed UUID workflow.
secret_id string Ano Tajemství, které workflow rotuje.
environment string Ano Cílové prostředí.
schedule string Ne Cron plán pro automatickou rotaci.

mazevault_certificate

Spravuje certifikát vydaný nebo sledovaný v MazeVault. Privátní klíč je computed (generován MazeVault) a vystaven jako citlivý Terraform výstup.

resource "mazevault_certificate" "tls" {
  common_name                = "api.example.com"
  ttl                        = "8760h"    # 1 rok
  key_size                   = 4096
  organization_ca_account_id = var.ca_account_id
}

output "tls_cert_pem" {
  value     = mazevault_certificate.tls.certificate_pem
  sensitive = false
}

output "tls_key_pem" {
  value     = mazevault_certificate.tls.private_key_pem
  sensitive = true
}
Atribut Typ Povinný Popis
id string Computed UUID certifikátu.
common_name string Ano CN certifikátu (např. api.example.com).
ttl string Ne Platnost jako Go duration string (8760h, 365d).
key_size number Ne Velikost RSA klíče v bitech (výchozí: 2048).
organization_ca_account_id string Ne CA účet pro automatické vydávání a rotaci.
serial_number string Computed Sériové číslo certifikátu.
certificate_pem string Computed PEM zakódovaný certifikát.
private_key_pem string Computed PEM zakódovaný privátní klíč. Citlivé.
status string Computed pending, issued, expired, revoked.
expires_at string Computed Čas vypršení platnosti.

mazevault_certificate_template

Definuje opakovaně použitelnou politiku vydávání certifikátů: použití klíče, rozšířené použití klíče, SANs, platnost a vazbu na CA účet.

resource "mazevault_certificate_template" "web_tls" {
  project_id    = mazevault_project.backend.id
  name          = "Web TLS 1Y"
  ca_account_id = var.ca_account_id
  ttl_hours     = 8760
  key_type      = "RSA"
  key_size      = 2048
}
Atribut Typ Povinný Popis
id string Computed UUID šablony.
project_id string Ano Vlastnický projekt.
name string Ano Název šablony.
ca_account_id string Ne Vázaný CA účet.
ttl_hours number Ne Výchozí platnost certifikátu v hodinách.
key_type string Ne RSA nebo EC.
key_size number Ne Velikost klíče (bity pro RSA, velikost křivky pro EC).

mazevault_ca

Registruje CA účet (DigiCert, Venafi, ADCS, ACME, Vault PKI atd.) v projektu.

resource "mazevault_ca" "digicert" {
  project_id    = mazevault_project.backend.id
  name          = "DigiCert Production"
  provider_type = "digicert"
  config = {
    api_key         = var.digicert_api_key
    organization_id = "12345"
  }
}
Atribut Typ Povinný Popis
id string Computed UUID CA účtu.
project_id string Ano Vlastnický projekt.
name string Ano Popisný název.
provider_type string Ano digicert, venafi, adcs, acme, vault, step, est, psd2.
config map(string) Ne Konfigurace specifická pro poskytovatele (API klíče, URL). Citlivé.

mazevault_integration

Propojuje MazeVault s externím úložištěm tajemství nebo cílem nasazení (Azure Key Vault, AWS Secrets Manager, Kubernetes, GCP Secret Manager atd.).

resource "mazevault_integration" "azure_kv" {
  project_id = mazevault_project.backend.id
  name       = "Production Azure Key Vault"
  type       = "azure_key_vault"
  config = {
    vault_url            = "https://prod-vault.vault.azure.net"
    tenant_id            = var.tenant_id
    client_id            = var.client_id
    use_managed_identity = "true"
  }
}
Atribut Typ Povinný Popis
id string Computed UUID integrace.
project_id string Ano Vlastnický projekt.
name string Ano Název integrace.
type string Ano azure_key_vault, aws_secrets_manager, kubernetes, gcp_secret_manager, hashicorp_vault.
config map(string) Ne Konfigurace specifická pro poskytovatele.

mazevault_integration_group

Seskupuje více integrací namapovaných na různá prostředí. Užitečné pro multi-regionální nebo multi-KeyVault scénáře, kde stejné logické tajemství musí být zapsáno do různých backendů v závislosti na prostředí.

resource "mazevault_integration_group" "multi_env_kv" {
  project_id  = mazevault_project.backend.id
  name        = "Multi-Region Key Vaults"
  description = "Směruje tajemství do správného regionálního Azure Key Vault"

  mappings {
    integration_id = mazevault_integration.azure_kv_eu.id
    environment    = "production-eu"
    priority       = 1
  }

  mappings {
    integration_id = mazevault_integration.azure_kv_us.id
    environment    = "production-us"
    priority       = 1
  }
}
Atribut Typ Povinný Popis
id string Computed UUID skupiny.
project_id string Ano Vlastnický projekt.
name string Ano Název skupiny.
description string Ne Volitelný popis.

Blok mappings

Atribut Typ Povinný Popis
integration_id string Ano Integrace přiřazená tomuto prostředí.
environment string Ano Label prostředí (dev, staging, production-eu, …).
priority number Ne Priorita pro failover. Nižší = vyšší priorita.

mazevault_consistency_group

Ověřuje, že sada klíčů tajemství existuje se shodnými hodnotami napříč více prostředími. MazeVault skupinu průběžně monitoruje a upozorňuje při detekci nekonzistencí.

resource "mazevault_consistency_group" "db_creds" {
  project_id   = mazevault_project.backend.id
  name         = "Parita databázových přihlašovacích údajů"
  description  = "Zajistit konzistenci DB přihlašovacích údajů ve staging a production"
  secret_keys  = ["DB_HOST", "DB_PORT", "DB_NAME"]
  environments = ["staging", "production"]
}
Atribut Typ Povinný Popis
id string Computed UUID skupiny.
project_id string Ano Vlastnický projekt.
name string Ano Název skupiny.
description string Ne Popis.
secret_keys list(string) Ano Klíče tajemství ke sledování konzistence.
environments list(string) Ano Prostředí k porovnání.

mazevault_role

Vytvoří vlastní RBAC roli se specifickou sadou oprávnění.

resource "mazevault_role" "deploy_bot" {
  name        = "deploy-bot"
  description = "Přístup jen pro čtení pro deployment pipeline"
  permissions = ["secrets:read", "certificates:read", "projects:read"]
}
Atribut Typ Povinný Popis
id string Computed UUID role.
name string Ano Název role (unikátní v rámci organizace).
description string Ne Popis.
permissions list(string) Ano Řetězce oprávnění (např. secrets:read, certificates:write).

mazevault_group_mapping

Mapuje skupinu z externího poskytovatele identity (Entra ID, LDAP, SCIM) na RBAC roli MazeVault.

resource "mazevault_group_mapping" "ops_team" {
  external_group_id = "sg-ops-production"
  role_id           = mazevault_role.deploy_bot.id
  provider_type     = "entra"
}
Atribut Typ Povinný Popis
id string Computed UUID mapování.
external_group_id string Ano Identifikátor externí skupiny (Entra object ID, LDAP DN, SCIM název skupiny).
role_id string Ano Cílová MazeVault role.
provider_type string Ne entra, ldap, scim.

mazevault_service_identity

Vytvoří servisní účet (strojová identita) s vlastním client_id a client_secret pro neosobní CI/CD přístup.

resource "mazevault_service_identity" "ci_pipeline" {
  display_name = "GitHub Actions CI"
  description  = "Read-only servisní účet pro deployment pipeline"
  owner_email  = "platform-team@example.com"
}

output "ci_client_id" {
  value = mazevault_service_identity.ci_pipeline.client_id
}

output "ci_client_secret" {
  value     = mazevault_service_identity.ci_pipeline.client_secret
  sensitive = true
}
Atribut Typ Povinný Popis
id string Computed UUID servisní identity.
display_name string Ano Název pro zobrazení.
description string Ne Popis.
owner_email string Ano Kontaktní e-mail vlastnického týmu.
client_id string Computed OAuth2 client ID.
client_secret string Computed OAuth2 client secret. Citlivé.

mazevault_api_token

Vytvoří osobní nebo servisní API token s granulárním scope.

resource "mazevault_api_token" "automation" {
  name   = "terraform-automation"
  scopes = ["secrets:read", "certificates:read", "rotation:write"]
}
Atribut Typ Povinný Popis
id string Computed UUID tokenu.
name string Ano Název tokenu.
scopes list(string) Ano Scope oprávnění.
token string Computed Hodnota tokenu. Citlivé. Dostupná pouze při vytvoření.

Data Sources

mazevault_consistency_status

Načte aktuální stav konzistence consistency groups projektu.

data "mazevault_consistency_status" "check" {
  project_id = mazevault_project.backend.id
}

output "consistency_ok" {
  value = data.mazevault_consistency_status.check.status == "healthy"
}
Atribut Typ Popis
project_id string Projekt k dotazování.
status string healthy, warning nebo error.
missing_count number Počet detekovaných chybějících tajemství.
issues list(string) Srozumitelný seznam problémů s konzistencí.

mazevault_project_certificates

Vypíše všechny certifikáty v projektu.

data "mazevault_project_certificates" "all" {
  project_id = mazevault_project.backend.id
}
Atribut Typ Popis
project_id string Projekt k dotazování.
certificates list(object) Seznam přehledů certifikátů (id, common_name, status, expires_at).

mazevault_project_cas

Vypíše CA účty zaregistrované v projektu.

data "mazevault_project_cas" "available" {
  project_id = mazevault_project.backend.id
}

mazevault_project_certificate_templates

Vypíše certifikátové šablony dostupné v projektu.

data "mazevault_project_certificate_templates" "templates" {
  project_id = mazevault_project.backend.id
}

mazevault_project_csrs

Vypíše nevyřízené Certificate Signing Requests v projektu.

data "mazevault_project_csrs" "pending" {
  project_id = mazevault_project.backend.id
}

Kompletní příklad

Následující příklad zřídí plně automatizovaný pipeline rotace tajemství pro PostgreSQL heslo v produkci.

terraform {
  required_providers {
    mazevault = {
      source  = "MazeVault/mazevault"
      version = "~> 1.0"
    }
  }
}

provider "mazevault" {
  server_url = var.mazevault_url
  api_token  = var.mazevault_token
}

resource "mazevault_organization" "acme" {
  name = "Acme s.r.o."
}

resource "mazevault_project" "backend" {
  organization_id = mazevault_organization.acme.id
  name            = "Backend Services"
  environment     = "production"
}

resource "mazevault_integration" "azure_kv" {
  project_id = mazevault_project.backend.id
  name       = "Production Key Vault"
  type       = "azure_key_vault"
  config = {
    vault_url            = var.keyvault_url
    use_managed_identity = "true"
  }
}

resource "mazevault_secret" "db_password" {
  project_id  = mazevault_project.backend.id
  key         = "POSTGRES_PASSWORD"
  value       = var.initial_db_password
  environment = "production"

  rotation {
    enabled       = true
    interval_days = 30
    notification_emails = ["dba@example.com"]
  }
}

resource "mazevault_secret_link" "db_link" {
  secret_id      = mazevault_secret.db_password.id
  integration_id = mazevault_integration.azure_kv.id
  link_type      = "database"
  metadata = {
    db_user = "app_user"
    db_host = "db.prod.example.com"
    db_name = "appdb"
  }
}

resource "mazevault_rotation_config" "db" {
  secret_id             = mazevault_secret.db_password.id
  environment           = "production"
  ttl_hours             = 720
  rotation_strategy     = "rolling"
  grace_period_minutes  = 60
  workflow_steps_json   = jsonencode([
    {
      type   = "connection_validation"
      config = { integration_id = mazevault_integration.azure_kv.id }
    },
    {
      type   = "postgres_rotation"
      config = {
        host     = "db.prod.example.com"
        port     = 5432
        database = "appdb"
        username = "app_user"
      }
    }
  ])
}

resource "mazevault_consistency_group" "prod_creds" {
  project_id   = mazevault_project.backend.id
  name         = "Produkční DB přihlašovací údaje"
  secret_keys  = ["POSTGRES_PASSWORD", "POSTGRES_HOST", "POSTGRES_PORT"]
  environments = ["staging", "production"]
}

Import existujících zdrojů

Použijte terraform import pro přenesení existujících MazeVault zdrojů pod správu Terraformu:

# Import tajemství
terraform import mazevault_secret.db_password <secret-uuid>

# Import projektu
terraform import mazevault_project.backend <project-uuid>

# Import certifikátu
terraform import mazevault_certificate.tls <certificate-uuid>

# Import integrační skupiny
terraform import mazevault_integration_group.multi_env_kv <group-uuid>

UUID zdrojů jsou viditelné v MazeVault UI (URL cesta) nebo přes REST API (GET /api/v1/...).


Doporučené postupy

  • Ukládejte stav vzdáleně — používejte Terraform Cloud, Azure Blob Storage nebo AWS S3 s povoleným zamykáním stavu.
  • Označte citlivé výstupy — vždy přidávejte sensitive = true na jakýkoliv výstup, který odhaluje hodnoty tajemství nebo privátní klíče.
  • Používejte proměnné pro přihlašovací údaje — injektujte api_token, client_secret a přihlašovací údaje CA přes proměnné prostředí TF_VAR_ nebo CI/CD store tajemství, nikdy v souborech .tfvars commitnutých do správy verzí.
  • Přichyťte verze provideru — použijte ~> 1.0 pro povolení patch aktualizací při blokování neočekávaných major-version změn.
  • Používejte consistency groups pro detekci driftu — po zřízení přidejte mazevault_consistency_group pro zachycení driftu prostředí před tím, než se stane incidentem.
  • Grace periods pro rotaci — vždy nastavujte grace_period_minutes > 0 pro databázové rotace, aby probíhající připojení mohla skončit před zneplatněním staré hodnoty.
  • Oddělené workspace pro každé prostředí — používejte Terraform workspaces nebo oddělené state soubory pro každé prostředí (dev/staging/production) pro zabránění náhodným zápisům přes prostředí.