Skip to content

Instantly share code, notes, and snippets.

@alonsoir
Last active April 25, 2025 19:35
Show Gist options
  • Save alonsoir/c58e6d72543875bc90fc228cd01400f6 to your computer and use it in GitHub Desktop.
Save alonsoir/c58e6d72543875bc90fc228cd01400f6 to your computer and use it in GitHub Desktop.
Este comando bash trata de averiguar vulnerabilidades en tu instalacion docker, comprobando si hay imagenes y contenedores que puedan usar el socket docker, o ejecutarse con --privileged entre otras muchas cosas. Basicamente es un wrapper trivy y checkov que a examinar todos los contenedores e imagenes de tu anfitrion.
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n'
##### CONFIGURACIÓN #####
OUTPUT_DIR="./output"
SKIP_PDF=false
SEND_MAIL=false
EMAIL_RECIPIENT="[email protected]"
HELP=false
declare -a IMAGES
show_help(){
cat <<EOF
Uso: $0 [opciones] [imagen1 imagen2...]
Si no se pasan imágenes, escanea todas las locales y en ejecución.
Opciones:
--output-dir DIR Directorio de salida (por defecto: ./output)
--skip-pdf No generar PDF
--send-mail Enviar report.pdf por mailx a $EMAIL_RECIPIENT
--help Mostrar esta ayuda
EOF
exit 0
}
# Parsear flags
while (( $# )); do
case $1 in
--output-dir) OUTPUT_DIR="$2"; shift 2;;
--skip-pdf) SKIP_PDF=true; shift;;
--send-mail) SEND_MAIL=true; shift;;
--help) show_help;;
*) IMAGES+=("$1"); shift;;
esac
done
mkdir -p "$OUTPUT_DIR"
##### HERRAMIENTAS #####
tools=(
"ghcr.io/aquasecurity/trivy:latest"
"bridgecrew/checkov:latest"
"anchore/syft:latest"
"wagoodman/dive:latest"
"instrumentisto/nmap:latest"
)
echo "🔄 Pre-pull de herramientas..."
for t in "${tools[@]}"; do
echo -n " • pull $t: "
if docker pull "$t" &>/dev/null; then echo "✅"; else echo "❌"; fi
done
##### IMÁGENES A ESCANEAR #####
if [ ${#IMAGES[@]} -eq 0 ]; then
# locales
while read -r repo tag; do
[[ "$repo"=="<none>" ]] && continue
IMAGES+=("$repo:$tag")
done < <(docker images --format '{{.Repository}} {{.Tag}}')
# en ejecución
while read -r img; do
IMAGES+=("$img")
done < <(docker ps --format '{{.Image}}')
fi
# dedupe
IMAGES=($(printf "%s\n" "${IMAGES[@]}" | sort -u))
[ ${#IMAGES[@]} -gt 0 ] || { echo "❌ No hay imágenes para auditar."; exit 1; }
echo "🖼️ Imágenes a auditar:"
for img in "${IMAGES[@]}"; do echo " - $img"; done
##### FUNCIONES #####
check_security(){
local image=$1
local ok=0
if docker inspect "$image" 2>/dev/null | grep -q '"Privileged": true'; then
echo " ⚠️ $image usa --privileged"; ok=1
fi
if docker inspect "$image" 2>/dev/null | grep -q '/var/run/docker.sock'; then
echo " ⚠️ $image monta docker.sock"; ok=1
fi
return $ok
}
download_image(){
local i=$1
echo -n " • pull $i: "
if docker pull "$i" &>/dev/null; then echo "✅"; else echo "❌"; fi
}
scan_image(){
local image=$1
local safe=${image//[:\/]/_}
echo "🔍 $image"
# Trivy
echo -n " - Trivy: "
if docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$PWD/$OUTPUT_DIR":/output \
ghcr.io/aquasecurity/trivy:latest image \
--quiet --format json --output /output/"$safe"-trivy.json "$image"; then
echo "✅"; else echo "❌"; fi
# Checkov (requiere BC_API_KEY)
if [ -n "${BC_API_KEY-}" ]; then
echo -n " - Checkov: "
if docker run --rm \
-e BC_API_KEY="$BC_API_KEY" \
-v "$PWD/$OUTPUT_DIR":/output \
bridgecrew/checkov:latest \
--docker-image "$image" \
--output-file-path /output/"$safe"-checkov.md; then
echo "✅"; else echo "❌"; fi
else
echo " - Checkov: ⚠️ salto (falta BC_API_KEY)"
fi
# Syft
echo -n " - Syft: "
if docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$PWD/$OUTPUT_DIR":/output \
anchore/syft:latest "$image" -o json \
>"$OUTPUT_DIR/$safe"-syft.json; then
echo "✅"; else echo "❌"; fi
# Dive
echo -n " - Dive: "
if docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$PWD/$OUTPUT_DIR":/output \
wagoodman/dive:latest "$image"; then
echo "✅"; else echo "❌"; fi
# Nmap
echo -n " - Nmap: "
if docker run --rm --net host \
instrumentisto/nmap:latest -p- --open "$image" \
-oN /output/"$safe"-nmap.txt; then
echo "✅"; else echo "❌"; fi
}
generate_pdf(){
local mds=( "$OUTPUT_DIR"/*-checkov.md )
if [ ${#mds[@]} -gt 0 ] && [ "$SKIP_PDF" = false ]; then
echo "🖨️ Generando PDF..."
if pandoc -s "${mds[@]}" -o "$OUTPUT_DIR"/report.pdf; then
echo " ✅ report.pdf"; else echo " ❌"; fi
else
echo "⚠️ No hay Checkov.md o --skip-pdf activo"
fi
}
send_mail(){
if [ "$SEND_MAIL" = true ]; then
if command -v mailx &>/dev/null; then
echo "📧 Enviando correo..."
mailx -s "Informe Auditoría Docker" -a "$OUTPUT_DIR"/report.pdf \
"$EMAIL_RECIPIENT" < /dev/null \
&& echo " ✅ correo enviado"
else
echo "⚠️ mailx no instalado"
fi
fi
}
##### EJECUCIÓN #####
echo "==== DESCARGA IMÁGENES ===="
for img in "${IMAGES[@]}"; do download_image "$img"; done
echo "==== ESCANEO ===="
for img in "${IMAGES[@]}"; do
if check_security "$img"; then
scan_image "$img"
else
echo " ❌ $img omitida"
fi
done
echo "==== INFORMES ===="
generate_pdf
echo "==== CORREO ===="
send_mail
echo "✅ Listo. Revisa $OUTPUT_DIR"```
#!/bin/bash
# Comprobación previa: Docker
if ! command -v docker >/dev/null 2>&1; then
echo "❌ Docker no está instalado o no está en el PATH."
exit 1
fi
# Comprobación de imágenes necesarias
NEEDED_IMAGES=("aquasec/trivy:latest" "bridgecrew/checkov:latest")
for IMAGE in "${NEEDED_IMAGES[@]}"; do
if ! docker image inspect "$IMAGE" >/dev/null 2>&1; then
echo "🔄 Descargando imagen necesaria: $IMAGE"
docker pull "$IMAGE"
fi
done
# Variables de archivos
TIMESTAMP=$(date '+%Y-%m-%d_%H-%M-%S')
LOG_FILE="docker_analysis.log"
AUDIT_MD="docker_audit_report.md"
AUDIT_PDF="docker_audit_report.pdf"
TRIVY_JSON="trivy_report.json"
# Limpieza inicial
> "$LOG_FILE"
> "$AUDIT_MD"
echo "Informe de Auditoría de Contenedores Docker" >> "$AUDIT_MD"
echo "==========================================" >> "$AUDIT_MD"
echo "" >> "$AUDIT_MD"
echo "Fecha de Auditoría: $(date)" >> "$AUDIT_MD"
echo "" >> "$AUDIT_MD"
echo "## Revisión de Imágenes Docker" >> "$AUDIT_MD"
docker images --format "{{.Repository}}:{{.Tag}}" | while read -r image; do
echo "" | tee -a "$LOG_FILE" "$AUDIT_MD"
echo " - Analizando imagen: $image" | tee -a "$LOG_FILE" "$AUDIT_MD"
ports=$(docker inspect --format='{{range .Config.ExposedPorts}}{{println .}}{{end}}' "$image" 2>/dev/null)
if [ -z "$ports" ]; then
echo " - La imagen $image no expone puertos." | tee -a "$LOG_FILE" "$AUDIT_MD"
else
echo " - La imagen $image expone los siguientes puertos: ${ports}" | tee -a "$LOG_FILE" "$AUDIT_MD"
fi
# Trivy via Docker
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
-v "$(pwd):/root/reports" aquasec/trivy:latest \
image --severity HIGH,CRITICAL --format json -o "/root/reports/$TRIVY_JSON" "$image" > /dev/null 2>&1
if grep -q '"Vulnerabilities":\[\]' "$TRIVY_JSON"; then
echo " - No se encontraron vulnerabilidades conocidas en la imagen $image." | tee -a "$LOG_FILE" "$AUDIT_MD"
else
echo " - ¡Se encontraron vulnerabilidades en $image! Revisa $TRIVY_JSON para más detalles." | tee -a "$LOG_FILE" "$AUDIT_MD"
fi
done
echo "" >> "$AUDIT_MD"
echo "## Revisión de Contenedores Activos" >> "$AUDIT_MD"
echo "" >> "$AUDIT_MD"
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Status}}" >> "$AUDIT_MD"
# Checkov via Docker (opcional)
echo "" | tee -a "$LOG_FILE"
echo "Ejecutando análisis de IaC con Checkov (si hay ficheros compatibles)..." | tee -a "$LOG_FILE"
docker run --rm -v "$(pwd):/data" bridgecrew/checkov:latest -d /data >> "$LOG_FILE" 2>&1
# PDF opcional con pandoc
if command -v pandoc >/dev/null 2>&1; then
echo "Generando PDF del informe con pandoc..." | tee -a "$LOG_FILE"
pandoc "$AUDIT_MD" -o "$AUDIT_PDF"
echo "PDF generado: $AUDIT_PDF" | tee -a "$LOG_FILE"
else
echo "⚠️ pandoc no está instalado. Para generar PDF instala pandoc manualmente." | tee -a "$LOG_FILE"
echo " Puedes instalarlo con: sudo apt install pandoc" | tee -a "$LOG_FILE"
fi
echo "" | tee -a "$LOG_FILE"
echo "✅ Informe generado con éxito:" | tee -a "$LOG_FILE"
echo " - $AUDIT_MD (Markdown)" | tee -a "$LOG_FILE"
echo " - $AUDIT_PDF (si pandoc está instalado)" | tee -a "$LOG_FILE"
echo " - $TRIVY_JSON (vulnerabilidades)" | tee -a "$LOG_FILE"
echo " - $LOG_FILE (log del análisis)" | tee -a "$LOG_FILE"
- Analizando imagen: bridgecrew/checkov:latest
- La imagen bridgecrew/checkov:latest no expone puertos.
- ¡Se encontraron vulnerabilidades en bridgecrew/checkov:latest! Revisa trivy_report.json para más detalles.
- Analizando imagen: aquasec/trivy:latest
- La imagen aquasec/trivy:latest no expone puertos.
- ¡Se encontraron vulnerabilidades en aquasec/trivy:latest! Revisa trivy_report.json para más detalles.
- Analizando imagen: <none>:<none>
- La imagen <none>:<none> no expone puertos.
- ¡Se encontraron vulnerabilidades en <none>:<none>! Revisa trivy_report.json para más detalles.
- Analizando imagen: mysql:8.0
- La imagen mysql:8.0 expone los siguientes puertos: {}
{}
- ¡Se encontraron vulnerabilidades en mysql:8.0! Revisa trivy_report.json para más detalles.
- Analizando imagen: docker/desktop-kubernetes:kubernetes-v1.32.2-cni-v1.6.0-critools-v1.31.1-cri-dockerd-v0.3.16-1-debian
- La imagen docker/desktop-kubernetes:kubernetes-v1.32.2-cni-v1.6.0-critools-v1.31.1-cri-dockerd-v0.3.16-1-debian no expone puertos.
- ¡Se encontraron vulnerabilidades en docker/desktop-kubernetes:kubernetes-v1.32.2-cni-v1.6.0-critools-v1.31.1-cri-dockerd-v0.3.16-1-debian! Revisa trivy_report.json para más detalles.
- Analizando imagen: registry.k8s.io/kube-apiserver:v1.32.2
- La imagen registry.k8s.io/kube-apiserver:v1.32.2 no expone puertos.
- ¡Se encontraron vulnerabilidades en registry.k8s.io/kube-apiserver:v1.32.2! Revisa trivy_report.json para más detalles.
- Analizando imagen: registry.k8s.io/kube-proxy:v1.32.2
- La imagen registry.k8s.io/kube-proxy:v1.32.2 no expone puertos.
- ¡Se encontraron vulnerabilidades en registry.k8s.io/kube-proxy:v1.32.2! Revisa trivy_report.json para más detalles.
- Analizando imagen: registry.k8s.io/kube-scheduler:v1.32.2
- La imagen registry.k8s.io/kube-scheduler:v1.32.2 no expone puertos.
- ¡Se encontraron vulnerabilidades en registry.k8s.io/kube-scheduler:v1.32.2! Revisa trivy_report.json para más detalles.
- Analizando imagen: registry.k8s.io/kube-controller-manager:v1.32.2
- La imagen registry.k8s.io/kube-controller-manager:v1.32.2 no expone puertos.
- ¡Se encontraron vulnerabilidades en registry.k8s.io/kube-controller-manager:v1.32.2! Revisa trivy_report.json para más detalles.
- Analizando imagen: hello-world:latest
- La imagen hello-world:latest no expone puertos.
- ¡Se encontraron vulnerabilidades en hello-world:latest! Revisa trivy_report.json para más detalles.
- Analizando imagen: redis:7
- La imagen redis:7 expone los siguientes puertos: {}
- ¡Se encontraron vulnerabilidades en redis:7! Revisa trivy_report.json para más detalles.
- Analizando imagen: testcontainers/ryuk:0.11.0
- La imagen testcontainers/ryuk:0.11.0 no expone puertos.
- ¡Se encontraron vulnerabilidades en testcontainers/ryuk:0.11.0! Revisa trivy_report.json para más detalles.
- Analizando imagen: registry.k8s.io/etcd:3.5.16-0
- La imagen registry.k8s.io/etcd:3.5.16-0 expone los siguientes puertos: {}
{}
{}
{}
- ¡Se encontraron vulnerabilidades en registry.k8s.io/etcd:3.5.16-0! Revisa trivy_report.json para más detalles.
- Analizando imagen: testcontainers/ryuk:0.9.0
- La imagen testcontainers/ryuk:0.9.0 no expone puertos.
- ¡Se encontraron vulnerabilidades en testcontainers/ryuk:0.9.0! Revisa trivy_report.json para más detalles.
- Analizando imagen: registry.k8s.io/coredns/coredns:v1.11.3
- La imagen registry.k8s.io/coredns/coredns:v1.11.3 expone los siguientes puertos: {}
{}
- ¡Se encontraron vulnerabilidades en registry.k8s.io/coredns/coredns:v1.11.3! Revisa trivy_report.json para más detalles.
- Analizando imagen: registry.k8s.io/pause:3.10
- La imagen registry.k8s.io/pause:3.10 no expone puertos.
- ¡Se encontraron vulnerabilidades en registry.k8s.io/pause:3.10! Revisa trivy_report.json para más detalles.
- Analizando imagen: mysql:8.0.36-debian
- La imagen mysql:8.0.36-debian expone los siguientes puertos: {}
{}
- ¡Se encontraron vulnerabilidades en mysql:8.0.36-debian! Revisa trivy_report.json para más detalles.
- Analizando imagen: docker/desktop-vpnkit-controller:dc331cb22850be0cdd97c84a9cfecaf44a1afb6e
- La imagen docker/desktop-vpnkit-controller:dc331cb22850be0cdd97c84a9cfecaf44a1afb6e no expone puertos.
- ¡Se encontraron vulnerabilidades en docker/desktop-vpnkit-controller:dc331cb22850be0cdd97c84a9cfecaf44a1afb6e! Revisa trivy_report.json para más detalles.
- Analizando imagen: docker/desktop-storage-provisioner:v2.0
- La imagen docker/desktop-storage-provisioner:v2.0 no expone puertos.
- ¡Se encontraron vulnerabilidades en docker/desktop-storage-provisioner:v2.0! Revisa trivy_report.json para más detalles.
Ejecutando análisis de IaC con Checkov (si hay ficheros compatibles)...
Generando PDF del informe con pandoc...
PDF generado: docker_audit_report.pdf
✅ Informe generado con éxito:
- docker_audit_report.md (Markdown)
- docker_audit_report.pdf (si pandoc está instalado)
- trivy_report.json (vulnerabilidades)
- docker_analysis.log (log del análisis)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment