rogerzeferino/openvas-alert-automation

GitHub: rogerzeferino/openvas-alert-automation

一套基于 Bash 和 Python 的轻量级自动化流水线,在 OpenVAS 扫描完成后通过 Telegram 和企业邮件实时推送告警通知。

Stars: 0 | Forks: 0

# OpenVAS 警报自动化流水线 利用 OpenVAS、HTTP webhook、Bash 和 Python 实现漏洞扫描实时通知的自动化系统。已在企业生产环境中实施。 ## 概述 在 OpenVAS 完成扫描后,系统会自动通过 **Telegram** 和 **企业电子邮件** 触发警报,无需人工干预。该流水线使用 Linux 原生工具(Bash、netcat、Python)构建,并直接与运行在 Docker 中的 OpenVAS 集成。 ## 架构 ``` OpenVAS (Docker) ↓ HTTP GET Alert (Task Done) Webhook Listener (netcat :8080) ↓ stdin pipe Script Bash (parser + Telegram) ↓ env vars + setpriv Script Python (e-mail via relay SMTP) ↓ Telegram Bot + E-mail Corporativo ``` ## 功能 - 在 OpenVAS 完成任何扫描后自动触发警报 - 通过 **Telegram Bot** 进行实时通知 - 通过内部 SMTP 中继发送 **企业电子邮件** - 手动解析 HTTP GET 请求(无外部依赖) - 包含状态、任务名称、日期/时间和建议操作的结构化消息 - 使用 `setpriv` 进行安全的用户上下文切换执行 - 轻量级流水线:netcat + Bash + 纯 Python ## 仓库结构 ``` openvas-alert-automation/ │ ├── scripts/ │ ├── openvas_telegram.sh # Webhook listener + parser + envio Telegram │ └── send_email_openvas.py # Envio de e-mail via SMTP relay │ ├── docs/ │ ├── arquitetura.md # Detalhamento do fluxo │ └── configuracao_openvas.md # Como configurar o alerta HTTP no OpenVAS │ └── README.md ``` ## OpenVAS 中的警报配置 在 OpenVAS 中,使用以下配置创建一个 **Alert**: | 字段 | 值 | |---------|--------------------------------------------| | Method | HTTP Get | | Event | Task run status changed → Done | | URL | `http://SEU_IP:8080/?event=$e&task=$n` | ## Webhook 监听器 监听器循环监听 `8080` 端口上的连接,并通过 stdin 将请求内容直接传递给 Bash 脚本: ``` while true; do nc -l -p 8080 -q 1 | /usr/local/bin/openvas_telegram.sh done ``` ## Bash 脚本 — `openvas_telegram.sh` 负责: 1. 捕获并解析 HTTP GET 请求 2. 通过 `grep -oP` 提取 `event` 和 `task` 参数 3. 将通知发送至 **Telegram Bot** 4. 导出环境变量,并通过 `setpriv` 在受限用户上下文中调用 Python 脚本 ``` #!/bin/bash TOKEN="SEU_TOKEN" CHAT_ID="SEU_CHAT_ID" REQUEST=$(head -n 1) EVENT=$(echo "$REQUEST" | grep -oP 'event=\K[^& ]+') TASK=$(echo "$REQUEST" | grep -oP 'task=\K[^& ]+') EVENT=$(echo "$EVENT" | sed 's/+/ /g') TASK=$(echo "$TASK" | sed 's/+/ /g') [ -z "$EVENT" ] && EVENT="Scan Finalizado" [ -z "$TASK" ] && TASK="N/A" DATA=$(date "+%d/%m/%Y %H:%M") MESSAGE="🚨 ALERTA DE SEGURANÇA 🚨 ━━━━━━━━━━━━━━━━━━━━━━━ 📌 Status: $EVENT 🖥️ Task: $TASK 📅 Data: $DATA ━━━━━━━━━━━━━━━━━━━━━━━ 🔎 Scan de vulnerabilidades concluído. ⚠️ Ação recomendada: • Acessar o OpenVAS • Revisar vulnerabilidades • Priorizar HIGH/CRITICAL " curl -s -X POST https://api.telegram.org/bot$TOKEN/sendMessage \ -d chat_id=$CHAT_ID \ -d text="$MESSAGE" export EVENT export TASK setpriv --reuid=1001 --regid=1001 --clear-groups \ /usr/bin/python3 /usr/local/bin/send_email_openvas.py ``` ## Python 脚本 — `send_email_openvas.py` 负责通过内部 SMTP 中继发送电子邮件,使用 Bash 脚本导出的环境变量。 ``` #!/usr/bin/env python3 import smtplib from email.mime.text import MIMEText from datetime import datetime import os SMTP_SERVER = "SEU_SMTP_RELAY" SMTP_PORT = 25 EMAIL_FROM = "alert.openvas@seudominio.com" EMAIL_TO = "destinatario@seudominio.com" TASK = os.getenv("TASK", "N/A") EVENT = os.getenv("EVENT", "Scan Finalizado") now = datetime.now().strftime("%d/%m/%Y %H:%M") body = f""" 🚨 ALERTA DE SEGURANÇA - OPENVAS 🚨 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 📌 STATUS: {EVENT} 🖥️ TASK: {TASK} 📅 DATA: {now} ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🔎 O scan de vulnerabilidades foi concluído. ⚠️ AÇÃO RECOMENDADA: - Acessar o OpenVAS - Revisar vulnerabilidades - Priorizar HIGH/CRITICAL 🔗 ACESSO: https://SEU_OPENVAS:9392 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Alerta automático do sistema de segurança. """ msg = MIMEText(body) msg["Subject"] = f"[SECURITY ALERT] OpenVAS - {TASK}" msg["From"] = EMAIL_FROM msg["To"] = EMAIL_TO try: server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT) server.send_message(msg) server.quit() print("Email enviado com sucesso.") except Exception as e: print(f"Erro ao enviar email: {e}") ``` ## 需配置的变量 在使用前,请替换脚本中的占位符: | 变量 | 位置 | 描述 | |-------------------|--------------------------|----------------------------------------| | `SEU_TOKEN` | `openvas_telegram.sh` | Telegram Bot Token | | `SEU_CHAT_ID` | `openvas_telegram.sh` | Telegram Chat ID | | `SEU_SMTP_RELAY` | `send_email_openvas.py` | 内部 SMTP 中继的 IP 或主机名 | | `SEU_OPENVAS` | `send_email_openvas.py` | OpenVAS Web 界面的 IP/主机名 | | `EMAIL_FROM` | `send_email_openvas.py` | 发件人地址 | | `EMAIL_TO` | `send_email_openvas.py` | 收件人地址 | ## 解决的主要挑战 **脱离 root 上下文执行** OpenVAS 运行在 Docker 中,且脚本需要以非特权用户身份触发 Python。解决方案:使用带有 `--reuid`、`--regid` 和 `--clear-groups` 参数的 `setpriv`。 **手动解析 HTTP 请求** OpenVAS 仅支持简单的 HTTP GET。在没有框架的情况下,直接通过 `grep -oP` 和 `sed` 对 netcat 捕获的 stdin 进行了解析。 **通过 stdin 进行进程间通信** `nc → bash → python` 的流程需要谨慎处理 stdin 的行为:netcat 需要 `-q 1` 标志,以便在接收到第一个数据包后关闭连接并释放管道。 **通过环境变量实现 Bash + Python 集成** 由于 Python 是作为子进程被 Bash 调用的,因此数据传递是通过 `export` 环境变量来完成的,从而避免了使用临时文件或更复杂的解决方案。 **具有隔离网络的 Docker 环境** OpenVAS 容器需要能够访问运行监听器的主机。这需要在 Docker 中调整网络配置(主机网络模式或正确的接口映射)。 ## 使用技术 - **OpenVAS / Greenbone** — 漏洞扫描器 - **Bash** — 流水线解析与编排 - **Python 3** — 通过 smtplib 发送电子邮件 - **Netcat (nc)** — 监听 8080 端口的轻量级 HTTP 监听器 - **curl** — 与 Telegram API 集成 - **setpriv** — 安全的用户上下文切换 - **Docker** — OpenVAS 的执行环境 - **Ubuntu Server** — 基础操作系统 ## 结果 - 流水线在企业环境(生产)中运行正常 - 每次扫描结束后自动发送警报,无需人工干预 - 事件发生后不到 5 秒即可通过 Telegram 和电子邮件送达通知 - 结构化消息提供充足的上下文以便立即进行分类处理 - 为未来与 SIEM(Wazuh / StellarCyber)的集成奠定了基础 ## 后续步骤 - 与 Wazuh 集成以实现事件关联 - 使用报告中的数据(CVE、受影响的主机)丰富警报内容 - 用更健壮的监听器(socat 或 Python 服务)替代 netcat - 扫描历史记录仪表板 ## 安全警告 本仓库中的脚本包含敏感凭证(Telegram Token、电子邮件地址、内部 IP)的占位符。**切勿将真实数值提交至公共仓库。**在生产环境中请使用环境变量或 secrets 管理工具。 *本项目在真实的企业环境中开发并实施 — Nortox S/A*
标签:DevSecOps, Docker, GPT, HTTP监听, IT运维, netcat, OpenVAS, PB级数据处理, PHP, Python, SecOps, Shell脚本, SMTP, Socks5代理, Telegram机器人, Webhook, 上游代理, 云安全架构, 企业安全, 力导向图, 子域名枚举, 安全信息与事件管理, 安全运维, 安全防御评估, 实时通知, 应用安全, 搜索引擎爬取, 数字取证, 无后门, 漏洞管理, 系统安全, 网络安全, 网络资产管理, 自动化告警, 自动化脚本, 请求拦截, 邮件通知, 隐私保护