Pular para o conteúdo principal

CipherVault 3.0 — observabilidade, governança e expansão de protocolos

· 6 min para ler
Rafael Martinez
CEO & Co-founder, CipherVault

A v3.0 chega 24 horas depois da v2.0, mas com foco completamente diferente. Onde a v2 consolidou subsystems novos (PKI, EaaS, SSH CA, Dynamic Secrets, Tokenization), a v3 endurece e expande o que existe: observabilidade end-to-end, governança refinada (N-de-M approvals, rate limits, SBOM signing), e expansão de protocolos (Secretless Proxy agora MySQL, Redis e MongoDB; Tokenization NIST FF1 oficial; Workload Identity com OIDC genérico e SPIFFE).

15 issues fechadas no milestone v3.0.

✨ Highlights

Tokenization NIST FF1 oficial

Substituímos a implementação custom de FPE da v1.9 pela construção NIST SP 800-38G FF1 (Format-Preserving Encryption baseado em Feistel

  • AES-CBC-MAC).

Por que isso importa:

  • PCI-friendly — auditores reconhecem FF1; implementação custom precisava de defesa caso a caso
  • Token É o ciphertext — não há lookup em DB nem tokenization_records.ciphertext separado. Detokenize é apenas decrypt
  • 4 formatos com radix: ff1-decimal (radix 10, PAN/CPF), ff1-hex (radix 16), ff1-alpha (radix 26, A-Z), ff1-alnum (radix 62, A-Za-z0-9)
curl -X POST https://cv.acme.com.br/tokenization/vaults \
-d '{ "name": "pan-prd", "format": "ff1-decimal" }'

curl -X POST https://cv.acme.com.br/tokenization/vaults/pan-prd/tokenize \
-d '{ "values": ["4111111111111111"] }'
# tokens preservam dígitos: "9823745638291052"

Migração: vaults antigos (preserving, uuid, alphanumeric) continuam funcionando — novos vaults preferem FF1.

Secretless Proxy multi-protocolo

Onde a v1.9 era só Postgres CleartextPassword (MVP), a v3 traz:

ProtocoloComo
PostgresStartupMessage intercept (já existia)
MySQLHandshake v10 upstream-first, nativePasswordAuth (SHA1-XOR), rewrite HandshakeResponse41
RedisAUTH no upstream com cred do lease, intercepta AUTH do client (responde +OK fake)
MongoDBSCRAM-SHA-256 client (PBKDF2 + HMAC RFC 7677), wire framing OP_MSG/OP_QUERY, intercepta saslStart/Continue
secretless-proxy \
--listen :3306 \
--upstream mysql.internal.acme.com.br:3306 \
--protocol mysql \
--upstream-tls --upstream-ca-file /etc/ssl/cv-internal.pem \
--lease-pool-size 5 \
--cv-url https://cv.acme.com.br --conn-id app_... --role-id 42

E mais:

  • TLS upstream--upstream-tls, --upstream-ca-file, --upstream-tls-skip-verify
  • Lease pool client--lease-pool-size N pré-cria leases idle, drena no shutdown (reduz RTT inicial de 100ms para ~5ms)
  • Lease pool serverrole.lease_reuse_max_uses + dynamic_leases.use_count, mesma (role,app) reaproveita lease com SKIP LOCKED

Workload Identity expandida

Além dos 4 métodos da v1.8 (k8s_sa, aws_iam, gcp_iam, azure_msi):

  • oidc_genericverifyOidcToken com discovery .well-known/openid-configuration + JWKS cache 24h. Cobre HashiCorp Vault JWT auth, Okta, Auth0, qualquer OIDC compliant
  • spiffeverifySpiffeJwtSvid com trust_domain bundle. Para clusters SPIRE / Istio com SPIFFE IDs

HSM/KMS provider abstraction

Antes a chave master vivia local (cifrada por env var). Agora há abstração com 3 providers:

ProviderBackend
localKEK derivada de MASTER_KEY env var (mesmo comportamento da v2)
aws-kmsAWS KMS Encrypt/Decrypt API (lazy load do AWS SDK)
pkcs11HSMs PKCS#11 (Thales Luna, AWS CloudHSM, etc.)
# Configuração
CV_HSM_PROVIDER=aws-kms
CV_HSM_AWS_KMS_KEY_ID=arn:aws:kms:sa-east-1:123:key/abc

# Health check
curl https://cv.acme.com.br/health/hsm
# { "provider": "aws-kms", "healthy": true, "key_arn": "..." }

Dynamic Secrets — 4 engines novas

EngineMecanismo
cassandraCREATE ROLE WITH LOGIN AND PASSWORD
mssqlCREATE LOGIN + CREATE USER FOR LOGIN
redis (ACL-based)ACL SETUSER ... ON >password (Redis 6+)
gcp_iam (modo sa_key)Cria SA key com TTL (em vez de access token de 1h)

gcp_iam agora aceita template.mode = "access_token" | "sa_key" — SA key permite TTL > 1h (cap 24h pelo CV) ao custo de não ser self-revoking.

mTLS nas enginespostgres e mysql engines aceitam config.ssl_ca, ssl_cert, ssl_key para conexão admin via mTLS.

PKI — OCSP responder + SSH CA chain

OCSP RFC 6960 — clientes que precisam validar revogação online (navegadores, mTLS rigoroso) agora têm endpoint próprio:

POST /pki/cas/:id/ocsp # body: OCSPRequest DER
GET /pki/cas/:id/ocsp/:b64 # alternativa via GET

A response é BasicOCSPResponse assinada com a chave da CA.

SSH CA chain — múltiplas CAs por tenant + parent_ca_id. Permite modelar hierarquia (root CA → intermediate por unidade de negócio).

GET /ssh/cas # lista CAs do tenant
GET /ssh/cas/:id/chain?format=authorized_keys # chain pra distribuir

Roles agora têm ca_id — escolha qual CA assina certs daquela role.

K8s sidecar — reload sem restart

Quando o sidecar detecta rotação de secret (hash-based, hash do file content):

env:
# Sinal Unix (default SIGHUP)
- name: CV_RELOAD_SIGNAL
value: SIGHUP

# OU comando arbitrário
- name: CV_RELOAD_CMD
value: "/usr/local/bin/reload-app"

# Debounce (default 5s) — agrega múltiplas rotações
- name: CV_RELOAD_DEBOUNCE_MS
value: "5000"

Apps que suportam reload via sinal (nginx, haproxy, envoy) ou comando custom recebem trigger automático sem rolling-restart.

Observabilidade — Prometheus em todos os componentes

Métricas Prometheus expostas (gated por env CV_METRICS_ENABLED=true):

ComponenteMétricas novas
sensorcv_sensor_heartbeat, cv_sensor_collections_total, cv_sensor_credentials_collected, cv_sensor_errors_total, cv_sensor_collection_duration_seconds
scannercv_scanner_scans_total, cv_scanner_findings_total, cv_scanner_scan_duration_seconds, cv_scanner_tools_health
k8s sidecarcv_sidecar_admissions_total, cv_sidecar_secret_refresh_total, cv_sidecar_secret_age_seconds, cv_sidecar_reload_triggered_total, cv_sidecar_errors_total
secretless-proxy(já existia) — agora com labels por protocolo

Approvals — refinements operacionais

  • auto_fix_orphans no reconcile diário (dynamic_backends.auto_fix_orphans, default false) — drop users cv_* órfãos com idade > 24h automaticamente
  • Rate limitAPPROVAL_PENDING_LIMIT_PER_HOUR (default 10), retorna 429 APPROVAL_RATE_LIMITED quando excedido
  • N-de-M approval — antes 2-de-2 era fixo; agora actions: { master_key_rotate: { required_approvals: 3 } } é configurável. Tabela nova approval_signoffs com UNIQUE(approval_id, approver_id) previne duplo-sign do mesmo aprovador
  • master_key_rotate endpoint implementado (era no enum mas sem rota) — re-encripta fortress_shards.wrapped_key OLD→NEW, gated por dual-control

SBOM cosign signing

Cada release agora vem com SBOM (CycloneDX) assinado via Sigstore keyless OIDC. Anexamos .sig + .pem no GitHub Release. Permite verificação de proveniência sem chave PGP.

cosign verify-blob --bundle ciphervault-3.0.0.cdx.json.bundle \
ciphervault-3.0.0.cdx.json

⚠️ Breaking changes

  • ssh_ca UNIQUE(tenant_id) → UNIQUE(tenant_id, name) — clientes que dependiam do limite "uma CA SSH por tenant" precisam ajustar (agora podem ter N).
  • Tokenization custom (v1.9) mantida apenas para vaults existentes; novos vaults usam FF1 se você escolher os formatos ff1-*. preserving, uuid, alphanumeric continuam funcionando.

Todas migrations idempotentes:

  • pki_cas.parent_ca_id
  • dynamic_roles.lease_reuse_max_uses, dynamic_leases.use_count
  • dynamic_backends.auto_fix_orphans
  • approval_requests.required_approvals + tabela approval_signoffs
  • ssh_ca UNIQUE recompostado + parent_ca_id
  • ssh_signed_certs.ca_id, ssh_roles.ca_id

🧪 Tests

25+ unit tests novos:

  • secretless Go: RESP, AUTH detect, peek, lease pool
  • backend: ff1.test.js, hsm.test.js
  • frontend: setup vitest + jsdom + smoke do cn() helper

Roadmap pós-v3

3 issues movidas para o novo milestone operational:

  • #73 — SOC 2 evidence collection automation
  • #74 — ISO 27001 Annex A controls evidence
  • #75 — Pen test bounty público (HackerOne)

5 issues movidas para v4.0:

  • #72 — K8s federation
  • #77 — multi-region active-active
  • #78 — CRDTs para eventual consistency
  • #79 — K8s Operator com CRDs (não apenas Mutating Webhook)
  • #83 — Confidential computing (Intel SGX / AWS Nitro)

Atualizando

helm upgrade ciphervault ciphervault/ciphervault --version 3.0.0 \
--reuse-values

Migration roda automática. Sem ações manuais necessárias.

# CLI
brew upgrade ciphervault-cli

# SDKs (todos bumped pra 3.0)
pip install -U ciphervault
npm install @ciphervault/sdk@latest

— Rafael Martinez, CEO