← All posts

Sortez votre état Terraform de l'internet public (sans monter de VPN)

Authagonal·June 22, 2026
terraformsecurityzero-trustdevopsazure

Votre fichier d'état Terraform est l'artefact le plus sensible de tout votre cloud. C'est une carte complète de chaque ressource que vous exploitez, et selon vos providers il contient aussi des secrets en clair : chaînes de connexion, mots de passe générés, clés. Par défaut, ce fichier vit dans un compte de stockage cloud avec un endpoint public, verrouillé par rien de plus qu'une clé d'accès. Si cette clé fuit, l'attaquant n'a pas à énumérer votre infrastructure. Vous lui avez tendu le plan.

Nous vendons de l'authentification. Un fournisseur d'auth qui laisse les clés de son propre royaume sur l'internet ouvert n'a rien à faire avec les vôtres. C'est pourquoi notre compte d'état de production n'expose aucune surface publique. Y arriver comporte trois pièges, et nous avons éprouvé la forme de chacun avant de bien faire.

Piège un : l'œuf et la poule

L'état distant a besoin d'un backend qui existe déjà avant que Terraform puisse s'exécuter. Mais le backend est lui-même de l'infrastructure, et vous aimeriez que Terraform le gère. Vous ne pouvez pas utiliser le compte de stockage pour stocker l'état du compte de stockage qui n'existe pas encore.

La sortie passe par un amorçage en deux phases, mené délibérément. La phase un s'exécute avec un état local et crée exactement les fondations : le compte de stockage d'état, le réseau dans lequel il vivra, et le chemin d'accès. La phase deux fait basculer le bloc backend de local vers distant et migre le fichier d'état désormais existant vers le compte qu'il vient de créer. À partir de là, cette couche d'amorçage se gère elle-même à distance comme tout le reste. C'est quelques minutes à avoir l'impression de se tenir sur une échelle que l'on est encore en train de construire, puis c'est réglé pour toujours.

Piège deux : le problème d'accès, et la taxe de la passerelle VPN

Rendre le compte privé tient en une ligne : couper l'accès réseau public et placer un endpoint privé devant. Le compte de stockage n'est désormais accessible que depuis l'intérieur de votre réseau virtuel. Ce qui est précisément le problème, car la chose qui doit l'atteindre le plus souvent, votre pipeline CI, n'est pas à l'intérieur de votre réseau virtuel. Vous non plus.

La réponse de manuel consiste à monter un VPN fournisseur. Une passerelle VPN managée, ou un hôte bastion, ou du point-à-site avec certificats clients. Quiconque a fait cela connaît la taxe : la passerelle est coûteuse et lente à provisionner, le point-à-site implique d'émettre et de faire tourner des certificats clients, chaque nouvel opérateur est un rituel de configuration, et un bastion est une boîte de plus à patcher et à payer. C'est beaucoup d'infrastructure permanente dont le seul rôle est de « laisser des gens de confiance atteindre une chose privée ».

Nous avons tout évité. Au lieu d'une passerelle VPN, un petit connecteur zero-trust tourne comme un conteneur à l'intérieur du VNet, la catégorie qu'occupent Tailscale, Twingate et Cloudflare Access. Il rejoint un maillage conscient des identités. Les personnes autorisées et le pipeline CI atteignent l'endpoint privé à travers ce maillage, authentifiés par identité, avec un accès limité exactement à la seule ressource qui en a besoin. Pas de passerelle, pas d'IP publique, pas de certificats à faire tourner, pas de machine de rebond. La CI établit sa connexion le temps d'une exécution et la démonte ensuite. Le problème d'accès disparaît sans la facture de l'infrastructure permanente.

Piège trois : le verrouillage que l'on ne peut pas faire en une seule étape

L'instinct évident est de déclarer le compte privé dès le départ, dans le même apply Terraform qui le crée. Faites cela et vous coupez le cordon avant que le chemin privé n'existe : l'apply doit écrire l'état via l'endpoint public, l'endpoint privé et le DNS ne sont pas encore câblés, et vous verrouillez Terraform, et vous-même, dehors du compte que vous êtes en train de créer. Nous avons raisonné là-dessus avant de le déclencher, ce qui est le seul moment où la répétition à blanc vit dans votre tête plutôt que dans le terminal.

Le verrouillage est donc une étape distincte délibérée, menée seulement une fois que le réseau, l'endpoint privé et le connecteur sont tous en place et éprouvés. Une seule commande fait basculer l'accès réseau public sur désactivé. À l'instant où elle prend effet, l'endpoint public disparaît, l'ancienne liste blanche d'IP devient sans objet parce qu'il ne reste plus aucune surface publique à autoriser, et chaque exécution future atteint l'état via le maillage. Nous l'avons vérifié de la seule façon qui compte : en contrôlant que le compte répond désormais depuis le chemin privé et refuse le chemin public.

L'autre moitié : aucun mot de passe à voler

Tuer l'endpoint public retire la porte réseau. Le geste correspondant consiste à s'assurer qu'aucune clé permanente ne se cache derrière non plus. Notre pipeline ne détient aucun identifiant cloud. Il s'authentifie par fédération d'identité de charge de travail : le système CI présente un jeton OIDC à courte durée de vie, le cloud fait confiance à ce jeton pour un dépôt précis, et renvoie un accès qui expire en quelques minutes. Il n'y a pas de secret de service principal qui patiente dans un coffre en attendant de fuir, parce qu'il n'y a aucun secret au départ.

L'accès à l'état suit la même règle. Terraform lit et écrit le blob d'état avec un jeton d'annuaire à courte durée de vie lié à cette identité, et non avec la clé d'accès du compte de stockage. Ainsi, les deux choses qu'un attaquant désire le plus, une voie d'entrée et un identifiant pour l'emprunter, se résument à un endpoint privé uniquement et à un jeton qui expirait déjà pendant qu'il le lisait. Rien de statique à dérober.

Pourquoi se donner cette peine

Les fichiers d'état ne fuient généralement pas parce que quelqu'un a cassé le chiffrement. Ils fuient parce que le compte était public, qu'une clé a fini dans un log, un fork ou un portable, et que rien d'autre ne barrait la route. Retirer l'endpoint public élimine toute la catégorie du « la clé a fuité » du modèle de menace. La clé devient inutile sans être aussi sur le maillage.

C'est le même principe sur lequel nous construisons le produit : ne conditionnez pas la sécurité à l'effort ou au palier, faites-le simplement, parce que l'alternative est ce que vous regrettez à 2h du matin. Chaque fonctionnalité de sécurité que nous livrons aux clients, SSO et SAML, SCIM, MFA, webhooks imposés, export d'audit, est active sur tous les plans, jamais réservée à une montée en gamme entreprise. Découvrez ce qui est inclus.