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.

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:

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!

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?