fgravato/web-lookoutthreatfeed
GitHub: fgravato/web-lookoutthreatfeed
一个 Flask Web 应用,为 Lookout Mobile Endpoint Security 的威胁源阻止列表提供可视化管理界面,替代直接调用 API 的操作方式。
Stars: 0 | Forks: 0
# Lookout Threat Feed Manager
一个 Flask Web 应用,用于通过 [Threat Feed Management API](https://api.lookout.com/mgmt/threat-feeds/api-docs/external) 管理 [Lookout Mobile Endpoint Security](https://www.lookout.com) 的威胁源阻止列表。
## 功能
- **列表、创建、编辑和删除**威胁源
- **搜索**源内的域名(通过 DataTables 在客户端进行过滤)
- **批量添加或删除**域名,只需粘贴列表即可(每次请求最多 15,000 个)
- **文件上传** — 支持 CSV 或 JSON 格式,可选择增量或完全覆盖模式
- 显示 API 针对每个域名返回的部分成功错误
## 要求
- Python 3.9+
- 拥有具备威胁源权限的 Lookout API key
## 快速开始
```
# 1. Clone
git clone https://github.com/fgravato/web-lookoutthreatfeed.git
cd web-lookoutthreatfeed
# 2. 创建并激活 virtual environment
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# 3. 安装依赖
pip install -r requirements.txt
# 4. 添加您的 API key
cp config.ini config.local.ini
# 打开 config.local.ini,并将 YOUR_API_KEY_HERE 替换为您的 Lookout API key
```
```
# 5. 运行
flask run
```
打开 [http://localhost:5000](http://localhost:5000)。
## 配置
API 凭证从 INI 文件中读取。`config.local.ini` 优先级更高,且已被 git 忽略——请将您的真实密钥放在该文件中。
| 文件 | 是否提交 | 用途 |
|---|---|---|
| `config.ini` | 是 | 占位符模板——可以安全提交 |
| `config.local.ini` | **否** | 您的真实 API key——切勿提交此文件 |
```
[lookout]
api_key =
```
API key 会在首次请求时交换为短期的 OAuth2 bearer token。该 token 缓存在 Flask session 中,并在过期时自动刷新。
## 使用方法
### 管理源
主页列出了您租户的所有源。在那里您可以:
- **创建**新源(需要标题和描述,各 8–255 个字符)
- **编辑**源的标题、描述或分析权限
- **删除**源(需确认提示)
- **点击源**以打开其域名管理页面
### 管理域名
在源详情页面上:
| 操作 | 方法 |
|---|---|
| 搜索 | 在搜索框中输入——即时过滤域名列表 |
| 添加域名 | 在 **Bulk Add** 中每行粘贴一个域名,点击 Add |
| 删除域名 | 在 **Bulk Delete** 中每行粘贴一个域名,点击 Delete |
| 删除单个域名 | 点击任何域名行旁边的 **×** 按钮 |
| 上传文件 | 选择 CSV 或 JSON 文件,选择上传类型,点击 Upload |
批量添加/删除每次请求最多支持 **15,000 个域名**(API 限制)。
### 文件上传格式
#### 增量 CSV — 添加或移除特定域名
```
domain,action
evil.com,add
old-threat.net,delete
```
#### 覆盖 CSV — 替换整个源
```
domain
evil.com
bad-actor.net
```
#### JSON — 仅限增量
```
{
"operations": [
{"domain": "evil.com", "action": "add"},
{"domain": "old-threat.net", "action": "delete"}
]
}
```
API 强制执行的文件大小限制:文件上传为 **7 MB**,JSON 增量更新为 **2 MB**。
## 运行测试
```
source .venv/bin/activate
python -m pytest test_app.py -v
```
测试使用了一个 stub `requests` 模块——无需网络调用,也不需要 API key。
## 生产部署
对于本地之外的任何用途,请在其后端运行 WSGI 服务器并设置一个固定的 secret key:
```
pip install gunicorn
FLASK_SECRET_KEY= gunicorn app:app
```
请从环境变量或 secrets manager 中设置 `app.secret_key`,而不是使用 `app.py` 中自动生成的值。
## 故障排除
| 症状 | 可能原因 | 解决方法 |
|---|---|---|
| 主页显示 "Could not authenticate" | API key 缺失或错误 | 检查 `config.local.ini` 是否存在且 key 正确 |
| 每次请求都返回 401 | Token 交换失败 | 在 Lookout 控制台中验证 key 是否具有 threat feed scopes |
| 上传返回 413 | 文件超出 API 大小限制 | 拆分为较小的文件(7 MB / 2 MB 限制) |
| 上传后出现 "Invalid Domain" 错误 | API 拒绝了域名格式 | 确保域名为裸主机名(`evil.com`,而不是 `https://evil.com`) |
| 找不到源 (404) | 源 ID 已不存在 | 从主页刷新源列表 |
## 项目结构
```
app.py # Flask application (~220 lines)
templates/
base.html # Bootstrap 5 layout, flash messages
feeds.html # Feed list + create modal
feed_detail.html # Domain table, bulk ops, file upload, edit modal
config.ini # API key template (commit-safe placeholder)
requirements.txt # flask, requests
test_app.py # 21 unit tests (no network)
swagger.json # Lookout API OpenAPI 3.0 spec
```
## API 参考
此应用封装了 Lookout Threat Feed Management API (`https://api.lookout.com/mgmt/threat-feeds`):
| 方法 | 路径 | 用途 |
|---|---|---|
| GET | `/api/v1/threat-feeds` | 列出租户的源 GUID |
| POST | `/api/v1/threat-feeds` | 创建新源 |
| GET | `/api/v1/threat-feeds/{id}` | 获取源的元数据 |
| PUT | `/api/v1/threat-feeds/{id}` | 更新标题/描述/分析标志 |
| DELETE | `/api/v1/threat-feeds/{id}` | 删除源 |
| GET | `/api/v1/threat-feeds/{id}/elements` | 下载所有域名 (CSV) |
| POST | `/api/v1/threat-feeds/{id}/elements` | 通过 CSV 文件上传域名 |
| POST | `/api/v1/threat-feeds/{id}/elements/incremental-updates` | 通过 JSON 批量添加/删除 |
完整规范:[`swagger.json`](swagger.json) 或 [在线 API 文档](https://api.lookout.com/mgmt/threat-feeds/api-docs/external)。
## 贡献
1. Fork 该仓库并创建一个分支
2. 进行修改并添加测试 (`test_app.py`)
3. 运行 `python -m pytest test_app.py -v`——所有测试必须通过
4. 发起一个 pull request
## 许可证
MIT
标签:CSV上传, DataTables, Flask, JSON解析, Lookout, OAuth2, Python, RESTful API, 企业安全, 威胁情报, 威胁源管理, 开发者工具, 开源, 批量操作, 提示词优化, 无后门, 移动端点安全, 端点防护, 网络安全管理, 网络资产管理, 虚拟环境, 逆向工具, 阻止列表, 黑名单管理