Adios
BlogSeguridad

Seguridad

Cómo mantener secretos fuera del código fuente

Los nombres de variables de entorno pueden estar en un manifiesto. Las credenciales no. Las referencias a secretos conservan ese límite desde el trabajo local hasta producción.

Equipo de AdiosActualizado 17 de julio de 20267 min de lectura

Un secreto guardado una vez en un commit puede sobrevivir en clones, cachés, registros y commits antiguos mucho después de eliminar la línea visible.

Guarda en un commit la referencia, no el valor

El código de la aplicación necesita nombres estables de variables de entorno. No necesita la credencial de producción de cada nombre. En un manifiesto Adios, una referencia a un secreto registra la dependencia sin guardar su valor en el repositorio.

Así se mantiene revisable el contrato de despliegue. Un compañero puede ver que la aplicación necesita DATABASE_URL o STRIPE_SECRET_KEY mientras el acceso al valor se controla por separado.

env:
  DATABASE_URL: secret://DATABASE_URL
  API_SIGNING_KEY: secret://API_SIGNING_KEY

Trata la compilación y la ejecución como destinatarios distintos

Algunas credenciales solo se necesitan al instalar dependencias u obtener código fuente privado. Otras se necesitan durante la ejecución. Dar todos los secretos a ambas fases amplía la exposición más de lo que requiere la aplicación.

Limita cada valor a la vía que lo usa y no imprimas los valores resueltos en la salida de compilación, los registros del entorno de ejecución ni los mensajes de error. Un almacén de secretos no puede proteger una credencial que la aplicación escribe en un registro público.

  • —Solo compilación: tokens de paquetes privados y claves de despliegue de Git.
  • —Solo ejecución: contraseñas de bases de datos, claves de firma y credenciales API de proveedores.
  • —Ambas fases solo cuando ambas necesiten el mismo valor.

La rotación debe ser habitual

Toda credencial acabará necesitando un cambio. Usa nombres y un comportamiento de aplicación que permitan sustituir el valor sin editar el código fuente. Para credenciales de gran impacto, prevé un período de solapamiento en el que se acepten los valores antiguos y nuevos mientras se reinician las cargas de trabajo.

Si un secreto llega a Git, rótalo primero y limpia el repositorio después. Eliminar la línea ayuda a ordenar, pero no vuelve seguro el valor expuesto.

  • —Crea la credencial de reemplazo sin desactivar la anterior.
  • —Actualiza el valor guardado y migra las cargas de trabajo al reemplazo.
  • —Verifica que los registros y la actividad del proveedor usan la nueva credencial.
  • —Revoca la credencial anterior y registra la hora de rotación.

Responde a una credencial guardada en un commit

Supón que un desarrollador guarda una URL de base de datos en un commit, la elimina en el siguiente y hace force-push de la rama. Trata la contraseña como expuesta de todos modos: un clon, una descarga de CI, un índice del editor o una caché de pull request pueden contenerla ya.

Desactiva o rota la credencial, inspecciona su registro de auditoría del proveedor, busca valores impresos accidentalmente en los registros y limpia después el historial del repositorio. Reescribir el historial reduce futuros descubrimientos; rotar elimina el acceso actual.

Todos los artículos