SaniaSaeed2/threat-intel-platform
GitHub: SaniaSaeed2/threat-intel-platform
基于Spring Cloud微服务和Kafka的分布式威胁情报处理平台,自动化完成从多源威胁数据采集、IOC提取验证、VirusTotal评分到持久化存储的完整流水线。
Stars: 0 | Forks: 0
# 威胁情报处理平台
一个基于分布式微服务的网络安全平台,从 AbuseIPDB 和 AlienVault OTX 获取威胁数据,提取并验证入侵指标 (IOC),使用 VirusTotal 对其进行评分,并将丰富后的结果存储在 MySQL 中——所有这一切均通过 Apache Kafka 进行连接。
## 目录
- [概述](#overview)
- [架构](#architecture)
- [技术栈](#tech-stack)
- [微服务](#microservices)
- [Kafka 主题](#kafka-topics)
- [入门指南](#getting-started)
- [API 接口](#api-endpoints)
- [API 密钥](#api-keys)
- [故障排除](#troubleshooting)
-
## 概述
手动威胁分析无法跟上现代攻击量的步伐。该平台自动化了整个 pipeline——从威胁信息源中提取原始数据,一直到存储经过清理和严重性评分、可供查询的 IOC。
**功能特性:**
- 从 AbuseIPDB 和 AlienVault OTX 获取 IP 和域名威胁数据
- 使用基于正则表达式的解析提取并验证 IOC
- 对私有或不可路由的指标进行去重和过滤
- 使用 VirusTotal(基于规则 + API 评分)对每个 IOC 进行评分
- 将带有完整审计字段的丰富记录存储在 MySQL 中
- 暴露用于查询、排序和分析的 REST 端点
## 架构
```
External APIs Kafka Pipeline Storage & Analytics
───────────── ────────────── ───────────────────
AbuseIPDB ──┐ ┌── MySQL DB
├──► Ingestion ──► [raw-threats] ──► Processing ──► [processed-iocs] ──► Database Service
AlienVault ──┘ Service (Kafka) Service │
│ │
└──► [iocs-to-rank] ──► Ranking ───────┘
Service
(Severity Scores)
│
[ranked-iocs]
│
Database Service
│
Analytics Service
│
API Gateway (:8080) ◄──────────────── Frontend Dashboard ◄──────────────────────────┘
Eureka Service Registry (:8761)
```
## 技术栈
| 组件 | 技术 |
|---|---|
| 语言 | Java 17 + Spring Boot |
| 服务发现 | Spring Cloud Eureka |
| API 网关 | Spring Cloud Gateway |
| 消息传递 | Apache Kafka 3.x + Zookeeper |
| 数据库 | MySQL 8.0 |
| ORM | Spring Data JPA (Hibernate) |
| HTTP 客户端 | Spring WebFlux (WebClient) |
| 容器化 | Docker + Docker Compose |
| 构建工具 | Apache Maven 3.8+ |
| 前端 | HTML + CSS + Vanilla JS |
| 威胁源 1 | AbuseIPDB REST API |
| 威胁源 2 | AlienVault OTX REST API |
| 评分 API | VirusTotal API v3 |
## 微服务
| 服务 | 端口 | 职责 |
|---|---|---|
| `eureka-server` | 8761 | 服务发现与注册中心 |
| `api-gateway` | 8080 | 统一入口点、路由、CORS |
| `ingestion-service` | 8081 | 从 AbuseIPDB 和 AlienVault 拉取数据 |
| `extraction-service` | 8082 | 解析 JSON,提取 IP 和域名 |
| `processing-service` | 8083 | 验证、去重并重新发布 IOC |
| `database-service` | 8084 | 将 IOC 存储在 MySQL 中,暴露 REST API |
| `ranking-service` | 8085 | 通过基于规则 + VirusTotal 计算严重性评分 |
| `analytics-service` | 8086 | 聚合视图与统计 |
| `kafka-producer-service` | 8087 | 手动和编程式 Kafka 发布 |
## Kafka 主题
| 主题 | 生产者 | 消费者 |
|---|---|---|
| `raw-threats` | Ingestion Service | Processing Service |
| `processed-iocs` | Processing Service | Database Service |
| `iocs-to-rank` | Processing Service | Ranking Service |
| `ranked-iocs` | Ranking Service | Database Service |
## 入门指南
### 前置条件
| 工具 | 版本 | 下载 |
|---|---|---|
| Java JDK | 17+ | https://adoptium.net |
| Maven | 3.8+ | https://maven.apache.org |
| MySQL | 8.0 | https://dev.mysql.com/downloads |
| Apache Kafka | 3.x | https://kafka.apache.org/downloads |
| Docker | Latest | https://www.docker.com |
### 选项 A —— Docker Compose(推荐)
```
# 克隆仓库
git clone https://github.com/your-username/threat-intel-platform.git
cd threat-intel-platform
# (可选)设置真实 API keys
export ABUSEIPDB_API_KEY=your_key_here
export ALIENVAULT_API_KEY=your_key_here
export VIRUSTOTAL_API_KEY=your_key_here
# 启动所有内容
docker-compose up --build
```
运行后,请打开:
- 前端仪表板:http://localhost:3000
- Eureka 仪表板:http://localhost:8761
- Kafka UI:http://localhost:9090
### 选项 B —— 手动运行
#### 步骤 1:设置 MySQL
```
mysql -u root -p < schema.sql
```
在 `database-service/src/main/resources/application.yml` 中更新凭据:
```
spring:
datasource:
username: root
password: your_password
```
#### 步骤 2:启动 Zookeeper 和 Kafka
```
# 终端 1 — Zookeeper
$KAFKA_HOME/bin/zookeeper-server-start.sh $KAFKA_HOME/config/zookeeper.properties
# 终端 2 — Kafka broker
$KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/config/server.properties
# 终端 3 — 创建 topics(Kafka 启动后等待 10 秒)
chmod +x create-kafka-topics.sh
./create-kafka-topics.sh
```
#### 步骤 3:构建所有服务
```
mvn clean package -DskipTests
```
#### 步骤 4:按顺序启动服务
```
# 终端 1 — Eureka(启动其他服务前等待 10 秒)
java -jar eureka-server/target/eureka-server-1.0.0.jar
# 终端 2 — API Gateway
java -jar api-gateway/target/api-gateway-1.0.0.jar
# 终端 3 — Ingestion Service
java -jar ingestion-service/target/ingestion-service-1.0.0.jar
# 终端 4 — Extraction Service
java -jar extraction-service/target/extraction-service-1.0.0.jar
# 终端 5 — Processing Service
java -jar processing-service/target/processing-service-1.0.0.jar
# 终端 6 — Database Service
java -jar database-service/target/database-service-1.0.0.jar
# 终端 7 — Ranking Service
java -jar ranking-service/target/ranking-service-1.0.0.jar
# 终端 8 — Analytics Service
java -jar analytics-service/target/analytics-service-1.0.0.jar
# 终端 9 — Kafka Producer Service
java -jar kafka-producer-service/target/kafka-producer-service-1.0.0.jar
```
或使用启动脚本:
```
chmod +x start-all.sh && ./start-all.sh
```
#### 步骤 5:打开前端
```
threat-intel-platform/frontend/src/index.html
```
或使用 live-server:
```
cd frontend/src
npx live-server --port=3000
```
## API 接口
所有请求均通过位于 `http://localhost:8080` 的 API Gateway 进行。
### 获取
```
# 从所有来源触发 ingestion
curl -X POST "http://localhost:8081/api/ingest/trigger?source=all"
```
### IOC
```
# 获取所有 IOC(分页)
curl "http://localhost:8084/api/ioc?page=0&size=10"
# 获取统计信息
curl "http://localhost:8084/api/ioc/stats"
# 获取高严重性 IOC
curl "http://localhost:8084/api/ioc/high-severity?minScore=7.0"
```
### 评分
```
# 对特定 IOC 进行排名
curl "http://localhost:8085/api/rank/ioc?value=185.220.101.5&type=IP_ADDRESS"
```
### Kafka 生产者
```
# 手动将 IOC 发布到 Kafka
curl -X POST "http://localhost:8087/api/kafka/publish-ioc?iocValue=1.2.3.4&iocType=IP_ADDRESS"
```
### 通过 API Gateway
```
curl "http://localhost:8080/api/ioc/stats"
curl "http://localhost:8080/api/analytics/summary"
```
## API 密钥
该系统在没有 API 密钥的情况下以演示模式运行——将自动加载模拟数据。
要使用真实的威胁情报,请注册并设置以下内容:
| 提供商 | 注册地址 | 环境变量 |
|---|---|---|
| AbuseIPDB | https://www.abuseipdb.com | `ABUSEIPDB_API_KEY` |
| AlienVault OTX | https://otx.alienvault.com | `ALIENVAULT_API_KEY` |
| VirusTotal | https://www.virustotal.com | `VIRUSTOTAL_API_KEY` |
## 故障排除
| 问题 | 解决方案 |
|---|---|
| 服务未在 Eureka 中显示 | 启动后等待 30–60 秒——Eureka 存在心跳延迟 |
| MySQL 连接被拒绝 | 确保 MySQL 在端口 3306 上运行且凭据正确 |
| Kafka 连接被拒绝 | 确保在 Kafka 之前启动 Zookeeper |
| `ClassNotFoundException` | 使用 `mvn clean package -DskipTests` 重新构建 |
| 端口已被占用 | 运行 `lsof -ti:8081 \| xargs kill -9`(根据需要替换端口) |
| 数据库中没有 IOC | 通过前端或 curl 触发手动获取 |
## 项目结构
```
threat-intel-platform/
├── analytics-service/
├── api-gateway/
├── database-service/
├── eureka-server/
├── extraction-service/
├── frontend/
├── ingestion-service/
├── kafka-producer-service/
├── processing-service/
├── ranking-service/
├── docker-compose.yml
├── pom.xml
├── schema.sql
└── README.md
```
**课程:** COMP-370 – 软构建与开发
**机构:** PAF-IAST,计算科学学院,Mang,Haripur
**讲师:** Dr. Malik Nabeel Ahmed Awan
标签:AbuseIPDB, Apache Kafka, Ask搜索, IOC提取, IP威胁分析, Java/Python/Go, Kafka消息队列, RESTful API, VirusTotal, 代码示例, 分布式系统, 后端开发, 响应大小分析, 域名安全, 多模态安全, 威胁情报, 威胁评分, 安全数据管道, 实时处理, 开发者工具, 微服务架构, 情报收集, 提示词优化, 攻击指标, 数据分析, 数据可视化, 数据清洗, 漏洞指标, 漏洞研究, 版权保护, 网络安全, 请求拦截, 软件成分分析, 隐私保护