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)¶
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.
| 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ě.
mazevault_secret_link¶
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.
| 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.
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.
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 = truena 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_secreta přihlašovací údaje CA přes proměnné prostředíTF_VAR_nebo CI/CD store tajemství, nikdy v souborech.tfvarscommitnutých do správy verzí. - Přichyťte verze provideru — použijte
~> 1.0pro 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_grouppro zachycení driftu prostředí před tím, než se stane incidentem. - Grace periods pro rotaci — vždy nastavujte
grace_period_minutes > 0pro 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í.