Sanjay-Suresh2005/file-integrity-monitor
GitHub: Sanjay-Suresh2005/file-integrity-monitor
一款蓝队文件完整性监控工具,结合 VirusTotal 威胁情报和 ELK SIEM 实现实时文件变更检测、恶意软件识别与自动化告警。
Stars: 1 | Forks: 0
# 🛡️ 文件完整性监控 (FIM)
一款实时的蓝队安全工具,用于监控目录中的未经授权文件更改,结合 **VirusTotal 威胁情报**丰富事件信息,并将结构化审计日志发送至 **ELK stack SIEM**,配合自动化检测规则。





## 📌 功能简介
- **实时检测**文件创建、修改、删除及重命名/移动事件
- 使用 SHA-256 对每个文件进行**哈希计算**,并与已知良好的基线进行比对
- 调用 **VirusTotal** API v3 查询每个新建或修改文件的威胁信誉
- 检测到恶意软件时,将日志严重性**升级**为 Critical(严重),并附加 ECS `threat.*` 字段
- 通过 Logstash 将结构化的 NDJSON 日志**传输**至 Elasticsearch
- 通过 6 条 Kibana SIEM 检测规则进行**告警**,涵盖勒索软件、恶意软件植入、删除以及规避技术
## 🏗️ 架构
```
FIM_lab/ (monitored directory)
│
▼
monitor.py (Watchdog Observer)
│ fires instantly on any file event
▼
event_processor.py (Non-blocking Queue)
│ returns immediately, enqueues work
▼
Background Workers (4x daemon threads)
├── vt_client.py ──► VirusTotal API v3 (SHA-256 lookup)
│ └── virustotal_cache (SQLite, 7-day TTL)
├── database.py ───► fim.db (SQLite audit trail)
└── logger.py ─────► fim_events.log (ECS NDJSON)
│
▼
Logstash (Docker)
│
▼
Elasticsearch ──► Kibana SIEM
(fim-events index) (6 detection rules)
```
## 🚀 快速开始
### 前置条件
- Python 3.10+
- Docker Desktop
- VirusTotal API 密钥(免费版即可)
### 1. 克隆仓库
```
git clone https://github.com/Sanjay-Suresh2005/file-integrity-monitor.git
cd file-integrity-monitor
```
### 2. 设置环境
**在 Windows 上(命令提示符):**
```
copy .env.example .env
```
**在 Linux/macOS 上:**
```
cp .env.example .env
```
编辑 `.env` 并填入你的值:
```
VT_API_KEY=your_virustotal_api_key_here
VT_ENABLED=true
ELASTIC_PASSWORD=your_elastic_password_here
ELASTICSEARCH_PASSWORD=your_elastic_password_here
```
### 3. 安装 Python 依赖
```
cd FIM_project
pip install -r requirements.txt
```
### 4. 启动 ELK stack
```
cd ..
docker compose up -d
```
等待约 60 秒,直到所有容器变为健康状态。Kibana 将可以通过 `http://localhost:5601` 访问。
### 5. 运行 FIM agent
```
cd FIM_project
python main.py
```
Agent 将执行以下操作:
1. 为受监控目录中的所有文件建立基线
2. 开始监控实时变更
3. 对每个新建或修改的文件查询 VirusTotal
4. 通过 Logstash 将事件发送至 Elasticsearch
## 📁 项目结构
```
file-integrity-monitor/
├── .env.example # Environment variable template
├── .gitignore
├── docker-compose.yml # ELK stack (Elastic 9.4.1)
├── FIM_project/
│ ├── main.py # Entry point: baseline + monitoring
│ ├── config.py # Paths, settings, .env loader
│ ├── hashing.py # SHA-256 + file metadata
│ ├── database.py # SQLite: events, baseline, VT cache
│ ├── vt_client.py # VirusTotal API v3 client
│ ├── monitor.py # Watchdog filesystem observer
│ ├── event_processor.py # Non-blocking worker queue engine
│ ├── logger.py # ECS-compliant NDJSON logger
│ ├── requirements.txt
│ └── tests/
│ ├── test_fim_events.py # 11 unit + integration tests
│ └── run_tests.py
├── logstash/
│ ├── fim_template.json # Elasticsearch index template
│ └── pipeline/
│ └── logstash.conf # Logstash input/filter/output
├── kibana/
│ └── README_KIBANA_RULES.md # Detection rules documentation
└── simulation/
├── trigger_rule2_eicar.py # Simulate malware detection
├── trigger_rule4_ransomware.py # Simulate ransomware pattern
├── trigger_rule8_repeated.py # Simulate file tampering
└── trigger_rule9_executable.py # Simulate malware drop
```
## 🔍 VirusTotal 集成
每个 `file_created` 或 `file_modified` 事件都会触发 SHA-256 信誉查询:
```
New/modified file detected
│
▼
Check virustotal_cache (SQLite)
│
┌────┴────┐
Cache hit Cache miss
< 7 days or expired
│ │
│ ▼
│ GET /api/v3/files/{sha256}
│ │
│ ┌──────┴──────┐
│ 404 (unknown) 200 (known)
│ cache as clean cache result
└────────┬─────────┘
│
malicious_count > 0?
┌────────┴────────┐
YES NO
│ │
Escalate severity Standard log
to Critical (7) severity: 1
Add threat.* fields
Alert in Kibana
```
**缓存行为:**
- 结果缓存 7 天 — 保护免费 API 额度(限制为 4 次请求/分钟)
- HTTP 404(未知文件)将被缓存为安全 — 防止重复查询
- HTTP 429(频率限制)会被优雅处理 — 监控继续 uninterrupted
## 🚨 Kibana 检测规则
6 条涵盖全面威胁光谱的自定义 SIEM 规则:
| 规则 | 严重性 | 触发条件 |
|------|----------|---------|
| FIM — 检测到恶意文件 (VirusTotal) | 🔴 Critical | VT 标记哈希为恶意 |
| FIM — 频繁文件修改 (勒索软件模式) | 🔴 High | 同一主机在 1 分钟内发生 10 次以上修改 |
| FIM — 受监控目录中文件被删除 | 🔴 High | 任何文件被删除 |
| FIM — 植入可执行文件或脚本 | 🟡 Medium | 创建了 .exe .bat .ps1 .py .vbs .sh 文件 |
| FIM — 文件被重命名或移动 | 🟡 Medium | 任何文件被重命名或移动 |
| FIM — 同一文件被反复修改 | 🟡 Medium | 同一文件在 1 分钟内被修改 5 次以上 |
有关完整的规则查询和设置说明,请参阅 [`kibana/README_KIBANA_RULES.md`](kibana/README_KIBANA_RULES.md)。
## 🧪 测试
```
cd FIM_project
python -m unittest tests/test_fim_events.py
```
11 项测试涵盖:
- 所有 4 种事件类型(创建、修改、删除、移动)
- VT 缓存存储和 7 天过期机制
- 对 404、429 和网络超时的优雅处理
- 恶意情报丰富化 — 严重性升级,ECS threat 字段
## 🎭 威胁模拟与规则测试
在 `simulation/` 目录内提供了一组自动化模拟脚本,以帮助验证您的 Kibana SIEM 检测规则并演示其功能。
确保 FIM agent 正在运行(在 `FIM_project/` 中执行 `python main.py`),然后从项目根目录执行以下任何命令:
### 1. 模拟恶意软件检测(规则 2)
写入标准的 EICAR 防病毒测试特征码。这将触发 VirusTotal 查询,将告警升级为 **Critical** 严重性,并附加 ECS 威胁情报块:
```
python simulation/trigger_rule2_eicar.py
```
### 2. 模拟勒索软件模式(规则 4)
在几秒钟内快速创建/修改 12 个文件,以触发基于阈值的勒索软件活动规则:
```
python simulation/trigger_rule4_ransomware.py
```
### 3. 模拟文件篡改(规则 8)
连续 6 次对单个文件附加更改,以触发频繁修改告警:
```
python simulation/trigger_rule8_repeated.py
```
### 4. 模拟植入脚本/可执行文件(规则 9)
写入模拟的 PowerShell 脚本(`.ps1`)以触发脚本植入告警:
```
python simulation/trigger_rule9_executable.py
```
## 🔧 技术栈
| 组件 | 技术 |
|-----------|------------|
| Agent 语言 | Python 3.10+ |
| 文件系统监控 | Watchdog |
| 威胁情报 | VirusTotal API v3 |
| 本地存储 | SQLite |
| 日志格式 | NDJSON / Elastic Common Schema (ECS) |
| 日志提取 | Logstash 9.4.1 |
| 搜索与存储 | Elasticsearch 9.4.1 |
| SIEM 与仪表板 | Kibana 9.4.1 |
| 容器化 | Docker Compose |
## ⚙️ 配置
所有设置均通过 `.env` 控制:
| 变量 | 描述 |
|----------|-------------|
| `VT_API_KEY` | 您的 VirusTotal API 密钥 |
| `VT_ENABLED` | 设置为 `true` 以启用威胁查询 |
| `ELASTIC_PASSWORD` | Kibana 登录密码 |
| `ELASTICSEARCH_PASSWORD` | Elasticsearch 内部密码 |
要禁用 VirusTotal(离线/物理隔离模式),请设置 `VT_ENABLED=false`。Agent 将在没有任何 API 调用的情况下继续监控和记录日志。
⚠️ `docker-compose.yml` 中的 Kibana 加密密钥仅适用于
本地/实验室环境使用。在任何生产部署中,请将其替换为随机 32 个字符以上的字符串。
## 📄 许可证
MIT License — 详情请参阅 [LICENSE](LICENSE)。
标签:Docker, ELK技术栈, Python, 内容过滤, 威胁情报, 安全运营, 安全防御评估, 开发者工具, 扫描框架, 无后门, 版权保护, 越狱测试, 逆向工具