fgravato/Lookout_Device_dashboard

GitHub: fgravato/Lookout_Device_dashboard

一个基于 Flask 的 Lookout 移动设备风险仪表板,解决多租户设备监控、CVE 扫描与大规模数据导出的性能问题。

Stars: 0 | Forks: 0

# Lookout MRA 设备仪表板 用于通过 Lookout Mobile Risk API v2 管理移动设备的 Flask Web 应用程序。提供实时仪表板、设备过滤、Excel 导出、CVE 漏洞扫描、多租户支持和智能缓存功能。 ## 功能特性 - **设备仪表板** — 实时设备库存,含连接、暂存、断开等状态摘要 - **高级过滤** — 按平台、风险等级、保护状态、连接状态、自上次检查以来的天数等条件过滤 - **Excel 导出** — 使用 openpyxl 导出带汇总页的过滤设备数据 - **CVE 漏洞扫描** — 对设备舰队进行已知 CVE 扫描 - **多租户支持** — 从单个仪表板管理多个 Lookout 租户 - **智能缓存** — 内存与 SQLite 持久化结合,后台刷新与增量同步 - **身份验证** — 可选的 HTTP Basic 身份验证,配合 Werkzeug 密码哈希 - **速率限制** — 内置 Flask-Limiter 对 API 端点的保护 ## 先决条件 - Python 3.8 或更高版本 - 拥有 Lookout Mobile Endpoint Protection 账户并具备 API 访问权限(或开发模式下使用示例数据) ## 安装 ### macOS / Linux ``` # 解压 ZIP 文件 unzip Lookout-Reporting_tool_version1.zip cd Lookout-Reporting_tool_version1 # 创建虚拟环境(推荐) python3 -m venv venv source venv/bin/activate # 安装依赖 pip install -r requirements.txt ``` ### Windows **选项 A — 使用命令提示符:** ``` :: Extract the zip file to a folder, then open Command Prompt and navigate to it cd C:\Users\YourName\Downloads\Lookout-Reporting_tool_version1 :: Create a virtual environment python -m venv venv :: Activate the virtual environment venv\Scripts\activate.bat :: Install dependencies pip install -r requirements.txt ``` **选项 B — 使用 PowerShell:** ``` # 将 ZIP 文件解压到文件夹,然后打开 PowerShell 并导航到该文件夹 cd C:\Users\YourName\Downloads\Lookout-Reporting_tool_version1 # 创建虚拟环境 python -m venv venv # 激活虚拟环境 # 注意:如果遇到执行策略错误,请先运行以下命令: # Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser venv\Scripts\Activate.ps1 # 安装依赖 pip install -r requirements.txt ``` **验证安装:** ``` python -c "import flask; print('Flask', flask.__version__)" ``` 若看到 `Flask 3.0.0`,则安装成功。 ### 依赖项 | 包 | 用途 | |----|------| | Flask 3.0 | Web 框架 | | requests 2.31 | Lookout API 的 HTTP 客户端 | | openpyxl 3.1 | Excel 文件生成 | | python-dotenv 1.0 | 环境变量管理 | | Flask-HTTPAuth 4.8 | HTTP Basic 身份验证 | | Flask-Limiter 3.5 | API 速率限制 | | python-dateutil 2.8 | 日期/时间工具 | ## 配置 复制示例环境文件并编辑: ``` cp .env.example .env # macOS/Linux copy .env.example .env # Windows ``` 在任意文本编辑器中打开 `.env` 并更新适用于你环境的值。 ### 必需设置 | 变量 | 描述 | |------|------| | `LOOKOUT_APPLICATION_KEY` | 你的 Lookout API 应用程序密钥(若使用示例数据则不需要) | ### 通用设置 | 变量 | 默认值 | 描述 | |------|--------|------| | `USE_SAMPLE_DATA` | `false` | 使用内置示例数据而非真实 API | | `AUTH_ENABLED` | `false` | 启用 HTTP Basic 身份验证 | | `AUTH_USERS` | — | 用户凭据,格式为 `user:pass,user2:pass2` | | `HOST` | `127.0.0.1` | 服务器绑定地址 | | `PORT` | `5000` | 服务器端口 | | `DEBUG` | `false` | 启用 Flask 调试模式 | | `FLASK_ENV` | `default` | 环境:`development`、`production` 或 `testing` | | `LOG_LEVEL` | `INFO` | 日志级别:DEBUG、INFO、WARNING、ERROR | ### 缓存设置 | 变量 | 默认值 | 描述 | |------|--------|------| | `CACHE_ENABLED` | `true` | 启用内存缓存 | | `CACHE_MAX_AGE_MINUTES` | `60` | 缓存 TTL(分钟) | | `ENABLE_DISK_CACHE` | `true` | 将缓存持久化到 SQLite(重启后保留) | | `CACHE_FILE_PATH` | `./device_cache.db` | SQLite 缓存文件位置 | | `AUTO_REFRESH_ON_STARTUP` | `true` | 应用启动时获取设备数据 | | `BACKGROUND_REFRESH_ENABLED` | `false` | 启用后台缓存刷新线程 | | `BACKGROUND_REFRESH_INTERVAL_MINUTES` | `30` | 后台刷新间隔 | | `ENABLE_DELTA_SYNC` | `true` | 刷新时仅获取已更改设备 | | `DELTA_SYNC_LOOKBACK_HOURS` | `24` | 增量同步时间窗口 | ### 多租户设置 | 变量 | 默认值 | 描述 | |------|--------|------| | `ENABLE_MULTI_TENANT` | `false` | 启用多租户模式 | | `TENANTS_CONFIG_FILE` | `./tenants.json` | 租户配置文件路径 | ### API 设置 | 变量 | 默认值 | 描述 | |------|--------|------| | `API_TIMEOUT` | `30` | API 请求超时(秒) | | `API_RETRY_ATTEMPTS` | `3` | 失败重试次数 | | `MAX_DEVICES_PER_REQUEST` | `1000` | 每页设备数(最大 1000) | ### 获取 Lookout 应用程序密钥 1. 以管理员身份登录 [Lookout 控制台](https://app.lookout.com) 2. 导航至 **System > Application Keys** 3. 点击 **GENERATE KEY** 并输入标签 4. 立即复制生成的密钥(之后无法检索) 5. 将其添加到 `.env` 文件中 ## 运行应用程序 ### 开发模式(使用示例数据) 无需 API 密钥。 **macOS / Linux:** ``` USE_SAMPLE_DATA=true python app.py ``` **Windows(命令提示符):** ``` set USE_SAMPLE_DATA=true python app.py ``` **Windows(PowerShell):** ``` $env:USE_SAMPLE_DATA="true" python app.py ``` ### 生产环境 ``` python run_dashboard.py ``` 启动脚本会检查依赖项和配置,打印状态摘要并自动打开浏览器。 或者直接运行: ``` python app.py ``` 仪表板默认地址为 `http://localhost:5001`。 ### 按舰队规模推荐配置 **小型舰队(< 1,000 设备):** ``` CACHE_MAX_AGE_MINUTES=30 BACKGROUND_REFRESH_ENABLED=false ENABLE_DISK_CACHE=false ``` **中型舰队(1,000 - 10,000 设备):** ``` CACHE_MAX_AGE_MINUTES=60 BACKGROUND_REFRESH_ENABLED=true BACKGROUND_REFRESH_INTERVAL_MINUTES=30 ENABLE_DISK_CACHE=true ``` **大型舰队(10,000+ 设备):** ``` CACHE_MAX_AGE_MINUTES=120 BACKGROUND_REFRESH_ENABLED=true BACKGROUND_REFRESH_INTERVAL_MINUTES=60 ENABLE_DISK_CACHE=true ENABLE_DELTA_SYNC=true ``` ## API 端点 所有端点在 `AUTH_ENABLED=true` 时均需身份验证(`/health` 除外)。 | 方法 | 端点 | 描述 | |------|------|------| | `GET` | `/` | 仪表板 UI | | `GET` | `/health` | 健康检查(无需身份验证) | | `GET` | `/api/devices` | 带缓存元数据的过滤设备列表 | | `GET` | `/api/device/` | 单个设备及风险分析 | | `POST` | `/api/refresh` | 触发缓存刷新 | | `GET` | `/api/export/excel` | 导出过滤设备为 Excel | | `GET/POST` | `/api/cve/*` | CVE 漏洞扫描端点 | | `GET/POST` | `/api/tenants/*` | 租户管理端点 | | `GET` | `/api/cache/*` | 缓存状态与管理 | ### 设备过滤查询参数 ``` GET /api/devices?platform=IOS&security_status=THREATS_HIGH&min_last_seen_days=7&max_last_seen_days=30 ``` ## 项目结构 ``` Lookout-Reporting_tool_version1/ ├── app.py # App factory (create_app), error handlers, background refresh ├── config.py # Configuration classes (Dev/Prod/Test) from env vars ├── run_dashboard.py # Production launcher with dependency checks ├── lookout_client.py # LookoutMRAClient — OAuth2 API client with retry logic ├── device_cache.py # DeviceCache — thread-safe in-memory + SQLite persistence ├── auth/ │ └── manager.py # AuthManager — HTTP Basic auth with password hashing ├── routes/ # Flask Blueprints │ ├── devices.py # Device listing and detail endpoints │ ├── export.py # Excel/CSV export endpoints │ ├── cve.py # CVE scanning endpoints │ ├── tenants.py # Multi-tenant management │ └── cache.py # Cache status and control ├── services/ # Business logic layer │ ├── device_service.py # Device fetching, caching, delta sync │ ├── risk_service.py # Per-device risk analysis │ ├── export_service.py # Excel/CSV generation │ ├── cve_service.py # CVE vulnerability scanning │ ├── tenant_service.py # Multi-tenant client management │ └── export/sheets/ # Excel sheet generators ├── utils/ │ ├── device_filters.py # Query-parameter filtering logic │ └── time_utils.py # Date/time helpers ├── templates/ # Jinja2 HTML templates ├── static/ # CSS, JS, images ├── tests/ │ ├── conftest.py # Test fixtures and TestConfig │ ├── unit/ # Unit tests │ └── integration/ # Integration tests ├── requirements.txt # Python dependencies ├── setup.cfg # Pytest configuration ├── .env.example # Environment variable template ├── tenants.json.example # Multi-tenant configuration template └── sample_data.json # Built-in sample device data ``` ## 架构 应用程序采用 **Flask 应用工厂模式**,结合 Blueprints 进行路由,使用服务类处理业务逻辑。 ``` Request → Blueprint route (routes/) → Service class (services/) → LookoutMRAClient / DeviceCache → Response ``` 服务通过 `app.extensions` 注入到应用,并在路由处理程序中访问。 ### 缓存策略 针对大型设备舰队的两层缓存设计以提升性能: 1. **内存字典** — 主缓存,通过 `threading.RLock` 保证线程安全 2. **磁盘上的 SQLite** — 可选持久层,重启后保留数据 后台刷新与增量同步可最小化 API 调用。增量同步仅在配置的时间窗口内获取已变更设备。 ## 测试 ``` # 运行所有测试 pytest # 仅运行单元测试 pytest tests/unit/ # 仅运行集成测试 pytest tests/integration/ # 单个测试 pytest -k "test_name" # 带覆盖率 pytest --cov ``` 测试使用 `TestingConfig`,启用示例数据、禁用身份验证与缓存,服务通过 `app.extensions` 模拟。 ## 故障排除 | 问题 | 解决方案 | |------|----------| |来自 Lookout API 的 401 未经授权** | 验证 `LOOKOUT_APPLICATION_KEY` 是否正确且未过期 | | **429 请求过多** | 降低刷新频率;启用增量同步与磁盘缓存 | | **大型舰队启动缓慢** | 启用 `ENABLE_DISK_CACHE=true` — 后续启动从 SQLite 加载,约 2 秒 | | **每次重启缓存为空** | 确保 `ENABLE_DISK_CACHE=true` 且 `CACHE_FILE_PATH` 可写 | | **端口已被占用** | 在 `.env` 中修改 `PORT` 或停止其他进程 | | **缺少依赖项** | 运行 `pip install -r requirements.txt` | | **`python` 在 Windows 上无法识别** | 重新安装 Python 并勾选 **"Add Python to PATH"**,或使用完整路径 `C:\Python3x\python.exe` | | **PowerShell 脚本执行错误** | 运行 `Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser` 后重试 | | **`venv` 文件夹已在压缩包中** | 删除现有 `venv` 文件夹,并使用 `python -m venv venv` 重新创建 | ## 许可证 内部应用程序。根据组织需求进行修改。
标签:Excel导出, Flask, Flask-Limiter, HTTP基本认证, Lookout Mobile Risk API, Python, SQLite, Werkzeug密码哈希, 仪表盘, 保护状态过滤, 后台刷新, 增量同步, 多平台, 大舰队, 实时过滤, 平台过滤, 开发运维, 性能优化, 无后门, 检测绕过, 正则匹配, 目录枚举, 看板, 移动安全, 移动设备管理, 缓存, 设备体检, 设备清单, 连接状态过滤, 风险监控, 风险等级过滤