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, 上游代理, 云安全架构, 企业安全, 力导向图, 子域名枚举, 安全信息与事件管理, 安全运维, 安全防御评估, 实时通知, 应用安全, 搜索引擎爬取, 数字取证, 无后门, 漏洞管理, 系统安全, 网络安全, 网络资产管理, 自动化告警, 自动化脚本, 请求拦截, 邮件通知, 隐私保护