Introducción a la Automatización de Pruebas de Seguridad en el Ciclo DevOps

En fintech.works nos dedicamos a producir software para el sector de procesamiento de pagos, lo cual nos obliga a mantener un estándar de seguridad durante todo el proceso de desarrollo.
Este estándar lo mantenemos mediante un sistema que debe cumplir los siguientes requisitos:
- Accesible: No debería tomar más de 5 minutos explicar el sistema a un nuevo developer, esto también implica el uso de herramientas conocidas y prácticas tradicionales.
- Inmediato: El sistema debe reportar problemas de seguridad encontrados minutos después de haberlo integrado a una rama importante.
- Medible: Una persona ajena al desarrollo debería poder saber a fin de mes la cantidad de problemas de seguridad reportados, mitigados y en proceso de mitigación.
- Auditable: Todo el proceso debería generar logs detallados que puedan ser verificados por un agente externo.
El objetivo de este blog es mostrar los checkpoints de seguridad que implementamos para poder cumplir estos requisitos.
Happy Path
En el siguiente diagrama podemos ver el camino típico que sigue un cambio en el código fuente desde que es publicado en una rama "feature" hasta que finalmente llega a la rama "main" donde puede considerarse en producción, esto implica que este cambio está expuesto al mundo exterior y a clientes.

Siguiendo los pasos tenemos el siguiente flujo:
- Se baja la rama "main".
- Se agrega una funcionalidad nueva en una rama "feature" y se hace commit al repositorio.
- Se genera un pull-request a la rama "main" para integrar el cambio.
- Este pull request es aceptado o rechazado por un developer senior.
- Finalmente se integra a la rama "main" quedando en producción.
Checkpoint 1: White box lint
El primer checkpoint de seguridad lo encontramos en el propio IDE utilizado por los desarrolladores, para esto existe una gran variedad de linters dedicados exclusivamente a detectar problemas de seguridad como tokens en texto plano, valores de variables secretas en código y otros problemas que pueden ser llevados por error al repositorio compartido.