<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>CipherVault — Changelog</title>
        <link>https://docs.ciphervault.com.br/blog</link>
        <description>Releases e novidades do CipherVault</description>
        <lastBuildDate>Fri, 22 May 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>pt-BR</language>
        <item>
            <title><![CDATA[CipherVault 4.8 — AI Copilot, SaaS billing, Zero-Knowledge vault e Browser extension]]></title>
            <link>https://docs.ciphervault.com.br/blog/v4-8-0-release</link>
            <guid>https://docs.ciphervault.com.br/blog/v4-8-0-release</guid>
            <pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[70 commits desde a v4.7. A maior expansão de superfície produto desde]]></description>
            <content:encoded><![CDATA[<p><strong>70 commits desde a v4.7. A maior expansão de superfície produto desde
a v4.0.</strong> A v4.8 traz cinco eixos novos ao mesmo tempo: <strong>AI Copilot
multi-provider</strong>, <strong>SaaS multi-tenant com Stripe</strong>, <strong>Zero-Knowledge
vault opt-in</strong>, <strong>Browser extension MV3</strong> Chrome+Firefox e <strong>PQC V2</strong> com
hybrid key-wrap + dual-sign + KMIP PQC. Mais: dual-licensing (Apache 2.0</p>
<ul>
<li class="">AGPL + commercial) e hardening Nuclei zero-vulns.</li>
</ul>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-ai-copilot--multi-provider-rag-grounded-redactor-5-fases">🤖 AI Copilot — multi-provider, RAG-grounded, redactor (5 fases)<a href="https://docs.ciphervault.com.br/blog/v4-8-0-release#-ai-copilot--multi-provider-rag-grounded-redactor-5-fases" class="hash-link" aria-label="Link direto para 🤖 AI Copilot — multi-provider, RAG-grounded, redactor (5 fases)" title="Link direto para 🤖 AI Copilot — multi-provider, RAG-grounded, redactor (5 fases)" translate="no">​</a></h2>
<p>O Copilot do CipherVault é um assistente de segurança plugável a 4
backends LLM, com <strong>redactor obrigatório</strong> em todos os prompts (PII,
secrets, tokens, IPs internos mascarados antes de sair do CV) e <strong>cost
meter per-tenant</strong> com observabilidade Prometheus.</p>
<p><strong>Providers suportados:</strong></p>
<table><thead><tr><th>Provider</th><th>Use case</th><th>Auth</th></tr></thead><tbody><tr><td><strong>OpenAI</strong></td><td>SaaS default</td><td>API key</td></tr><tr><td><strong>Azure OpenAI</strong></td><td>Enterprise compliance / data residency</td><td>API key + endpoint</td></tr><tr><td><strong>AWS Bedrock (Claude)</strong></td><td>AWS-native, IAM-driven</td><td>IRSA / IAM role</td></tr><tr><td><strong>Ollama</strong></td><td>Self-hosted, air-gap</td><td>local URL</td></tr></tbody></table>
<p><strong>5 capabilities expostas (endpoints REST):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">POST /copilot/explain-risk       { secret_id }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">POST /copilot/summarize-path     { attack_path_id }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">POST /copilot/validation-tasks   { vault_id, policy }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">POST /copilot/chat               { messages: [...] }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">POST /copilot/generate-code      { language, prompt }   ← com lint guard-rails + RAG</span><br></div></code></pre></div></div>
<p><code>generateCode</code> passa por <strong>lint pré-resposta</strong> (rejeita código com
secrets hard-coded) e usa <strong>RAG vector store</strong> indexando docs do CV para
respostas grounded ao produto.</p>
<p><strong>UI chat widget</strong> (PR #334) — Floating button + slide-over com
streaming tokens, history per-tenant, citation chips.</p>
<p>Opt-in via env:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token builtin class-name" style="color:rgb(189, 147, 249)">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">CV_COPILOT_PROVIDER</span><span class="token operator">=</span><span class="token plain">openai      </span><span class="token comment" style="color:rgb(98, 114, 164)"># ou: azure-openai, bedrock-claude, ollama</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">OPENAI_API_KEY</span><span class="token operator">=</span><span class="token plain">sk-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">.</span><br></div></code></pre></div></div>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/ai-copilot">Documentação completa →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-saas-multi-tenant--stripe-billing-6-fases">💳 SaaS multi-tenant + Stripe billing (6 fases)<a href="https://docs.ciphervault.com.br/blog/v4-8-0-release#-saas-multi-tenant--stripe-billing-6-fases" class="hash-link" aria-label="Link direto para 💳 SaaS multi-tenant + Stripe billing (6 fases)" title="Link direto para 💳 SaaS multi-tenant + Stripe billing (6 fases)" translate="no">​</a></h2>
<p>CipherVault.com.br como SaaS gerenciado. Stack:</p>
<ul>
<li class=""><strong>Stripe billing foundation</strong> — products / prices / webhook handler <code>/billing/webhook</code> / customer→tenant mapping / subscription lifecycle</li>
<li class=""><strong>Public signup</strong> — <code>POST /saas/signup</code>, email verify token, resend flow</li>
<li class=""><strong>Tier enforcement middleware</strong> — <code>requireTier('professional'|'enterprise')</code> em routes feature-gated; <code>GET /saas/tier</code> retorna tier atual + quotas + grace period</li>
<li class=""><strong>Operator runbook + status page scaffold</strong></li>
<li class=""><strong>Signup page</strong> UI — landing → Stripe Checkout → activate tenant</li>
<li class=""><strong>Legal templates</strong> — SLA, <strong>DPA (GDPR Art. 28)</strong>, ToS, Privacy Policy gerados em <code>etc/legal/</code> com placeholders por jurisdição (BR LGPD + EU GDPR)</li>
</ul>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/saas-tiers">Documentação completa →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-zero-knowledge-vault-opt-in-5-fases">🔒 Zero-Knowledge vault opt-in (5 fases)<a href="https://docs.ciphervault.com.br/blog/v4-8-0-release#-zero-knowledge-vault-opt-in-5-fases" class="hash-link" aria-label="Link direto para 🔒 Zero-Knowledge vault opt-in (5 fases)" title="Link direto para 🔒 Zero-Knowledge vault opt-in (5 fases)" translate="no">​</a></h2>
<p>Bitwarden-style E2EE para tenants regulados. Server <strong>nunca vê plaintext</strong> de
secret values — só metadados (name, path, tags) e blob opaco
cifrado client-side.</p>
<ul>
<li class="">Marca <code>vaults.is_zero_knowledge=true</code> (flag one-way; flip post-create recusado com <code>ZK_FLAG_IMMUTABLE</code>)</li>
<li class="">Wire envelope: <code>zk:v1:&lt;algo&gt;:&lt;kdf&gt;:&lt;salt&gt;:&lt;iv&gt;:&lt;ct&gt;:&lt;tag&gt;</code></li>
<li class="">Algos: <code>aes-256-gcm</code> ou <code>xchacha20-poly1305</code>. KDFs: <code>argon2id</code> (recommended) ou <code>hkdf-sha256</code></li>
<li class="">Server-side ops impossíveis (tokenize/EaaS/encrypt/search-content) recusam com <code>ZkBoundaryViolation</code> HTTP 409</li>
<li class=""><strong>SDK cliente <code>@ciphervault/zk-sdk</code></strong> — browser + Node CLI <code>cv-zk</code></li>
<li class=""><strong>UI unlock flow</strong> — <code>ZkUnlockDialog</code> + in-memory keystore + auto-attach em SecretForm/SecretViewDialog via <code>useVaultForSecret</code> hook</li>
</ul>
<p><strong>Trade-offs explícitos (documentados em <a href="https://github.com/Martinez1991/ciphervault/blob/main/docs/ZERO_KNOWLEDGE.md" target="_blank" rel="noopener noreferrer" class="">doc/ZERO_KNOWLEDGE.md</a>):</strong></p>
<ul>
<li class="">Search server-side limita-se a metadata</li>
<li class="">Audit registra who/when/op nunca what/diff</li>
<li class=""><strong>Recovery impossível se passphrase perdida</strong> — server não decriptografa</li>
</ul>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/zero-knowledge-vault">Documentação completa →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-browser-extension-mv3--chrome--firefox-7-fases">🌐 Browser Extension MV3 — Chrome + Firefox (7 fases)<a href="https://docs.ciphervault.com.br/blog/v4-8-0-release#-browser-extension-mv3--chrome--firefox-7-fases" class="hash-link" aria-label="Link direto para 🌐 Browser Extension MV3 — Chrome + Firefox (7 fases)" title="Link direto para 🌐 Browser Extension MV3 — Chrome + Firefox (7 fases)" translate="no">​</a></h2>
<p>Manifest V3 native, build separado pra cada navegador:</p>
<ul>
<li class=""><strong>Secret list + search + click-to-copy</strong> com auto-clear clipboard 30s</li>
<li class=""><strong>ZK unlock + decrypt on reveal</strong> via <code>@ciphervault/zk-sdk</code> no popup</li>
<li class=""><strong>Autofill content script</strong> com campo-by-campo highlight</li>
<li class=""><strong>Capture-on-submit</strong> — intercepta <code>&lt;form&gt;</code> submit, popup oferece salvar como secret</li>
<li class=""><strong>Auto-lock timer</strong> configurável (idle timeout)</li>
<li class=""><strong>Password generator</strong> com 6 perfis (alfa, alfa-num, simbólico, PIN, passphrase, custom)</li>
<li class=""><strong>Firefox port</strong> — <code>dist-firefox/</code> com <code>browser_specific_settings</code></li>
</ul>
<p>Disponível em:</p>
<ul>
<li class="">Chrome Web Store: <strong>pendente review</strong></li>
<li class="">Firefox AMO: <strong>pendente listing</strong></li>
<li class="">Self-host: build em <code>tools/browser-extension/dist/</code> ou <code>dist-firefox/</code></li>
</ul>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/browser-extension">Documentação completa →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-pqc-v2--hybrid-wrap--dual-sign--kmip-pqc-5-fases">🛡️ PQC V2 — Hybrid wrap + Dual-sign + KMIP PQC (5 fases)<a href="https://docs.ciphervault.com.br/blog/v4-8-0-release#%EF%B8%8F-pqc-v2--hybrid-wrap--dual-sign--kmip-pqc-5-fases" class="hash-link" aria-label="Link direto para 🛡️ PQC V2 — Hybrid wrap + Dual-sign + KMIP PQC (5 fases)" title="Link direto para 🛡️ PQC V2 — Hybrid wrap + Dual-sign + KMIP PQC (5 fases)" translate="no">​</a></h2>
<p>Expansão sobre v4.5 PQC. Foco em <strong>híbrido sempre</strong> (clássico ⊕
post-quantum) — quebra de um algoritmo não compromete o outro.</p>
<p><strong>Novos endpoints:</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">POST /pqc/hybrid-classical/wrap        AES-256-GCM key wrap híbrido</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">POST /pqc/hybrid-classical/unwrap        (RSA-OAEP-2048 ou ECDH-P256 + ML-KEM-768)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">POST /pqc/dual-sign/sign               Assina simultaneamente RSA-PSS-3072 + ML-DSA-65</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">POST /pqc/dual-sign/verify             Verifier exige AMBAS válidas</span><br></div></code></pre></div></div>
<p><strong>KMIP PQC objects:</strong> clientes KMIP podem <code>Create</code> objetos
<code>ML-KEM</code> + <code>ML-DSA</code> via TTLV — primeira implementação KMIP 1.4 com PQC
no mercado open-source.</p>
<p><strong>Audit Merkle checkpoint signed:</strong> snapshot horário em
<code>pqc_audit_checkpoints</code> com <strong>RSA-PSS-3072 + ML-DSA-87</strong> dual signature
(nível highest pra audit trail compliance regulada).</p>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/post-quantum-crypto">Documentação completa →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-anomaly-ml-v2-3-fases--shadow-mode--ensemble">🔬 Anomaly ML V2 (3 fases — shadow mode + ensemble)<a href="https://docs.ciphervault.com.br/blog/v4-8-0-release#-anomaly-ml-v2-3-fases--shadow-mode--ensemble" class="hash-link" aria-label="Link direto para 🔬 Anomaly ML V2 (3 fases — shadow mode + ensemble)" title="Link direto para 🔬 Anomaly ML V2 (3 fases — shadow mode + ensemble)" translate="no">​</a></h2>
<p>V1 (heurística baseline) continua default. V2 introduz:</p>
<ul>
<li class=""><strong>Phase 1</strong> — null-fallback scaffold em <code>mlV2/</code></li>
<li class=""><strong>Phase 2</strong> — shadow mode wiring + V1/V2 comparison logs</li>
<li class=""><strong>Phase 3</strong> — ensemble OR + V2-only modes (env <code>CV_ANOMALY_ML_VERSION=v1|shadow|v2|ensemble</code>)</li>
</ul>
<p>Permite experimentação A/B do detector novo sem afetar production
decisioning.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-dual-licensing-apache-20--agpl--commercial">📜 Dual-licensing (Apache 2.0 + AGPL + Commercial)<a href="https://docs.ciphervault.com.br/blog/v4-8-0-release#-dual-licensing-apache-20--agpl--commercial" class="hash-link" aria-label="Link direto para 📜 Dual-licensing (Apache 2.0 + AGPL + Commercial)" title="Link direto para 📜 Dual-licensing (Apache 2.0 + AGPL + Commercial)" translate="no">​</a></h2>
<p>Triângulo de licenciamento pra serviar 3 perfis de adopter:</p>
<table><thead><tr><th>Licença</th><th>Quem usa</th><th>Permissões</th></tr></thead><tbody><tr><td><strong>Apache 2.0</strong> (default)</td><td>OSS contribs, projetos comerciais "discretos"</td><td>Use, modify, redistribuir; sem obrigação de open-source de derivativos</td></tr><tr><td><strong>AGPL-3.0</strong> (opt-in)</td><td>Quem quer copyleft fortes pra prevenir "SaaS leeching"</td><td>Forks que rodem como serviço devem abrir código</td></tr><tr><td><strong>Commercial</strong></td><td>Enterprise que querem isenção de AGPL + warranty</td><td>Termos negociados; template em <code>LICENSE-COMMERCIAL.template.md</code></td></tr></tbody></table>
<p><code>LICENSING.md</code> é guia de decisão. <code>NOTICE</code> lista components AGPL
opcionais.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-security-hardening-nuclei-5-prs">🔐 Security hardening Nuclei (5 PRs)<a href="https://docs.ciphervault.com.br/blog/v4-8-0-release#-security-hardening-nuclei-5-prs" class="hash-link" aria-label="Link direto para 🔐 Security hardening Nuclei (5 PRs)" title="Link direto para 🔐 Security hardening Nuclei (5 PRs)" translate="no">​</a></h2>
<p>Baseline Nuclei 2026-05 <strong>zero vulns</strong>. Hardening implementado:</p>
<ul>
<li class=""><strong>CloudFront</strong> security headers policy (HSTS preload, CSP report-only → enforced, X-Frame-Options DENY, Permissions-Policy)</li>
<li class=""><strong>DMARC</strong> TXT record + <strong>DKIM via Titan</strong> (procedure documentada)</li>
<li class=""><strong>DNSSEC Route 53</strong> + DS no Registro.br</li>
<li class=""><strong>Email obfuscator</strong> JS snippet (mailto bot protection)</li>
<li class=""><strong>Nginx local</strong> headers + ports loopback-only</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-breaking-changes">⚠️ Breaking changes<a href="https://docs.ciphervault.com.br/blog/v4-8-0-release#%EF%B8%8F-breaking-changes" class="hash-link" aria-label="Link direto para ⚠️ Breaking changes" title="Link direto para ⚠️ Breaking changes" translate="no">​</a></h2>
<ul>
<li class=""><strong>Storage</strong>: vaults criados com <code>is_zero_knowledge=true</code> recusam tokenize / encrypt / search-content server-side com <code>ZkBoundaryViolation</code> HTTP 409. Apps que dependiam dessas ops em <strong>todos</strong> os vaults precisam checar a flag antes.</li>
<li class=""><strong>Licensing</strong>: default mudou para <strong>Apache 2.0</strong>. AGPL agora é opt-in via <code>LICENSE-AGPL.md</code>. Usuários que importavam o repo sob assumption MIT/BSD devem ler <code>LICENSING.md</code>.</li>
<li class=""><strong>Copilot opt-in</strong>: nenhum provider habilitado por default. Requer <code>CV_COPILOT_PROVIDER=...</code> + credenciais.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="atualizando">Atualizando<a href="https://docs.ciphervault.com.br/blog/v4-8-0-release#atualizando" class="hash-link" aria-label="Link direto para Atualizando" title="Link direto para Atualizando" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Self-hosted Helm</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ciphervault ciphervault/ciphervault </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">4.8</span><span class="token plain">.0 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  --reuse-values</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Migrate schema (is_zero_knowledge, pqc_audit_checkpoints, subscriptions tables)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">exec</span><span class="token plain"> deploy/ciphervault-backend -- </span><span class="token function" style="color:rgb(80, 250, 123)">node</span><span class="token plain"> migrate.js up</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Copilot (opcional)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">CV_COPILOT_PROVIDER</span><span class="token operator">=</span><span class="token plain">openai</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">OPENAI_API_KEY</span><span class="token operator">=</span><span class="token plain">sk-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">.</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Browser extension self-host</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">cd</span><span class="token plain"> tools/browser-extension </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">npm</span><span class="token plain"> run build         </span><span class="token comment" style="color:rgb(98, 114, 164)"># Chrome</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">cd</span><span class="token plain"> tools/browser-extension </span><span class="token operator">&amp;&amp;</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">npm</span><span class="token plain"> run build:firefox </span><span class="token comment" style="color:rgb(98, 114, 164)"># Firefox</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="testes">Testes<a href="https://docs.ciphervault.com.br/blog/v4-8-0-release#testes" class="hash-link" aria-label="Link direto para Testes" title="Link direto para Testes" translate="no">​</a></h2>
<p><strong>+280 testes novos</strong>. Total agora &gt; <strong>2180 testes</strong>.</p>
<p>— Rafael Martinez, CEO</p>]]></content:encoded>
            <category>Release</category>
            <category>Copilot</category>
            <category>SaaS</category>
            <category>Zero-Knowledge</category>
            <category>Browser Extension</category>
            <category>Post-quantum</category>
            <category>Licenciamento</category>
        </item>
        <item>
            <title><![CDATA[CipherVault 4.6 — Gap analysis closures vs Pulumi/Bitwarden/Keeper]]></title>
            <link>https://docs.ciphervault.com.br/blog/v4-6-0-release</link>
            <guid>https://docs.ciphervault.com.br/blog/v4-6-0-release</guid>
            <pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A v4.6 fecha 6 gaps competitivos mapeados em análise vs Pulumi ESC,]]></description>
            <content:encoded><![CDATA[<p>A v4.6 fecha 6 gaps competitivos mapeados em análise vs <strong>Pulumi ESC,
Bitwarden e Keeper</strong>. Ganhos diretos pra paridade: <strong>HIBP Breach Watch</strong>
(Keeper/Bitwarden parity), <strong>One-Time Share</strong> self-destructing (Send
parity), <strong>OIDC Issuer</strong> com <code>AssumeRoleWithWebIdentity</code> (Pulumi ESC
parity) e <strong>Environment composition</strong> com chain root→leaf.</p>
<p>Mais 4 SDKs novos (Rust, PHP, Ruby, C++) elevando o portfólio para <strong>9
linguagens — paridade total com Bitwarden</strong>.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-hibp-breach-watch-262">✨ HIBP Breach Watch (#262)<a href="https://docs.ciphervault.com.br/blog/v4-6-0-release#-hibp-breach-watch-262" class="hash-link" aria-label="Link direto para ✨ HIBP Breach Watch (#262)" title="Link direto para ✨ HIBP Breach Watch (#262)" translate="no">​</a></h2>
<p>Integração nativa com a API <code>pwnedpasswords.com/range/</code>:</p>
<ul>
<li class=""><strong>k-anonymity SHA-1 prefix lookup</strong> — apenas os 5 primeiros chars do
hash saem do CV. Plaintext nunca leak.</li>
<li class="">Per-prefix cache 7 dias (reduz outbound network)</li>
<li class="">Opt-in via <code>CV_BREACH_WATCH_ENABLED=true</code> (default off por privacy
conservatism + air-gap friendly)</li>
<li class="">Scheduler diário; resultado materializa em <code>secrets.breach_count</code></li>
</ul>
<p><strong>Widget UI</strong> <code>BreachWatchWidget</code> reaproveitado em Dashboard +
Profile + SecretCard.</p>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/breach-watch">Documentação →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-one-time-share-263">✨ One-Time Share (#263)<a href="https://docs.ciphervault.com.br/blog/v4-6-0-release#-one-time-share-263" class="hash-link" aria-label="Link direto para ✨ One-Time Share (#263)" title="Link direto para ✨ One-Time Share (#263)" translate="no">​</a></h2>
<p>Bitwarden Send / Keeper One-Time Share parity. Self-destructing links:</p>
<ul>
<li class="">Token <strong>256-bit URL-safe</strong> gerado server-side</li>
<li class="">TTL configurável até 30 dias</li>
<li class="">View count (1-3 default) ou tempo (lockout primeiro a fechar)</li>
<li class="">Revoke manual antes de TTL expirar</li>
<li class="">Counter+timer decay visível no preview público</li>
</ul>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">POST /share              { secret_id, ttl_minutes, max_views }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">→ { token, share_url }</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">GET  /share/:token       público (sem auth) — exibe valor + decrementa view</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">DELETE /share/id/:id     revoga</span><br></div></code></pre></div></div>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/one-time-share">Documentação →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-oidc-issuer--aws-assumerolewithwebidentity-261">✨ OIDC Issuer + AWS AssumeRoleWithWebIdentity (#261)<a href="https://docs.ciphervault.com.br/blog/v4-6-0-release#-oidc-issuer--aws-assumerolewithwebidentity-261" class="hash-link" aria-label="Link direto para ✨ OIDC Issuer + AWS AssumeRoleWithWebIdentity (#261)" title="Link direto para ✨ OIDC Issuer + AWS AssumeRoleWithWebIdentity (#261)" translate="no">​</a></h2>
<p>CipherVault como <strong>OIDC IdP</strong> (não mais só consumer). Pulumi ESC parity
real:</p>
<ul>
<li class="">Discovery em <code>/.well-known/openid-configuration</code></li>
<li class="">JWKS em <code>/.well-known/jwks.json</code> — <strong>EC P-256 ES256</strong>, rotate via
<code>POST /oidc/rotate</code></li>
<li class=""><code>POST /oidc/token</code> mint de JWT pra workload identity</li>
<li class="">AWS pode usar como <code>OIDCProvider</code> em IAM. App federa AWS via
<code>AssumeRoleWithWebIdentity</code> <strong>sem static keys</strong></li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># AWS-side: cria OIDC provider apontando pra CV</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">aws iam create-open-id-connect-provider </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--url</span><span class="token plain"> https://cv.acme.com.br </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  --client-id-list </span><span class="token string" style="color:rgb(255, 121, 198)">"sts.amazonaws.com"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  --thumbprint-list </span><span class="token operator">&lt;</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-s</span><span class="token plain"> https://cv.acme.com.br/.well-known/openid-configuration </span><span class="token operator">|</span><span class="token plain"> jq </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-r</span><span class="token plain"> .jwks_uri</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># App-side: troca JWT do CV por AWS credentials temporárias</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">JWT</span><span class="token operator">=</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$(</span><span class="token variable function" style="color:rgb(80, 250, 123);font-style:italic">curl</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token variable parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-X</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic"> POST https://cv.acme.com.br/oidc/token </span><span class="token variable parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-H</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token variable string" style="color:rgb(255, 121, 198);font-style:italic">"Authorization: Bearer </span><span class="token variable string variable" style="color:rgb(189, 147, 249);font-style:italic">$CV_TOKEN</span><span class="token variable string" style="color:rgb(255, 121, 198);font-style:italic">"</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic"> </span><span class="token variable operator" style="color:rgb(189, 147, 249);font-style:italic">|</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic"> jq </span><span class="token variable parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-r</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic"> .token</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">aws sts assume-role-with-web-identity </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  --role-arn arn:aws:iam::123:role/ciphervault-fed </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  --role-session-name app1 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  --web-identity-token </span><span class="token string" style="color:rgb(255, 121, 198)">"</span><span class="token string variable" style="color:rgb(189, 147, 249);font-style:italic">$JWT</span><span class="token string" style="color:rgb(255, 121, 198)">"</span><br></div></code></pre></div></div>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/oidc-issuer">Documentação →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-environment-composition-phase-1-260">✨ Environment composition (Phase 1) (#260)<a href="https://docs.ciphervault.com.br/blog/v4-6-0-release#-environment-composition-phase-1-260" class="hash-link" aria-label="Link direto para ✨ Environment composition (Phase 1) (#260)" title="Link direto para ✨ Environment composition (Phase 1) (#260)" translate="no">​</a></h2>
<p>Pulumi ESC flagship. <strong>Hierarchy + chain visualization:</strong></p>
<ul>
<li class=""><code>environments</code> table — nós em árvore (parent_id)</li>
<li class=""><code>environment_secrets</code> — bindings por environment</li>
<li class=""><code>GET /environments/:id/compose</code> faz walk <strong>root → leaf</strong></li>
<li class=""><strong>Leaf-wins override</strong> sobre conflitos (com <code>source</code> chain pra debug)</li>
</ul>
<p>UI em <code>/Environments</code> mostra tree visual + effective secrets com source
highlighting (visualiza de onde veio cada secret).</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">production</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  ↳ inherits  → base-config</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      ↳ DATABASE_HOST=prod.db</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">      ↳ LOG_LEVEL=warn</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  ↳ overrides → LOG_LEVEL=info</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  effective:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    DATABASE_HOST=prod.db    [from base-config]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    LOG_LEVEL=info           [from production override]</span><br></div></code></pre></div></div>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/environment-composition">Documentação →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-endpoint-discovery-scaffold-265">✨ Endpoint Discovery scaffold (#265)<a href="https://docs.ciphervault.com.br/blog/v4-6-0-release#-endpoint-discovery-scaffold-265" class="hash-link" aria-label="Link direto para ✨ Endpoint Discovery scaffold (#265)" title="Link direto para ✨ Endpoint Discovery scaffold (#265)" translate="no">​</a></h2>
<p>CipherVault Guardian Phase 1 expande pra <strong>endpoints Linux</strong>:</p>
<ul>
<li class="">Agent lê <code>/etc/passwd</code> + <code>/root/.ssh/authorized_keys</code></li>
<li class="">Reporta accounts encontradas via <code>POST /kube-guardian/endpoint-accounts</code></li>
<li class="">Backend ingest deduplica e correlaciona com vault membership</li>
<li class="">UI em <code>/EndpointDiscovery</code> lista accounts + filtros</li>
</ul>
<p>Cobertura ampliada pra Windows / hosts não-K8s em fases futuras (closes
#265 partial).</p>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/endpoint-discovery">Documentação →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-tier-2-sdks-codegen-266">✨ Tier 2 SDKs codegen (#266)<a href="https://docs.ciphervault.com.br/blog/v4-6-0-release#-tier-2-sdks-codegen-266" class="hash-link" aria-label="Link direto para ✨ Tier 2 SDKs codegen (#266)" title="Link direto para ✨ Tier 2 SDKs codegen (#266)" translate="no">​</a></h2>
<p>OpenAPI codegen scaffolds para 4 linguagens novas, atingindo paridade
total com Bitwarden (9 SDKs):</p>
<table><thead><tr><th>Linguagem</th><th>Path</th><th>Generator</th><th>Status</th></tr></thead><tbody><tr><td>Rust</td><td><code>sdks/rust/</code></td><td><code>openapi-generator</code> rust</td><td>scaffold + CI</td></tr><tr><td>PHP</td><td><code>sdks/php/</code></td><td><code>openapi-generator</code> php</td><td>scaffold + CI</td></tr><tr><td>Ruby</td><td><code>sdks/ruby/</code></td><td><code>openapi-generator</code> ruby</td><td>scaffold + CI</td></tr><tr><td>C++</td><td><code>sdks/cpp/</code></td><td><code>openapi-generator</code> cpp-restsdk</td><td>scaffold + CI</td></tr></tbody></table>
<p>Portfólio total: <strong>Python, Go, Node/TS, Java, C#, Rust, PHP, Ruby, C++</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-competitive_matrix-expandido-256-257">✨ COMPETITIVE_MATRIX expandido (#256, #257)<a href="https://docs.ciphervault.com.br/blog/v4-6-0-release#-competitive_matrix-expandido-256-257" class="hash-link" aria-label="Link direto para ✨ COMPETITIVE_MATRIX expandido (#256, #257)" title="Link direto para ✨ COMPETITIVE_MATRIX expandido (#256, #257)" translate="no">​</a></h2>
<p>Pulumi ESC + Bitwarden + Keeper adicionados (agora <strong>10 vendors</strong>).
Nova seção "Features que CipherVault NÃO tem" (transparência) abriu 11
issues mapeando o roadmap.</p>
<p>Out-of-scope assumido e documentado: PAM session recording + PRA
(privileged remote access) — produto separado.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="atualizando">Atualizando<a href="https://docs.ciphervault.com.br/blog/v4-6-0-release#atualizando" class="hash-link" aria-label="Link direto para Atualizando" title="Link direto para Atualizando" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Self-hosted Helm</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ciphervault ciphervault/ciphervault </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">4.6</span><span class="token plain">.0 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  --reuse-values</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Habilitar Breach Watch (opt-in)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">export</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">CV_BREACH_WATCH_ENABLED</span><span class="token operator">=</span><span class="token plain">true</span><br></div></code></pre></div></div>
<p>— Rafael Martinez, CEO</p>]]></content:encoded>
            <category>Release</category>
            <category>OIDC</category>
            <category>SDKs</category>
            <category>Gap analysis</category>
        </item>
        <item>
            <title><![CDATA[CipherVault 4.7 — Frontend coverage completo + observability + runbooks]]></title>
            <link>https://docs.ciphervault.com.br/blog/v4-7-0-release</link>
            <guid>https://docs.ciphervault.com.br/blog/v4-7-0-release</guid>
            <pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[38 PRs em 1 dia. Frontend cobre 100% das features v4.5/v4.6, Grafana]]></description>
            <content:encoded><![CDATA[<p><strong>38 PRs em 1 dia.</strong> Frontend cobre 100% das features v4.5/v4.6, Grafana
dashboard <code>ciphervault-overview</code> com 12 panels, 9 Prometheus alerts,
4 operator runbooks novos.</p>
<p>Teste suite estabilizada: <strong>1261/1261 passing</strong>, 87 suites verdes.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-frontend-ui-coverage-prs-276-285">✨ Frontend UI coverage (PRs #276-#285)<a href="https://docs.ciphervault.com.br/blog/v4-7-0-release#-frontend-ui-coverage-prs-276-285" class="hash-link" aria-label="Link direto para ✨ Frontend UI coverage (PRs #276-#285)" title="Link direto para ✨ Frontend UI coverage (PRs #276-#285)" translate="no">​</a></h2>
<p>10 páginas/widgets novas:</p>
<table><thead><tr><th>Página</th><th>PR</th><th>O que entrega</th></tr></thead><tbody><tr><td><strong>/Tenants</strong></td><td>#276</td><td>Suspend/unsuspend actions + purge countdown + reason inline</td></tr><tr><td><strong>/Share</strong></td><td>#277</td><td>One-Time Share list + create modal + copy URL + revoke</td></tr><tr><td><strong>/Environments</strong></td><td>#278</td><td>Tree hierarchy + chain visualization + effective_secrets com source highlighting + bind/unbind</td></tr><tr><td><strong>Settings → OIDC tab</strong></td><td>#279</td><td>Discovery preview + JWKS keys table + rotate + AWS IAM setup walkthrough</td></tr><tr><td><strong>Dashboard widgets</strong></td><td>#283</td><td>4 StatCards (Shares + Envs + KMIP + BreachWatch) com fail-soft queries</td></tr><tr><td><strong>Profile → GDPR section</strong></td><td>#280</td><td>Export download + typed-confirm forget gate</td></tr><tr><td><strong>Tenants quota gauges</strong></td><td>#280</td><td>Progress bar color-coded por threshold</td></tr><tr><td><strong>Settings → Infrastructure → HSM</strong></td><td>#281</td><td>Multi-provider grid + 4 cache metric cards + <code>/health/hsm/cache</code></td></tr><tr><td><strong>/Kmip</strong></td><td>#282</td><td>Status header + lifecycle distribution + ops support + objects table + detail modal</td></tr><tr><td><strong>AuditLogs filter</strong></td><td>#284</td><td>14 novos action types com emoji + cores por severity</td></tr><tr><td><strong>/EndpointDiscovery</strong></td><td>#285</td><td>Backend ingestion + admin list + 4 stat cards + filterable table</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-observability--grafana--prometheus-287">✨ Observability — Grafana + Prometheus (#287)<a href="https://docs.ciphervault.com.br/blog/v4-7-0-release#-observability--grafana--prometheus-287" class="hash-link" aria-label="Link direto para ✨ Observability — Grafana + Prometheus (#287)" title="Link direto para ✨ Observability — Grafana + Prometheus (#287)" translate="no">​</a></h2>
<p><strong>Dashboard <code>ciphervault-overview</code></strong> com 12 panels:</p>
<ul>
<li class="">Leases gauges (active/expiring/expired por engine)</li>
<li class="">Latency p50/p95/p99 por endpoint</li>
<li class="">Multi-KM health (Local + AWS KMS + PKCS#11)</li>
<li class="">Cache hit rate (HSM cache, JWKS cache, Lease cache)</li>
<li class="">Replication lag (CDC checkpoint Postgres → MongoDB/MySQL)</li>
<li class="">Phase 5 multi-region replica state</li>
<li class="">Build info (version, commit, env)</li>
</ul>
<p><strong>Prometheus alerts</strong> — 9 rules:</p>
<table><thead><tr><th>Severidade</th><th>Count</th></tr></thead><tbody><tr><td>Critical</td><td>2 (DB down, master_key_rotate failed)</td></tr><tr><td>Warning</td><td>5 (HSM cache miss spike, lease pool &gt; 80%, replication lag &gt; 5min, etc.)</td></tr><tr><td>Info</td><td>2 (cert renew em 30d, baseline anomaly low confidence)</td></tr></tbody></table>
<p>Auto-provisioning configs em <code>docker-compose.observability.yml</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> compose </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> docker-compose.yml </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">               </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> infrastructure/docker-compose/docker-compose.observability.yml up </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Grafana em :3001 com dashboard pré-importado, Prometheus :9090</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-operator-runbooks-288">✨ Operator runbooks (#288)<a href="https://docs.ciphervault.com.br/blog/v4-7-0-release#-operator-runbooks-288" class="hash-link" aria-label="Link direto para ✨ Operator runbooks (#288)" title="Link direto para ✨ Operator runbooks (#288)" translate="no">​</a></h2>
<p>4 novos:</p>
<ul>
<li class=""><strong><code>OIDC_AWS_SETUP.md</code></strong> — walkthrough OIDC provider → IAM trust → dynamic backend</li>
<li class=""><strong><code>RLS_ACTIVATION.md</code></strong> — 4-phase Postgres Row-Level Security rollout (sombra → enforced → rollback drill → cleanup)</li>
<li class=""><strong><code>KMIP_CLIENT_TESTING.md</code></strong> — pykmip examples + OASIS conformance checklist</li>
<li class=""><strong><code>DR_PLAYBOOK.md</code></strong> — 7 recovery scenarios (region failover, KMS rotation rollback, HSM bricked, full restore from snapshot, partial corruption, network partition, master_key compromise)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-test-stability-286">🐛 Test stability (#286)<a href="https://docs.ciphervault.com.br/blog/v4-7-0-release#-test-stability-286" class="hash-link" aria-label="Link direto para 🐛 Test stability (#286)" title="Link direto para 🐛 Test stability (#286)" translate="no">​</a></h2>
<p><strong>AD/LDAP engines test isolation</strong> via lazy require de <code>ldapjs</code>. Eliminou
21 test failures intermitentes. Suíte agora rola <strong>1261/1261 passing</strong>,
87 suites verdes — sem flakies.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="comparison-pages-292">Comparison pages (#292)<a href="https://docs.ciphervault.com.br/blog/v4-7-0-release#comparison-pages-292" class="hash-link" aria-label="Link direto para Comparison pages (#292)" title="Link direto para Comparison pages (#292)" translate="no">​</a></h2>
<p>Públicas no docs site, vs Doppler/Vault/Akeyless. Honestas sobre <strong>onde
CipherVault perde</strong> (ex: maturidade ecosystem vs Vault) e onde ganha
(LGPD-native, brazilian timezone support, dual-license).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dr-test-report-291">DR Test Report (#291)<a href="https://docs.ciphervault.com.br/blog/v4-7-0-release#dr-test-report-291" class="hash-link" aria-label="Link direto para DR Test Report (#291)" title="Link direto para DR Test Report (#291)" translate="no">​</a></h2>
<p>Execution report do DR drill 2026-Q2 publicado em <code>docs/dr-test-2026-q2.md</code>.
Validado RTO 12min / RPO 38s real (target: RTO 15min / RPO &lt; 60s).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="atualizando">Atualizando<a href="https://docs.ciphervault.com.br/blog/v4-7-0-release#atualizando" class="hash-link" aria-label="Link direto para Atualizando" title="Link direto para Atualizando" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ciphervault ciphervault/ciphervault </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">4.7</span><span class="token plain">.0 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  --reuse-values</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Importar dashboard Grafana</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl apply </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> infrastructure/observability/grafana-dashboard-cv-overview.yaml</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Importar Prometheus rules</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl apply </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> infrastructure/observability/prometheus-alerts.yaml</span><br></div></code></pre></div></div>
<p>— Rafael Martinez, CEO</p>]]></content:encoded>
            <category>Release</category>
            <category>UI</category>
            <category>Observability</category>
            <category>Runbooks</category>
        </item>
        <item>
            <title><![CDATA[CipherVault 4.5 — Guardian, PQC, Plugin SDK e 17 PRs em 10 dias]]></title>
            <link>https://docs.ciphervault.com.br/blog/v4-5-0-release</link>
            <guid>https://docs.ciphervault.com.br/blog/v4-5-0-release</guid>
            <pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[5 dias após a v4.4, fechamos a maior release de feature parity da]]></description>
            <content:encoded><![CDATA[<p>5 dias após a v4.4, fechamos a maior release de feature parity da
plataforma: <strong>17 PRs</strong> alinhando o CipherVault com competidores
(HashiCorp Vault, Doppler) e introduzindo o <strong>CipherVault Guardian</strong> —
integração K8s v2 que consolida Webhook + ESO + Sensor sob um Helm chart único.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-ciphervault-guardian--k8s-integration-v2">✨ CipherVault Guardian — K8s integration v2<a href="https://docs.ciphervault.com.br/blog/v4-5-0-release#-ciphervault-guardian--k8s-integration-v2" class="hash-link" aria-label="Link direto para ✨ CipherVault Guardian — K8s integration v2" title="Link direto para ✨ CipherVault Guardian — K8s integration v2" translate="no">​</a></h2>
<p>Consolida 3 caminhos K8s separados (Mutating Webhook, External Secrets
Operator, Sensor de cluster) sob <strong>um Helm chart único</strong> + 3
capabilities novas.</p>
<p><strong>Phases entregues em 4 PRs:</strong></p>
<ol>
<li class=""><strong>Foundation + Discovery + Drift</strong> — Go agent (<code>cv-guardian/</code>, 8 packages) descobre workloads, classifica criticidade, reporta drift</li>
<li class=""><strong>Validating Admission Webhook</strong> — 4 rules built-in (<code>hardcoded-secret-env</code>, <code>privileged-critical-secret</code>, <code>cross-namespace-no-binding</code>, <code>stale-rotation</code>). <strong>Audit-mode default</strong>, promote → <code>block</code> via dual-control</li>
<li class=""><strong>SPIFFE/SPIRE opcional + multi-cluster federation</strong> — workload identities + cross-cluster paths</li>
</ol>
<p><strong>Helm chart</strong> <code>charts/ciphervault-guardian/</code>:</p>
<ul>
<li class="">9 kinds renderizados em config completa</li>
<li class="">2 modos RBAC (namespace default + cluster opt-in para Attack Path)</li>
<li class="">Imagem distroless UID 65532</li>
</ul>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/guardian">Documentação completa →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-post-quantum-crypto-142">✨ Post-quantum crypto (#142)<a href="https://docs.ciphervault.com.br/blog/v4-5-0-release#-post-quantum-crypto-142" class="hash-link" aria-label="Link direto para ✨ Post-quantum crypto (#142)" title="Link direto para ✨ Post-quantum crypto (#142)" translate="no">​</a></h2>
<p><strong>Kyber KEM + Dilithium signatures</strong> (FIPS 203/204) via
<code>@noble/post-quantum</code>. Endpoints:</p>
<ul>
<li class=""><code>POST /pqc/kem/encapsulate</code> / <code>decapsulate</code> — Kyber</li>
<li class=""><code>POST /pqc/sig/sign</code> / <code>verify</code> — Dilithium</li>
<li class=""><code>POST /pqc/hybrid/*</code> — modo híbrido (clássico ⊕ PQC), recomendado para 2026+</li>
</ul>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/post-quantum-crypto">Documentação →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-plugin-sdk-para-secret-engines-137">✨ Plugin SDK para secret engines (#137)<a href="https://docs.ciphervault.com.br/blog/v4-5-0-release#-plugin-sdk-para-secret-engines-137" class="hash-link" aria-label="Link direto para ✨ Plugin SDK para secret engines (#137)" title="Link direto para ✨ Plugin SDK para secret engines (#137)" translate="no">​</a></h2>
<p>Community-extensible. File-based discovery em <code>CV_PLUGINS_DIR</code>.
Reference plugin em <code>backend/plugins-example/dummy-engine/</code>.</p>
<p>Permite implementar engines customizados (DBs proprietários, sistemas
internos) sem fork do backend.</p>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/plugin-sdk">Documentação →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-driftanomaly-detection-146">✨ Drift/anomaly detection (#146)<a href="https://docs.ciphervault.com.br/blog/v4-5-0-release#-driftanomaly-detection-146" class="hash-link" aria-label="Link direto para ✨ Drift/anomaly detection (#146)" title="Link direto para ✨ Drift/anomaly detection (#146)" translate="no">​</a></h2>
<p>Vault Radar-equivalente. Endpoints <code>/anomalies</code> + scheduler 24h.
Detecta:</p>
<ul>
<li class="">Secrets sem rotação a &gt; N dias</li>
<li class="">AppConnections com IPs de regiões anômalas</li>
<li class="">Picos de acesso fora do baseline</li>
<li class="">Drift entre <code>dynamic_backends</code> reconcile e estado real do DB</li>
</ul>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/anomaly-detection">Documentação →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-replication-cdc-148">✨ Replication CDC (#148)<a href="https://docs.ciphervault.com.br/blog/v4-5-0-release#-replication-cdc-148" class="hash-link" aria-label="Link direto para ✨ Replication CDC (#148)" title="Link direto para ✨ Replication CDC (#148)" translate="no">​</a></h2>
<p><strong>Phase 1+2</strong> entregues:</p>
<ul>
<li class="">CDC polling Postgres → MongoDB/MySQL sinks</li>
<li class="">4 tabelas whitelistadas (<code>secrets</code> redacted, <code>vaults</code>, <code>audit_logs</code>, <code>risk_scores</code>)</li>
<li class="">Failover state machine <code>mirror ↔ promoted ↔ demoted</code> + split-brain auto-detect</li>
<li class="">5 admin endpoints, promote gated por dual-control</li>
</ul>
<p><strong>Phase 3</strong> — storage abstraction PoC. Foundation only;
refactor completo de 200 call sites requer 6-10 sprints.</p>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/replication">Documentação →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-kmip-14-server-141">✨ KMIP 1.4 server (#141)<a href="https://docs.ciphervault.com.br/blog/v4-5-0-release#-kmip-14-server-141" class="hash-link" aria-label="Link direto para ✨ KMIP 1.4 server (#141)" title="Link direto para ✨ KMIP 1.4 server (#141)" translate="no">​</a></h2>
<p><code>Create</code> / <code>Get</code> / <code>GetAttributes</code> / <code>Activate</code> / <code>Revoke</code> / <code>Destroy</code>
via codec TTLV na <strong>porta 5696 TLS</strong>. Permite clientes legados (Java
KMS, IBM Spectrum Scale, etc.) usar CipherVault sem código próprio.</p>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/kmip">Documentação →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-ide-plugins-153">✨ IDE plugins (#153)<a href="https://docs.ciphervault.com.br/blog/v4-5-0-release#-ide-plugins-153" class="hash-link" aria-label="Link direto para ✨ IDE plugins (#153)" title="Link direto para ✨ IDE plugins (#153)" translate="no">​</a></h2>
<p>Finalmente. <strong>VS Code extension</strong> (TypeScript) + <strong>JetBrains plugin</strong>
(Kotlin) com:</p>
<ul>
<li class="">Tree view dos vaults / secrets acessíveis</li>
<li class="">CodeLens em <code>{{cv:vault/path}}</code> mostrando preview + clique para inserir</li>
<li class="">Auto-detect de project root via <code>.ciphervault.yml</code></li>
</ul>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/ide-plugins">Documentação →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-argo-cd-config-management-plugin-152">✨ Argo CD Config Management Plugin (#152)<a href="https://docs.ciphervault.com.br/blog/v4-5-0-release#-argo-cd-config-management-plugin-152" class="hash-link" aria-label="Link direto para ✨ Argo CD Config Management Plugin (#152)" title="Link direto para ✨ Argo CD Config Management Plugin (#152)" translate="no">​</a></h2>
<p>CLI <code>cv-argocd-cmp</code> resolve placeholders <code>{{cv:vault/path}}</code> em
manifests antes de aplicar no cluster. Sem secret estático no Argo CD,
GitOps puro.</p>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/argocd-plugin">Documentação →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-config-inheritance--branch-configs-162">✨ Config inheritance + branch configs (#162)<a href="https://docs.ciphervault.com.br/blog/v4-5-0-release#-config-inheritance--branch-configs-162" class="hash-link" aria-label="Link direto para ✨ Config inheritance + branch configs (#162)" title="Link direto para ✨ Config inheritance + branch configs (#162)" translate="no">​</a></h2>
<p>Vault herda secrets do parent via <code>parent_vault_id</code>. <code>listResolvedSecrets</code>
com <strong>leaf-wins override</strong>. Caso de uso clássico: <code>producao</code> herda de
<code>base-config</code>, mas pode sobrescrever entries específicas.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-paas-push-168">✨ PaaS push (#168)<a href="https://docs.ciphervault.com.br/blog/v4-5-0-release#-paas-push-168" class="hash-link" aria-label="Link direto para ✨ PaaS push (#168)" title="Link direto para ✨ PaaS push (#168)" translate="no">​</a></h2>
<p>Push de secrets do CV para Heroku / Vercel / Netlify via API nativa.
Workaround para apps deployadas em PaaS que não suportam OIDC pull.</p>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/paas-push">Documentação →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-secret-health-analytics-169">✨ Secret Health Analytics (#169)<a href="https://docs.ciphervault.com.br/blog/v4-5-0-release#-secret-health-analytics-169" class="hash-link" aria-label="Link direto para ✨ Secret Health Analytics (#169)" title="Link direto para ✨ Secret Health Analytics (#169)" translate="no">​</a></h2>
<p>Dashboard <code>/analytics/health</code> com:</p>
<ul>
<li class="">Distribuição de idade por secret</li>
<li class="">Risk score average por vault</li>
<li class="">Top 10 secrets nunca rotacionados</li>
<li class="">CSV export</li>
</ul>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/secret-health-analytics">Documentação →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-web-console-admin-154">✨ Web Console admin (#154)<a href="https://docs.ciphervault.com.br/blog/v4-5-0-release#-web-console-admin-154" class="hash-link" aria-label="Link direto para ✨ Web Console admin (#154)" title="Link direto para ✨ Web Console admin (#154)" translate="no">​</a></h2>
<p>Terminal admin em WebSocket <code>/console/ws</code> + REST <code>/console/exec</code>.
<strong>8 comandos whitelisted</strong>, sem shell spawn (mitigação RCE).</p>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/web-console">Documentação →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-auth-methods">✨ Auth methods<a href="https://docs.ciphervault.com.br/blog/v4-5-0-release#-auth-methods" class="hash-link" aria-label="Link direto para ✨ Auth methods" title="Link direto para ✨ Auth methods" translate="no">​</a></h2>
<ul>
<li class=""><strong>AppRole</strong> (#134) — Vault-style "secret zero" (<code>role_id</code> + <code>secret_id</code>)</li>
<li class=""><strong>HSM auto-unseal real</strong> (#147) — Vault-style. KEK encrypted-at-rest, auto-unseal via HSM provider no boot</li>
<li class=""><strong>SCIM 2.0</strong> (#161) — RFC 7644. Endpoints <code>/scim/v2/Users</code> + <code>/scim/v2/Groups</code> para Okta/Azure AD provisioning</li>
<li class=""><strong>External Secrets Operator compat layer</strong> (#167) — <code>/eso/secrets/by-id|by-name</code> + <code>/eso/vault/&lt;name&gt;</code> para ESO webhook provider</li>
</ul>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/scim">SCIM →</a> | <a class="" href="https://docs.ciphervault.com.br/docs/integrations/eso-compat">ESO compat →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-dynamic-secrets--7-engines-novas">✨ Dynamic Secrets — 7 engines novas<a href="https://docs.ciphervault.com.br/blog/v4-5-0-release#-dynamic-secrets--7-engines-novas" class="hash-link" aria-label="Link direto para ✨ Dynamic Secrets — 7 engines novas" title="Link direto para ✨ Dynamic Secrets — 7 engines novas" translate="no">​</a></h2>
<table><thead><tr><th>Engine</th><th>PR</th><th>Mecanismo</th></tr></thead><tbody><tr><td><strong>Active Directory</strong></td><td>#138</td><td><code>ldap_modify</code> user/password</td></tr><tr><td><strong>LDAP</strong></td><td>#139</td><td>OpenLDAP / 389DS / FreeIPA</td></tr><tr><td><strong>Consul</strong></td><td>#144</td><td><code>acl_token_create</code></td></tr><tr><td><strong>Nomad</strong></td><td>#144</td><td><code>acl_token_create</code></td></tr><tr><td><strong>RabbitMQ</strong></td><td>#145</td><td><code>PUT /api/users</code> + permissions</td></tr><tr><td><strong>AliCloud STS</strong></td><td>#149</td><td><code>AssumeRole</code> Aliyun</td></tr><tr><td><strong>MongoDB Atlas</strong></td><td>#150</td><td>Programmatic API key</td></tr><tr><td><strong>HCP Terraform</strong></td><td>#151</td><td>Workspace variables</td></tr></tbody></table>
<p>Total agora: <strong>17 engines</strong> (postgres, mysql, aws_sts, gcp_iam, azure_sp,
mongodb, mssql, cassandra, redis, rabbitmq, hcp_terraform, mongodb_atlas,
alicloud_sts, ldap, ad, consul, nomad).</p>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/dynamic-secrets">Dynamic Secrets →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-hsm-pkcs11-hardening-140">✨ HSM PKCS#11 hardening (#140)<a href="https://docs.ciphervault.com.br/blog/v4-5-0-release#-hsm-pkcs11-hardening-140" class="hash-link" aria-label="Link direto para ✨ HSM PKCS#11 hardening (#140)" title="Link direto para ✨ HSM PKCS#11 hardening (#140)" translate="no">​</a></h2>
<p><code>Pkcs11Provider</code> agora <strong>real</strong> via <code>pkcs11js</code>:</p>
<ul>
<li class=""><code>CKM_AES_KEY_WRAP</code> — wrapping de DEK no HSM</li>
<li class=""><code>sign</code> / <code>verify</code> operations no HSM (não só <code>encrypt/decrypt</code>)</li>
<li class="">Rotation de KEK in-place</li>
<li class="">CI matrix com <strong>SoftHSM v2</strong> sempre + CloudHSM/YubiHSM opt-in</li>
</ul>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/hsm-kms">HSM →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-doppler-migration-170">✨ Doppler migration (#170)<a href="https://docs.ciphervault.com.br/blog/v4-5-0-release#-doppler-migration-170" class="hash-link" aria-label="Link direto para ✨ Doppler migration (#170)" title="Link direto para ✨ Doppler migration (#170)" translate="no">​</a></h2>
<p>CLI <code>cv-migrate-doppler</code> importa projects / configs / secrets do
Doppler. Mapping <code>project + config → vault</code>.</p>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/doppler-migration">Migração →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-framework-integration-guides-166">✨ Framework integration guides (#166)<a href="https://docs.ciphervault.com.br/blog/v4-5-0-release#-framework-integration-guides-166" class="hash-link" aria-label="Link direto para ✨ Framework integration guides (#166)" title="Link direto para ✨ Framework integration guides (#166)" translate="no">​</a></h2>
<p>8 guides published no repo do produto:</p>
<ul>
<li class="">Vite, Next.js, Laravel, Django, FastAPI, Rails, Spring Boot, Express</li>
</ul>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/framework-integrations">Índice →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-breaking-changes">⚠️ Breaking changes<a href="https://docs.ciphervault.com.br/blog/v4-5-0-release#%EF%B8%8F-breaking-changes" class="hash-link" aria-label="Link direto para ⚠️ Breaking changes" title="Link direto para ⚠️ Breaking changes" translate="no">​</a></h2>
<ul>
<li class=""><strong><code>kube_guardian_policy_change</code> action</strong> adicionada — promote de policy <code>audit</code> → <code>block</code> agora exige aprovação. Operadores que automatizam promote precisam ajustar.</li>
<li class=""><strong>PKCS#11 <code>Pkcs11Provider</code> mudou de stub para real</strong> — quem usava em dev com mock implícito precisa configurar SoftHSM v2 ou similar.</li>
<li class=""><strong><code>charts/ciphervault-guardian/</code></strong> novo Helm chart; quem instalava webhook + ESO + sensor separadamente deve migrar pra single chart (Helm hooks fazem migration automática).</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="atualizando">Atualizando<a href="https://docs.ciphervault.com.br/blog/v4-5-0-release#atualizando" class="hash-link" aria-label="Link direto para Atualizando" title="Link direto para Atualizando" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Self-hosted Helm</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ciphervault ciphervault/ciphervault </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">4.5</span><span class="token plain">.0 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  --reuse-values</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Guardian (novo Helm chart, substitui webhook+ESO+sensor)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">helm </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> ciphervault-guardian ciphervault/guardian </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--namespace</span><span class="token plain"> ciphervault-system</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Migrar do Doppler (uma vez)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">cv-migrate-doppler --doppler-token </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$DOPPLER_TOKEN</span><span class="token plain"> --cv-url https://cv.acme.com.br</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="testes">Testes<a href="https://docs.ciphervault.com.br/blog/v4-5-0-release#testes" class="hash-link" aria-label="Link direto para Testes" title="Link direto para Testes" translate="no">​</a></h2>
<p><strong>+~250 testes novos. Total agora &gt; 1900 testes.</strong></p>
<p>— Rafael Martinez, CEO</p>]]></content:encoded>
            <category>Release</category>
            <category>Kubernetes</category>
            <category>CI/CD</category>
            <category>SDK</category>
            <category>LGPD</category>
        </item>
        <item>
            <title><![CDATA[CipherVault 4.0 → 4.4 — K8s Operator, Multi-region, Confidential Computing]]></title>
            <link>https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release</link>
            <guid>https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release</guid>
            <pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[24 horas após a v3.0, lançamos 5 releases consecutivas consolidando]]></description>
            <content:encoded><![CDATA[<p>24 horas após a v3.0, lançamos <strong>5 releases consecutivas</strong> consolidando
todo o milestone <code>v4.0</code> (5 issues arquiteturais que estavam em design
desde a v3). Hoje a plataforma cobre cenários antes deferidos: <strong>K8s
Operator real</strong>, <strong>Multi-region active-active</strong>, <strong>Confidential
Computing</strong> (TEE attestation), <strong>K8s Federation</strong> (pull-from-CV) e
<strong>CRDTs</strong> para metadata cross-region.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="v400--architectural-scaffolding">v4.0.0 — Architectural scaffolding<a href="https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release#v400--architectural-scaffolding" class="hash-link" aria-label="Link direto para v4.0.0 — Architectural scaffolding" title="Link direto para v4.0.0 — Architectural scaffolding" translate="no">​</a></h2>
<p>5 projetos iniciados como scaffolds para serem promovidos ao longo do dia:</p>
<ul>
<li class=""><strong>K8s Operator</strong> (#79) — Go module + 3 CRD types + controller skeletons</li>
<li class=""><strong>Multi-region routing</strong> (#77) — middleware + tabela <code>tenant_regions</code></li>
<li class=""><strong>Confidential computing</strong> (#83) — <code>lib/attestation.js</code> provider abstraction (mock|nitro|sgx|sev-snp)</li>
<li class=""><strong>K8s federation</strong> (#72) — <code>docs/design/K8S_FEDERATION.md</code> com decisão pull-from-CV</li>
<li class=""><strong>CRDTs</strong> (#78) — GCounter funcional + 4 stubs</li>
</ul>
<p>Todos promovidos para implementação real em v4.1/4.2/4.3 (vide abaixo).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="v410--k8s-operator-real--aws-nitro-enclaves">v4.1.0 — K8s Operator real + AWS Nitro Enclaves<a href="https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release#v410--k8s-operator-real--aws-nitro-enclaves" class="hash-link" aria-label="Link direto para v4.1.0 — K8s Operator real + AWS Nitro Enclaves" title="Link direto para v4.1.0 — K8s Operator real + AWS Nitro Enclaves" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="k8s-operator">K8s Operator<a href="https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release#k8s-operator" class="hash-link" aria-label="Link direto para K8s Operator" title="Link direto para K8s Operator" translate="no">​</a></h3>
<p>Substitui o scaffold por implementação funcional:</p>
<ul>
<li class="">Module Go com <strong>controller-runtime v0.20</strong></li>
<li class=""><strong>3 CRDs</strong>: <code>CipherVaultSecret</code>, <code>CipherVaultLease</code>, <code>CipherVaultDynamicRole</code></li>
<li class=""><strong>Reconcilers</strong>:<!-- -->
<ul>
<li class=""><strong>Secret</strong> — fetch + SHA256 hash drift detect + ownerRef + requeue</li>
<li class=""><strong>Lease</strong> — request + auto-renew threshold% + Revoke via finalizer on delete</li>
<li class=""><strong>DynamicRole</strong> — idempotent POST/PUT + 1h drift check</li>
</ul>
</li>
<li class="">Manager + leader election + healthz/readyz</li>
<li class="">Manifests: 3 CRDs YAML + ClusterRole + ServiceAccount + Deployment</li>
<li class="">Dockerfile multi-stage (<code>golang:1.26</code> + distroless static, nonroot)</li>
</ul>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/k8s-operator">Documentação completa →</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="aws-nitro-enclaves-attestation">AWS Nitro Enclaves attestation<a href="https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release#aws-nitro-enclaves-attestation" class="hash-link" aria-label="Link direto para AWS Nitro Enclaves attestation" title="Link direto para AWS Nitro Enclaves attestation" translate="no">​</a></h3>
<p><code>lib/attestationVerify.js</code> (320 linhas) com verifier completo:</p>
<ul>
<li class="">Decode COSE_Sign1 + payload CBOR via <code>cbor-x</code></li>
<li class="">Cert chain walk até <strong>AWS Nitro Root CA</strong> (PEM embedded validated SHA-384)</li>
<li class="">ECDSA-P384/SHA-384 signature verify (raw → DER conversion)</li>
<li class="">Freshness ±5min + nonce <code>timingSafeEqual</code> (anti-replay)</li>
<li class="">PCR allowlist via <code>loadExpectedPCRsFromEnv()</code> (<code>ATTESTATION_EXPECTED_PCR{0..N}</code>)</li>
</ul>
<p>Endpoint: <code>POST /attestation/verify</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="v420--crdts--multi-region-active-active">v4.2.0 — CRDTs + Multi-region active-active<a href="https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release#v420--crdts--multi-region-active-active" class="hash-link" aria-label="Link direto para v4.2.0 — CRDTs + Multi-region active-active" title="Link direto para v4.2.0 — CRDTs + Multi-region active-active" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="crdts-5-tipos-completos">CRDTs (5 tipos completos)<a href="https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release#crdts-5-tipos-completos" class="hash-link" aria-label="Link direto para CRDTs (5 tipos completos)" title="Link direto para CRDTs (5 tipos completos)" translate="no">​</a></h3>
<p><code>lib/crdt/index.js</code>:</p>
<table><thead><tr><th>Tipo</th><th>Semântica</th></tr></thead><tbody><tr><td><strong>GCounter</strong></td><td>Grow-only counter</td></tr><tr><td><strong>PNCounter</strong></td><td>Par GCounter pos/neg</td></tr><tr><td><strong>GSet</strong></td><td>Grow-only set</td></tr><tr><td><strong>LWWRegister</strong></td><td>Last-write-wins com timestamp + region tiebreak</td></tr><tr><td><strong>ORSet</strong></td><td>Observed-Remove com tags únicas (suporta concurrent add+remove)</td></tr></tbody></table>
<p><code>lib/crdt/store.js</code> — persistence em <code>crdt_states</code> (race-safe <code>SELECT FOR UPDATE</code> merge-on-write). <code>lib/crdt/syncer.js</code> — background syncer push 5s para peers via <code>CRDT_PEERS</code> env.</p>
<p><strong>Use case implementado:</strong> <code>audit_count</code> — cada <code>audit()</code> incrementa
GCounter por tenant; total cross-region em &lt; 10s.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="multi-region">Multi-region<a href="https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release#multi-region" class="hash-link" aria-label="Link direto para Multi-region" title="Link direto para Multi-region" translate="no">​</a></h3>
<p>Topologia <strong>active-active</strong> com Postgres logical replication (pub/sub):</p>
<ul>
<li class="">Tabela <code>tenant_regions</code> (tenant_id PK + primary_region + replica_regions[])</li>
<li class=""><code>lib/multiRegion.js</code> — middleware <code>requireRegionForwarding</code> aplicado após auth<!-- -->
<ul>
<li class=""><code>excludePaths</code>: <code>/auth</code>, <code>/admin/tenant-region</code>, <code>/attestation</code>, <code>/crdt/sync</code>, <code>/clusters</code>, <code>/health</code>, <code>/metrics</code></li>
<li class="">Loop detection via <code>X-CV-Region-Origin</code> header</li>
<li class="">Cache 60s TTL</li>
</ul>
</li>
<li class=""><code>infrastructure/multi-region/setup-replication.sql</code> — 24 tabelas replicadas; <strong>excluídas</strong>: <code>audit_logs</code> (CRDT cobre), <code>dynamic_leases</code> (region-local), <code>crdt_states</code> (sync próprio)</li>
<li class="">Métricas: <code>cv_cross_region_forwards_total</code>, <code>cv_replication_lag_seconds</code></li>
<li class="">Failover via <code>POST /admin/tenant-region/:id/promote</code> <strong>gated por dual-control</strong> (<code>tenant_region_promote</code> action)</li>
<li class="">Runbook completo em <code>docs/runbooks/REGIONAL_FAILOVER.md</code></li>
</ul>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/multi-region">Documentação →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="v430--k8s-federation-pull-from-cv">v4.3.0 — K8s Federation pull-from-CV<a href="https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release#v430--k8s-federation-pull-from-cv" class="hash-link" aria-label="Link direto para v4.3.0 — K8s Federation pull-from-CV" title="Link direto para v4.3.0 — K8s Federation pull-from-CV" translate="no">​</a></h2>
<p>Múltiplos clusters K8s consomem secrets de um plano de controle único.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="backend-phase-1">Backend (Phase 1)<a href="https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release#backend-phase-1" class="hash-link" aria-label="Link direto para Backend (Phase 1)" title="Link direto para Backend (Phase 1)" translate="no">​</a></h3>
<ul>
<li class="">3 tabelas: <code>clusters</code>, <code>cluster_secret_policies</code>, <code>cluster_apply_log</code></li>
<li class="">9 endpoints REST em <code>routes/clusters.js</code>:<!-- -->
<ul>
<li class=""><strong>Admin (JWT):</strong> POST/GET/DELETE <code>/clusters</code>, POST/GET/DELETE <code>/clusters/:id/policies</code></li>
<li class=""><strong>Operator (X-Cluster-Token):</strong> GET <code>/clusters/:id/desired-state</code>, POST <code>/clusters/:id/status</code></li>
<li class=""><strong>Audit:</strong> GET <code>/clusters/:id/audit</code></li>
</ul>
</li>
<li class="">Excluído de region-forwarding middleware (region-local)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="operator-phase-2">Operator (Phase 2)<a href="https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release#operator-phase-2" class="hash-link" aria-label="Link direto para Operator (Phase 2)" title="Link direto para Operator (Phase 2)" translate="no">​</a></h3>
<ul>
<li class=""><code>kubernetes/operator/controllers/federation_controller.go</code> — <code>FederationManager</code> polling loop</li>
<li class=""><strong>Leader election</strong> (1 instância pula CV por vez)</li>
<li class="">Materializa policies como <code>CipherVaultSecret</code> CRDs locais → reconcilers existentes consomem</li>
<li class="">Auto-cria namespace, label propagation, idempotent upsert</li>
<li class="">Status report heartbeat + applied/errors back to CV</li>
<li class=""><strong>Opt-in</strong> via env <code>CV_CLUSTER_ID</code> + <code>CV_CLUSTER_TOKEN</code></li>
</ul>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/k8s-federation">Documentação →</a></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="phase-34-deferred">Phase 3+4 deferred<a href="https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release#phase-34-deferred" class="hash-link" aria-label="Link direto para Phase 3+4 deferred" title="Link direto para Phase 3+4 deferred" translate="no">​</a></h3>
<p>Air-gap caching incremental + <code>kind</code> cluster e2e tests.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="v440--multi-tee-attestation-completo">v4.4.0 — Multi-TEE attestation completo<a href="https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release#v440--multi-tee-attestation-completo" class="hash-link" aria-label="Link direto para v4.4.0 — Multi-TEE attestation completo" title="Link direto para v4.4.0 — Multi-TEE attestation completo" translate="no">​</a></h2>
<p>Atestação para 3 TEEs principais:</p>
<table><thead><tr><th>TEE</th><th>Provider</th><th>Status</th></tr></thead><tbody><tr><td><strong>AWS Nitro Enclaves</strong></td><td><code>NitroProvider</code> (v4.1)</td><td>✅ Validação ECDSA completa contra Nitro Root CA</td></tr><tr><td><strong>Intel SGX DCAP</strong></td><td><code>SgxDcapProvider</code></td><td>⚠️ Parsing + measurements + nonce; assinatura ECDSA contra Intel root requer <code>libsgx_dcap_quoteverify</code> (Phase 2)</td></tr><tr><td><strong>AMD SEV-SNP</strong></td><td><code>SevSnpProvider</code></td><td>⚠️ Parsing 1184 bytes + measurement + nonce; assinatura contra AMD root requer <code>libsnphost</code> (Phase 2)</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="multi-format-dispatcher">Multi-format dispatcher<a href="https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release#multi-format-dispatcher" class="hash-link" aria-label="Link direto para Multi-format dispatcher" title="Link direto para Multi-format dispatcher" translate="no">​</a></h3>
<p><code>lib/attestationVerifyMulti.js</code> — dispatcher por format. <code>POST /attestation/verify</code> aceita:</p>
<ul>
<li class=""><code>aws-nitro-cose-sign1</code> (default, back-compat)</li>
<li class=""><code>sgx-dcap-quote-v3</code></li>
<li class=""><code>amd-sev-snp-report</code></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mocks-pra-dev-sem-hardware">Mocks pra dev sem hardware<a href="https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release#mocks-pra-dev-sem-hardware" class="hash-link" aria-label="Link direto para Mocks pra dev sem hardware" title="Link direto para Mocks pra dev sem hardware" translate="no">​</a></h3>
<ul>
<li class=""><code>SGX_MOCK_QUOTE_FILE</code> — usa quote pré-gerado</li>
<li class=""><code>SEV_SNP_MOCK_REPORT_FILE</code> — idem para SEV</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="limitação-documentada">Limitação documentada<a href="https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release#limita%C3%A7%C3%A3o-documentada" class="hash-link" aria-label="Link direto para Limitação documentada" title="Link direto para Limitação documentada" translate="no">​</a></h3>
<p><code>signature_validated: false</code> em SGX/SEV — verifiers parseiam structure</p>
<ul>
<li class="">measurements + nonce mas <strong>não validam ECDSA contra Intel/AMD root CA</strong>
ainda. Phase 2 follow-up requer C bindings nativas.</li>
</ul>
<p>AWS Nitro mantém validação completa.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="infrastructure">Infrastructure<a href="https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release#infrastructure" class="hash-link" aria-label="Link direto para Infrastructure" title="Link direto para Infrastructure" translate="no">​</a></h3>
<ul>
<li class=""><code>.github/workflows/docker-publish.yml</code> — <strong>6 imagens</strong> publicadas em <code>ghcr.io/martinez1991/ciphervault-*</code></li>
<li class="">Tags: <code>:vX.Y.Z</code>, <code>:X.Y</code>, <code>:X</code>, <code>:latest</code>, <code>:main</code>, <code>:sha-&lt;short&gt;</code></li>
<li class=""><strong>Multi-arch</strong> <code>linux/amd64</code> + <code>linux/arm64</code> (QEMU + buildx)</li>
<li class=""><strong>SBOM + provenance + Sigstore cosign keyless signing</strong></li>
<li class=""><code>infrastructure/docker-compose/docker-compose.prod.yml</code> — overlay sem <code>build:</code></li>
<li class=""><code>kubernetes/operator/config/manager/deployment.yaml</code> — <code>ciphervault-k8s-operator:v4.4.0</code></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="security-fixes">Security fixes<a href="https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release#security-fixes" class="hash-link" aria-label="Link direto para Security fixes" title="Link direto para Security fixes" translate="no">​</a></h3>
<p><strong>28 Dependabot alerts fixados</strong> sem breaking changes:</p>
<p><code>path-to-regexp</code>, <code>flatted</code>, <code>picomatch</code>, <code>rollup</code>, <code>brace-expansion</code>,
<code>dompurify</code>, <code>esbuild</code>, <code>vite</code>, <code>@tootallnate/once</code>, <code>golang.org/x/oauth2</code>
(CVE-2025-22868), <code>golang.org/x/net</code>, <code>golang.org/x/crypto</code>.</p>
<p>CI Go bumped 1.25 → <strong>1.26</strong> — cobre 4 stdlib advisories
(GO-2026-4866/4870/4946/4947).</p>
<p><a class="" href="https://docs.ciphervault.com.br/docs/integrations/confidential-computing">Confidential Computing →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-breaking-changes">⚠️ Breaking changes<a href="https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release#%EF%B8%8F-breaking-changes" class="hash-link" aria-label="Link direto para ⚠️ Breaking changes" title="Link direto para ⚠️ Breaking changes" translate="no">​</a></h2>
<ul>
<li class=""><strong>Multi-region middleware</strong> ativo após auth — endpoints com <code>tenant_id</code> mismatch agora retornam <strong>307</strong> com <code>Location</code> apontando para a região primária. Apps antigos podem ficar em loop se ignorarem redirect (ver <code>excludePaths</code> no docs).</li>
<li class=""><strong>K8s Operator</strong> substitui o scaffold v4.0 — quem clonou o scaffold precisa re-<code>git pull</code>.</li>
<li class=""><strong>Postgres logical replication</strong> exige <code>wal_level=logical</code> no primary (configurável via <code>infrastructure/multi-region/setup-replication.sql</code>).</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="atualizando">Atualizando<a href="https://docs.ciphervault.com.br/blog/v4-0-to-4-4-release#atualizando" class="hash-link" aria-label="Link direto para Atualizando" title="Link direto para Atualizando" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Self-hosted Helm</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ciphervault ciphervault/ciphervault </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">4.4</span><span class="token plain">.0 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  --reuse-values</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># K8s Operator (novo)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">kubectl apply </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-f</span><span class="token plain"> https://raw.githubusercontent.com/Martinez1991/ciphervault/main/kubernetes/operator/config/crds/</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Docker images (multi-arch)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> pull ghcr.io/martinez1991/ciphervault-backend:v4.4.0</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">docker</span><span class="token plain"> pull ghcr.io/martinez1991/ciphervault-k8s-operator:v4.4.0</span><br></div></code></pre></div></div>
<p>Verificar SBOM:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">cosign verify-blob </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--bundle</span><span class="token plain"> ciphervault-backend-v4.4.0.cdx.json.bundle </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  ciphervault-backend-v4.4.0.cdx.json</span><br></div></code></pre></div></div>
<p>— Rafael Martinez, CEO</p>]]></content:encoded>
            <category>Release</category>
            <category>Breaking change</category>
            <category>Kubernetes</category>
        </item>
        <item>
            <title><![CDATA[CipherVault 3.0 — observabilidade, governança e expansão de protocolos]]></title>
            <link>https://docs.ciphervault.com.br/blog/v3-0-0-release</link>
            <guid>https://docs.ciphervault.com.br/blog/v3-0-0-release</guid>
            <pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A v3.0 chega 24 horas depois da v2.0, mas com foco completamente]]></description>
            <content:encoded><![CDATA[<p>A <strong>v3.0</strong> 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:
<strong>observabilidade end-to-end</strong>, <strong>governança refinada</strong> (N-de-M
approvals, rate limits, SBOM signing), e <strong>expansão de protocolos</strong>
(Secretless Proxy agora MySQL, Redis e MongoDB; Tokenization NIST FF1
oficial; Workload Identity com OIDC genérico e SPIFFE).</p>
<p>15 issues fechadas no milestone v3.0.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-highlights">✨ Highlights<a href="https://docs.ciphervault.com.br/blog/v3-0-0-release#-highlights" class="hash-link" aria-label="Link direto para ✨ Highlights" title="Link direto para ✨ Highlights" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="tokenization-nist-ff1-oficial">Tokenization NIST FF1 oficial<a href="https://docs.ciphervault.com.br/blog/v3-0-0-release#tokenization-nist-ff1-oficial" class="hash-link" aria-label="Link direto para Tokenization NIST FF1 oficial" title="Link direto para Tokenization NIST FF1 oficial" translate="no">​</a></h3>
<p>Substituímos a implementação custom de FPE da v1.9 pela construção
<strong>NIST SP 800-38G FF1</strong> (Format-Preserving Encryption baseado em Feistel</p>
<ul>
<li class="">AES-CBC-MAC).</li>
</ul>
<p><strong>Por que isso importa:</strong></p>
<ul>
<li class=""><strong>PCI-friendly</strong> — auditores reconhecem FF1; implementação custom precisava de defesa caso a caso</li>
<li class=""><strong>Token É o ciphertext</strong> — não há lookup em DB nem <code>tokenization_records.ciphertext</code> separado. Detokenize é apenas decrypt</li>
<li class=""><strong>4 formatos com radix:</strong> <code>ff1-decimal</code> (radix 10, PAN/CPF), <code>ff1-hex</code> (radix 16), <code>ff1-alpha</code> (radix 26, A-Z), <code>ff1-alnum</code> (radix 62, A-Za-z0-9)</li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-X</span><span class="token plain"> POST https://cv.acme.com.br/tokenization/vaults </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'{ "name": "pan-prd", "format": "ff1-decimal" }'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-X</span><span class="token plain"> POST https://cv.acme.com.br/tokenization/vaults/pan-prd/tokenize </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">'{ "values": ["4111111111111111"] }'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># tokens preservam dígitos: "9823745638291052"</span><br></div></code></pre></div></div>
<p>Migração: vaults antigos (<code>preserving</code>, <code>uuid</code>, <code>alphanumeric</code>) continuam
funcionando — novos vaults preferem FF1.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="secretless-proxy-multi-protocolo">Secretless Proxy multi-protocolo<a href="https://docs.ciphervault.com.br/blog/v3-0-0-release#secretless-proxy-multi-protocolo" class="hash-link" aria-label="Link direto para Secretless Proxy multi-protocolo" title="Link direto para Secretless Proxy multi-protocolo" translate="no">​</a></h3>
<p>Onde a v1.9 era só Postgres CleartextPassword (MVP), a v3 traz:</p>
<table><thead><tr><th>Protocolo</th><th>Como</th></tr></thead><tbody><tr><td><strong>Postgres</strong></td><td>StartupMessage intercept (já existia)</td></tr><tr><td><strong>MySQL</strong></td><td>Handshake v10 upstream-first, <code>nativePasswordAuth</code> (SHA1-XOR), rewrite HandshakeResponse41</td></tr><tr><td><strong>Redis</strong></td><td>AUTH no upstream com cred do lease, intercepta AUTH do client (responde <code>+OK</code> fake)</td></tr><tr><td><strong>MongoDB</strong></td><td>SCRAM-SHA-256 client (PBKDF2 + HMAC RFC 7677), wire framing OP_MSG/OP_QUERY, intercepta saslStart/Continue</td></tr></tbody></table>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">secretless-proxy </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--listen</span><span class="token plain"> :3306 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--upstream</span><span class="token plain"> mysql.internal.acme.com.br:3306 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--protocol</span><span class="token plain"> mysql </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  --upstream-tls --upstream-ca-file /etc/ssl/cv-internal.pem </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  --lease-pool-size </span><span class="token number">5</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  --cv-url https://cv.acme.com.br --conn-id app_</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">. --role-id </span><span class="token number">42</span><br></div></code></pre></div></div>
<p>E mais:</p>
<ul>
<li class=""><strong>TLS upstream</strong> — <code>--upstream-tls</code>, <code>--upstream-ca-file</code>, <code>--upstream-tls-skip-verify</code></li>
<li class=""><strong>Lease pool client</strong> — <code>--lease-pool-size N</code> pré-cria leases idle, drena no shutdown (reduz RTT inicial de 100ms para ~5ms)</li>
<li class=""><strong>Lease pool server</strong> — <code>role.lease_reuse_max_uses</code> + <code>dynamic_leases.use_count</code>, mesma <code>(role,app)</code> reaproveita lease com <code>SKIP LOCKED</code></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="workload-identity-expandida">Workload Identity expandida<a href="https://docs.ciphervault.com.br/blog/v3-0-0-release#workload-identity-expandida" class="hash-link" aria-label="Link direto para Workload Identity expandida" title="Link direto para Workload Identity expandida" translate="no">​</a></h3>
<p>Além dos 4 métodos da v1.8 (<code>k8s_sa</code>, <code>aws_iam</code>, <code>gcp_iam</code>, <code>azure_msi</code>):</p>
<ul>
<li class=""><strong><code>oidc_generic</code></strong> — <code>verifyOidcToken</code> com discovery <code>.well-known/openid-configuration</code> + JWKS cache 24h. Cobre HashiCorp Vault JWT auth, Okta, Auth0, qualquer OIDC compliant</li>
<li class=""><strong><code>spiffe</code></strong> — <code>verifySpiffeJwtSvid</code> com <code>trust_domain</code> bundle. Para clusters SPIRE / Istio com SPIFFE IDs</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hsmkms-provider-abstraction">HSM/KMS provider abstraction<a href="https://docs.ciphervault.com.br/blog/v3-0-0-release#hsmkms-provider-abstraction" class="hash-link" aria-label="Link direto para HSM/KMS provider abstraction" title="Link direto para HSM/KMS provider abstraction" translate="no">​</a></h3>
<p>Antes a chave master vivia local (cifrada por env var). Agora há
abstração com 3 providers:</p>
<table><thead><tr><th>Provider</th><th>Backend</th></tr></thead><tbody><tr><td><code>local</code></td><td>KEK derivada de <code>MASTER_KEY</code> env var (mesmo comportamento da v2)</td></tr><tr><td><code>aws-kms</code></td><td>AWS KMS Encrypt/Decrypt API (lazy load do AWS SDK)</td></tr><tr><td><code>pkcs11</code></td><td>HSMs PKCS#11 (Thales Luna, AWS CloudHSM, etc.)</td></tr></tbody></table>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Configuração</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">CV_HSM_PROVIDER</span><span class="token operator">=</span><span class="token plain">aws-kms</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">CV_HSM_AWS_KMS_KEY_ID</span><span class="token operator">=</span><span class="token plain">arn:aws:kms:sa-east-1:123:key/abc</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Health check</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">curl</span><span class="token plain"> https://cv.acme.com.br/health/hsm</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># { "provider": "aws-kms", "healthy": true, "key_arn": "..." }</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dynamic-secrets--4-engines-novas">Dynamic Secrets — 4 engines novas<a href="https://docs.ciphervault.com.br/blog/v3-0-0-release#dynamic-secrets--4-engines-novas" class="hash-link" aria-label="Link direto para Dynamic Secrets — 4 engines novas" title="Link direto para Dynamic Secrets — 4 engines novas" translate="no">​</a></h3>
<table><thead><tr><th>Engine</th><th>Mecanismo</th></tr></thead><tbody><tr><td><code>cassandra</code></td><td><code>CREATE ROLE WITH LOGIN AND PASSWORD</code></td></tr><tr><td><code>mssql</code></td><td><code>CREATE LOGIN</code> + <code>CREATE USER FOR LOGIN</code></td></tr><tr><td><code>redis</code> (ACL-based)</td><td><code>ACL SETUSER ... ON &gt;password</code> (Redis 6+)</td></tr><tr><td><code>gcp_iam</code> (modo <code>sa_key</code>)</td><td>Cria SA key com TTL (em vez de access token de 1h)</td></tr></tbody></table>
<p><code>gcp_iam</code> agora aceita <code>template.mode = "access_token" | "sa_key"</code> —
SA key permite TTL &gt; 1h (cap 24h pelo CV) ao custo de não ser
self-revoking.</p>
<p><strong>mTLS nas engines</strong> — <code>postgres</code> e <code>mysql</code> engines aceitam
<code>config.ssl_ca</code>, <code>ssl_cert</code>, <code>ssl_key</code> para conexão admin via mTLS.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pki--ocsp-responder--ssh-ca-chain">PKI — OCSP responder + SSH CA chain<a href="https://docs.ciphervault.com.br/blog/v3-0-0-release#pki--ocsp-responder--ssh-ca-chain" class="hash-link" aria-label="Link direto para PKI — OCSP responder + SSH CA chain" title="Link direto para PKI — OCSP responder + SSH CA chain" translate="no">​</a></h3>
<p><strong>OCSP RFC 6960</strong> — clientes que precisam validar revogação online
(navegadores, mTLS rigoroso) agora têm endpoint próprio:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">POST /pki/cas/:id/ocsp     # body: OCSPRequest DER</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">GET  /pki/cas/:id/ocsp/:b64 # alternativa via GET</span><br></div></code></pre></div></div>
<p>A response é <code>BasicOCSPResponse</code> assinada com a chave da CA.</p>
<p><strong>SSH CA chain</strong> — múltiplas CAs por tenant + <code>parent_ca_id</code>. Permite
modelar hierarquia (root CA → intermediate por unidade de negócio).</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">GET /ssh/cas                                      # lista CAs do tenant</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">GET /ssh/cas/:id/chain?format=authorized_keys     # chain pra distribuir</span><br></div></code></pre></div></div>
<p>Roles agora têm <code>ca_id</code> — escolha qual CA assina certs daquela role.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="k8s-sidecar--reload-sem-restart">K8s sidecar — reload sem restart<a href="https://docs.ciphervault.com.br/blog/v3-0-0-release#k8s-sidecar--reload-sem-restart" class="hash-link" aria-label="Link direto para K8s sidecar — reload sem restart" title="Link direto para K8s sidecar — reload sem restart" translate="no">​</a></h3>
<p>Quando o sidecar detecta rotação de secret (hash-based, hash do file
content):</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token key atrule">env</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Sinal Unix (default SIGHUP)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> CV_RELOAD_SIGNAL</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">value</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> SIGHUP</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># OU comando arbitrário</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> CV_RELOAD_CMD</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">value</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"/usr/local/bin/reload-app"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token comment" style="color:rgb(98, 114, 164)"># Debounce (default 5s) — agrega múltiplas rotações</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> CV_RELOAD_DEBOUNCE_MS</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">value</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"5000"</span><br></div></code></pre></div></div>
<p>Apps que suportam reload via sinal (nginx, haproxy, envoy) ou comando
custom recebem trigger automático sem rolling-restart.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="observabilidade--prometheus-em-todos-os-componentes">Observabilidade — Prometheus em todos os componentes<a href="https://docs.ciphervault.com.br/blog/v3-0-0-release#observabilidade--prometheus-em-todos-os-componentes" class="hash-link" aria-label="Link direto para Observabilidade — Prometheus em todos os componentes" title="Link direto para Observabilidade — Prometheus em todos os componentes" translate="no">​</a></h3>
<p>Métricas Prometheus expostas (gated por env <code>CV_METRICS_ENABLED=true</code>):</p>
<table><thead><tr><th>Componente</th><th>Métricas novas</th></tr></thead><tbody><tr><td><strong>sensor</strong></td><td><code>cv_sensor_heartbeat</code>, <code>cv_sensor_collections_total</code>, <code>cv_sensor_credentials_collected</code>, <code>cv_sensor_errors_total</code>, <code>cv_sensor_collection_duration_seconds</code></td></tr><tr><td><strong>scanner</strong></td><td><code>cv_scanner_scans_total</code>, <code>cv_scanner_findings_total</code>, <code>cv_scanner_scan_duration_seconds</code>, <code>cv_scanner_tools_health</code></td></tr><tr><td><strong>k8s sidecar</strong></td><td><code>cv_sidecar_admissions_total</code>, <code>cv_sidecar_secret_refresh_total</code>, <code>cv_sidecar_secret_age_seconds</code>, <code>cv_sidecar_reload_triggered_total</code>, <code>cv_sidecar_errors_total</code></td></tr><tr><td><strong>secretless-proxy</strong></td><td>(já existia) — agora com labels por protocolo</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="approvals--refinements-operacionais">Approvals — refinements operacionais<a href="https://docs.ciphervault.com.br/blog/v3-0-0-release#approvals--refinements-operacionais" class="hash-link" aria-label="Link direto para Approvals — refinements operacionais" title="Link direto para Approvals — refinements operacionais" translate="no">​</a></h3>
<ul>
<li class=""><strong><code>auto_fix_orphans</code></strong> no reconcile diário (<code>dynamic_backends.auto_fix_orphans</code>, default <code>false</code>) — drop users <code>cv_*</code> órfãos com idade &gt; 24h automaticamente</li>
<li class=""><strong>Rate limit</strong> — <code>APPROVAL_PENDING_LIMIT_PER_HOUR</code> (default 10), retorna 429 <code>APPROVAL_RATE_LIMITED</code> quando excedido</li>
<li class=""><strong>N-de-M approval</strong> — antes 2-de-2 era fixo; agora <code>actions: { master_key_rotate: { required_approvals: 3 } }</code> é configurável. Tabela nova <code>approval_signoffs</code> com <code>UNIQUE(approval_id, approver_id)</code> previne duplo-sign do mesmo aprovador</li>
<li class=""><strong><code>master_key_rotate</code> endpoint implementado</strong> (era no enum mas sem rota) — re-encripta <code>fortress_shards.wrapped_key</code> OLD→NEW, gated por dual-control</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sbom-cosign-signing">SBOM cosign signing<a href="https://docs.ciphervault.com.br/blog/v3-0-0-release#sbom-cosign-signing" class="hash-link" aria-label="Link direto para SBOM cosign signing" title="Link direto para SBOM cosign signing" translate="no">​</a></h3>
<p>Cada release agora vem com SBOM (CycloneDX) <strong>assinado via Sigstore</strong>
keyless OIDC. Anexamos <code>.sig</code> + <code>.pem</code> no GitHub Release. Permite
verificação de proveniência sem chave PGP.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">cosign verify-blob </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--bundle</span><span class="token plain"> ciphervault-3.0.0.cdx.json.bundle </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  ciphervault-3.0.0.cdx.json</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-breaking-changes">⚠️ Breaking changes<a href="https://docs.ciphervault.com.br/blog/v3-0-0-release#%EF%B8%8F-breaking-changes" class="hash-link" aria-label="Link direto para ⚠️ Breaking changes" title="Link direto para ⚠️ Breaking changes" translate="no">​</a></h2>
<ul>
<li class=""><strong><code>ssh_ca</code> UNIQUE(tenant_id) → UNIQUE(tenant_id, name)</strong> — clientes que dependiam do limite "uma CA SSH por tenant" precisam ajustar (agora podem ter N).</li>
<li class=""><strong>Tokenization custom (v1.9)</strong> mantida apenas para vaults existentes; <strong>novos vaults usam FF1</strong> se você escolher os formatos <code>ff1-*</code>. <code>preserving</code>, <code>uuid</code>, <code>alphanumeric</code> continuam funcionando.</li>
</ul>
<p>Todas migrations idempotentes:</p>
<ul>
<li class=""><code>pki_cas.parent_ca_id</code></li>
<li class=""><code>dynamic_roles.lease_reuse_max_uses</code>, <code>dynamic_leases.use_count</code></li>
<li class=""><code>dynamic_backends.auto_fix_orphans</code></li>
<li class=""><code>approval_requests.required_approvals</code> + tabela <code>approval_signoffs</code></li>
<li class=""><code>ssh_ca</code> UNIQUE recompostado + <code>parent_ca_id</code></li>
<li class=""><code>ssh_signed_certs.ca_id</code>, <code>ssh_roles.ca_id</code></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-tests">🧪 Tests<a href="https://docs.ciphervault.com.br/blog/v3-0-0-release#-tests" class="hash-link" aria-label="Link direto para 🧪 Tests" title="Link direto para 🧪 Tests" translate="no">​</a></h2>
<p>25+ unit tests novos:</p>
<ul>
<li class=""><strong>secretless Go</strong>: RESP, AUTH detect, peek, lease pool</li>
<li class=""><strong>backend</strong>: <code>ff1.test.js</code>, <code>hsm.test.js</code></li>
<li class=""><strong>frontend</strong>: setup vitest + jsdom + smoke do <code>cn()</code> helper</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="roadmap-pós-v3">Roadmap pós-v3<a href="https://docs.ciphervault.com.br/blog/v3-0-0-release#roadmap-p%C3%B3s-v3" class="hash-link" aria-label="Link direto para Roadmap pós-v3" title="Link direto para Roadmap pós-v3" translate="no">​</a></h2>
<p>3 issues movidas para o novo milestone <strong><code>operational</code></strong>:</p>
<ul>
<li class=""><code>#73</code> — SOC 2 evidence collection automation</li>
<li class=""><code>#74</code> — ISO 27001 Annex A controls evidence</li>
<li class=""><code>#75</code> — Pen test bounty público (HackerOne)</li>
</ul>
<p>5 issues movidas para <strong><code>v4.0</code></strong>:</p>
<ul>
<li class=""><code>#72</code> — K8s federation</li>
<li class=""><code>#77</code> — multi-region active-active</li>
<li class=""><code>#78</code> — CRDTs para eventual consistency</li>
<li class=""><code>#79</code> — K8s Operator com CRDs (não apenas Mutating Webhook)</li>
<li class=""><code>#83</code> — Confidential computing (Intel SGX / AWS Nitro)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="atualizando">Atualizando<a href="https://docs.ciphervault.com.br/blog/v3-0-0-release#atualizando" class="hash-link" aria-label="Link direto para Atualizando" title="Link direto para Atualizando" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ciphervault ciphervault/ciphervault </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">3.0</span><span class="token plain">.0 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  --reuse-values</span><br></div></code></pre></div></div>
<p>Migration roda automática. Sem ações manuais necessárias.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># CLI</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">brew upgrade ciphervault-cli</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># SDKs (todos bumped pra 3.0)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">pip </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-U</span><span class="token plain"> ciphervault</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> @ciphervault/sdk@latest</span><br></div></code></pre></div></div>
<p>— Rafael Martinez, CEO</p>]]></content:encoded>
            <category>Release</category>
            <category>Breaking change</category>
            <category>Kubernetes</category>
            <category>LGPD</category>
        </item>
        <item>
            <title><![CDATA[CipherVault 2.0 — de secrets manager para plataforma completa de secrets, identidade e criptografia]]></title>
            <link>https://docs.ciphervault.com.br/blog/v2-0-0-release</link>
            <guid>https://docs.ciphervault.com.br/blog/v2-0-0-release</guid>
            <pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Hoje lançamos CipherVault 2.0 — major release consolidando 15 minor]]></description>
            <content:encoded><![CDATA[<p>Hoje lançamos <strong>CipherVault 2.0</strong> — major release consolidando 15 minor
versions desde a v1.0. Este é o momento em que o CipherVault deixa de ser
<strong>apenas</strong> um cofre de secrets e vira uma <strong>plataforma completa de secrets,
identidade e criptografia self-hosted</strong> — competindo de igual para igual
com HashiCorp Vault e CyberArk Conjur, e mantendo o foco em LGPD e mercado
brasileiro.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-highlights-agregados-v160--v191">✨ Highlights agregados (v1.6.0 → v1.9.1)<a href="https://docs.ciphervault.com.br/blog/v2-0-0-release#-highlights-agregados-v160--v191" class="hash-link" aria-label="Link direto para ✨ Highlights agregados (v1.6.0 → v1.9.1)" title="Link direto para ✨ Highlights agregados (v1.6.0 → v1.9.1)" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="8-novos-subsystems">8 novos subsystems<a href="https://docs.ciphervault.com.br/blog/v2-0-0-release#8-novos-subsystems" class="hash-link" aria-label="Link direto para 8 novos subsystems" title="Link direto para 8 novos subsystems" translate="no">​</a></h3>
<ul>
<li class=""><strong>Dual-control / Break-glass / Quorum</strong> (v1.6.0) — aprovação 2-de-2 em operações destrutivas e break-glass</li>
<li class=""><strong>Dynamic Secrets</strong> (v1.7.0–1.7.2) — JIT credentials TTL ≤24h em 6 engines: Postgres, MySQL, MongoDB, AWS STS, GCP IAM, Azure SP</li>
<li class=""><strong>SSH Certificate Authority</strong> (v1.7.3) — CA Ed25519 com certs efêmeros TTL ≤24h. Substitui <code>authorized_keys</code> distribuído + jumphost</li>
<li class=""><strong>Encryption-as-a-Service</strong> (v1.7.4) — API REST <code>/eaas/keys/:name/encrypt|decrypt</code>, AES-256-GCM, key versioning</li>
<li class=""><strong>Kubernetes Mutating Admission Webhook</strong> (v1.7.5) — pods anotados recebem injeção automática (init container OU sidecar) sem rolling-restart</li>
<li class=""><strong>PKI as a Service</strong> (v1.8.0) — CAs internas role-based, RSA-2048, CRL centralizada, mTLS interno entre microserviços</li>
<li class=""><strong>Workload Identity expandida</strong> (v1.8.0) — 4 métodos: K8s SA, AWS IAM, GCP IAM, Azure MSI</li>
<li class=""><strong>Tokenization / FPE</strong> (v1.9.0) — 3 formatos determinísticos (preserving, uuid, alphanumeric)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="tooling-completo">Tooling completo<a href="https://docs.ciphervault.com.br/blog/v2-0-0-release#tooling-completo" class="hash-link" aria-label="Link direto para Tooling completo" title="Link direto para Tooling completo" translate="no">​</a></h3>
<ul>
<li class=""><strong>CLI Go <code>cv</code></strong> (v1.8.1) — single binary, 8 grupos de comandos, output <code>json|table|raw</code>, pipe-friendly</li>
<li class=""><strong>Terraform Provider oficial</strong> (v1.8.3) — 8 resources + 3 data sources usando <code>terraform-plugin-framework</code> v1.6+</li>
<li class=""><strong>AdminClient em 5 SDKs</strong> (v1.8.2 + v1.9.1) — Python, Go, Node/TS, Java, C# com bindings JWT bearer pra automação. Consumer SDKs (mTLS+DPoP) inalterados</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mais">Mais<a href="https://docs.ciphervault.com.br/blog/v2-0-0-release#mais" class="hash-link" aria-label="Link direto para Mais" title="Link direto para Mais" translate="no">​</a></h3>
<ul>
<li class=""><strong>Secretless Proxy</strong> (v1.9.0) — Go binary starter, app conecta em <code>localhost:5432</code> com user/pass arbitrários e proxy injeta cred efêmera transparentemente. <strong>MVP</strong> — apenas Postgres CleartextPassword</li>
<li class=""><strong>Documentação operacional</strong> — <code>HA_MULTI_REGION.md</code> com 3 topologias + DR procedures; <code>COMPLIANCE.md</code> mapeando SOC 2 + ISO 27001:2022 Annex A → features</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-breaking-changes">⚠️ Breaking changes<a href="https://docs.ciphervault.com.br/blog/v2-0-0-release#%EF%B8%8F-breaking-changes" class="hash-link" aria-label="Link direto para ⚠️ Breaking changes" title="Link direto para ⚠️ Breaking changes" translate="no">​</a></h2>
<ul>
<li class=""><strong>JWT carrega <code>tenant_id</code> claim</strong> — tokens emitidos antes do v1.6.0 não disparam dual-control. <strong>Re-login obrigatório</strong> na atualização</li>
<li class=""><strong>Migration cria 13 tabelas adicionais</strong>: <code>approval_requests</code>, <code>dynamic_*</code>, <code>ssh_*</code>, <code>eaas_*</code>, <code>pki_*</code>, <code>workload_identity_methods</code>, <code>tokenization_*</code>, <code>dynamic_secret_tasks</code></li>
<li class=""><strong>Backend Docker image</strong> agora requer <code>openssh-keygen</code> (já incluído no Dockerfile oficial)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-o-que-vem-a-seguir">📦 O que vem a seguir<a href="https://docs.ciphervault.com.br/blog/v2-0-0-release#-o-que-vem-a-seguir" class="hash-link" aria-label="Link direto para 📦 O que vem a seguir" title="Link direto para 📦 O que vem a seguir" translate="no">​</a></h2>
<p>A 2.x será uma plataforma estável. Próximos meses focados em:</p>
<ul>
<li class=""><strong>Polimento UX</strong> — flows simplificados em Approvals, EaaS, PKI</li>
<li class=""><strong>Mais engines de Dynamic Secrets</strong> — Oracle, SQL Server, Redis, Elasticsearch</li>
<li class=""><strong>Secretless Proxy expandido</strong> — MySQL, suporte TLS upstream, pool de leases</li>
<li class=""><strong>Documentação para operadores</strong> — runbooks, playbooks de incidente, capacity planning</li>
<li class=""><strong>Compliance</strong> — relatórios automatizados pra LGPD, ISO 27001 e SOC 2 com evidências geradas a partir do <code>audit_logs</code></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="atualizando">Atualizando<a href="https://docs.ciphervault.com.br/blog/v2-0-0-release#atualizando" class="hash-link" aria-label="Link direto para Atualizando" title="Link direto para Atualizando" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="self-hosted-helm">Self-hosted (Helm)<a href="https://docs.ciphervault.com.br/blog/v2-0-0-release#self-hosted-helm" class="hash-link" aria-label="Link direto para Self-hosted (Helm)" title="Link direto para Self-hosted (Helm)" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">helm upgrade ciphervault ciphervault/ciphervault </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">--version</span><span class="token plain"> </span><span class="token number">2.0</span><span class="token plain">.0 </span><span class="token punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  --reuse-values</span><br></div></code></pre></div></div>
<p>A migration de 13 tabelas é idempotente. Re-login obrigatório para todos
os usuários (tokens pré-1.6.0 não têm <code>tenant_id</code>).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cli">CLI<a href="https://docs.ciphervault.com.br/blog/v2-0-0-release#cli" class="hash-link" aria-label="Link direto para CLI" title="Link direto para CLI" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Linux/macOS</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">brew upgrade ciphervault-cli   </span><span class="token comment" style="color:rgb(98, 114, 164)"># ou baixar do GitHub Releases</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Windows</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">scoop update ciphervault-cli</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sdks">SDKs<a href="https://docs.ciphervault.com.br/blog/v2-0-0-release#sdks" class="hash-link" aria-label="Link direto para SDKs" title="Link direto para SDKs" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">pip </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-U</span><span class="token plain"> ciphervault              </span><span class="token comment" style="color:rgb(98, 114, 164)"># Python 2.0.0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">npm</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">install</span><span class="token plain"> @ciphervault/sdk@latest     </span><span class="token comment" style="color:rgb(98, 114, 164)"># Node/TS 2.0.0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Java/Go/C#: ver releases nos respectivos package managers</span><br></div></code></pre></div></div>
<hr>
<p>Obrigado a cada cliente, parceiro e contribuidor que tornou esta release
possível. Continuamos firmes na missão de fazer do CipherVault o cofre
brasileiro de referência para empresas sérias com segurança.</p>
<p>— Rafael Martinez, CEO</p>]]></content:encoded>
            <category>Release</category>
            <category>Breaking change</category>
            <category>LGPD</category>
        </item>
        <item>
            <title><![CDATA[CipherVault 1.6 → 1.9.1 — 8 subsystems novos em 3 dias]]></title>
            <link>https://docs.ciphervault.com.br/blog/v1-6-to-1-9-1-summary</link>
            <guid>https://docs.ciphervault.com.br/blog/v1-6-to-1-9-1-summary</guid>
            <pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Em 72 horas a plataforma ganhou 8 subsystems novos, CLI Go e]]></description>
            <content:encoded><![CDATA[<p>Em 72 horas a plataforma ganhou <strong>8 subsystems novos</strong>, <strong>CLI Go</strong> e
<strong>Terraform Provider oficial</strong>. Resumo dos 11 sub-releases (v1.6.0 a v1.9.1)
que pavimentaram o caminho para o major v2.0.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="v160--approvals-dual-control--break-glass--quorum">v1.6.0 — Approvals (Dual-control / Break-glass / Quorum)<a href="https://docs.ciphervault.com.br/blog/v1-6-to-1-9-1-summary#v160--approvals-dual-control--break-glass--quorum" class="hash-link" aria-label="Link direto para v1.6.0 — Approvals (Dual-control / Break-glass / Quorum)" title="Link direto para v1.6.0 — Approvals (Dual-control / Break-glass / Quorum)" translate="no">​</a></h2>
<p>Framework completo de aprovação para operações destrutivas, configs críticas
e break-glass. Estado: GA.</p>
<ul>
<li class="">Tabela <code>approval_requests</code> com status lifecycle, expiração, payload JSONB</li>
<li class=""><code>lib/approvalControl.js</code>: middleware factory <code>requireDualApproval(actionType, extractFn)</code>. Anti self-approval, anti cross-tenant, expiração, one-shot consumed</li>
<li class=""><code>lib/approvalExecutors.js</code>: re-execução pós-aprovação para 7 actions (<code>fortress_delete</code>, <code>vault_delete</code>, <code>mfa_disable</code>, <code>siem_change</code>, <code>rbac_change</code>, <code>fortress_view</code> break-glass, <code>export_zip</code> break-glass)</li>
<li class="">Routes wired: <code>DELETE</code> fortress secret, <code>DELETE</code> vault, <code>POST</code> fortress view, <code>POST</code> export-zip</li>
<li class="">Scheduler de expiração: 30min com leader-lock</li>
<li class="">UI: página <code>/Approvals</code> filtrável + painel de config + badge de pending count</li>
<li class="">JWT carrega <code>tenant_id</code> claim (necessário pro guard cross-tenant)</li>
</ul>
<p><strong>Limitações:</strong> 2-de-2 fixo (não suporta N-de-M arbitrário); <code>master_key_rotate</code> no enum mas sem endpoint.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="v170--172--dynamic-secrets">v1.7.0 → 1.7.2 — Dynamic Secrets<a href="https://docs.ciphervault.com.br/blog/v1-6-to-1-9-1-summary#v170--172--dynamic-secrets" class="hash-link" aria-label="Link direto para v1.7.0 → 1.7.2 — Dynamic Secrets" title="Link direto para v1.7.0 → 1.7.2 — Dynamic Secrets" translate="no">​</a></h2>
<p>JIT credentials com TTL ≤ 24h. License gate: <code>enterprise</code>.</p>
<table><thead><tr><th>Engine</th><th>Paradigma</th><th>Versão</th></tr></thead><tbody><tr><td><code>postgres</code></td><td><code>CREATE ROLE</code> + <code>GRANT</code> + <code>DROP ROLE</code></td><td>1.7.0</td></tr><tr><td><code>mysql</code></td><td><code>CREATE USER</code> + <code>GRANT</code> + <code>DROP USER</code></td><td>1.7.1</td></tr><tr><td><code>aws_sts</code></td><td><code>AssumeRole</code> / <code>GetFederationToken</code> (revoke no-op)</td><td>1.7.1</td></tr><tr><td><code>gcp_iam</code></td><td><code>IAMCredentials.GenerateAccessToken</code></td><td>1.7.2</td></tr><tr><td><code>azure_sp</code></td><td>Graph <code>addPassword</code></td><td>1.7.2</td></tr><tr><td><code>mongodb</code></td><td><code>createUser</code> / <code>dropUser</code> admin DB</td><td>1.7.2</td></tr></tbody></table>
<p><strong>Operacional:</strong> cap absoluto 24h • job de expiração 60s com leader-lock •
reconcile diário pra orphans <code>cv_*</code> (<code>dynamic_lease_orphan_in_backend</code>
severity critical) • rate limit token-bucket (capacity 30, refill 0.5/s) •
<strong>Prometheus metrics</strong> (7 custom + default process; <code>/metrics</code> gated por <code>CV_METRICS_ENABLED=true</code>).</p>
<p><strong>Sensor mode (Phase 4)</strong>: tabela <code>dynamic_secret_tasks</code> + <code>sensorBridge.js</code>
com poll 30s. Sensor reusa engines do backend via require relativo.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="v173--ssh-certificate-authority">v1.7.3 — SSH Certificate Authority<a href="https://docs.ciphervault.com.br/blog/v1-6-to-1-9-1-summary#v173--ssh-certificate-authority" class="hash-link" aria-label="Link direto para v1.7.3 — SSH Certificate Authority" title="Link direto para v1.7.3 — SSH Certificate Authority" translate="no">​</a></h2>
<p>CA Ed25519 lazy-bootstrapped por tenant.</p>
<ul>
<li class="">Roles: <code>default_principals</code>, <code>allowed_principals</code>, <code>default_ttl_sec</code>, <code>max_ttl_sec</code> (cap 24h), <code>cert_options</code>, <code>cert_extensions</code></li>
<li class="">Endpoints: <code>GET /ssh/ca</code> (público), <code>POST /ssh/roles/:id/sign</code> (reason mín 5 chars)</li>
<li class="">Implementação via <code>ssh-keygen</code> subprocess (sshpk não suporta principals/extensions OpenSSH cert)</li>
<li class="">KRL endpoint: <code>GET /ssh/krl</code></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="v174--encryption-as-a-service">v1.7.4 — Encryption-as-a-Service<a href="https://docs.ciphervault.com.br/blog/v1-6-to-1-9-1-summary#v174--encryption-as-a-service" class="hash-link" aria-label="Link direto para v1.7.4 — Encryption-as-a-Service" title="Link direto para v1.7.4 — Encryption-as-a-Service" translate="no">​</a></h2>
<p>API REST <code>/eaas/keys/:name/encrypt|decrypt</code> para apps cifrarem payloads
sem ter chave local.</p>
<ul>
<li class="">AES-256-GCM, key versioning, AAD opcional</li>
<li class=""><strong>Wire format</strong>: <code>eaas:v1:{name}:{version}:{iv}:{ct}:{tag}</code></li>
<li class="">DEK plaintext em cache 60s; KEK cifra DEK em DB (envelope encryption)</li>
<li class="">Auth flexível (JWT OU X-Client-Id/Secret)</li>
<li class="">Audit em todas operações (sem plaintext nos logs)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="v175--kubernetes-mutating-admission-webhook--sidecar">v1.7.5 — Kubernetes Mutating Admission Webhook + Sidecar<a href="https://docs.ciphervault.com.br/blog/v1-6-to-1-9-1-summary#v175--kubernetes-mutating-admission-webhook--sidecar" class="hash-link" aria-label="Link direto para v1.7.5 — Kubernetes Mutating Admission Webhook + Sidecar" title="Link direto para v1.7.5 — Kubernetes Mutating Admission Webhook + Sidecar" translate="no">​</a></h2>
<ul>
<li class=""><code>lib/k8sInjector.js</code>: handler de <code>AdmissionReview</code>, gera JSONPatch RFC 6902</li>
<li class="">Mutation strategy: + <code>emptyDir</code> volume tmpfs + initContainer ou sidecar (K8s 1.28+ via <code>restartPolicy: Always</code>) + volumeMount read-only</li>
<li class="">8 annotations configuráveis: <code>inject</code>, <code>client-id</code>, <code>secrets</code>, <code>volume</code>, <code>cv-url</code>, <code>secret-name</code>, <code>refresh-interval</code>, <code>sidecar-image</code></li>
<li class=""><code>kubernetes/sidecar/</code> — Node.js binary + Dockerfile non-root (uid 65534, RO root FS)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="v180--pki-as-a-service--workload-identity-expandida">v1.8.0 — PKI as a Service + Workload Identity expandida<a href="https://docs.ciphervault.com.br/blog/v1-6-to-1-9-1-summary#v180--pki-as-a-service--workload-identity-expandida" class="hash-link" aria-label="Link direto para v1.8.0 — PKI as a Service + Workload Identity expandida" title="Link direto para v1.8.0 — PKI as a Service + Workload Identity expandida" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pki">PKI<a href="https://docs.ciphervault.com.br/blog/v1-6-to-1-9-1-summary#pki" class="hash-link" aria-label="Link direto para PKI" title="Link direto para PKI" translate="no">​</a></h3>
<ul>
<li class="">CAs internas nomeadas por tenant. RSA-2048 self-signed via <code>node-forge</code></li>
<li class="">Roles com policy: <code>allowed_cn_regex</code>, <code>allowed_dns_regex</code>, <code>default_ttl_sec</code>, <code>max_ttl_sec</code> (cap 90d), <code>key_usages</code>, <code>ext_key_usages</code>, <code>is_ca</code></li>
<li class="">Issuance: CSR mode OR generateKey (CV gera RSA-2048)</li>
<li class="">CRL endpoint público: <code>GET /pki/cas/:id/crl</code></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="workload-identity-4-métodos">Workload Identity (4 métodos)<a href="https://docs.ciphervault.com.br/blog/v1-6-to-1-9-1-summary#workload-identity-4-m%C3%A9todos" class="hash-link" aria-label="Link direto para Workload Identity (4 métodos)" title="Link direto para Workload Identity (4 métodos)" translate="no">​</a></h3>
<table><thead><tr><th>Tipo</th><th>Como valida</th></tr></thead><tbody><tr><td><code>k8s_sa</code></td><td>JWT de K8s ServiceAccount validado via TokenReview API</td></tr><tr><td><code>aws_iam</code></td><td>re-executa <code>STS:GetCallerIdentity</code> preassinado, valida ARN</td></tr><tr><td><code>gcp_iam</code></td><td>JWT GCP audience-bound validado via JWKS público Google</td></tr><tr><td><code>azure_msi</code></td><td>JWT IMDS validado via JWKS do tenant Azure AD</td></tr></tbody></table>
<p>Endpoint <code>POST /workload-identity/login</code> (público) troca claim externa por
JWT CV de 1h.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="license-feature-gating">License feature gating<a href="https://docs.ciphervault.com.br/blog/v1-6-to-1-9-1-summary#license-feature-gating" class="hash-link" aria-label="Link direto para License feature gating" title="Link direto para License feature gating" translate="no">​</a></h3>
<p><code>lib/license.js</code>: <code>requireFeature(name)</code> middleware + <code>FEATURE_MIN_PLAN</code> map
(<code>dynamic_secrets</code> requer enterprise).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="v181--cli-go-cv">v1.8.1 — CLI Go <code>cv</code><a href="https://docs.ciphervault.com.br/blog/v1-6-to-1-9-1-summary#v181--cli-go-cv" class="hash-link" aria-label="Link direto para v181--cli-go-cv" title="Link direto para v181--cli-go-cv" translate="no">​</a></h2>
<p>Single binary cobrindo administração + consumo via terminal.</p>
<ul>
<li class="">8 grupos de comandos: <code>login</code>, <code>secret</code>, <code>lease</code>, <code>ssh</code>, <code>eaas</code>, <code>pki</code>, <code>approval</code></li>
<li class="">Config: flags <code>--url --token</code>, env <code>CV_URL CV_TOKEN</code>, ou <code>~/.ciphervault/config.yaml</code> (mode 0600)</li>
<li class="">Output formats: <code>json | table | raw</code> (raw é pipe-friendly)</li>
<li class="">Pipe-friendly: <code>echo "data" | cv eaas encrypt key | cv eaas decrypt key</code></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="v182--sdk-python-adminclient">v1.8.2 — SDK Python AdminClient<a href="https://docs.ciphervault.com.br/blog/v1-6-to-1-9-1-summary#v182--sdk-python-adminclient" class="hash-link" aria-label="Link direto para v1.8.2 — SDK Python AdminClient" title="Link direto para v1.8.2 — SDK Python AdminClient" translate="no">​</a></h2>
<p>Novo módulo <code>ciphervault.admin</code> com bindings administrativos (JWT bearer).
7 sub-resources: <code>cv.dynamic</code>, <code>cv.eaas</code>, <code>cv.ssh</code>, <code>cv.pki</code>, <code>cv.approvals</code>,
<code>cv.workload</code>, <code>cv.tokenization</code>. Consumer SDK (mTLS+DPoP) <strong>inalterado</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="v183--terraform-provider-oficial">v1.8.3 — Terraform Provider oficial<a href="https://docs.ciphervault.com.br/blog/v1-6-to-1-9-1-summary#v183--terraform-provider-oficial" class="hash-link" aria-label="Link direto para v1.8.3 — Terraform Provider oficial" title="Link direto para v1.8.3 — Terraform Provider oficial" translate="no">​</a></h2>
<p>Provider em Go usando <code>terraform-plugin-framework</code> v1.6+.</p>
<ul>
<li class=""><strong>8 resources</strong>: <code>ciphervault_secret</code>, <code>ciphervault_vault</code>, <code>ciphervault_eaas_key</code>, <code>ciphervault_pki_ca</code>, <code>ciphervault_pki_role</code>, <code>ciphervault_ssh_role</code>, <code>ciphervault_dynamic_backend</code>, <code>ciphervault_dynamic_role</code></li>
<li class=""><strong>3 data sources</strong>: <code>ciphervault_secret</code>, <code>ciphervault_pki_ca_cert</code>, <code>ciphervault_ssh_ca_pubkey</code></li>
<li class="">Auth via env <code>CV_URL</code> + <code>CV_TOKEN</code> ou bloco provider explícito</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="v190--tokenization--format-preserving-encryption--secretless-proxy">v1.9.0 — Tokenization / Format-Preserving Encryption + Secretless Proxy<a href="https://docs.ciphervault.com.br/blog/v1-6-to-1-9-1-summary#v190--tokenization--format-preserving-encryption--secretless-proxy" class="hash-link" aria-label="Link direto para v1.9.0 — Tokenization / Format-Preserving Encryption + Secretless Proxy" title="Link direto para v1.9.0 — Tokenization / Format-Preserving Encryption + Secretless Proxy" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="tokenization--fpe">Tokenization / FPE<a href="https://docs.ciphervault.com.br/blog/v1-6-to-1-9-1-summary#tokenization--fpe" class="hash-link" aria-label="Link direto para Tokenization / FPE" title="Link direto para Tokenization / FPE" translate="no">​</a></h3>
<p>3 formatos: <code>preserving</code> (mantém char-class), <code>uuid</code> (v4 determinístico),
<code>alphanumeric</code> (length match).</p>
<ul>
<li class="">Determinístico via blind index <code>HMAC-SHA256(blind_key, value)</code> → mesma input gera mesmo token (idempotente, permite JOIN/lookup estável em DB do app)</li>
<li class="">AES-256-GCM ciphertext + KEK envelope. Plaintext nunca em logs</li>
<li class="">Cross-tenant guard em todas as ops. Delete vault exige <code>reason ≥ 10 chars</code></li>
<li class="">Endpoints: <code>POST /tokenization/vaults</code>, <code>POST /vaults/:id/tokenize</code>, <code>POST /vaults/:id/detokenize</code></li>
<li class="">Tabelas: <code>tokenization_vaults</code> (DEK + blind_key cifrados), <code>tokenization_records</code> (token + ciphertext + UNIQUE em blind_index)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="secretless-proxy-go-binary-mvp">Secretless Proxy (Go binary, MVP)<a href="https://docs.ciphervault.com.br/blog/v1-6-to-1-9-1-summary#secretless-proxy-go-binary-mvp" class="hash-link" aria-label="Link direto para Secretless Proxy (Go binary, MVP)" title="Link direto para Secretless Proxy (Go binary, MVP)" translate="no">​</a></h3>
<p>Sidecar local que escuta TCP, intercepta <code>Postgres StartupMessage</code>, pede
lease no CV, conecta upstream com cred efêmera, daí byte-puro bidirecional.</p>
<ul>
<li class="">App configura conexão pra <code>localhost:5432</code> com user/pass arbitrários — proxy injeta cred real</li>
<li class="">Lease revogado em close (defer)</li>
<li class=""><strong>Limitações MVP</strong>: só Postgres CleartextPassword auth, sem TLS upstream, sem pool de leases. Roadmap em <code>secretless-proxy/README.md</code></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="documentação-operacional">Documentação operacional<a href="https://docs.ciphervault.com.br/blog/v1-6-to-1-9-1-summary#documenta%C3%A7%C3%A3o-operacional" class="hash-link" aria-label="Link direto para Documentação operacional" title="Link direto para Documentação operacional" translate="no">​</a></h3>
<ul>
<li class=""><code>docs/HA_MULTI_REGION.md</code> — 3 topologias (single-region HA, active-passive multi-region, active-active sharded), checklist pré-prod, monitoring obrigatório, capacity planning, DR test procedures</li>
<li class=""><code>docs/COMPLIANCE.md</code> — mapping completo SOC 2 Trust Services (CC6/CC7) + ISO 27001:2022 Annex A → features do produto. Auditor checklist + gaps organizacionais</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="v191--adminclient-nos-4-sdks-restantes">v1.9.1 — AdminClient nos 4 SDKs restantes<a href="https://docs.ciphervault.com.br/blog/v1-6-to-1-9-1-summary#v191--adminclient-nos-4-sdks-restantes" class="hash-link" aria-label="Link direto para v1.9.1 — AdminClient nos 4 SDKs restantes" title="Link direto para v1.9.1 — AdminClient nos 4 SDKs restantes" translate="no">​</a></h2>
<ul>
<li class=""><strong><code>sdks/go/admin.go</code></strong>: <code>NewAdmin(url, token)</code> com sub-resources <code>Dynamic</code>, <code>EaaS</code>, <code>SSH</code>, <code>PKI</code>, <code>Approvals</code>, <code>Workload</code>, <code>Tokenization</code>. Structs tipados (<code>Lease</code>, <code>EaasEnvelope</code>, <code>SshCert</code>, <code>PkiCert</code>)</li>
<li class=""><strong><code>sdks/nodejs/src/admin.ts</code></strong>: <code>AdminClient</code> com fetch() nativo + AbortController. Tipos exportados em <code>index.ts</code></li>
<li class=""><strong><code>sdks/java/src/main/java/io/ciphervault/AdminClient.java</code></strong>: inner classes pra cada subsystem. Usa <code>java.net.http</code> (Java 11+, zero deps externas)</li>
<li class=""><strong><code>sdks/csharp/CipherVault.Sdk/AdminClient.cs</code></strong>: async/await com records C# 9 + <code>System.Text.Json</code></li>
</ul>
<p>Todos seguem o mesmo contrato do Python AdminClient (v1.8.2). Consumer
SDKs (mTLS+DPoP) preservados intactos.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resumo">Resumo<a href="https://docs.ciphervault.com.br/blog/v1-6-to-1-9-1-summary#resumo" class="hash-link" aria-label="Link direto para Resumo" title="Link direto para Resumo" translate="no">​</a></h2>
<table><thead><tr><th>Subsystem</th><th>Versão</th><th>Estado</th></tr></thead><tbody><tr><td>Approvals (dual-control)</td><td>1.6.0</td><td>GA</td></tr><tr><td>Dynamic Secrets (6 engines)</td><td>1.7.0–1.7.2</td><td>GA</td></tr><tr><td>SSH Certificate Authority</td><td>1.7.3</td><td>GA</td></tr><tr><td>Encryption-as-a-Service</td><td>1.7.4</td><td>GA</td></tr><tr><td>K8s Mutating Admission Webhook</td><td>1.7.5</td><td>GA</td></tr><tr><td>PKI as a Service</td><td>1.8.0</td><td>GA</td></tr><tr><td>Workload Identity (4 métodos)</td><td>1.8.0</td><td>GA</td></tr><tr><td>Tokenization / FPE</td><td>1.9.0</td><td>GA</td></tr><tr><td>Secretless Proxy</td><td>1.9.0</td><td>MVP</td></tr><tr><td>CLI Go <code>cv</code></td><td>1.8.1</td><td>GA</td></tr><tr><td>Terraform Provider</td><td>1.8.3</td><td>GA</td></tr><tr><td>AdminClient (5 SDKs)</td><td>1.8.2 + 1.9.1</td><td>GA</td></tr></tbody></table>
<p>Próxima parada: <strong>v2.0.0</strong> — major release consolidando tudo.</p>]]></content:encoded>
            <category>Release</category>
            <category>Segurança</category>
            <category>Kubernetes</category>
            <category>CI/CD</category>
            <category>API</category>
        </item>
        <item>
            <title><![CDATA[CipherVault 1.5 — Self-rotation cloud, attach-secret e demo-app refatorado]]></title>
            <link>https://docs.ciphervault.com.br/blog/v1-5-0-release</link>
            <guid>https://docs.ciphervault.com.br/blog/v1-5-0-release</guid>
            <pubDate>Sat, 02 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Release com rotação self-managed das credenciais que o CipherVault usa]]></description>
            <content:encoded><![CDATA[<p>Release com <strong>rotação self-managed</strong> das credenciais que o CipherVault usa
para acessar cloud integrations, <strong>demo-app</strong> transformado em validador
multi-suite, <strong>enumeration hardening</strong> (UUID externo) e melhorias UX/segurança
no fluxo Secrets/Fortress. ~20 commits desde 1.4.1.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-novidades">✨ Novidades<a href="https://docs.ciphervault.com.br/blog/v1-5-0-release#-novidades" class="hash-link" aria-label="Link direto para ✨ Novidades" title="Link direto para ✨ Novidades" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="self-rotation-de-credenciais--cloud-integrations">Self-rotation de credenciais — cloud integrations<a href="https://docs.ciphervault.com.br/blog/v1-5-0-release#self-rotation-de-credenciais--cloud-integrations" class="hash-link" aria-label="Link direto para Self-rotation de credenciais — cloud integrations" title="Link direto para Self-rotation de credenciais — cloud integrations" translate="no">​</a></h3>
<p>Padrão <strong>"create → test → delete"</strong>: cria nova cred, valida que funciona,
persiste, só então deleta a antiga. Se qualquer etapa antes do persist
falhar, a cred atual continua intacta.</p>
<table><thead><tr><th>Provider</th><th>Mecanismo</th></tr></thead><tbody><tr><td><strong>AWS</strong></td><td>IAM Access Keys via <code>@aws-sdk/client-iam</code></td></tr><tr><td><strong>GCP</strong></td><td>Service Account Keys via IAM REST</td></tr><tr><td><strong>IBM</strong></td><td>IAM API Keys via <code>/v1/apikeys</code></td></tr></tbody></table>
<ul>
<li class=""><strong>Manual</strong>: <code>POST /cloud-integrations/:id/rotate-credentials</code> + botão "Rotacionar credenciais" no card</li>
<li class=""><strong>Auto</strong>: opt-in via toggle <code>auto_rotate</code>. Rotação <strong>imediata após primeiro sync</strong> (queima a cred copy-paste-able) + <strong>scheduler 24h</strong> com leader lock + retry 1h em failure</li>
<li class="">UI: badge no card mostra "auto-rotate · próxima DD/MM HH<!-- -->:mm<!-- -->", "rotação falhou" (com tooltip do reason), ou "pendente"</li>
<li class="">Schema: <code>auto_rotate</code>, <code>last_credentials_rotated_at</code>, <code>next_rotation_at</code>, <code>rotation_failed_at</code>, <code>rotation_failure_reason</code> em <code>cloud_integrations</code> + index parcial</li>
<li class="">Auditoria: <code>integration_credentials_rotated</code> (manual) e <code>_rotated_auto</code> / <code>_rotation_failed</code> (scheduler)</li>
</ul>
<p><strong>Não suportado</strong> (paradigmas diferentes): Azure, OCI, Huawei (lookups distintos / RSA keypairs); PAMs por design (são rotacionadores, não rotacionados).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="vault-attach-secret-referência-não-cópia">Vault attach-secret (referência, não cópia)<a href="https://docs.ciphervault.com.br/blog/v1-5-0-release#vault-attach-secret-refer%C3%AAncia-n%C3%A3o-c%C3%B3pia" class="hash-link" aria-label="Link direto para Vault attach-secret (referência, não cópia)" title="Link direto para Vault attach-secret (referência, não cópia)" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#F8F8F2"><span class="token plain">POST /vaults/:id/attach-secret { secret_id, kind, promote? }</span><br></div></code></pre></div></div>
<p>Atribui secret/fortress existente a outro cofre por <strong>referência</strong> (mesmo
id em N cofres). Rotação reflete em todos. Idempotente.</p>
<ul>
<li class="">Validações: <code>requireVaultAccess('write')</code> no destino + <code>canAccessSecret</code> na origem + env consistency (vault PRD exige <code>promote=true</code> pra absorver dev)</li>
<li class="">UI: dialog reutilizável "Adicionar a outro cofre" no card de Secret e Fortress</li>
<li class=""><strong>Decisão de design</strong>: rejeitar duplicação por valor evita rotation drift (dois secrets divergem após uma rotacionar e a outra não)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="custom-rotation-script-secrets--fortress">Custom rotation script (Secrets + Fortress)<a href="https://docs.ciphervault.com.br/blog/v1-5-0-release#custom-rotation-script-secrets--fortress" class="hash-link" aria-label="Link direto para Custom rotation script (Secrets + Fortress)" title="Link direto para Custom rotation script (Secrets + Fortress)" translate="no">​</a></h3>
<p>Nova platform <code>custom_script</code> no RotationModal com <strong>selector de linguagem</strong>:</p>
<ul>
<li class=""><strong>Shell</strong> / <strong>Python 3</strong> / <strong>JavaScript (Node)</strong> / <strong>Java (JBang)</strong></li>
</ul>
<p>Textarea com placeholder contextual por linguagem; variáveis disponíveis:
<code>{{new_password}}</code> no template + <code>$NEW_SECRET</code> no env. Sensor é
responsável pela execução.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="userspublic_id-uuid-externo-anti-enumeration"><code>users.public_id</code> UUID externo (anti-enumeration)<a href="https://docs.ciphervault.com.br/blog/v1-5-0-release#userspublic_id-uuid-externo-anti-enumeration" class="hash-link" aria-label="Link direto para userspublic_id-uuid-externo-anti-enumeration" title="Link direto para userspublic_id-uuid-externo-anti-enumeration" translate="no">​</a></h3>
<p>IDs sequenciais em URL vazam contagem de users. Solução:</p>
<ul>
<li class="">Migration: <code>users.public_id UUID NOT NULL DEFAULT gen_random_uuid() UNIQUE</code> + backfill + extension <code>pgcrypto</code></li>
<li class=""><code>GET/PUT/DELETE /users/:id</code> aceita <strong>ambos</strong> os formatos (helper <code>userIdClause</code> discrimina por regex v4)</li>
<li class="">Frontend (<code>IAMSettings</code>) prefere <code>public_id</code> em update/delete (fallback pro id int)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="aviso-fortress-no-secretform">Aviso Fortress no SecretForm<a href="https://docs.ciphervault.com.br/blog/v1-5-0-release#aviso-fortress-no-secretform" class="hash-link" aria-label="Link direto para Aviso Fortress no SecretForm" title="Link direto para Aviso Fortress no SecretForm" translate="no">​</a></h3>
<p>Banner violeta no topo do form (modo criação) direciona credenciais críticas
pra Fortress; reposiciona Secrets como "staging para sync com cloud/PAM".
<code>Internal</code> continua disponível como destino válido.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-demo-app--refatorado-completo">🧪 Demo-app — refatorado completo<a href="https://docs.ciphervault.com.br/blog/v1-5-0-release#-demo-app--refatorado-completo" class="hash-link" aria-label="Link direto para 🧪 Demo-app — refatorado completo" title="Link direto para 🧪 Demo-app — refatorado completo" translate="no">​</a></h2>
<p>Era single-purpose mTLS demo (~220 linhas); agora é validador multi-tab
de toda a superfície pública do CipherVault (~1500 linhas):</p>
<ul>
<li class=""><strong>7 suites de smoke test</strong>: AppConnection (mTLS+DPoP), Auth (PAT lifecycle), Secrets CRUD, Fortress, Vaults RBAC, Audit + License, OIDC Federation (com mock issuer in-memory)</li>
<li class=""><strong>OIDC mock issuer</strong>: keypair RSA-2048 in-memory, expõe <code>.well-known/openid-configuration</code> + <code>jwks.json</code> + endpoint utilitário <code>/issue?sub=...</code>. Auto-setup via PAT cria a cloud_integration <code>oidc_custom</code></li>
<li class=""><strong>Trace HTTP por teste</strong>: cada teste captura todas as requests com método/URL/status/ms + headers (Authorization sanitizado) + bodies (truncados em 5KB), renderiza em <code>&lt;details&gt;</code> expansível</li>
<li class=""><strong>Run all</strong>: botão na home agrega pass/fail das 7 suites</li>
<li class=""><strong>Seed</strong>: cria 50–100 (configurável) de cada entidade — vaults, secrets, fortress, integrations, app_connections, paths, users</li>
<li class=""><strong>Cleanup</strong>: deleta tudo que o seed criou (match por prefixo <code>seed-</code>), ordem reversa de FKs</li>
<li class=""><strong>Perf test</strong>: spawn N workers concorrentes por D segundos, gera relatório com p50/p95/p99 + latências por quarto da janela + detecção automática de degradação (p95(Q4) &gt; 1.5×p95(Q1) ou error rate &gt; 1%)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-correções">🐛 Correções<a href="https://docs.ciphervault.com.br/blog/v1-5-0-release#-corre%C3%A7%C3%B5es" class="hash-link" aria-label="Link direto para 🐛 Correções" title="Link direto para 🐛 Correções" translate="no">​</a></h2>
<ul>
<li class=""><strong><code>risk_scores.secret_id</code> FK sem <code>ON DELETE</code></strong>: bloqueava qualquer DELETE de secret com score (UI inteira). Migrado pra <code>ON DELETE SET NULL</code> (alinhado com <code>leak_findings</code>)</li>
<li class=""><strong>Demo-app trace interceptor</strong>: callback retornava <code>undefined</code>, fazia testes 200/201 aparecerem como FAIL. Fix: success interceptor agora retorna <code>res</code></li>
<li class=""><strong>OIDC <code>PROVIDER_NOT_FOUND</code></strong>: setup manual era passo gargalo; agora o teste de Setup auto-cria a cloud_integration via API</li>
<li class=""><strong>Fortress rotate</strong>: test referenciava <code>r.active_version</code> mas endpoint retorna <code>r.new_version</code> — aceita ambos</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-testes">🧪 Testes<a href="https://docs.ciphervault.com.br/blog/v1-5-0-release#-testes" class="hash-link" aria-label="Link direto para 🧪 Testes" title="Link direto para 🧪 Testes" translate="no">​</a></h2>
<p>186 cases passando em 17 suites.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="migrations">Migrations<a href="https://docs.ciphervault.com.br/blog/v1-5-0-release#migrations" class="hash-link" aria-label="Link direto para Migrations" title="Link direto para Migrations" translate="no">​</a></h2>
<ul>
<li class=""><code>users.public_id UUID</code> + index único + extension <code>pgcrypto</code></li>
<li class=""><code>cloud_integrations.auto_rotate / last_credentials_rotated_at / next_rotation_at / rotation_failed_at / rotation_failure_reason</code> + partial index</li>
<li class=""><code>risk_scores.secret_id_fkey</code> recreate com <code>ON DELETE SET NULL</code> (DO block idempotente)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking">Breaking<a href="https://docs.ciphervault.com.br/blog/v1-5-0-release#breaking" class="hash-link" aria-label="Link direto para Breaking" title="Link direto para Breaking" translate="no">​</a></h2>
<p>Nada. Tudo opt-in: <code>auto_rotate</code> default OFF, attach-secret é endpoint novo,
public_id complementa o id sem substituir.</p>]]></content:encoded>
            <category>Release</category>
            <category>Multi-cloud</category>
            <category>CI/CD</category>
        </item>
        <item>
            <title><![CDATA[CipherVault 1.4 — RBAC vault-aware, cofres pessoais e UI gating por permissão]]></title>
            <link>https://docs.ciphervault.com.br/blog/v1-4-0-release</link>
            <guid>https://docs.ciphervault.com.br/blog/v1-4-0-release</guid>
            <pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Release focada em RBAC vault-aware, cofres pessoais por usuário e]]></description>
            <content:encoded><![CDATA[<p>Release focada em <strong>RBAC vault-aware</strong>, <strong>cofres pessoais por usuário</strong> e
<strong>gating de UI por permissão</strong> (sidebar, settings, route guards). 10 commits
desde v1.3.0.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-novidades">✨ Novidades<a href="https://docs.ciphervault.com.br/blog/v1-4-0-release#-novidades" class="hash-link" aria-label="Link direto para ✨ Novidades" title="Link direto para ✨ Novidades" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cofres-pessoais-rbac-tenant-internal">Cofres pessoais (RBAC tenant-internal)<a href="https://docs.ciphervault.com.br/blog/v1-4-0-release#cofres-pessoais-rbac-tenant-internal" class="hash-link" aria-label="Link direto para Cofres pessoais (RBAC tenant-internal)" title="Link direto para Cofres pessoais (RBAC tenant-internal)" translate="no">​</a></h3>
<p>Cada user ganha um vault <code>is_personal=true</code> auto-criado em três fluxos:</p>
<ol>
<li class="">Criação via admin (<code>POST /users</code>)</li>
<li class="">Self-signup (<code>/auth/register</code>)</li>
<li class="">Fallback no primeiro login (<code>ensurePersonalVault</code>)</li>
</ol>
<p>Migration <code>0024_personal_vault.sql</code> adiciona <code>is_personal BOOL</code> +
<code>owner_user_id INT</code>.</p>
<p><strong>Privacidade absoluta:</strong></p>
<ul>
<li class="">Personal vault: <strong>somente o owner acessa</strong> — admin global <strong>NÃO bypassa</strong></li>
<li class="">Não aceita membros</li>
<li class="">UI: badge "Pessoal" no card; botão Excluir desabilitado</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hierarquia-de-roles-em-vaults-compartilhados">Hierarquia de roles em vaults compartilhados<a href="https://docs.ciphervault.com.br/blog/v1-4-0-release#hierarquia-de-roles-em-vaults-compartilhados" class="hash-link" aria-label="Link direto para Hierarquia de roles em vaults compartilhados" title="Link direto para Hierarquia de roles em vaults compartilhados" translate="no">​</a></h3>
<p>Tabela <code>vault_members(vault_id, user_id, role)</code> com <code>role ∈ {reader, contributor, owner}</code>:</p>
<table><thead><tr><th>Role</th><th>Permite</th></tr></thead><tbody><tr><td><code>reader</code></td><td>Ler vault + revelar secrets (<code>POST /secrets/:id/view</code>)</td></tr><tr><td><code>contributor</code></td><td>Reader + criar/editar/deletar secrets do vault</td></tr><tr><td><code>owner</code></td><td>Contributor + editar metadata + gerenciar membros</td></tr></tbody></table>
<p>Lib <code>backend/src/lib/vaultAccess.js</code>: <code>canAccessVault()</code>,
<code>requireVaultAccess()</code> middleware, <code>listAccessibleVaultIds()</code>,
<code>actionRequires()</code>. Endpoints <code>GET/POST/PATCH/DELETE /vaults/:id/members</code>
com auditoria.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="vault-aware-secretfortress-access">Vault-aware secret/fortress access<a href="https://docs.ciphervault.com.br/blog/v1-4-0-release#vault-aware-secretfortress-access" class="hash-link" aria-label="Link direto para Vault-aware secret/fortress access" title="Link direto para Vault-aware secret/fortress access" translate="no">​</a></h3>
<p>Lib <code>backend/src/lib/secretAccess.js</code> com helpers
<code>listVisibleSecretIds()</code>, <code>listVisibleFortressIds()</code>, <code>canAccessSecret()</code>.</p>
<p>Regras aplicadas em <code>GET /secrets</code>, <code>GET /fortress</code>, <code>GET /:id</code>,
<code>POST /:id/view</code>:</p>
<ul>
<li class=""><strong>Personal vault</strong> → somente o owner</li>
<li class=""><strong>Shared vault</strong> → membros (qualquer role)</li>
<li class=""><strong>Orphan</strong> (sem vault) → admin OU <code>created_by</code> (criador acessa o que criou)</li>
</ul>
<p>Admin perdeu bypass em shared vaults — precisa ser membro explícito;
mantém apenas <code>list</code> (metadata) pra governance.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="iam-permission-based-ui-gating">IAM permission-based UI gating<a href="https://docs.ciphervault.com.br/blog/v1-4-0-release#iam-permission-based-ui-gating" class="hash-link" aria-label="Link direto para IAM permission-based UI gating" title="Link direto para IAM permission-based UI gating" translate="no">​</a></h3>
<ul>
<li class=""><code>GET /auth/me/permissions</code> resolve permissões do <code>iam_group</code> do user</li>
<li class="">Catálogo de grupos vive em <code>account_settings.iam_groups</code> do <strong>primeiro admin do tenant</strong> (source of truth tenant-wide)</li>
<li class=""><code>AuthContext</code> carrega <code>permissions: Set</code> + <code>admin_bypass</code> em paralelo ao <code>/auth/me</code>; expõe <code>hasPermission(p)</code></li>
<li class=""><strong>Sidebar</strong> (<code>Layout.jsx</code>) e abas internas de Settings escondem páginas/seções sem permissão</li>
<li class="">Grupo padrão "User" criado automaticamente; novos users sem grupo explícito caem nele</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="vault-selector-no-fortress-create">Vault selector no Fortress create<a href="https://docs.ciphervault.com.br/blog/v1-4-0-release#vault-selector-no-fortress-create" class="hash-link" aria-label="Link direto para Vault selector no Fortress create" title="Link direto para Vault selector no Fortress create" translate="no">​</a></h3>
<ul>
<li class="">POST <code>/fortress</code> aceita <code>vault_id</code> opcional, validado via <code>canAccessVault('write')</code> antes de cifrar</li>
<li class="">UI <code>CreateDialog</code> ganha <code>&lt;Select&gt;</code> listando cofres acessíveis (pessoal marcado com ★)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="route-guards-no-frontend">Route guards no frontend<a href="https://docs.ciphervault.com.br/blog/v1-4-0-release#route-guards-no-frontend" class="hash-link" aria-label="Link direto para Route guards no frontend" title="Link direto para Route guards no frontend" translate="no">​</a></h3>
<p><code>&lt;RouteGuard pageName=...&gt;</code> em <code>App.jsx</code> bloqueia acesso direto via URL —
sem o guard, sidebar oculta mas <code>/Fortress</code> digitado na barra entrava.
Redireciona pra <code>/Settings</code> (Perfil sempre liberado).</p>
<p><code>PAGE_PERMISSION</code> exportado de <code>Layout.jsx</code> é a fonte de verdade compartilhada
entre sidebar e router.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-correções">🐛 Correções<a href="https://docs.ciphervault.com.br/blog/v1-4-0-release#-corre%C3%A7%C3%B5es" class="hash-link" aria-label="Link direto para 🐛 Correções" title="Link direto para 🐛 Correções" translate="no">​</a></h2>
<ul>
<li class=""><strong>JSONB containment incorreto</strong>: <code>vault.fortress_secret_ids</code> armazena integers mas checks usavam operador <code>?</code> (text-only). Resultado: secrets atribuídos a cofre apareciam como <strong>orphan</strong> e admin via tudo. Trocado <code>?::text</code> por <code>@&gt; to_jsonb()</code> (type-aware) em <code>secretAccess.js</code> e no UPDATE do <code>fortress.js</code> POST.</li>
<li class=""><strong>iam_group resolution</strong>: lookup lia <code>account_settings.iam_groups</code> do user, mas catálogo vive no admin do tenant. Corrige bug onde "atribuir grupo DevOps tornava user admin".</li>
<li class=""><strong>Personal vault edit bloqueado</strong>: <code>disabled={vault.is_personal}</code> no botão Editar bloqueava o owner. Removido — owner do personal pode editar metadata.</li>
<li class=""><strong>Pepper rotation sem re-deploy</strong>: novo endpoint admin pra rotacionar <code>FORTRESS_PEPPER</code> em runtime, com re-encryption das versões ativas.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-testes">🧪 Testes<a href="https://docs.ciphervault.com.br/blog/v1-4-0-release#-testes" class="hash-link" aria-label="Link direto para 🧪 Testes" title="Link direto para 🧪 Testes" translate="no">​</a></h2>
<p>181 cases passando em 16 suites. Novos:</p>
<ul>
<li class=""><code>vaultAccess.test.js</code> — RBAC personal/shared, hierarquia, admin bypass restrito a <code>list</code></li>
<li class=""><code>secretAccess.test.js</code> — orphan creator, personal isolation, fortress kind</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-breaking-changes">⚠️ Breaking changes<a href="https://docs.ciphervault.com.br/blog/v1-4-0-release#%EF%B8%8F-breaking-changes" class="hash-link" aria-label="Link direto para ⚠️ Breaking changes" title="Link direto para ⚠️ Breaking changes" translate="no">​</a></h2>
<ul>
<li class="">Admin não acessa mais shared vaults sem ser membro explícito (exceto <code>list</code> de metadata). Promoção de admin para owner é via <code>POST /vaults/:id/members</code> por outro owner.</li>
<li class="">Admin não vê secrets de personal vaults de outros users (privacidade absoluta).</li>
</ul>]]></content:encoded>
            <category>Release</category>
            <category>Segurança</category>
        </item>
        <item>
            <title><![CDATA[CipherVault 1.3.0 — SAML2, SIEM em 6 destinos, Attack Path templates e 5 SDKs oficiais]]></title>
            <link>https://docs.ciphervault.com.br/blog/v1-3-0-release</link>
            <guid>https://docs.ciphervault.com.br/blog/v1-3-0-release</guid>
            <pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Release grande de UX, autenticação federada e observabilidade. 25 commits]]></description>
            <content:encoded><![CDATA[<p>Release grande de UX, autenticação federada e observabilidade. <strong>25 commits</strong>
desde v1.2.1 com novidades em SSO, encaminhamento SIEM, simulação de ataques
e SDKs oficiais em 5 linguagens.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-novidades">✨ Novidades<a href="https://docs.ciphervault.com.br/blog/v1-3-0-release#-novidades" class="hash-link" aria-label="Link direto para ✨ Novidades" title="Link direto para ✨ Novidades" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sso-via-saml-20">SSO via SAML 2.0<a href="https://docs.ciphervault.com.br/blog/v1-3-0-release#sso-via-saml-20" class="hash-link" aria-label="Link direto para SSO via SAML 2.0" title="Link direto para SSO via SAML 2.0" translate="no">​</a></h3>
<ul>
<li class="">SP-initiated, IdP-initiated, <strong>Single Logout (SLO)</strong></li>
<li class="">AuthnRequest assinado, JIT role mapping via attributes</li>
<li class="">Keypair SP auto-gerado no primeiro login (via <code>node-forge</code>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="siem-forwarding--6-connectors">SIEM Forwarding — 6 connectors<a href="https://docs.ciphervault.com.br/blog/v1-3-0-release#siem-forwarding--6-connectors" class="hash-link" aria-label="Link direto para SIEM Forwarding — 6 connectors" title="Link direto para SIEM Forwarding — 6 connectors" translate="no">​</a></h3>
<p>Cada evento gravado em <code>audit_logs</code> é encaminhado automaticamente
(fire-and-forget) para todas as integrações SIEM com <code>status='connected'</code>.
Cache TTL 60s no <code>lib/siemDispatcher.js</code>.</p>
<table><thead><tr><th>Provider</th><th>Endpoint</th><th>Auth</th><th>Formato</th></tr></thead><tbody><tr><td>Splunk Enterprise</td><td>HEC <code>/services/collector/event</code></td><td><code>Authorization: Splunk &lt;token&gt;</code></td><td>JSON</td></tr><tr><td>Elastic Security</td><td><code>/_bulk</code></td><td>API key OR Basic</td><td>NDJSON</td></tr><tr><td>Microsoft Sentinel</td><td>Log Analytics Data Collector API</td><td>HMAC-SHA256</td><td>JSON</td></tr><tr><td>IBM QRadar</td><td>HTTP Receiver Log Source (Universal DSM)</td><td>Bearer ou <code>SEC</code> token</td><td>LEEF 2.0 ou JSON</td></tr><tr><td>Google SecOps (Chronicle)</td><td><code>/v2/udmevents:batchCreate</code></td><td>Service Account JWT</td><td>UDM events</td></tr><tr><td>SentinelOne Singularity</td><td>Mgmt URL customizável</td><td><code>Authorization: ApiToken</code></td><td>JSON</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="attack-path-templates--what-if-simulation">Attack Path templates + What-if simulation<a href="https://docs.ciphervault.com.br/blog/v1-3-0-release#attack-path-templates--what-if-simulation" class="hash-link" aria-label="Link direto para Attack Path templates + What-if simulation" title="Link direto para Attack Path templates + What-if simulation" translate="no">​</a></h3>
<p><code>/attack-paths</code> ganha 5 colunas novas e 3 templates pré-modelados:</p>
<table><thead><tr><th>Template</th><th>TTC</th><th>Risco</th><th>Cenário</th></tr></thead><tbody><tr><td><code>aws_privesc</code></td><td>minutos</td><td>critical</td><td>IAM <code>iam:AttachUserPolicy</code> → <code>AdministratorAccess</code></td></tr><tr><td><code>k8s_secret_exposure</code></td><td>minutos</td><td>high</td><td>Pod RCE → ServiceAccount token → cloud creds</td></tr><tr><td><code>ci_cd_token_leak</code></td><td>imediato</td><td>critical</td><td><code>GITHUB_TOKEN</code> em log → action maliciosa → exfil</td></tr></tbody></table>
<p><strong>What-if simulation</strong> (<code>POST /attack-paths/:id/simulate</code>) calcula
<code>blast_radius</code> (vaults/connections/paths/secrets afetados),
<code>time_to_compromise</code> por <code>credential_type</code> e gera <code>remediation_hints</code>
contextualizados.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="auditoria-com-cobertura-automática">Auditoria com cobertura automática<a href="https://docs.ciphervault.com.br/blog/v1-3-0-release#auditoria-com-cobertura-autom%C3%A1tica" class="hash-link" aria-label="Link direto para Auditoria com cobertura automática" title="Link direto para Auditoria com cobertura automática" translate="no">​</a></h3>
<p>Via <code>makeCrud</code> audit option em secrets, sensors, tenants, attack-paths,
leak-findings, cloud-integrations + auth flow completo (login success/failure,
password change, MFA, settings, personal tokens, SAML2 logout) + ciclo de vida
completo de secret (push/remove cloud, rotate manual/automatic).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sdks-oficiais--5-linguagens">SDKs oficiais — 5 linguagens<a href="https://docs.ciphervault.com.br/blog/v1-3-0-release#sdks-oficiais--5-linguagens" class="hash-link" aria-label="Link direto para SDKs oficiais — 5 linguagens" title="Link direto para SDKs oficiais — 5 linguagens" translate="no">​</a></h3>
<p>Lançados em paralelo: <strong>Python, Node.js, Java, Go, C#</strong> + cURL cookbook.
Helper <code>from_federated_token()</code> / <code>FromFederatedToken()</code> em todos pra OIDC
Federation.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-mudanças">🔄 Mudanças<a href="https://docs.ciphervault.com.br/blog/v1-3-0-release#-mudan%C3%A7as" class="hash-link" aria-label="Link direto para 🔄 Mudanças" title="Link direto para 🔄 Mudanças" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="oidc-federation-refator-modelo-v13">OIDC Federation refator (modelo v1.3)<a href="https://docs.ciphervault.com.br/blog/v1-3-0-release#oidc-federation-refator-modelo-v13" class="hash-link" aria-label="Link direto para OIDC Federation refator (modelo v1.3)" title="Link direto para OIDC Federation refator (modelo v1.3)" translate="no">​</a></h3>
<p>Provider config (issuer/jwks/audience) movido pra <code>cloud_integrations</code>
(categoria CI/CD Federation). AppConnection guarda apenas <code>oidc_enabled</code> +
<code>oidc_subject_patterns[]</code> + <code>oidc_provider_ids[]</code> (whitelist).</p>
<p><code>/federated-token</code> agora resolve provider via JWT <code>iss</code> claim filtrado pela
whitelist. UI <code>FederationManager</code> (428 linhas) substituído por
<code>OidcFederationToggle</code> simplificado. CRUD legacy <code>/federation-configs/*</code>
retorna <strong>410 Gone</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="settings-consolidado">Settings consolidado<a href="https://docs.ciphervault.com.br/blog/v1-3-0-release#settings-consolidado" class="hash-link" aria-label="Link direto para Settings consolidado" title="Link direto para Settings consolidado" translate="no">​</a></h3>
<ul>
<li class="">Aba "Conta" removida; campos migrados pra Perfil (logo+nome+timezone) e Notificações (security_email)</li>
<li class="">3 abas (Notificações + Auditoria &amp; Logs + Alertas) → 1 aba <strong>"Eventos &amp; Destinos"</strong> com matriz 8×3 (events × Log/Email/Webhook)</li>
<li class="">Backwards-compat: save espelha pros blobs legacy</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ux">UX<a href="https://docs.ciphervault.com.br/blog/v1-3-0-release#ux" class="hash-link" aria-label="Link direto para UX" title="Link direto para UX" translate="no">​</a></h3>
<ul>
<li class="">SecretForm vira wizard 2-step (destino → dados)</li>
<li class="">IntegrationForm: dropdown gigante substituído por pills de categoria + grid de cards</li>
<li class="">22 emojis de provider → componente único <code>ProviderLogo</code> (cor brand + monograma; SVG oficial opcional via <code>/public/logos/</code>)</li>
<li class="">Secrets create: 11 destinos (6 cloud + 1 on-prem + 4 PAM); destinos sem integração ficam transparentes/disabled</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-correções">🐛 Correções<a href="https://docs.ciphervault.com.br/blog/v1-3-0-release#-corre%C3%A7%C3%B5es" class="hash-link" aria-label="Link direto para 🐛 Correções" title="Link direto para 🐛 Correções" translate="no">​</a></h2>
<ul>
<li class="">Keycloak health probe: usa management port 9000 (Keycloak 22+) em vez de 8080</li>
<li class="">migrate.js: backticks no comentário SQL fechavam template literal JS</li>
<li class="">OIDC save: <code>GET /by-client</code> agora devolve campos OIDC; estado local sincroniza com response do PUT</li>
<li class="">Attack Path <code>/from-template</code>: <code>tenant_id="default"</code> placeholder vira NULL</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-testes">🧪 Testes<a href="https://docs.ciphervault.com.br/blog/v1-3-0-release#-testes" class="hash-link" aria-label="Link direto para 🧪 Testes" title="Link direto para 🧪 Testes" translate="no">​</a></h2>
<p>Backend ganha <strong>Jest 29</strong> + 10 arquivos de teste, <strong>104 cases passando</strong>.
Cobertura focada em libs tocadas: federation, attackPathTemplates,
siemDispatcher, saml, crud sanitize, conectores SIEM (Sentinel HMAC,
QRadar LEEF, OIDC JWKS).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-documentação">📚 Documentação<a href="https://docs.ciphervault.com.br/blog/v1-3-0-release#-documenta%C3%A7%C3%A3o" class="hash-link" aria-label="Link direto para 📚 Documentação" title="Link direto para 📚 Documentação" translate="no">​</a></h2>
<ul>
<li class=""><code>docs/FEATURES.md</code>, <code>docs/ARCHITECTURE.md</code>, <code>docs/API.md</code>, <code>docs/TESTING.md</code> atualizados</li>
<li class=""><code>public/logos/README.md</code> documenta como adicionar logos oficiais</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="versões-dos-sdks">Versões dos SDKs<a href="https://docs.ciphervault.com.br/blog/v1-3-0-release#vers%C3%B5es-dos-sdks" class="hash-link" aria-label="Link direto para Versões dos SDKs" title="Link direto para Versões dos SDKs" translate="no">​</a></h2>
<p>Todos bumped pra <code>1.3.0</code>: backend, sdks/python, sdks/nodejs, sdks/java, sdks/csharp.</p>]]></content:encoded>
            <category>Release</category>
            <category>Segurança</category>
            <category>SDK</category>
            <category>LGPD</category>
        </item>
        <item>
            <title><![CDATA[CipherVault 1.2.1 — Cofres, OIDC Federation para CI/CD e refator AppConnections]]></title>
            <link>https://docs.ciphervault.com.br/blog/v1-2-1-release</link>
            <guid>https://docs.ciphervault.com.br/blog/v1-2-1-release</guid>
            <pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A versão 1.2.1 consolida três frentes que mudam como o CipherVault é usado]]></description>
            <content:encoded><![CDATA[<p>A versão <strong>1.2.1</strong> consolida três frentes que mudam como o CipherVault é usado
em produção: introduz <strong>Cofres (Vaults)</strong> como container nomeado para Secrets
e Fortress, traz <strong>OIDC Federation</strong> para CI/CD, e reorganiza
<strong>AppConnections</strong> em torno do modelo vault-based.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-novidades">✨ Novidades<a href="https://docs.ciphervault.com.br/blog/v1-2-1-release#-novidades" class="hash-link" aria-label="Link direto para ✨ Novidades" title="Link direto para ✨ Novidades" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cofres-vaults">Cofres (Vaults)<a href="https://docs.ciphervault.com.br/blog/v1-2-1-release#cofres-vaults" class="hash-link" aria-label="Link direto para Cofres (Vaults)" title="Link direto para Cofres (Vaults)" translate="no">​</a></h3>
<p>Nova entidade que agrupa Secrets normais + Fortress em containers nomeados
por ambiente (Dev / Hml / Staging / Prd):</p>
<ul>
<li class="">Tabela <code>vaults</code> com <code>secret_ids[]</code>, <code>fortress_secret_ids[]</code>, tags, status</li>
<li class="">CRUD completo em <code>/vaults</code> + <code>GET /vaults/collisions</code> (secrets em múltiplos cofres)</li>
<li class=""><strong>Validação de ambiente</strong>: vault PRD só aceita secrets PRD; secrets sem env podem ser auto-promovidos com <code>promote=true</code> (409 <code>VAULT_ENV_PROMOTE_REQUIRED</code>); hml/staging bloqueiam (409 <code>VAULT_ENV_CONFLICT</code>)</li>
<li class="">Página <code>Vaults.jsx</code> + <code>VaultForm.jsx</code> com classificação visual (ok / promote / conflict / em-múltiplos)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="oidc-federation-para-cicd">OIDC Federation para CI/CD<a href="https://docs.ciphervault.com.br/blog/v1-2-1-release#oidc-federation-para-cicd" class="hash-link" aria-label="Link direto para OIDC Federation para CI/CD" title="Link direto para OIDC Federation para CI/CD" translate="no">​</a></h3>
<p>Pipelines trocam um <code>id_token</code> OIDC por bundle de certs fresco — <strong>zero
segredo pré-compartilhado</strong>:</p>
<ul>
<li class="">Suporte a <strong>GitHub Actions, GitLab CI, CircleCI</strong> (preset automático) + <strong>Jenkins, Bamboo</strong> (via plugin OIDC) + <strong>Custom</strong> (issuer/JWKS livres)</li>
<li class=""><code>POST /app-connections/:id/federated-token</code> (público, autentica via JWT) — valida signature, iss, aud, exp, iat ≤ 10min, subject pattern com wildcard seguro</li>
<li class="">CRUD de <code>federation_configs</code> com 5 endpoints</li>
<li class=""><code>lib/federation.js</code> com cache de JWKS (5min TTL via <code>jwks-rsa</code>)</li>
<li class="">Transação <code>FOR UPDATE</code> na emissão — evita race em chamadas concorrentes</li>
<li class="">UI <code>FederationManager.jsx</code> na página de detalhe da conexão + dialog gerador de snippet pronto pra pipeline</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="appconnections--refator-vault-based">AppConnections — refator vault-based<a href="https://docs.ciphervault.com.br/blog/v1-2-1-release#appconnections--refator-vault-based" class="hash-link" aria-label="Link direto para AppConnections — refator vault-based" title="Link direto para AppConnections — refator vault-based" translate="no">​</a></h3>
<ul>
<li class="">Nova coluna <code>vault_ids[]</code> substituindo <code>secret_ids[]</code> na autorização</li>
<li class="">Página de detalhe em URL única: <code>/AppConnections/&lt;client_id&gt;</code> (UUID, não id sequencial)</li>
<li class=""><code>client_secret</code> agora prefixado com <code>CipherVault_</code> — padrão tipo <code>ghp_</code>, <code>sk-ant-</code> para detecção de leaks por scanners</li>
<li class=""><code>GET /app-connections/by-client/:clientId</code> — resolve por UUID</li>
<li class=""><code>GET /app-connections/auto-paths</code> — lista auto-derivada de <code>conexões × cofres × secrets</code></li>
<li class=""><code>POST /app-connections/:id/export-zip</code> — bundle AES-256 com senha custom (<code>archiver-zip-encrypted</code>)</li>
<li class=""><code>GET /app-connections/fetch/:clientId/:vaultName/:secretName</code> — fetch por nome (HTTP+mTLS)</li>
<li class="">Campos novos: <code>environment</code>, <code>require_dpop</code>, <code>concurrent_session_*</code>, <code>external_ca_pem</code></li>
<li class="">Path aggregators agora vinculados obrigatoriamente a uma conexão, com escopo limitado (409 <code>VAULT_OUT_OF_SCOPE</code>)</li>
<li class="">Dialog de Client Secret após criação (antes o valor aparecia só em toast fácil de perder)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="auditoria-refresh">Auditoria (refresh)<a href="https://docs.ciphervault.com.br/blog/v1-2-1-release#auditoria-refresh" class="hash-link" aria-label="Link direto para Auditoria (refresh)" title="Link direto para Auditoria (refresh)" translate="no">​</a></h3>
<ul>
<li class="">Novo helper <code>lib/audit.js</code> fire-and-forget</li>
<li class="">14+ actions novas: <code>connection_*</code>, <code>path_*</code>, <code>vault_*</code>, <code>cert_{issued,revoked,rotated}</code>, <code>bundle_exported</code>, <code>dpop_toggled</code>, <code>concurrent_policy_changed</code>, <code>federation_*</code></li>
<li class="">Frontend: coluna "Data / Hora" como primeira da tabela, formato <code>dd/MM/yyyy HH:mm:ss</code>, ícones/labels por 30+ actions</li>
<li class="">Export CSV com escape correto + filename datado</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dashboard">Dashboard<a href="https://docs.ciphervault.com.br/blog/v1-2-1-release#dashboard" class="hash-link" aria-label="Link direto para Dashboard" title="Link direto para Dashboard" translate="no">​</a></h3>
<ul>
<li class="">Removido card "Tenants Ativos" (irrelevante pro contexto de secrets)</li>
<li class="">Novos cards: "Rotação em dia (≤ 90d)" e "Rotação atrasada (&gt; 90d)"</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-segurança">🔒 Segurança<a href="https://docs.ciphervault.com.br/blog/v1-2-1-release#-seguran%C3%A7a" class="hash-link" aria-label="Link direto para 🔒 Segurança" title="Link direto para 🔒 Segurança" translate="no">​</a></h2>
<ul>
<li class="">OIDC Federation elimina necessidade de compartilhar <code>client_secret</code> com pipelines</li>
<li class="">Prefixo <code>CipherVault_</code> em client_secrets permite detecção por scanners</li>
<li class="">Export ZIP usa <strong>AES-256 real</strong> server-side (substituiu ZipCrypto legado do JSZip)</li>
<li class=""><code>iat</code> de id_tokens OIDC rejeitado se &gt; 10min (replay window reduzida)</li>
<li class="">Transações com row-lock previnem race em write-heavy cert operations</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-correções">🐛 Correções<a href="https://docs.ciphervault.com.br/blog/v1-2-1-release#-corre%C3%A7%C3%B5es" class="hash-link" aria-label="Link direto para 🐛 Correções" title="Link direto para 🐛 Correções" translate="no">​</a></h2>
<ul>
<li class="">Race em <code>cert/issue</code> com chamadas paralelas (perdia chave no read-modify-write do JWKS) — corrigido com transação <code>FOR UPDATE</code></li>
<li class="">Castle icon faltando no import da aba Paths causava white screen</li>
<li class="">Date field mismatch em AuditTable (<code>log.created_date</code> → <code>log.created_at</code>)</li>
<li class="">Federation form abria com <code>provider="github"</code> mas issuer/jwks_url vazios — preset agora auto-aplicado</li>
<li class=""><code>JWKS_KEY_NOT_FOUND</code> mostrava mensagem vazia — agora surface <code>.cause.code</code>/<code>.code</code></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-swagger">📊 Swagger<a href="https://docs.ciphervault.com.br/blog/v1-2-1-release#-swagger" class="hash-link" aria-label="Link direto para 📊 Swagger" title="Link direto para 📊 Swagger" translate="no">​</a></h2>
<p>86 paths / 29 schemas documentados (antes 70 / 18).</p>]]></content:encoded>
            <category>Release</category>
            <category>CI/CD</category>
            <category>API</category>
        </item>
    </channel>
</rss>