Braulio2002/Monitor-de-cambios-en-superficie-de-ataque
GitHub: Braulio2002/Monitor-de-cambios-en-superficie-de-ataque
Stars: 0 | Forks: 0
# 🛡️ Monitor Avanzado de Cambios en Superficie de Ataque (MACSA)
### *Defensive Exposure Delta Auditor & Compliance Inspector (OWASP ASVS, NIST CSF 2.0 & CIS Controls v8)*
███╗ ███╗ █████╗ ██████╗███████╗ █████╗
████╗ ████║██╔══██╗██╔════╝██╔════╝██╔══██╗
██╔████╔██║███████║██║ ███████╗███████║
██║╚██╔╝██║██╔══██║██║ ╚════██║██╔══██║
██║ ╚═╝ ██║██║ ██║╚██████╗███████║██║ ██║
╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚══════╝╚═╝ ╚═╝
## 📖 TABLA DE CONTENIDOS
1. [Introducción y Objetivos](#-introducción-y-objetivos)
2. [Alineación con Estándares Internacionales (NIST & OWASP & CIS)](#-alineación-con-estándares-internacionales-nist--owasp--cis)
3. [Advertencia Legal y Escaneo Defensivo Seguro](#-advertencia-legal-y-escaneo-defensivo-seguro)
4. [Mermaid: Arquitectura de Componentes y Flujo de Control](#-mermaid-arquitectura-de-componentes-y-flujo-de-control)
5. [Estructura Física del Proyecto](#-estructura-física-del-proyecto)
6. [Instalación y Aprovisionamiento](#-instalación-y-aprovisionamiento)
7. [Guía Completa de Operación](#-guía-completa-de-operación)
8. [Detalle y Mapeo de Reportes (Excel Multihoja)](#-detalle-y-mapeo-de-reportes-excel-multihoja)
9. [Fórmula de Riesgo y Scoring Ponderado](#-fórmula-de-riesgo-y-scoring-ponderado)
10. [Integración en DevSecOps (CI/CD Pipeline)](#-integración-en-devsecops-cicd-pipeline)
11. [Contenedores de Producción (Dockerfile)](#-contenedores-de-producción-dockerfile)
12. [Guía de Extensibilidad (Añadir Reglas en 3 Minutos)](#-guía-de-extensibilidad-añadir-reglas-en-3-minutos)
13. [Resolución de Problemas (Troubleshooting)](#-resolución-de-problemas-troubleshooting)
14. [Suite de Pruebas y Aseguramiento](#-suite-de-pruebas-y-aseguramiento)
## 📖 Introducción y Objetivos
El **Monitor Avanzado de Cambios en Superficie de Ataque (MACSA)** es un motor estático de ciberseguridad defensiva automatizado de nivel industrial. Su objetivo primordial es **comparar dos instantáneas autorizadas** de la exposición externa de una organización — un escaneo histórico (*baseline*) frente a un escaneo actual — detectando alteraciones críticas en puertos, subdominios, servicios, cabeceras HTTP, configuraciones TLS y endpoints de API.
Esta solución está diseñada bajo los estrictos estándares de **Clean Architecture** y principios **SOLID**, garantizando un total aislamiento de las reglas de negocio respecto a librerías de infraestructura. MACSA se integra de forma fluida en pipelines de **DevSecOps**, permitiendo a equipos de SOC, analistas de ciberseguridad y administradores de sistemas auditar de forma local y determinista la evolución de su superficie de ataque antes de cada despliegue o revisión de cumplimiento.
### Capacidades principales
- Detección de **puertos nuevos abiertos** o históricos cerrados (incluyendo bases de datos, Docker API, SSH, RDP).
- Descubrimiento de **subdominios sensibles** (`admin`, `staging`, `backup`, `vpn`, etc.) y cambios de IP (riesgo de *Subdomain Takeover*).
- Análisis de **servicios expuestos** y cambios de versión en componentes críticos.
- Auditoría de **cabeceras de seguridad** (HSTS, CSP, X-Frame-Options, cookies).
- Validación de **SSL/TLS** (certificados expirados, protocolos obsoletos TLS 1.0/1.1).
- Control de **endpoints de API** con pérdida de autenticación en rutas privadas.
- Motor cuantitativo de **scoring 0–100** con severidad `CRITICAL`, `HIGH`, `MEDIUM`, `LOW`, `INFO`.
- Reportes corporativos en **Excel (9 hojas)**, **PDF ejecutivo** y **JSON** para SIEM/SOAR.
## 📋 Alineación con Estándares Internacionales (NIST & OWASP & CIS)
La herramienta mapea de forma nativa los hallazgos y auditorías contra los marcos de cumplimiento y buenas prácticas de seguridad más relevantes para la gestión de exposición externa:
| Servicio del Monitor | Referencia de Control | Objetivo de Cumplimiento Normativo | Severidad Típica |
| :--- | :--- | :--- | :--- |
| **`ports_diff_service.py`** | **CIS Control 12.3** | Detectar servicios de red no autorizados expuestos a Internet (DB, RDP, Docker API). | **Crítica / Alta** |
| **`subdomains_diff_service.py`** | **OWASP ASVS V14** | Identificar expansión no controlada del perímetro DNS y subdominios administrativos expuestos. | **Alta / Media** |
| **`services_diff_service.py`** | **NIST CSF 2.0 (ID.AM)** | Inventariar y contrastar servicios y versiones en activos de perímetro. | **Media** |
| **`headers_diff_service.py`** | **OWASP Top 10 A05:2021** | Detectar debilitamiento de cabeceras de endurecimiento (HSTS, CSP, X-Frame-Options). | **Alta / Media** |
| **`ssl_tls_diff_service.py`** | **NIST SP 800-52 Rev. 2** | Validar caducidad de certificados y deshabilitación de protocolos TLS obsoletos. | **Crítica / Alta** |
| **`endpoint_diff_service.py`** | **OWASP API Security Top 10** | Alertar sobre endpoints que pierden controles de autenticación o autorización. | **Crítica** |
| **`severity_classifier_service.py`** | **CVSS Qualitative** | Clasificar hallazgos en niveles de severidad operativa para priorización de remediación. | **Variable** |
| **`risk_score_calculator_service.py`** | **NIST CSF 2.0 (ID.RA)** | Calcular riesgo cuantitativo ponderado para reporting ejecutivo y KPIs de exposición. | **Variable** |
## ⚠️ Advertencia Legal y Escaneo Defensivo Seguro
### Reglas de Operación Segura y Defensiva de MACSA:
* **Análisis Offline de Snapshots:** MACSA **no realiza escaneos activos** contra objetivos en red. Solo procesa archivos JSON/CSV previamente exportados por herramientas autorizadas (Nmap, escáneres internos, ASM corporativos).
* **Sin payloads ofensivos:** No ejecuta exploits, fuerza bruta, inyecciones, descargas automáticas ni alteraciones físicas de los archivos de entrada analizados.
* **Tolerancia a fallas:** Si un archivo de snapshot está corrupto o ausente, registra la incidencia en la hoja de errores y continúa el análisis del resto del inventario.
* **Datos sintéticos de demostración:** En el primer arranque, puede generar datos de ejemplo en `datos_entrada/` para validar el flujo sin exponer activos reales.
* **Hardening de salida:** Los reportes no incluyen credenciales ni secretos; solo metadatos de exposición ya presentes en los snapshots de entrada.
## 🗺️ Mermaid: Arquitectura de Componentes y Flujo de Control
El diseño de MACSA sigue el patrón de **Clean Architecture** aplicando **Inversión de Control** de tal manera que el núcleo lógico (Dominio y Aplicación) no tiene dependencias de librerías del framework o de infraestructura:
graph TD
subgraph Presentacion_Infraestructura [Presentación e Infraestructura - Adapters]
CLI[app/presentation/cli.py]
JsonReader[app/infrastructure/readers/json_snapshot_reader.py]
CsvReader[app/infrastructure/readers/csv_snapshot_reader.py]
ExcelExporter[app/infrastructure/exporters/excel_report_exporter.py]
JsonExporter[app/infrastructure/exporters/json_report_exporter.py]
PdfExporter[app/infrastructure/exporters/pdf_report_exporter.py]
DirectoryManager[app/infrastructure/filesystem/directory_manager.py]
end
subgraph Aplicacion [Lógica de Aplicación - Casos de Uso y Servicios]
UseCase[app/application/use_cases/monitor_attack_surface_changes_use_case.py]
PortsDiff[app/application/services/ports_diff_service.py]
SubdomainsDiff[app/application/services/subdomains_diff_service.py]
ServicesDiff[app/application/services/services_diff_service.py]
HeadersDiff[app/application/services/headers_diff_service.py]
SslTlsDiff[app/application/services/ssl_tls_diff_service.py]
EndpointDiff[app/application/services/endpoint_diff_service.py]
ScoreCalc[app/application/services/risk_score_calculator_service.py]
SeverityClass[app/application/services/severity_classifier_service.py]
Recommendation[app/application/services/recommendation_service.py]
ExecSummary[app/application/services/executive_summary_service.py]
ReaderInterface[app/application/interfaces/snapshot_reader_interface.py]
ExporterInterface[app/application/interfaces/report_exporter_interface.py]
end
subgraph Dominio [Capa de Dominio - Entidades y Value Objects]
ChangeReport[app/domain/entities/change_report.py]
DetectedChange[app/domain/entities/detected_change.py]
ScanSnapshot[app/domain/entities/scan_snapshot.py]
ExposedPort[app/domain/entities/exposed_port.py]
AssetTypeVO[app/domain/value_objects/asset_type.py]
SeverityVO[app/domain/value_objects/severity_level.py]
RiskVO[app/domain/value_objects/risk_level.py]
ChangeTypeVO[app/domain/value_objects/change_type.py]
end
CLI --> UseCase
JsonReader -.->|Implementa| ReaderInterface
CsvReader -.->|Implementa| ReaderInterface
ExcelExporter -.->|Implementa| ExporterInterface
JsonExporter -.->|Implementa| ExporterInterface
PdfExporter -.->|Implementa| ExporterInterface
DirectoryManager --> CLI
UseCase --> ReaderInterface
UseCase --> ExporterInterface
UseCase --> PortsDiff
UseCase --> SubdomainsDiff
UseCase --> ServicesDiff
UseCase --> HeadersDiff
UseCase --> SslTlsDiff
UseCase --> EndpointDiff
UseCase --> ScoreCalc
UseCase --> SeverityClass
UseCase --> Recommendation
UseCase --> ExecSummary
UseCase --> ChangeReport
ChangeReport --> DetectedChange
DetectedChange --> AssetTypeVO
DetectedChange --> SeverityVO
DetectedChange --> RiskVO
DetectedChange --> ChangeTypeVO
ScanSnapshot --> ExposedPort
## 🏗️ Estructura Física del Proyecto
Monitor de cambios en superficie de ataque/
│
├── app/
│ ├── main.py # Punto de entrada: delega en la CLI.
│ │
│ ├── config/
│ │ └── settings.py # Rutas, pesos de scoring y catálogos sensibles.
│ │
│ ├── domain/ # Capa de Dominio (lógica pura, sin dependencias externas)
│ │ ├── entities/
│ │ │ ├── scan_snapshot.py # Agregado raíz del inventario escaneado.
│ │ │ ├── change_report.py # Reporte consolidado de la auditoría delta.
│ │ │ ├── detected_change.py # Hallazgo individual con score y recomendación.
│ │ │ ├── exposed_port.py # Puerto expuesto en un objetivo.
│ │ │ ├── subdomain_asset.py # Activo de subdominio.
│ │ │ ├── exposed_service.py # Servicio detectado en un host.
│ │ │ ├── header_snapshot.py # Cabeceras HTTP de una URL.
│ │ │ ├── ssl_tls_snapshot.py # Estado criptográfico de un dominio.
│ │ │ └── exposed_endpoint.py # Endpoint de API monitorizado.
│ │ │
│ │ ├── value_objects/
│ │ │ ├── asset_type.py # Enum: PORT, SUBDOMAIN, SERVICE, HEADER, SSL_TLS, ENDPOINT.
│ │ │ ├── change_type.py # Enum: ADDED, REMOVED, MODIFIED, WEAKENED, IMPROVED.
│ │ │ ├── severity_level.py # Enum: CRITICAL, HIGH, MEDIUM, LOW, INFO.
│ │ │ └── risk_level.py # Enum: CRITICAL, HIGH, MEDIUM, LOW.
│ │ │
│ │ └── exceptions/
│ │ └── domain_exceptions.py # Excepciones del dominio de seguridad.
│ │
│ ├── application/ # Capa de Aplicación (orquestación y reglas de negocio)
│ │ ├── use_cases/
│ │ │ └── monitor_attack_surface_changes_use_case.py # Orquestador central del flujo delta.
│ │ │
│ │ ├── services/
│ │ │ ├── ports_diff_service.py # Diff de puertos abiertos/cerrados/modificados.
│ │ │ ├── subdomains_diff_service.py # Diff de subdominios y cambios de IP.
│ │ │ ├── services_diff_service.py # Diff de servicios y versiones.
│ │ │ ├── headers_diff_service.py # Diff de cabeceras de seguridad HTTP.
│ │ │ ├── ssl_tls_diff_service.py # Diff de certificados y protocolos TLS.
│ │ │ ├── endpoint_diff_service.py # Diff de endpoints y autenticación.
│ │ │ ├── snapshot_validator_service.py # Validación estructural de snapshots.
│ │ │ ├── severity_classifier_service.py # Clasificador cualitativo de severidad.
│ │ │ ├── risk_score_calculator_service.py # Calculador de score 0–100 y riesgo global.
│ │ │ ├── recommendation_service.py # Generador de remediaciones contextualizadas.
│ │ │ └── executive_summary_service.py # Resumen ejecutivo para CISO/Gerencia.
│ │ │
│ │ └── interfaces/
│ │ ├── snapshot_reader_interface.py # Puerto de lectura de snapshots.
│ │ └── report_exporter_interface.py # Puerto de exportación de reportes.
│ │
│ ├── infrastructure/ # Adaptadores de entrada/salida
│ │ ├── readers/
│ │ │ ├── json_snapshot_reader.py # Lector principal de snapshots JSON.
│ │ │ └── csv_snapshot_reader.py # Lector alternativo CSV.
│ │ ├── exporters/
│ │ │ ├── excel_report_exporter.py # Exportador Excel premium (9 hojas).
│ │ │ ├── json_report_exporter.py # Exportador JSON para integraciones.
│ │ │ └── pdf_report_exporter.py # Exportador PDF ejecutivo (ReportLab).
│ │ └── filesystem/
│ │ └── directory_manager.py # Aprovisionamiento de datos_entrada/datos_salida.
│ │
│ ├── presentation/
│ │ └── cli.py # Interfaz CLI con banner y panel de resultados.
│ │
│ └── shared/
│ ├── constants.py # Puertos/servicios/subdominios sensibles y recomendaciones.
│ ├── logger.py # Logging centralizado con colores.
│ ├── filename_utils.py # Generación de nombres de reporte sin colisiones.
│ ├── date_utils.py # Timestamps UTC / ISO 8601.
│ └── normalization_utils.py # Normalización de cabeceras y cadenas.
│
├── tests/
│ ├── unit/ # 8 módulos de pruebas unitarias de servicios diff/scoring.
│ └── integration/
│ └── test_monitor_attack_surface_changes_flow.py # Flujo E2E con datos sintéticos.
│
├── datos_entrada/ # Snapshots de entrada (generados o cargados manualmente)
│ ├── escaneo_anterior/ # Baseline histórico
│ └── escaneo_actual/ # Escaneo de comparación
│
├── datos_salida/ # Reportes generados (Excel, PDF, JSON)
│
├── requirements.txt # Dependencias: pandas, openpyxl, reportlab, pydantic, pytest, ruff.
├── pyproject.toml # Configuración pytest y ruff (line-length = 150).
└── .gitignore
## 🛠️ Instalación y Aprovisionamiento
### Requisitos del Sistema
* **Python 3.11 o superior** (compatible con 3.12 y 3.13).
* Administrador de dependencias `pip`.
* Espacio en disco para snapshots JSON y reportes exportados.
### Configuración del Entorno de Ejecución
1. **Clonar o descargar** el repositorio en su directorio de trabajo.
2. **Crear y activar el entorno virtual aislado (virtualenv)**:
* **Microsoft Windows (PowerShell):**
python -m venv venv
.\venv\Scripts\activate
* **GNU/Linux / macOS:**
python -m venv venv
source venv/bin/activate
3. **Instalación de la Suite de Dependencias:**
pip install -r requirements.txt
4. **(Opcional) Verificar calidad de código:**
ruff check app tests
ruff format app tests --check
## 🚀 Guía Completa de Operación
### 1. Preparar Snapshots de Entrada
MACSA aprovisiona automáticamente la estructura `datos_entrada/` en el primer arranque. Organice los archivos de la siguiente forma:
datos_entrada/
├── escaneo_anterior/ # Baseline (estado histórico autorizado)
│ ├── ports.json
│ ├── subdomains.json
│ ├── services.json
│ ├── headers.json
│ ├── ssl_tls.json
│ └── endpoints.json # Opcional
└── escaneo_actual/ # Estado actual a contrastar
├── ports.json
├── subdomains.json
├── services.json
├── headers.json
├── ssl_tls.json
└── endpoints.json # Opcional
Si las carpetas están vacías, el sistema generará **datos de demostración realistas** para validar el flujo de auditoría de inmediato.
### 2. Iniciar la Auditoría Delta
Ejecute el motor desde la raíz del repositorio:
python -m app.main
### 3. Salida de Consola (Panel Interactivo)
La interfaz CLI entregará métricas consolidadas y rutas de los reportes generados:
================================================================================
MONITOR AVANZADO DE CAMBIOS EN SUPERFICIE DE ATAQUE (v1.0.0)
[Herramienta de Auditoría Defensiva y Monitoreo de Exposición]
================================================================================
================================================================================
RESUMEN DE AUDITORÍA DE EXPOSICIÓN
================================================================================
Fecha de Ejecución: 2026-05-26T12:00:00Z
Puntuación de Riesgo: 95.00/100
Nivel de Riesgo Global: CRITICAL
--------------------------------------------------------------------------------
Total de Cambios: 12
[-] Críticos: 2
[-] Altos: 4
[-] Medios: 3
[-] Bajos: 2
[-] Informativos: 1
--------------------------------------------------------------------------------
Reportes generados correctamente en datos_salida/:
[+] attack_surface_changes_report.json
[+] attack_surface_changes_report.xlsx
[+] attack_surface_changes_report.pdf
================================================================================
Proceso finalizado.
================================================================================
### 4. Archivos de Salida
Los reportes se guardan en `datos_salida/` con nombres incrementales si ya existen versiones previas:
| Archivo | Descripción |
| :--- | :--- |
| `attack_surface_changes_report.xlsx` | Informe corporativo multihoja con código de colores por severidad |
| `attack_surface_changes_report.pdf` | Resumen ejecutivo para presentación a CISO/Gerencia |
| `attack_surface_changes_report.json` | Payload estructurado para SIEM, SOAR o dashboards internos |
## 📊 Detalle y Mapeo de Reportes (Excel Multihoja)
El reporte Microsoft Excel (`.xlsx`) cuenta con **9 hojas altamente estructuradas y formateadas** con `openpyxl` y estilos corporativos por severidad:
[ attack_surface_changes_report.xlsx ]
├── 📈 1. Resumen --> KPIs globales, riesgo ponderado y fecha de generación.
├── 📋 2. Cambios Detectados --> Inventario maestro de todos los hallazgos delta.
├── 🔌 3. Puertos --> Detalle de puertos abiertos, cerrados o modificados.
├── 🌐 4. Subdominios --> Nuevos subdominios, cambios de IP y estado HTTP.
├── ⚙️ 5. Servicios --> Servicios expuestos y cambios de versión.
├── 🛡️ 6. Headers --> Cabeceras de seguridad añadidas, removidas o debilitadas.
├── 🔒 7. SSL_TLS --> Certificados, expiración y protocolos TLS obsoletos.
├── 💡 8. Recomendaciones --> Matriz priorizada de acciones de remediación.
└── 🛑 9. Errores --> Incidencias de lectura/validación no bloqueantes.
### Especificación de Columnas por Hoja
1. **Resumen:** `total_cambios`, `cambios_criticos`, `cambios_altos`, `cambios_medios`, `cambios_bajos`, `cambios_informativos`, `riesgo_general`, `fecha_generacion`.
2. **Cambios Detectados:** `change_id`, `asset_type`, `change_type`, `asset_identifier`, `previous_value`, `current_value`, `severity`, `risk_score`, `risk_level`, `description`, `impact`, `recommendation`, `detected_at`.
3. **Puertos:** `target`, `ip`, `port`, `previous_status`, `current_status`, `previous_service`, `current_service`, `severity`, `recommendation`.
4. **Subdominios:** `domain`, `subdomain`, `previous_ip`, `current_ip`, `previous_status`, `current_status`, `severity`, `recommendation`.
5. **Servicios:** `host`, `port`, `previous_service`, `current_service`, `previous_version`, `current_version`, `severity`, `recommendation`.
6. **Headers:** `url`, `header`, `previous_value`, `current_value`, `change_type`, `severity`, `recommendation`.
7. **SSL_TLS:** `domain`, `check_name`, `previous_value`, `current_value`, `change_type`, `severity`, `recommendation`.
8. **Recomendaciones:** `prioridad`, `asset_type`, `asset_identifier`, `problema`, `recomendacion`.
9. **Errores:** `archivo`, `tipo_error`, `mensaje_error`, `fecha`.
## 📊 Fórmula de Riesgo y Scoring Ponderado
El motor calcula un **score cuantitativo de 0 a 100** por cada cambio detectado, utilizando pesos parametrizados en `app/config/settings.py` (`RISK_WEIGHTS`):
$$\text{Score}_{\text{cambio}} = f(\text{asset\_type}, \text{change\_type}, \text{details}) \in [0, 100]$$
$$\text{Riesgo}_{\text{global}} = \begin{cases} \max(\text{scores}) & \text{si } \max(\text{scores}) \geq 76 \\ \dfrac{1}{n}\sum_{i=1}^{n} \text{score}_i & \text{en caso contrario} \end{cases}$$
### Mapeo Cualitativo del Riesgo
| Rango | Nivel | Interpretación Operativa |
| :---: | :--- | :--- |
| **0 – 20** | 🟢 **LOW** | Cambios informativos o reducción de exposición (puerto cerrado, mejora de cabecera). |
| **21 – 50** | 🟡 **MEDIUM** | Nuevos activos de exposición moderada o cambios de versión no críticos. |
| **51 – 75** | 🔶 **HIGH** | Servicios sensibles expuestos, debilitamiento de HSTS/CSP o subdominios administrativos. |
| **76 – 100** | 🛑 **CRITICAL** | Bases de datos públicas, Docker API, certificados expirados o pérdida de autenticación en API. |
### Ejemplos de Pesos Configurados por Defecto
| Escenario | Peso |
| :--- | :---: |
| Docker API expuesto (`2375`) | **100** |
| Base de datos expuesta (MySQL, PostgreSQL, Redis, MongoDB) | **95** |
| Endpoint privado sin autenticación | **95** |
| Certificado SSL/TLS expirado | **95** |
| RDP expuesto (`3389`) | **85** |
| Servicio sensible nuevo (SSH, Jenkins, Grafana…) | **80** |
| Protocolo TLS 1.0 habilitado | **75** |
| HSTS eliminado | **70** |
| SSH expuesto (`22`) | **70** |
| CSP debilitada (`unsafe-inline`) | **60** |
| Puerto cerrado / mejora de seguridad | **0** |
## 🤖 Integración en DevSecOps (CI/CD Pipeline)
Automatice la validación de cambios en superficie de ataque en cada pipeline agregando `.github/workflows/attack-surface-monitor.yml`:
name: Attack Surface Change Monitor (MACSA)
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
schedule:
- cron: '0 6 * * 1' # Auditoría semanal los lunes a las 06:00 UTC
jobs:
exposure-delta-audit:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: 'pip'
- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run Quality Test Suite (Pytest)
run: python -m pytest -q
- name: Run Lint (Ruff)
run: ruff check app tests
- name: Run MACSA Exposure Delta Audit
run: python -m app.main
- name: Upload Security Reports
uses: actions/upload-artifact@v4
with:
name: attack-surface-reports
path: |
datos_salida/attack_surface_changes_report*.xlsx
datos_salida/attack_surface_changes_report*.json
datos_salida/attack_surface_changes_report*.pdf
## 🐳 Contenedores de Producción (Dockerfile)
Para despliegues corporativos estériles e independientes, empaquete la herramienta con el siguiente manifiesto optimizado:
# Capa de Construcción
FROM python:3.11-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --user -r requirements.txt
# Capa de Ejecución Segura
FROM python:3.11-slim AS runner
WORKDIR /app
RUN groupadd -g 10001 secops && \
useradd -u 10001 -g secops -m -s /bin/bash secops
COPY --from=builder /root/.local /home/secops/.local
COPY --chown=secops:secops app/ ./app/
COPY --chown=secops:secops pyproject.toml .
ENV PATH=/home/secops/.local/bin:$PATH
ENV PYTHONUNBUFFERED=1
RUN mkdir -p datos_entrada/escaneo_anterior datos_entrada/escaneo_actual datos_salida && \
chown -R secops:secops datos_entrada datos_salida
USER secops
VOLUME [ "/app/datos_entrada", "/app/datos_salida" ]
ENTRYPOINT [ "python", "-m", "app.main" ]
**Compilación y ejecución:**
docker build -t macsa:latest .
docker run --rm \
-v "$(pwd)/datos_entrada:/app/datos_entrada" \
-v "$(pwd)/datos_salida:/app/datos_salida" \
macsa:latest
## ⚙️ Guía de Extensibilidad (Añadir Reglas en 3 Minutos)
El diseño basado en interfaces permite extender el motor con nuevas validaciones de forma rápida. Ejemplo: detectar exposición de paneles de administración por patrón de URL en endpoints.
### 1. Crear el Servicio de Regla
Cree `app/application/services/admin_panel_exposure_service.py`:
from typing import List
from app.domain.entities.detected_change import DetectedChange
from app.domain.value_objects.asset_type import AssetType
from app.domain.value_objects.change_type import ChangeType
from app.domain.value_objects.severity_level import SeverityLevel
class AdminPanelExposureService:
ADMIN_PATHS = ("/admin", "/wp-admin", "/phpmyadmin", "/manager/html")
def analyze_endpoint(self, endpoint_dict: dict) -> List[dict]:
findings: List[dict] = []
url = str(endpoint_dict.get("url", "")).lower()
if any(path in url for path in self.ADMIN_PATHS):
findings.append(
{
"asset_type": AssetType.ENDPOINT,
"change_type": ChangeType.ADDED,
"asset_identifier": url,
"description": f"Panel administrativo potencialmente expuesto: {url}",
"details": endpoint_dict,
}
)
return findings
### 2. Registrar en el Caso de Uso
Inyecte el servicio en `monitor_attack_surface_changes_use_case.py` y acumule sus hallazgos en `raw_changes` antes del cálculo de scoring, reutilizando `SeverityClassifierService`, `RiskScoreCalculatorService` y `RecommendationService` existentes.
### 3. Ajustar Pesos (Opcional)
Añada una clave en `RISK_WEIGHTS` dentro de `app/config/settings.py`:
"ADMIN_PANEL_EXPOSED": 85,
## 🪵 Resolución de Problemas (Troubleshooting)
### 1. Error de codificación `charmap` en terminal de Windows
* **Causa:** La consola CMD/PowerShell heredada no utiliza UTF-8 y falla al imprimir caracteres especiales.
* **Solución:**
chcp 65001
$OutputEncoding = [Console]::OutputEncoding = [Text.UTF8Encoding]::UTF8
### 2. `ModuleNotFoundError: No module named 'app'`
* **Causa:** El intérprete no resuelve el paquete raíz al ejecutar scripts desde subdirectorios.
* **Solución:** Ejecute siempre desde la raíz del repositorio:
python -m app.main
### 3. Snapshots vacíos o sin cambios detectados
* **Causa:** Archivos JSON ausentes, mal formados o idénticos entre `escaneo_anterior` y `escaneo_actual`.
* **Solución:** Verifique la estructura de entrada, consulte la hoja **Errores** del Excel y valide que los identificadores (`target`, `subdomain`, `url`) sean consistentes entre ambos escaneos.
### 4. Rutas incorrectas de entrada/salida
* **Causa:** `BASE_DIR` en `app/config/settings.py` apunta a una ruta absoluta de otro entorno.
* **Solución:** Actualice `BASE_DIR` a la ruta local del proyecto o refactorice a rutas relativas basadas en `Path(__file__).resolve().parents[2]`.
### 5. Fallos al generar PDF o Excel
* **Causa:** Dependencias `reportlab` u `openpyxl` no instaladas o permisos de escritura insuficientes en `datos_salida/`.
* **Solución:**
pip install -r requirements.txt
Confirme permisos de escritura en la carpeta de salida.
## 🧪 Suite de Pruebas y Aseguramiento
El motor cuenta con **18 pruebas automatizadas** (unitarias e integración) ejecutadas mediante `pytest`:
# Ejecución estándar
pytest
# Modo verboso
pytest -v
# Con cobertura (requiere pytest-cov instalado)
pytest --cov=app --cov-report=term-missing
### Módulos cubiertos
| Módulo de Test | Ámbito Validado |
| :--- | :--- |
| `test_ports_diff_service.py` | Diff de puertos sensibles y scoring |
| `test_subdomains_diff_service.py` | Subdominios nuevos y cambio de IP |
| `test_services_diff_service.py` | Servicios expuestos y versiones |
| `test_headers_diff_service.py` | Cabeceras removidas/debilitadas |
| `test_ssl_tls_diff_service.py` | Certificados y protocolos TLS |
| `test_severity_classifier.py` | Clasificación cualitativa |
| `test_risk_score_calculator.py` | Cálculo numérico de riesgo |
| `test_recommendation_service.py` | Generación de remediaciones |
| `test_monitor_attack_surface_changes_flow.py` | Flujo E2E: lectura → diff → exportación |
### Calidad de código (Ruff)
ruff check app tests # Lint estático
ruff format app tests # Formateo automático
## 📄 Licencia y Uso Responsable
Este software se distribuye con fines educativos y de auditoría defensiva autorizada. El operador es responsable de cumplir las leyes locales de ciberseguridad y obtener el consentimiento explícito del propietario de los activos analizados.
MACSA v1.0.0 — Monitor Avanzado de Cambios en Superficie de Ataque
Clean Architecture · DevSecOps Ready · Zero Offensive Payloads