Usar pre-commit git hook con GitGuardian para escanear secretos

Una de las prácticas comunes en una cultura DevSecOps es el escaneo de secretos en tus repositorios. Si el secreto ha sido detectado en este punto ya será inevitable el tener que arreglar el commit, con herramientas como git filter-repo o BFG Repo-Cleaner, además de rotar la clave en cuestión por seguridad. Sin embargo, existe otra buenísima práctica que es la de verificar en local, antes de hacer el commit, de que no estás subiendo algo que no debas, y así minimizar el riesgo. Hoy quiero contarte cómo llevar a cabo esta tarea con la característica pre-commit git hook y la herramienta GitGuardian.

Instalar GitGuardian

Si todavía no la tienes en local, puedes instalarlo a través del siguiente comando:

brew install gitguardian/tap/ggshield

Antes de poder ejecutar GitGuardian necesitas generar un token para invocar a la API del servicio. Puedes conseguirlo desde el dashboard, en el apartado API, con el scope scan.

Configurar el pre-commit git hook

Ahora, si lo que quieres es que este proceso se ejecute para un repositorio en concreto, necesitas crear un archivo .env y guardar la variable de entorno GITGUARDIAN_API_KEY:

GITGUARDIAN_API_KEY=<YOUR_API_KEY>

Una vez tengas esta en su sitio ejecuta el comando para configurar tu repositorio:

ggshield install -m local

Esto generará un archivo en la ruta .git/hooks/pre-commit del mismo con el siguiente contenido:

#!/bin/bash

ggshield scan pre-commit

Para probarlo, simplemente debes añadir algún secreto 😃 En mi ejemplo, que es una API en .NET Core, he modificado el archivo appsettings.Development.json con lo siguiente:

{
    "ConnectionStrings": {
        "DefaultConnection": "Server=localhost,1433;Initial Catalog=heroes;Persist Security Info=False;User ID=sa;Password=Password1!;"
    },
    "Token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTY0MzI5NjgxNiwiZXhwIjoxNjQzMzAwNDE2fQ.pQtQdtGYfy8FzYIRIwHUEcoKGKWoOIjIehmkx5lvnug",
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
        }
    },
    "AllowedHosts": "*"
}

No te preocupes, el token es fake 🤓 .También he añadido el .env con la Api Key de GitGuardian tal y como te decía en el articulo. Si ahora intento ejecutar estos pasos:

git add .
git commit -m "try to publish a token"

El resultado será un escaneo y dos errores indicándome por qué no puedo hacer el commit:

Escaneo de secretos pre-commit con GitGuardian

En el caso de que lo quieras configurar globalmente deberías de usar este otro comando:

ggshield install -m global

El cual generaría este script en la ruta /Users/<TU_USUARIO>/.git/hooks/pre-commit con el siguiente contenido:

#!/bin/bash

if [[ -f .git/hooks/pre-commit ]]; then
    if ! .git/hooks/pre-commit $@; then
        echo 'Local pre-commit hook failed, please see output above'
        exit 1
    fi
fi
ggshield scan pre-commit

De igual forma, debes asegurarte de tener la variable de entorno GITGUARDIAN_API_KEY lista a nivel de repositorio o globalmente configurada.

¡Saludos!