Sb4m98/Shodan-Vulnerability-Monitor

GitHub: Sb4m98/Shodan-Vulnerability-Monitor

一个基于 Shodan API 的有状态漏洞监控管道,通过 Cosmos DB 去重并推送带有 CVSS/EPSS 评分的 CVE 告警,解决被动侦察中重复告警的痛点。

Stars: 0 | Forks: 0

# Shodan 漏洞监控器 这是一个基于 Shodan API 构建的威胁情报管道,用于持续发现任意网络范围内暴露和存在漏洞的资产。结果存储在 Azure Cosmos DB 中,在摄取时进行去重,并通过 Power BI 仪表板进行展示。新发现的漏洞会触发批量 SMTP 告警。该应用程序打包为 Flask 服务,运行在 Azure App Service 上,并通过 GitHub Actions 实现全自动化的 CI/CD 管道。 ## 概述 该系统解决了被动侦察工作流中的一个常见缺口:缺乏一个有状态的自动化层,无法将 Shodan 结果与持久存储进行关联,并仅展示最新的发现。该管道不会用已知资产的重复告警淹没运维人员,而是在持久化和通知之前,根据数据库检查每个 (IP, port, CVE) 元组,从而保持较高的信噪比。 CVE 元数据富化由 Shodan API 原生处理,它返回 CVSS 和 EPSS 评分以及漏洞摘要和参考链接。这些数据被规范化为适用于 Cosmos DB 和 Power BI 使用的扁平文档结构。 ## 架构 ``` +------------------+ | Shodan API | +--------+---------+ | +--------v---------+ | Flask Web App | <-- HTTP trigger (custom query) +--------+---------+ | +---------------+---------------+ | | +--------v---------+ +----------v--------+ | Azure Cosmos DB | | SMTP Notifier | | (dedup + store) | | (batch email alert)| +------------------+ +-------------------+ | +--------v---------+ | Power BI Report | +------------------+ ``` 部署通过 GitHub Actions 工作流处理,该工作流在每次合并到 `main` 分支时构建、打包并推送到 Azure App Service。 ## 功能 - 通过 HTTP 端点执行任意 Shodan 查询 - CVE 规范化,包含 CVSS、EPSS、排名、摘要和参考链接 - 有状态去重:仅持久化和告警未见过的 (IP, port, CVE) 元组 - 通过 `ThreadPoolExecutor` 进行并发 Cosmos DB 查询 - 批量邮件告警,包含每个发现的完整漏洞上下文 - 扫描后重定向至 Power BI 仪表板 - 密钥完全通过环境变量管理 —— 代码中不包含凭据 ## 环境要求 - Python 3.9+ - 拥有付费 API 密钥的 Shodan 账户(漏洞数据需要 Shodan Enterprise 或 Membership) - Azure Cosmos DB 实例(Core SQL API) - SMTP 中继(Office 365、SendGrid 或等效服务) ## 安装 ``` git clone https://github.com/your-username/shodan-monitor.git cd shodan-monitor pip install -r requirements.txt ``` ## 配置 所有运行时配置均通过环境变量传递。不使用配置文件或硬编码值。 | 变量 | 描述 | |---|---| | `SHODAN_API_KEY` | Shodan API 密钥 | | `SMTP_SERVER` | SMTP 服务器主机名 | | `SMTP_PORT_SECRET` | SMTP 端口(STARTTLS 通常为 587) | | `SMTP_USER_SECRET` | SMTP 认证用户名 | | `SMTP_PASS_SECRET` | SMTP 认证密码 | | `TO_EMAIL_SECRET` | 告警接收者地址 | | `DB_URI` | Azure Cosmos DB 账户 URI | | `DB_NAME` | Cosmos DB 数据库名称 | | `COLLECTION_NAME` | Cosmos DB 容器名称 | | `PRIMARY_KEY_DB` | Cosmos DB 主密钥 | 部署到 Azure App Service 时,应将这些配置为应用程序设置,而不是嵌入到工作流定义中。 ## 本地运行 ``` python app.py ``` 默认绑定到 `0.0.0.0:5000`。 ## API ### `GET /monitoraggio` 针对提供的查询执行 Shodan 搜索,对结果进行规范化和去重,将新发现持久化到 Cosmos DB,如果发现新漏洞则发送邮件告警,并重定向到 Power BI 报告。 **查询参数:** | 参数 | 类型 | 默认值 | 描述 | |---|---|---|---| | `query` | string | `country:"IT" city:"Castelnuovo della Daunia"` | 任意有效的 Shodan 搜索查询 | **示例:** ``` GET /monitoraggio?query=country%3A%22IT%22%20port%3A445%20vuln%3ACVE-2017-0144 ``` 成功时,客户端将重定向到 Power BI 仪表板。失败时,将返回带有 HTTP 500 状态码的 JSON 错误负载。 ## 数据模型 存储在 Cosmos DB 中的每个发现具有以下结构: ``` { "id": "", "ip": "93.x.x.x", "port": 445, "latitude": 41.x, "longitude": 15.x, "CVE": "CVE-2017-0144", "cvss": 9.3, "epss": 0.974, "ranking_epss": 0.99, "summary": "The SMBv1 server in Microsoft Windows...", "device": "", "product": "Windows 7", "references": "https://nvd.nist.gov/vuln/detail/CVE-2017-0144, ..." } ``` 去重操作在任何写入操作之前基于组合键 `(ip, port, CVE)` 执行。 ## 项目结构 ``` . ├── app.py # Flask application and route definitions ├── monitor.py # Core pipeline: search, normalize, persist, notify ├── requirements.txt ├── templates/ │ └── template.html ├── static/ │ └── logo.png └── .github/ └── workflows/ └── main_shodanwebapp.yml # CI/CD pipeline (build + deploy to Azure) ``` ## 部署 包含的 GitHub Actions 工作流处理到 Azure App Service 的完整构建和部署生命周期。 **必需的 GitHub 仓库密钥:** | 密钥 | 描述 | |---|---| | `AZUREAPPSERVICE_CLIENTID_*` | Azure 服务主体客户端 ID | | `AZUREAPPSERVICE_TENANTID_*` | Azure 租户 ID | | `AZUREAPPSERVICE_SUBSCRIPTIONID_*` | Azure 订阅 ID | 工作流在推送到 `main` 分支和手动触发时执行。它在 Python 3.9 环境下构建,安装依赖项,打包应用程序,并部署到 `ShodanWebApp` App Service 的 `Production` 插槽。 ## 安全注意事项 - Shodan 查询的范围应尽可能缩小到运维所需的范围,以避免不必要的 API 额度消耗和意外的侦察范围 - Cosmos DB 主密钥和 SMTP 凭据必须定期轮换,在高安全部署中,最好从 Azure Key Vault 获取,而不是使用 App Service 环境变量 - 当前实现中的 `/monitoraggio` 端点未经身份验证 —— 在暴露给非受信任网络之前,应通过网络或应用网关级别限制访问 - 来自 Shodan 的 EPSS 和 CVSS 评分反映的是查询时的状态;随着 NVD 和 FIRST 更新其数据集,评分可能会发生变化 ## 依赖项 ``` shodan azure-identity azure-keyvault-secrets azure-cosmos Flask ```
标签:Azure App Service, Azure Cosmos DB, CVE 预警, CVSS 评分, EPSS 评分, Flask, GitHub, GitHub Actions, Power BI, Python, Shodan API, SMTP 邮件通知, 去重处理, 威胁情报, 安全工具库, 实时处理, 密码管理, 开发者工具, 无后门, 检测规则, 漏洞监控, 结构化查询, 网络资产发现, 自动化安全, 自动笔记, 被动侦察, 资产暴露面管理, 逆向工具