Escanear imágenes de Docker en busca de secretos con GitGuardian

A veces se nos olvida lo importante que es mantener nuestros secretos a salvo, y es que las imágenes de Docker no deberían de ser una excepción. Es por ello que tenemos herramientas como GitGuardian que nos permite escanear, tanto localmente como de manera automatizada, tus imágenes en busca de secretos como contraseñas, API keys, tokens, etcétera, que hayas podido «dejarte olvidados». En este artículo te cuento cómo usarlo.

Instalación en local

Para poder escanear localmente tus imágenes lo primero que necesitas es instalar el CLI de GitGuardian, ggshield. Este proceso puedes hacerlo usando el gestor de paquetes pip:

pip install -U ggshield

Una API Key para GitGuardian

Para poder ejecutar los escaneos es necesario crear una API Key en el portal de GitGuardian, apartado API, con el scope scan.

Crear API Key con el scope scan

Guarda la misma en un archivo .env, en el mismo sitio donde vas a ejecutar el comando (o en una variable de entorno), con este formato:

GITGUARDIAN_API_KEY=<YOUR_API_KEY>

Dockerfile de ejemplo

Para probar esta herramienta, he creado el siguiente Dockerfile de ejemplo, bastante exagerado por cierto, para que puedas comprobar qué es lo que hace exactamente:

FROM node:14-alpine

ENV NODE_ENV=production

# SECRETS
ENV PASSWORD_FOR_SOMETHING="980df559c2Efe94Ec8F00FacCd8FFCb7cB72b0896EF052bEdE9"
ENV USERNAME="admin"
ENV PASSWORD="Passw0rd!"
ARG AZURE_STORAGE_ACCOUNT_KEY="MS8uDVjR4nYyJaX5KmvCLxOq6qP79oPyv6GdFavylwituEZ2xhGJgq7HN/rKpnpKRNraLo+mnW333NS1KRbRIg=="
ENV DB_USERNAME="admin"
ENV DB_PASSWORD="Passw0rd!"
ENV AWS_SECRET_ACCESS_KEY="7bGEZOxnJOwTaIj7PfcgJZ9WkIUk3kHsfa6UOEaq"
ENV CLIENT_ID="5b8f8f8f-b8f8-4f8f-8f8f-8f8f8f8f8f8f"
ENV CLIENT_SECRET="D2P949Ar6~0J-MO6_83Or~O~qwPVMfC~Rq"

WORKDIR /usr/src/app

EXPOSE 3000

RUN chown -R node /usr/src/app

USER node

CMD ["node", "index.js"]

Genera la imagen con el comando de siempre:

docker build -t ggshield-demo .

Y utiliza ggshield scan docker para revisar que tu imagen no contiene secretos:

ggshield scan docker ggshield-demo

En este ejemplo tan obvio, el resultado será el siguiente:

resultado de ggshield scan docker

Como puedes ver, no solo te dice los secretos que ha detectado, sino que además de qué tipo son (no te preocupes, ninguno de los que comparto son reales 😉 ). También puedes modificar el comportamiento de la herramienta creando un archivo llamado gitguardian.yaml en el lugar donde lo vas a ejecutar:

# Exclude files and paths by globbing
paths-ignore:
  - '**/README.md'
  - 'doc/*'
  - 'LICENSE'

# Ignore security incidents with the SHA256 of the occurrence obtained at output or the secret itself
# matches-ignore:
  # - name:
  #   match: 530e5a4a7ea00814db8845dd0cae5efaa4b974a3ce1c76d0384ba715248a5dc1
  # - name: credentials
  #   match: MY_TEST_CREDENTIAL

show-secrets: false # default: false

# By default only secrets are detected. Use all-policies to toggle this behaviour.
all-policies: false # default: false

# Set to true if the desired exit code for the CLI is always 0,
# otherwise the exit code will be 1 if incidents are found
# the environment variable GITGUARDIAN_EXIT_ZERO=true can also be used toggle this behaviour.
exit-zero: false # default: false

verbose: false # default: false

api-url: https://api.gitguardian.com

Este tipo de utilidades suelen integrarse con herramientas de CI/CD gracias al CLI. En este enlace puedes ver las que ya hay disponibles. Al final, la gracia está en que cada vez que detecte algún secreto la herramienta devolverá exit 1 y con ello puedes parar el proceso, antes de que quede público o listo para ser distribuido.

¡Saludos!

logo lemoncode

 

 

Bootcamp DevOps

Si tienes ganas de meterte en el área de DevOps, formo parte del
equipo de docentes del Bootcamp DevOps Lemoncode, ¿Te animas a
aprender con nosotros?

Más Info