Last active
April 25, 2025 19:35
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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"``` |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
- 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