Marcio Cunha

Cómo auditar secretos filtrados en GitHub y revocar accesos

Descubre cómo identificar credenciales expuestas en el código, limpiar el histórico de Git con herramientas especializadas y automatizar escaneos.

Marcio Cunha•7 min
También disponible en:PortuguêsEnglish
Resumen
  • Las credenciales olvidadas en el código fuente pueden ser descubiertas por bots automatizados a los pocos minutos de un commit público.
  • Simplemente eliminar un archivo en el commit actual no borra los datos confidenciales guardados en el histórico profundo de Git.
  • Las herramientas de escaneo especializado pueden recorrer bases de código completas en busca de patrones conocidos de claves y contraseñas.
  • Revocar inmediatamente el acceso comprometido reduce el tiempo de exposición antes de que los atacantes exploten los sistemas.
  • Automatizar revisiones en el flujo de desarrollo evita que ocurran futuras filtraciones en próximos despliegues.

El peligro silencioso de las credenciales expuestas en el código

Al desarrollar software, es común utilizar claves de acceso, contraseñas de bases de datos y tokens de API para pruebas locales. El gran problema ocurre cuando olvidamos estos datos confidenciales, conocidos como secretos, dentro del código fuente y enviamos todo a un repositorio público en GitHub. En la práctica, esto significa que cualquier bot malicioso que rastree internet puede encontrar estas claves en cuestión de minutos y usarlas para invadir servidores, extraer datos o realizar acciones financieras en tu nombre. El perjuicio puede ser gigantesco, exigiendo una reacción inmediata del equipo de ingeniería.

Incluso si notas el error rápidamente y borras el archivo con la contraseña en el commit siguiente, el daño ya podría estar hecho. Git, el sistema que usamos para controlar las versiones de nuestro código, guarda un historial completo de todo lo enviado. Esto significa que la contraseña antigua sigue grabada en las entrañas del repositorio, accesible para quien sepa dónde buscar. Antes de pensar en cualquier limpieza compleja, el primer paso indispensable es garantizar la integridad del resto del proyecto y de las herramientas relacionadas, tal como detallamos en nuestro artículo sobre cómo proteger ramas en GitHub y evitar merges con errores.

El impacto de una clave filtrada va mucho más allá de la aplicación afectada. A menudo, una sola clave de acceso a la nube otorga pase libre a toda la infraestructura de la empresa. Por esta razón, la gestión adecuada de credenciales debe ir de la mano con las estrategias corporativas de seguridad, alineándose con buenas prácticas de gestión de secretos y credenciales en ciclos de despliegue continuo para evitar exposiciones futuras. Identificar la filtración es solo el comienzo; la respuesta debe ser quirúrgica y coordinada.

Cómo identificar claves y contraseñas ocultas en el código

El primer paso para resolver el problema es saber exactamente qué fue expuesto. Hacer esto de forma manual, leyendo archivo por archivo, es inviable en proyectos medianos o grandes. Para automatizar esta búsqueda de tesoros perdidos, utilizamos herramientas dedicadas a la inspección de código en busca de patrones específicos, como largas secuencias alfanuméricas que parecen tokens de API de AWS, GitHub o pasarelas de pago.

Una de las herramientas más populares y eficientes para esta tarea es TruffleHog o Gitleaks. Analizan tanto los archivos actuales como todo el historial de modificaciones del repositorio en busca de firmas de credenciales conocidas. En la práctica, ejecutas el programa apuntando a la carpeta de tu proyecto local, y este genera un informe detallado indicando exactamente en qué línea y commit apareció la clave filtrada. Si tu equipo utiliza flujos complejos de ramificación, vale la pena entender cómo usar Git Rebase de forma segura en equipo sin romper código antes de aplicar correcciones profundas en el historial.

A continuación, observa un ejemplo práctico de cómo ejecutar un escaneo rápido usando Gitleaks directamente en tu terminal:

# Instala Gitleaks mediante el gestor de paquetes (ejemplo en macOS)brew install gitleaks# Ejecuta el escaneo en el repositorio actual y guarda el informe en JSONgitleaks detect --source . --report-path report.json --verbose

Este comando rastrea cada rincón del historial de Git y señala dónde residen los secretos. Con el informe en la mano, el equipo sabe exactamente qué claves fueron comprometidas y debe iniciar de inmediato el proceso de revocación en los paneles de los servicios respectivos.

La estrategia correcta para revocar accesos e invalidar tokens

Identificar la filtración y escanear el código son pasos fundamentales, pero el núcleo de la mitigación de riesgos es la invalidación inmediata de la credencial expuesta. Si un token de API de OpenAI o AWS ha quedado al descubierto, debe ser neutralizado en el panel del proveedor antes de hacer cualquier otra cosa. En la práctica, revocar significa decirle al sistema que esa clave ya no tiene validez, bloqueando cualquier intento futuro de uso por parte de terceros.

Tras revocar el acceso antiguo, el desarrollador debe generar una nueva credencial e inyectarla en la aplicación utilizando variables de entorno seguras o bóvedas de contraseñas dedicadas. Nunca almacenes contraseñas directamente en el código fuente o en archivos de configuración locales desprotegidos. El uso de archivos .env excluidos del control de versiones ayuda a mantener el entorno limpio, siempre y cuando dichos archivos nunca se envíen por error.

Además de cambiar la contraseña o el token filtrado, es vital revisar los registros de acceso del servicio afectado. Averigua si el atacante llegó a usar la clave durante el período en que estuvo pública. Analiza direcciones IP desconocidas, solicitudes fuera del horario comercial o picos anormales de consumo de recursos. Esta investigación forense asegura que comprendas el tamaño real del problema y puedas tomar medidas adicionales, como notificar a los clientes en caso de que se hayan visto datos sensibles.

Limpiando el historial profundo de Git

Eliminar un archivo del commit actual no borra el secreto de la base de datos de Git. Para depurar permanentemente los datos confidenciales del historial, debemos reescribir el pasado del repositorio. Herramientas como BFG Repo-Cleaner o el comando nativo git filter-repo son los estándares de la industria para esta delicada cirugía. En la práctica, estas herramientas reemplazan la cadena secreta por asteriscos o eliminan el archivo de todos los commits anteriores.

Vale la pena señalar que reescribir el historial altera los identificadores (hashes) de todos los commits modificados. Esto significa que, si otras personas están trabajando en el mismo proyecto, necesitarán sincronizar sus entornos cuidadosamente para no corromper el repositorio remoto. A continuación se muestra un ejemplo de cómo utilizar git filter-repo para eliminar un archivo completo que contenía contraseñas:

# Asegúrate de tener python y git-filter-repo instalados# Elimina el archivo con credenciales de todo el historial del repositoriogit filter-repo --path config/secrets.yml --invert-paths# Fuerza la actualización del repositorio remoto para sobrescribir el historial antiguoGit push origin --force --all

Una vez ejecutado este comando, el archivo problemático deja de existir en cualquier versión anterior del proyecto. Todos los colaboradores deberán clonar el repositorio nuevamente o hacer un pull forzado para alinear sus copias locales con la nueva realidad limpia.

Automatizando escaneos para evitar nuevas filtraciones

La mejor manera de lidiar con secretos filtrados es evitar que lleguen a GitHub. Para alcanzar este nivel de madurez operativa, implementamos ganchos de pre-confirmación (git hooks) y verificaciones automatizadas en las tuberías de integración continua (CI/CD). En la práctica, esto crea una barrera infranqueable que bloquea el comando git push si se detecta cualquier patrón sospechoso en los archivos modificados.

Herramientas como pre-commit permiten configurar verificaciones automáticas en la máquina de cada desarrollador antes de que el código salga del ordenador local. Si alguien intenta hacer commit de un archivo con una clave de API por accidente, la terminal mostrará un error claro y detendrá la acción. Este enfoque educativo fortalece la cultura de seguridad del equipo de forma continua, convirtiendo la prevención en un hábito diario.

Integrar estos escaneos en los servidores de integración continua añade una segunda línea de defensa. Incluso si un desarrollador ignora las advertencias locales, la tubería de compilación fallará automáticamente al detectar cualquier credencial expuesta en el repositorio remoto. De esta manera, la seguridad deja de depender exclusivamente de la atención humana y pasa a estar garantizada por procesos automatizados y resilientes.

Filtrar secretos en GitHub es un incidente estresante, pero perfectamente manejable si el equipo actúa con rapidez, método y organización. La combinación de escaneos profundos en el historial de Git, la revocación inmediata de accesos en los proveedores de nube y la adopción de automatizaciones preventivas asegura que el error no se repita. Recuerda que la seguridad de la información es un viaje continuo de mejora de los procesos y herramientas que utilizamos a diario en el desarrollo de software.

Al establecer rutinas rigurosas de revisión e invertir en la educación del equipo, transformamos las vulnerabilidades en oportunidades para aprender y fortalecer la infraestructura. Mantén tus entornos monitoreados, utiliza bóvedas de contraseñas adecuadas y asegúrate de que tu base de código permanezca siempre libre de sorpresas indeseadas.