Hay muchísimo escrito sobre seguridad en Docker y sobre cómo escribir un Dockerfile seguro. Una búsqueda rápida te da consejos y buenas prácticas para aburrir.

Muy bien. Pero sigue quedando un problema gordo que esos posts no resuelven: cómo automatizar la comprobación.

Pasos para construir una imagen de Docker

Construir una imagen de Docker tiene dos pasos:

  • Escribir el Dockerfile.

  • Construir la imagen a partir de ese Dockerfile.

Este post va del primero, el contenido del Dockerfile. Las comprobaciones de seguridad sobre imágenes ya construidas las dejo para otro post.

Automatizar las comprobaciones de seguridad en Dockerfiles

Los equipos de seguridad suelen andar cortos de gente. Así que la única forma realista de meter seguridad en el pipeline de desarrollo es automatizarla.

Da igual qué pipeline uses (Jenkins, Bamboo, GitHub Actions, GitLab pipelines, Bitbucket pipelines…). La idea es siempre la misma: si aparece un problema crítico en el Dockerfile, la construcción se para.

Llegados aquí lo normal sería irte a GitHub a buscar alguna herramienta que compruebe Dockerfiles de forma automática. No hace falta. Ya lo he hecho yo por ti.

Las dos más interesantes que encontré:

  • Hadolint: https://github.com/hadolint/hadolint

  • Dockerfile-security: https://github.com/cr0hn/dockerfile-security (spoiler: la escribí yo)

Vamos a ver las dos.

Hadolint

Hadolint es una herramienta muy buena. Funciona con reglas y trae un montón integradas, y no solo de seguridad.

Es un binario único, muy rápido, escrito en Haskell. Además tiene un buen puñado de opciones para personalizar el análisis.

El proyecto tiene una versión online, así que puedes probarla sin instalar nada:

hadolint

Dockerfile-security

Dockerfile-security es menos ambiciosa que Hadolint. Es más simple, y se diseñó desde el principio para correr dentro de un sistema de CI (integración continua).

El foco es la seguridad. Como Hadolint, funciona con reglas. También es rápida, está escrita en Python y se instala con pip.

Trae algunas reglas genéricas integradas (las core rules) y otras para escenarios concretos (reglas específicas de Java, por ejemplo).

dockerfile-security

Hadolint contra Dockerfile-security

Cada una tiene sus puntos fuertes y sus flojos.

Ventajas de Hadolint

  • Un buen catálogo de reglas integradas, no solo de seguridad.

  • Binario independiente.

  • Muy rápida.

  • Feedback claro de los problemas que encuentra.

  • Versión online.

Desventajas de Hadolint

  • Está escrita en Haskell, así que si necesitas una regla nueva tienes que escribirla en Haskell y recompilar la herramienta.

  • No tiene ninguna opción para exportar los resultados en un formato que se pueda parsear, como JSON o XML.

Ventajas de Dockerfile-security

  • Centrada en seguridad.

  • Centrada en DevSecOps.

  • Muy rápida.

  • Feedback claro de los problemas que encuentra.

  • Añadir reglas nuevas es fácil. Las reglas son ficheros YAML planos.

  • Las reglas se pueden traer de sitios remotos, basta con darle la URL completa.

  • Los resultados se pueden exportar como un fichero JSON.

Desventajas de Dockerfile-security

  • Las reglas son más simples que las de Hadolint.

  • No es un binario independiente.

¿Cuál usar, Hadolint o Dockerfile-security?

No hay una respuesta correcta. Depende de lo que necesites:

  • Si quieres algo más que reglas de seguridad, Hadolint es una buena opción.

  • Si necesitas tus propias reglas, Dockerfile-security es la mejor elección.

Y hay una tercera opción: ¿por qué limitarse a una? Las dos son rápidas y fáciles de meter en un pipeline. Así que… ¿por qué no usar las dos?

Más posts de la serie DevSecOps

DevSecOps series No. 1 — Rompiendo el CI/CD usando repositorios Git maliciosos

DevSecOps series No. 3: Problemas de toda la vida en DevOps, las bombas zip

DevSecOps series No. 4: Protegiendo las variables de entorno en los sistemas de CI más conocidos