Hnnno/Incident-Response-Playbook-Automator
GitHub: Hnnno/Incident-Response-Playbook-Automator
基于MITRE ATT&CK框架的自动化安全事件响应编排系统,通过YAML剧本将告警自动映射并执行封禁、通知、取证等响应动作链。
Stars: 0 | Forks: 0
# IR Playbook Automator
自动化安全事件响应系统。接收警报,将其映射到与 **MITRE ATT&CK** 框架对齐的 YAML 格式 playbook 中,并自动执行一系列操作:IP 封锁、通知、创建工单以及收集取证证据。
## 目录
- [描述](#descripcion)
- [架构](#arquitectura)
- [支持的警报类型](#tipos-de-alerta-soportados)
- [要求](#requisitos)
- [安装说明](#instalacion)
- [使用说明](#uso)
- [项目结构](#estructura-del-proyecto)
- [警报格式](#formato-de-alerta)
- [添加新 playbook](#agregar-un-nuevo-playbook)
- [添加新操作](#agregar-una-nueva-accion)
- [生产环境配置](#configuracion-para-produccion)
- [测试](#tests)
- [路线图](#roadmap)
## 描述
```
Alerta ingresada → Playbook identificado → Acciones ejecutadas → Reporte guardado
| | | |
JSON / dict playbooks.yaml bloquear_ip JSON + log
(MITRE TTP) enviar_email Evidencia JSON
crear_ticket Audit trail
```
系统默认以 **模拟模式** 运行,这意味着在明确启用之前,不会对系统执行任何实际操作。这允许您在没有风险的情况下迭代和测试 playbook。
## 架构
```
ir-playbook-automator/
├── config/
│ ├── playbooks.yaml # Definicion declarativa de playbooks (MITRE-mapeados)
│ └── configuracion.yaml # SMTP, ticketing, firewall, modo simulacion
├── src/
│ ├── principal.py # Punto de entrada CLI
│ ├── modelos_alerta.py # Dataclasses: Alerta, ResultadoAccion, ReporteEjecucion
│ ├── parser_alertas.py # Ingesta desde archivo JSON o dict
│ ├── motor_playbook.py # Motor de ejecucion paso a paso
│ └── acciones/
│ └── __init__.py # bloquear_ip, aislar_host, deshabilitar_cuenta,
│ # enviar_notificacion, crear_ticket, registrar_evidencia
├── alertas/
│ └── alertas_muestra.json # Alertas de ejemplo para demo y pruebas
├── tests/
│ └── test_playbook.py # 15 tests unitarios (pytest)
├── logs/
│ ├── evidencia/ # Archivos JSON de evidencia por incidente
│ └── reportes/ # Reportes completos de ejecucion de playbook
└── requirements.txt
```
## 支持的警报类型
| 警报类型 | MITRE TTP | 严重性 | 执行的操作 |
|-------------------------|-----------|-----------|--------------------------------------------------------|
| `fuerza_bruta` | T1110 | 高 | 封锁 IP → 邮件 → 工单 → 证据 |
| `malware_detectado` | T1204 | 严重 | 隔离主机 → 邮件 → 工单 → 证据 |
| `escalada_privilegios` | T1068 | 严重 | 禁用账户 → 邮件 → 工单 → 证据 |
| `exfiltracion_datos` | T1048 | 严重 | 封锁 IP (24小时) → 邮件 → 工单 → 证据 |
| `escaneo_puertos` | T1046 | 中 | 封锁 IP (30分钟) → 邮件 → 工单 |
## 要求
- Python 3.11 或更高版本
- `requirements.txt` 中列出的依赖项
```
pyyaml>=6.0
requests>=2.31.0
pytest>=7.4.0
pytest-cov>=4.1.0
```
## 安装说明
```
git clone https://github.com/tu-usuario/ir-playbook-automator
cd ir-playbook-automator
pip install -r requirements.txt
```
## 使用说明
**使用示例警报运行(模拟模式):**
```
cd src
python principal.py
```
**使用自定义警报文件运行:**
```
python principal.py --archivo-alertas ../alertas/alertas_muestra.json
```
**指定报告目录:**
```
python principal.py --archivo-alertas ../alertas/alertas_muestra.json --directorio-reportes ../reportes/
```
**执行实际操作(需要完整配置):**
```
python principal.py --sin-simulacion
```
**预期输出:**
```
=================================================================
RESUMEN DE EJECUCION - IR PLAYBOOK AUTOMATOR
=================================================================
Total alertas procesadas : 5
Playbooks exitosos : 5
Playbooks con errores : 0
-----------------------------------------------------------------
[ALTA ] fuerza_bruta | Ataque de Fuerza Bruta Detec | OK
[MEDIA ] escaneo_puertos | Escaneo de Puertos Detectado | OK
[CRITICA] escalada_privilegios | Intento de Escalada de Privi | OK
[CRITICA] exfiltracion_datos | Posible Exfiltracion de Dato | OK
[CRITICA] malware_detectado | Malware o Archivo Sospechoso | OK
=================================================================
```
## 项目结构
### `modelos_alerta.py`
定义了系统的主要 dataclass:
- `TipoAlerta` — 包含支持的事件类型的枚举
- `Severidad` — 包含严重级别的枚举:`baja`(低)、`media`(中)、`alta`(高)、`critica`(严重)
- `Alerta` — 核心模型,包含源 IP、用户、主机、详细信息以及自动生成的 ID
- `ResultadoAccion` — playbook 每个步骤的单个结果
- `ReporteEjecucion` — 包含元数据、结果和最终状态的完整执行报告
### `parser_alertas.py`
将来自不同来源的警报标准化为 `Alerta` 对象:
- `desde_dict(datos)` — 解析原始字典
- `desde_archivo_json(ruta)` — 读取并解析 JSON 文件(列表或单个警报)
- `desde_json_string(cadena)` — 从 JSON 字符串解析
- `obtener_alertas_muestra()` — 生成演示警报而无需文件
### `motor_playbook.py`
从 YAML 加载 playbook 并按顺序执行每个步骤。对于每个警报:
1. 查找与 `tipo_alerta` 对应的 playbook
2. 遍历定义的步骤
3. 从 `REGISTRO_ACCIONES` 解析操作函数
4. 将 `ResultadoAccion` 累积到 `ReporteEjecucion` 中
5. 使用时间戳和全局状态完成报告
### `acciones/__init__.py`
包含所有可用的响应函数和 `REGISTRO_ACCIONES`:
| 操作 | 描述 |
|-----------------------|----------------------------------------------------------|
| `bloquear_ip` | 通过 iptables 封锁源 IP(或模拟封锁) |
| `aislar_host` | 切断受影响主机的网络连接 |
| `deshabilitar_cuenta` | 禁用受损的用户账户 |
| `enviar_notificacion` | 通过 SMTP 向 SOC 团队发送电子邮件 |
| `crear_ticket` | 在 Jira 或模拟系统中创建事件工单 |
| `registrar_evidencia` | 将取证证据保存为 JSON 文件 |
## 警报格式
警报定义为包含以下字段的 JSON 对象:
```
{
"tipo_alerta": "fuerza_bruta",
"ip_origen": "45.33.32.156",
"severidad": "alta",
"usuario_objetivo": "administrador",
"host_objetivo": "srv-dc-01",
"timestamp": "2024-11-15T14:32:00",
"detalles": {
"intentos_fallidos": 87,
"ventana_tiempo_segundos": 45,
"protocolo": "RDP",
"puerto": 3389
}
}
```
必填字段:`tipo_alerta`、`ip_origen`。
可选字段:`severidad`(默认值:`media`)、`timestamp`(默认值:当前时间)、`usuario_objetivo`、`host_objetivo`、`detalles`。
## 添加新 playbook
编辑 `config/playbooks.yaml` 并在 `playbooks:` 下添加新键:
```
playbooks:
acceso_no_autorizado:
nombre: "Acceso No Autorizado Detectado"
descripcion: "Intento de acceso fuera de horario o desde ubicacion inusual"
severidad: alta
mitre_ttp: "T1078"
pasos:
- accion: bloquear_ip
parametros:
duracion_minutos: 120
razon: "Acceso no autorizado detectado"
- accion: enviar_notificacion
parametros:
asunto: "[ALERTA] Acceso no autorizado"
prioridad: alta
- accion: crear_ticket
parametros:
titulo: "Acceso No Autorizado - IP Bloqueada"
categoria: "acceso_indebido"
asignado: "equipo-iam"
- accion: registrar_evidencia
parametros:
recolectar: ["ip_origen", "usuario_objetivo", "hora_acceso"]
```
无需修改 Python 代码。引擎会通过 `tipo_alerta` 键自动加载 playbook。
## 添加新操作
在 `src/acciones/__init__.py` 中定义函数并注册它:
```
def mi_accion_personalizada(alerta: Alerta, parametros: dict, configuracion: dict) -> ResultadoAccion:
simulacion = configuracion.get("general", {}).get("simulacion", True)
# logica de la accion
mensaje = f"[SIMULACION] Accion ejecutada sobre {alerta.ip_origen}"
return ResultadoAccion("mi_accion_personalizada", True, mensaje, simulacion=simulacion)
REGISTRO_ACCIONES["mi_accion_personalizada"] = mi_accion_personalizada
```
然后可以在任何 playbook 中通过 `accion: mi_accion_personalizada` 引用它。
## 生产环境配置
### 电子邮件通知
配置环境变量:
```
export EMAIL_CONTRASENA="contrasena-smtp"
```
编辑 `config/configuracion.yaml`:
```
general:
simulacion: false
notificaciones:
email:
servidor_smtp: "smtp.gmail.com"
puerto_smtp: 587
remitente: "alertas-soc@tudominio.com"
destinatarios:
- "equipo-soc@tudominio.com"
- "gerente-seguridad@tudominio.com"
```
### 与 Jira 集成
```
export JIRA_USUARIO="tu-usuario"
export JIRA_TOKEN_API="tu-token-api"
```
```
tickets:
sistema: "jira"
modo_simulado: false
jira:
url: "https://tuempresa.atlassian.net"
clave_proyecto: "SOC"
tipo_incidencia: "Incidente"
```
### 使用 iptables 的真实防火墙 (Linux)
```
firewall:
sistema: "iptables"
modo_simulado: false
iptables:
cadena: "INPUT"
requiere_sudo: true
```
## 测试
```
pytest tests/ -v
```
```
tests/test_playbook.py::TestModelosAlerta::test_generacion_id_alerta PASSED
tests/test_playbook.py::TestModelosAlerta::test_alerta_a_dict PASSED
tests/test_playbook.py::TestModelosAlerta::test_resultado_accion_exitoso PASSED
tests/test_playbook.py::TestModelosAlerta::test_resultado_accion_fallido PASSED
tests/test_playbook.py::TestModelosAlerta::test_reporte_todo_exitoso PASSED
tests/test_playbook.py::TestModelosAlerta::test_reporte_con_fallos PASSED
tests/test_playbook.py::TestParserAlertas::test_parseo_dict_valido PASSED
tests/test_playbook.py::TestParserAlertas::test_tipo_desconocido PASSED
tests/test_playbook.py::TestParserAlertas::test_alertas_muestra_no_vacias PASSED
tests/test_playbook.py::TestParserAlertas::test_alertas_muestra_campos_requeridos PASSED
tests/test_playbook.py::TestAcciones::test_bloquear_ip_simulacion PASSED
tests/test_playbook.py::TestAcciones::test_enviar_notificacion_simulacion PASSED
tests/test_playbook.py::TestAcciones::test_crear_ticket_simulado PASSED
tests/test_playbook.py::TestAcciones::test_registrar_evidencia_crea_archivo PASSED
tests/test_playbook.py::TestAcciones::test_deshabilitar_cuenta_simulado PASSED
15 passed in 0.06s
```
运行并生成覆盖率报告:
```
pytest tests/ -v --cov=src --cov-report=term-missing
```
## 路线图
- [ ] 基于 FastAPI 的 REST Endpoint,用于接收来自外部 SIEM 的警报
- [ ] 实时监控警报目录的 Daemon 模式
- [ ] 通过 Slack 和 Microsoft Teams 的通知渠道
- [ ] 与 TheHive 集成进行案例管理
- [ ] 使用 Threat Intelligence 源(AbuseIPDB、OTX)丰富警报
- [ ] 在 AWS Lambda 进行 Serverless 部署
- [ ] 基于 Grafana 的指标仪表板
## 相关项目
该项目可与以下系统自然集成:
- **Log Analyzer** — 生成供此系统使用和执行的警报
- **IAM Audit Tool** — 可根据审计发现触发 `deshabilitar_cuenta` 操作
- **Threat Intel Feed Aggregator** — 在执行 playbook 之前使用 IoC 上下文丰富警报
## 许可证
MIT — 可自由使用、修改和分发。
*作为 Blue Team / SOC 作品集的一部分开发。与 MITRE ATT&CK 框架对齐。*
标签:CISA项目, Cloudflare, ESC漏洞, IP 地址批量处理, IR, MITRE ATT&CK, PB级数据处理, Playbook, Python, SOAR, YAML, 告警分诊, 告警映射, 安全事件自动化响应, 安全剧本, 安全告警, 安全库, 安全规则引擎, 安全运维, 工单系统, 数字取证, 无后门, 模拟运行, 电子取证, 私有化部署, 网络安全, 网络研究, 自动化安全防御, 自动化脚本, 自动封禁IP, 证据收集, 逆向工具, 防御规避, 隐私保护