CipherVault 3.0 — observabilidade, governança e expansão de protocolos
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.ciphertextseparado. 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:
| Protocolo | Como |
|---|---|
| Postgres | StartupMessage intercept (já existia) |
| MySQL | Handshake v10 upstream-first, nativePasswordAuth (SHA1-XOR), rewrite HandshakeResponse41 |
| Redis | AUTH no upstream com cred do lease, intercepta AUTH do client (responde +OK fake) |
| MongoDB | SCRAM-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 Npré-cria leases idle, drena no shutdown (reduz RTT inicial de 100ms para ~5ms) - Lease pool server —
role.lease_reuse_max_uses+dynamic_leases.use_count, mesma(role,app)reaproveita lease comSKIP LOCKED
Workload Identity expandida
Além dos 4 métodos da v1.8 (k8s_sa, aws_iam, gcp_iam, azure_msi):
oidc_generic—verifyOidcTokencom discovery.well-known/openid-configuration+ JWKS cache 24h. Cobre HashiCorp Vault JWT auth, Okta, Auth0, qualquer OIDC compliantspiffe—verifySpiffeJwtSvidcomtrust_domainbundle. 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:
| Provider | Backend |
|---|---|
local | KEK derivada de MASTER_KEY env var (mesmo comportamento da v2) |
aws-kms | AWS KMS Encrypt/Decrypt API (lazy load do AWS SDK) |
pkcs11 | HSMs 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
| Engine | Mecanismo |
|---|---|
cassandra | CREATE ROLE WITH LOGIN AND PASSWORD |
mssql | CREATE 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 engines — postgres 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):
| Componente | Métricas novas |
|---|---|
| sensor | cv_sensor_heartbeat, cv_sensor_collections_total, cv_sensor_credentials_collected, cv_sensor_errors_total, cv_sensor_collection_duration_seconds |
| scanner | cv_scanner_scans_total, cv_scanner_findings_total, cv_scanner_scan_duration_seconds, cv_scanner_tools_health |
| k8s sidecar | cv_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_orphansno reconcile diário (dynamic_backends.auto_fix_orphans, defaultfalse) — drop userscv_*órfãos com idade > 24h automaticamente- Rate limit —
APPROVAL_PENDING_LIMIT_PER_HOUR(default 10), retorna 429APPROVAL_RATE_LIMITEDquando excedido - N-de-M approval — antes 2-de-2 era fixo; agora
actions: { master_key_rotate: { required_approvals: 3 } }é configurável. Tabela novaapproval_signoffscomUNIQUE(approval_id, approver_id)previne duplo-sign do mesmo aprovador master_key_rotateendpoint implementado (era no enum mas sem rota) — re-encriptafortress_shards.wrapped_keyOLD→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_caUNIQUE(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,alphanumericcontinuam funcionando.
Todas migrations idempotentes:
pki_cas.parent_ca_iddynamic_roles.lease_reuse_max_uses,dynamic_leases.use_countdynamic_backends.auto_fix_orphansapproval_requests.required_approvals+ tabelaapproval_signoffsssh_caUNIQUE recompostado +parent_ca_idssh_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
