CipherVault 1.2.1 — Cofres, OIDC Federation para CI/CD e refator AppConnections
· 3 min para ler
A versão 1.2.1 consolida três frentes que mudam como o CipherVault é usado em produção: introduz Cofres (Vaults) como container nomeado para Secrets e Fortress, traz OIDC Federation para CI/CD, e reorganiza AppConnections em torno do modelo vault-based.
✨ Novidades
Cofres (Vaults)
Nova entidade que agrupa Secrets normais + Fortress em containers nomeados por ambiente (Dev / Hml / Staging / Prd):
- Tabela
vaultscomsecret_ids[],fortress_secret_ids[], tags, status - CRUD completo em
/vaults+GET /vaults/collisions(secrets em múltiplos cofres) - Validação de ambiente: vault PRD só aceita secrets PRD; secrets sem env podem ser auto-promovidos com
promote=true(409VAULT_ENV_PROMOTE_REQUIRED); hml/staging bloqueiam (409VAULT_ENV_CONFLICT) - Página
Vaults.jsx+VaultForm.jsxcom classificação visual (ok / promote / conflict / em-múltiplos)
OIDC Federation para CI/CD
Pipelines trocam um id_token OIDC por bundle de certs fresco — zero
segredo pré-compartilhado:
- Suporte a GitHub Actions, GitLab CI, CircleCI (preset automático) + Jenkins, Bamboo (via plugin OIDC) + Custom (issuer/JWKS livres)
POST /app-connections/:id/federated-token(público, autentica via JWT) — valida signature, iss, aud, exp, iat ≤ 10min, subject pattern com wildcard seguro- CRUD de
federation_configscom 5 endpoints lib/federation.jscom cache de JWKS (5min TTL viajwks-rsa)- Transação
FOR UPDATEna emissão — evita race em chamadas concorrentes - UI
FederationManager.jsxna página de detalhe da conexão + dialog gerador de snippet pronto pra pipeline
AppConnections — refator vault-based
- Nova coluna
vault_ids[]substituindosecret_ids[]na autorização - Página de detalhe em URL única:
/AppConnections/<client_id>(UUID, não id sequencial) client_secretagora prefixado comCipherVault_— padrão tipoghp_,sk-ant-para detecção de leaks por scannersGET /app-connections/by-client/:clientId— resolve por UUIDGET /app-connections/auto-paths— lista auto-derivada deconexões × cofres × secretsPOST /app-connections/:id/export-zip— bundle AES-256 com senha custom (archiver-zip-encrypted)GET /app-connections/fetch/:clientId/:vaultName/:secretName— fetch por nome (HTTP+mTLS)- Campos novos:
environment,require_dpop,concurrent_session_*,external_ca_pem - Path aggregators agora vinculados obrigatoriamente a uma conexão, com escopo limitado (409
VAULT_OUT_OF_SCOPE) - Dialog de Client Secret após criação (antes o valor aparecia só em toast fácil de perder)
Auditoria (refresh)
- Novo helper
lib/audit.jsfire-and-forget - 14+ actions novas:
connection_*,path_*,vault_*,cert_{issued,revoked,rotated},bundle_exported,dpop_toggled,concurrent_policy_changed,federation_* - Frontend: coluna "Data / Hora" como primeira da tabela, formato
dd/MM/yyyy HH:mm:ss, ícones/labels por 30+ actions - Export CSV com escape correto + filename datado
Dashboard
- Removido card "Tenants Ativos" (irrelevante pro contexto de secrets)
- Novos cards: "Rotação em dia (≤ 90d)" e "Rotação atrasada (> 90d)"
🔒 Segurança
- OIDC Federation elimina necessidade de compartilhar
client_secretcom pipelines - Prefixo
CipherVault_em client_secrets permite detecção por scanners - Export ZIP usa AES-256 real server-side (substituiu ZipCrypto legado do JSZip)
iatde id_tokens OIDC rejeitado se > 10min (replay window reduzida)- Transações com row-lock previnem race em write-heavy cert operations
🐛 Correções
- Race em
cert/issuecom chamadas paralelas (perdia chave no read-modify-write do JWKS) — corrigido com transaçãoFOR UPDATE - Castle icon faltando no import da aba Paths causava white screen
- Date field mismatch em AuditTable (
log.created_date→log.created_at) - Federation form abria com
provider="github"mas issuer/jwks_url vazios — preset agora auto-aplicado JWKS_KEY_NOT_FOUNDmostrava mensagem vazia — agora surface.cause.code/.code
📊 Swagger
86 paths / 29 schemas documentados (antes 70 / 18).