Saca el estado de Terraform de la internet pública (sin montar una VPN)
Tu archivo de estado de Terraform es el artefacto más sensible de toda tu nube. Es un mapa completo de cada recurso que ejecutas y, según tus proveedores, también guarda secretos en texto plano: cadenas de conexión, contraseñas generadas, claves.
Por defecto ese archivo vive en una cuenta de almacenamiento en la nube con un endpoint público, protegido con poco más que una clave de acceso. Si esa clave se filtra, el atacante no tiene que enumerar tu infraestructura. Le entregaste el plano.
Nosotros vendemos autenticación. Un proveedor de auth que deja las llaves de su propio reino en la internet abierta no tiene por qué custodiar las tuyas. Por eso nuestra cuenta de estado de producción no tiene ninguna superficie pública.
Llegar hasta ahí tiene tres trampas, y caímos en la forma de cada una antes de acertar.
Trampa uno: el huevo y la gallina
El estado remoto necesita un backend que ya exista antes de que Terraform pueda ejecutarse. Pero el backend es en sí mismo infraestructura, y te gustaría que Terraform lo gestionara. No puedes usar la cuenta de almacenamiento para guardar el estado de la cuenta de almacenamiento que todavía no existe.
La salida es un arranque deliberado en dos fases:
- Fase uno: se ejecuta con estado local y crea exactamente los cimientos: la cuenta de almacenamiento del estado, la red en la que vivirá y la ruta de acceso.
- Fase dos: cambia el bloque del backend de local a remoto y migra el archivo de estado ya existente hacia la cuenta que acaba de crear.
A partir de ahí, esa capa de arranque se gestiona a sí misma de forma remota como todo lo demás. Son unos minutos en los que sientes que estás de pie sobre una escalera que todavía estás construyendo, y luego queda hecho para siempre.
Trampa dos: el problema del alcance y el impuesto de la pasarela VPN
Hacer privada la cuenta es una sola línea: apaga el acceso público de red y pon un endpoint privado delante. Ahora la cuenta de almacenamiento solo es accesible desde dentro de tu red virtual. Lo cual es justamente el problema, porque lo que más a menudo necesita llegar a ella, tu pipeline de CI, no está dentro de tu red virtual. Tú tampoco.
La respuesta de manual es montar una VPN de proveedor. Una pasarela VPN gestionada, o un host bastión, o point-to-site con certificados de cliente. Cualquiera que haya hecho esto conoce el impuesto:
- La pasarela es cara y lenta de aprovisionar.
- Point-to-site significa emitir y rotar certificados de cliente.
- Cada operador nuevo es un ritual de configuración.
- Un bastión es una caja más que parchear y pagar.
Es mucha infraestructura permanente cuyo único trabajo es "dejar que la gente de confianza llegue a algo privado".
Nos saltamos todo eso. En lugar de una pasarela VPN, un pequeño conector de confianza cero corre como contenedor dentro de la VNet - la categoría que ocupan Tailscale, Twingate y Cloudflare Access. Se une a una malla consciente de identidad. Las personas autorizadas y el pipeline de CI llegan al endpoint privado a través de esa malla, autenticados por identidad, con el acceso acotado exactamente al único recurso que lo necesita.
Sin pasarela, sin IP pública, sin certificados que rotar, sin caja de salto. CI levanta su conexión durante lo que dura una ejecución y la desmonta al terminar. El problema del alcance desaparece sin la factura de la infraestructura permanente.
Trampa tres: el cierre que no puedes hacer en un solo paso
El instinto obvio es declarar la cuenta como privada desde el principio, en el mismo apply de Terraform que la crea. Hazlo y cortas el cordón antes de que exista la ruta privada: el apply necesita escribir el estado a través del endpoint público, el endpoint privado y el DNS aún no están cableados, y dejas a Terraform, y a ti mismo, fuera de la mismísima cuenta que estás creando.
Razonamos esto antes de dispararlo, que es la única vez en que el ensayo en seco vive en tu cabeza y no en la terminal. Así que el cierre es un paso aparte deliberado, ejecutado solo después de que la red, el endpoint privado y el conector estén todos arriba y probados.
Un comando cambia el acceso público de red a deshabilitado. En el momento en que aterriza, el endpoint público desaparece, la antigua lista blanca de IP se vuelve irrelevante porque ya no queda superficie pública sobre la que permitir nada, y cada ejecución futura llega al estado por la malla.
Lo verificamos de la única manera que cuenta: comprobando que la cuenta ahora responde desde la ruta privada y rechaza la pública.
La otra mitad: ninguna contraseña que robar
Matar el endpoint público elimina la puerta de red. El movimiento que lo acompaña es asegurarse de que tampoco haya una clave permanente detrás.
Nuestro pipeline no guarda ninguna credencial de nube. Se autentica con federación de identidad de carga de trabajo: el sistema de CI presenta un token OIDC de corta duración, la nube confía en ese token para un repositorio específico y devuelve un acceso que caduca en minutos. No hay secreto de service principal esperando en una bóveda a filtrarse, porque para empezar no hay secreto.
El acceso al estado sigue la misma regla. Terraform lee y escribe el blob de estado con un token de directorio de corta duración ligado a esa identidad, no con la clave de acceso de la cuenta de almacenamiento.
Así que las dos cosas que un atacante más quiere - una vía de entrada y una credencial para usarla - le salen como un endpoint solo privado y un token que ya estaba caducando mientras lo leía. Nada estático que llevarse.
Por qué molestarse
Los archivos de estado no suelen filtrarse porque alguien rompió el cifrado. Se filtran porque la cuenta era pública, una clave acabó en un log o en un fork o en un portátil, y nada más se interpuso en el camino.
Quitar el endpoint público elimina del modelo de amenazas toda la categoría de "la clave se filtró". La clave queda inútil sin estar además en la malla.
Es el mismo principio sobre el que construimos el producto: no condicionar la seguridad al esfuerzo ni al plan, simplemente hacerla, porque la alternativa es eso de lo que te arrepientes a las 2 de la madrugada. Cada función de seguridad que enviamos a los clientes - SSO y SAML, SCIM, MFA, webhooks forzados, exportación de auditoría - está activa en todos los planes, sin reservarse para un upsell empresarial. Mira qué incluye.
Comments
No comments yet. Start the discussion.