Security Scanner¶
Descripción¶
El Security Scanner es un contenedor Docker dedicado que contiene todas las herramientas necesarias para realizar análisis de seguridad en el proyecto AltruPets. Se ejecuta como Kubernetes Jobs o CronJobs para escanear código, dependencias, imágenes y configuraciones de infraestructura.
Arquitectura¶
Separación de Responsabilidades¶
graph LR
A[Backend Container] --> B["Node.js + App"]
C[Security Scanner] --> D[Security Tools]
style A fill:#e1f5e1
style B fill:#d4edda
style C fill:#fff3cd
style D fill:#f8d7da
¿Por qué un contenedor separado?¶
| Aspecto | Backend Container | Security Scanner |
|---|---|---|
| Propósito | Ejecutar la aplicación | Escanear seguridad |
| Tamaño | ~150MB (alpine) | ~2GB (con herramientas) |
| Entorno | Producción | CI/CD + Dev |
| Contenido | Solo runtime necesario | Todas las herramientas de seguridad |
| Principio | Mínima superficie de ataque | Máxima cobertura de análisis |
Beneficios de la Separación
- ✅ Imágenes de producción más pequeñas y seguras
- ✅ Despliegues más rápidos del backend
- ✅ Herramientas de seguridad aisladas de producción
- ✅ Escaneos programables independientes
- ✅ Versionado único de herramientas de seguridad
Anti-patrón (lo que NO hacemos)
- ❌ Instalar herramientas de seguridad en el Dockerfile del backend
- ❌ Mezclar dependencias de runtime con herramientas de análisis
- ❌ Exponer herramientas de seguridad en contenedores de producción
Herramientas Incluidas¶
Análisis de Vulnerabilidades¶
| Herramienta | Versión | Propósito |
|---|---|---|
| Trivy | 0.69.1 | Escaneo de contenedores y filesystem |
| npm audit | (Node 20.x) | Vulnerabilidades en dependencias Node.js |
| Safety | latest | Vulnerabilidades en dependencias Python |
Análisis Estático (SAST)¶
| Herramienta | Versión | Propósito |
|---|---|---|
| dart analyze | (Flutter stable) | Análisis estático de código Dart |
| ESLint | (via npm) | Análisis de código TypeScript/JavaScript |
| Bandit | latest | Análisis de seguridad en código Python |
Detección de Secretos¶
| Herramienta | Versión | Propósito |
|---|---|---|
| Trufflehog | 2.2.1 | Detección de secretos en código y commits |
Infrastructure as Code (IaC)¶
| Herramienta | Versión | Propósito |
|---|---|---|
| tfsec | 1.28.14 | Análisis de seguridad para Terraform |
| Checkov | 3.2.504 | Análisis de IaC multi-cloud (Terraform, K8s, Docker) |
Uso¶
Build Local¶
docker build -t altrupets/security-scanner:1.0.0 \
-f infrastructure/docker/security-scanner/Dockerfile .
Ejecución Local¶
# Escaneo completo
docker run --rm \
-v $(pwd):/workspace \
-v $(pwd)/.security-reports:/reports \
altrupets/security-scanner:1.0.0 all
# Escaneo específico
docker run --rm \
-v $(pwd):/workspace \
-v $(pwd)/.security-reports:/reports \
altrupets/security-scanner:1.0.0 deps
Makefile Commands¶
# Escaneo completo
make dev-security-scan
# Escaneos específicos
make dev-security-deps # Dependencias
make dev-security-sast # Análisis estático
make dev-security-secrets # Detección de secretos
make dev-security-container # Imágenes de contenedor
make dev-security-iac # Infrastructure as Code
# Auto-fix vulnerabilidades
make dev-security-fix
Kubernetes Job (On-Demand)¶
# Ejecutar escaneo manual
kubectl create job security-scan-manual \
--from=cronjob/security-scanner \
-n altrupets-dev
# Ver logs
kubectl logs -f job/security-scan-manual -n altrupets-dev
# Ver reportes
kubectl exec -it security-scan-manual-xxxxx -n altrupets-dev \
-- ls -la /reports
Kubernetes CronJob (Programado)¶
El scanner se ejecuta automáticamente todos los días a las 2:00 AM:
# Ver próximas ejecuciones
kubectl get cronjob security-scanner -n altrupets-dev
# Ver historial de Jobs
kubectl get jobs -n altrupets-dev -l app=security-scanner
# Ver logs del último escaneo
kubectl logs -f $(kubectl get pods -n altrupets-dev \
-l app=security-scanner --sort-by=.metadata.creationTimestamp \
-o jsonpath='{.items[-1].metadata.name}')
Tipos de Escaneo¶
1. Dependencias (deps)¶
Escanea vulnerabilidades en dependencias de paquetes:
Herramientas:
- npm audit para Node.js
- safety para Python
- flutter pub outdated --mode=security para Dart
Salida:
- .security-reports/npm-audit.json
- Reporte en consola con severidades
2. Análisis Estático (sast)¶
Analiza el código fuente en busca de problemas de seguridad:
Herramientas:
- dart analyze para Flutter/Dart
- eslint para TypeScript/JavaScript
- bandit para Python
- shellcheck para scripts Bash
Salida:
- .security-reports/dart-analyze.txt
- .security-reports/eslint.json
- .security-reports/shellcheck.json
3. Secretos (secrets)¶
Detecta secretos hardcodeados en el código:
Herramientas:
- trufflehog con verificación de secretos
Patrones detectados: - API keys - Passwords - Tokens (JWT, OAuth, etc.) - Private keys (RSA, EC, DSA) - Cloud credentials (AWS, GCP, Azure)
Salida:
- .security-reports/trufflehog.json
4. Contenedores (container)¶
Escanea imágenes Docker y Dockerfiles:
Herramientas:
- trivy para análisis de imágenes y configuración
Escanea: - Vulnerabilidades en imágenes base - Vulnerabilidades en dependencias - Configuración de Dockerfiles - Best practices de Docker
Salida:
- .security-reports/trivy-backend.json
- .security-reports/trivy-backend-config.json
5. Infrastructure as Code (iac)¶
Escanea configuraciones de infraestructura:
Herramientas:
- tfsec para Terraform/OpenTofu
- checkov para Terraform, Kubernetes, Docker
Escanea: - Configuraciones de Terraform - Manifiestos de Kubernetes - Dockerfiles - Helm charts
Salida:
- .security-reports/tfsec.json
- .security-reports/checkov.json
- .security-reports/checkov-k8s.json
6. Auto-Fix (fix)¶
Intenta corregir automáticamente vulnerabilidades:
Acciones:
- npm audit fix --force para Node.js
- flutter pub upgrade --major-versions para Dart
- dart fix --apply para código Dart
- eslint --fix para TypeScript/JavaScript
Reportes¶
Ubicación¶
Todos los reportes se guardan en:
graph TD
reports[".security-reports/"]
npm[npm-audit.json]
dart[dart-analyze.txt]
eslint[eslint.json]
shell[shellcheck.json]
truffle[trufflehog.json]
trivy[trivy-backend.json]
trivyc[trivy-backend-config.json]
tfsec[tfsec.json]
checkov[checkov.json]
checkovk[checkov-k8s.json]
summary[summary-YYYYMMDD-HHMMSS.md]
reports --> npm
reports --> dart
reports --> eslint
reports --> shell
reports --> truffle
reports --> trivy
reports --> trivyc
reports --> tfsec
reports --> checkov
reports --> checkovk
reports --> summary
style reports fill:#f8f9fa,stroke:#333
Reporte Resumen¶
Cada ejecución genera un reporte resumen en Markdown:
# DevSecOps Scan Report
**Date:** 2025-02-19 14:30:00
**Environment:** DEV Local (Minikube)
## Scans Performed
| Scan | Status | Report |
|------|--------|--------|
| Dependencies | ✅ | .security-reports/npm-audit.json |
| SAST | ✅ | .security-reports/dart-analyze.txt |
| Secrets | ✅ | .security-reports/trufflehog.json |
| Containers | ✅ | .security-reports/trivy-backend.json |
| IaC | ✅ | .security-reports/tfsec.json |
CI/CD Integration¶
GitHub Actions¶
# .github/workflows/security-scan.yml
name: Security Scan
on:
push:
branches: [main, develop]
pull_request:
schedule:
- cron: '0 2 * * *' # Diario a las 2 AM
jobs:
security-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build Security Scanner
run: |
docker build -t security-scanner:latest \
-f infrastructure/docker/security-scanner/Dockerfile .
- name: Run Security Scan
run: |
docker run --rm \
-v ${{ github.workspace }}:/workspace \
-v ${{ github.workspace }}/.security-reports:/reports \
security-scanner:latest all
- name: Upload Reports
uses: actions/upload-artifact@v4
with:
name: security-reports
path: .security-reports/
Configuración¶
Variables de Entorno¶
# Nivel de severidad mínimo
SEVERITY_THRESHOLD=HIGH
# Fallar el build en vulnerabilidades
FAIL_ON_VULNERABILITIES=true
# Directorio de reportes
REPORT_DIR=/reports
Exclusiones¶
Crear .trivyignore para excluir vulnerabilidades conocidas:
Crear .tfsec-ignore para Terraform:
# .tfsec-ignore
- rule: aws-s3-enable-bucket-encryption
expiry: 2025-12-31
reason: Bucket temporal para desarrollo
Troubleshooting¶
Error: Trivy database update failed¶
# Actualizar manualmente la base de datos
docker run --rm aquasec/trivy:latest image --download-db-only
Error: Flutter SDK not found¶
Falsos Positivos¶
Usar archivos de configuración para suprimir:
.trivyignorepara Trivy.tfsec-ignorepara tfsec.checkov.ymlpara Checkov
Mejores Prácticas¶
Recomendaciones
-
Ejecutar escaneos antes de cada commit
-
Revisar reportes regularmente
-
Priorizar vulnerabilidades CRITICAL y HIGH
-
Mantener herramientas actualizadas
-
Integrar en CI/CD pipeline
Referencias¶
Última actualización: 19 de febrero de 2025