← All posts

Tire o seu estado do Terraform da Internet pública (sem montar uma VPN)

Authagonal·June 22, 2026
terraformsecurityzero-trustdevopsazure

O ficheiro de estado do Terraform é o artefacto mais sensível de toda a sua cloud. É um mapa completo de cada recurso que executa e, consoante os seus providers, também guarda segredos em texto simples: strings de ligação, palavras-passe geradas, chaves. Por omissão, esse ficheiro vive numa conta de armazenamento na cloud com um endpoint público, protegido apenas por uma chave de acesso. Se essa chave vazar, o atacante não tem de enumerar a sua infraestrutura. Acaba de lhe entregar o diagrama.

Nós vendemos autenticação. Um fornecedor de auth que deixa as chaves do seu próprio reino na Internet aberta não tem qualquer legitimidade para guardar as suas. Por isso, a nossa conta de estado de produção não tem qualquer superfície pública. Chegar lá tem três armadilhas, e tropeçámos na forma de cada uma antes de a acertar.

Armadilha um: o ovo e a galinha

O estado remoto precisa de um backend que já exista antes de o Terraform poder correr. Mas o backend é, ele próprio, infraestrutura, e o ideal é que o Terraform o gira. Não pode usar a conta de armazenamento para guardar o estado da conta de armazenamento que ainda não existe.

A saída é um bootstrap deliberado em duas fases. A fase um corre com estado local e cria exatamente a fundação: a conta de armazenamento do estado, a rede onde vai viver e o caminho de acesso. A fase dois muda o bloco de backend de local para remoto e migra o ficheiro de estado, agora já existente, para dentro da conta que acabou de criar. A partir daí, essa camada de bootstrap gere-se a si própria de forma remota, como tudo o resto. São uns minutos a sentir que está em cima de uma escada que ainda está a construir, e depois fica feito para sempre.

Armadilha dois: o problema do alcance, e o imposto da gateway de VPN

Tornar a conta privada é uma linha: desligar o acesso de rede público e pôr um endpoint privado à frente dela. Agora a conta de armazenamento só é alcançável de dentro da sua rede virtual. O que é exatamente o problema, porque aquilo que mais precisa de lhe chegar, o seu pipeline de CI, não está dentro da sua rede virtual. E você também não.

A resposta dos manuais é montar uma VPN do provider. Uma gateway de VPN gerida, ou um host bastion, ou point-to-site com certificados de cliente. Quem já fez isto conhece o imposto: a gateway é cara e lenta de aprovisionar, o point-to-site obriga a emitir e rodar certificados de cliente, cada novo operador é um ritual de configuração, e um bastion é mais uma caixa para corrigir e pagar. É muita infraestrutura permanente cuja única função é "deixar pessoas de confiança chegar a uma coisa privada."

Nós dispensámos tudo isso. Em vez de uma gateway de VPN, um pequeno conector zero-trust corre como container dentro da VNet, a categoria que o Tailscale, o Twingate e o Cloudflare Access ocupam. Junta-se a uma malha consciente de identidade. As pessoas autorizadas e o pipeline de CI chegam ao endpoint privado através dessa malha, autenticadas por identidade, com o acesso restringido exatamente ao único recurso que precisa dele. Sem gateway, sem IP público, sem certificados para rodar, sem jump box. O CI levanta a sua ligação durante uma execução e desfá-la a seguir. O problema do alcance desaparece sem a fatura da infraestrutura permanente.

Armadilha três: o bloqueio que não se faz num só passo

O instinto óbvio é declarar a conta como privada logo de início, no mesmo apply do Terraform que a cria. Faça isso e corta o cordão antes de o caminho privado existir: o apply precisa de escrever o estado através do endpoint público, o endpoint privado e o DNS ainda não estão ligados, e tranca o Terraform, e a si próprio, do lado de fora da própria conta que está a criar. Raciocinámos sobre isto antes de o despoletar, que é a única vez em que o dry run vive na sua cabeça em vez de no terminal.

Por isso, o bloqueio é um passo separado e deliberado, executado só depois de a rede, o endpoint privado e o conector estarem todos de pé e comprovados. Um comando muda o acesso de rede público para desativado. No momento em que isto entra, o endpoint público desaparece, a antiga lista de IPs permitidos torna-se irrelevante porque já não há superfície pública onde permitir o que quer que seja, e toda a execução futura chega ao estado através da malha. Verificámo-lo da única forma que conta: confirmando que a conta agora responde a partir do caminho privado e recusa o público.

A outra metade: nenhuma palavra-passe para roubar

Matar o endpoint público remove a porta de rede. O movimento correspondente é garantir que também não há nenhuma chave permanente por detrás dela. O nosso pipeline não guarda nenhuma credencial de cloud. Autentica-se com federação de identidade de workload: o sistema de CI apresenta um token OIDC de curta duração, a cloud confia nesse token para um repositório específico e devolve um acesso que expira em minutos. Não há nenhum segredo de service principal sentado num cofre à espera de vazar, porque não há segredo nenhum para começar.

O acesso ao estado segue a mesma regra. O Terraform lê e escreve o blob de estado com um token de diretório de curta duração ligado a essa identidade, não com a chave de acesso da conta de armazenamento. Por isso, as duas coisas que um atacante mais quer, uma forma de entrar e uma credencial para a usar, saem como um endpoint só privado e um token que já estava a expirar enquanto o liam. Nada estático para levantar.

Porquê dar-se ao trabalho

Os ficheiros de estado normalmente não vazam porque alguém quebrou a encriptação. Vazam porque a conta era pública, uma chave foi parar a um log, a um fork ou a um portátil, e mais nada estava no caminho. Tirar o endpoint público remove do modelo de ameaça toda a classe de "a chave vazou." A chave torna-se inútil sem estar também na malha.

É o mesmo princípio sobre o qual construímos o produto: não condicionar a segurança a esforço ou a escalão, simplesmente fazê-la, porque a alternativa é aquilo de que nos arrependemos às 2 da manhã. Cada funcionalidade de segurança que entregamos aos clientes, SSO e SAML, SCIM, MFA, webhooks impostos, exportação de auditoria, está ativa em todos os planos, sem ser retida para um upsell empresarial. Veja o que está incluído.