architway/AI-Threat-Hunting-Query-Generation-Evaluation-System

GitHub: architway/AI-Threat-Hunting-Query-Generation-Evaluation-System

一个基于 AI 的威胁狩猎查询生成与评估系统,可将自然语言威胁假设自动转化为 DuckDB SQL 并对查询结果进行 precision/recall/F1 指标评估。

Stars: 0 | Forks: 0

# AI Strike 威胁狩猎查询生成 AI Strike 可将自然语言的 AWS CloudTrail 威胁狩猎假设转化为可执行的 DuckDB SQL,对该 SQL 在提供的 `nineteenFeaturesDf.csv` 数据集上运行,并根据 `hypotheses_outcomes.json` 对返回的行进行评估。每个生成的查询都包含解释、推理、假设、置信度、执行状态以及 precision/recall/F1 指标。 本项目采用离线优先策略。Mock 模式无需 API key 即可运行完整的本地 pipeline,而真实运行则使用 Cerebras。附加功能层包括 Streamlit 演示、prompt 策略对比、基准测试、执行失败后的一次性 SQL 修复、Docker 文件,以及基于 AWS 官方文档的 AWS 领域上下文 prompt 调优。 本提交策略具有极强的实用性:使用官方 AWS/领域研究、感知 schema 的 prompting、确定性的本地验证、低成本的 Cerebras 托管模型选项,以及离线 mock 路径,从而在不依赖反复调用昂贵前沿模型的情况下获得高评估价值。 ## 快速开始 在 Windows PowerShell 中从仓库根目录运行以下命令。进行 CLI、GUI 和 Docker 相关操作时,指定的 CSV 文件 `nineteenFeaturesDf.csv` 必须存在于仓库根目录中。 ### 1. 创建并激活虚拟环境 ``` python -m venv .venv .\.venv\Scripts\Activate.ps1 ``` 如果 PowerShell 在你的机器上阻止了激活,请在以下命令中直接使用 venv 的 Python: ``` .\.venv\Scripts\python.exe --version ``` ### 2. 安装依赖 ``` python -m pip install --upgrade pip python -m pip install -r requirements.txt ``` ### 3. 运行离线 / Mock CLI 冒烟测试 Mock 模式不进行任何网络调用,并会执行生成器、DuckDB 执行器、评估器、报告及输出产物: ``` .\.venv\Scripts\python.exe launch_check.py .\.venv\Scripts\python.exe main.py --mock-llm --prompt-strategy aws_domain --limit 1 ``` ### 4. 运行真实的 Cerebras CLI 将 `.env.example` 复制到 `.env`,填入 `CEREBRAS_API_KEY`,并保留 Cerebras 设置: ``` Copy-Item .env.example .env notepad .env ``` ``` CEREBRAS_API_KEY=your_cerebras_key_here CEREBRAS_BASE_URL=https://api.cerebras.ai/v1 AI_STRIKE_PROVIDER=cerebras AI_STRIKE_MODEL=gpt-oss-120b ``` 然后在进行更广泛的评估之前,先运行一次真实的单假设检查: ``` .\.venv\Scripts\python.exe launch_check.py --real $env:AI_STRIKE_REQUEST_BUDGET="1"; .\.venv\Scripts\python.exe main.py --hypothesis-id 1 --prompt-strategy aws_domain --model gpt-oss-120b --repair-attempts 0 --verbose ``` 修复/自愈默认设置为 `AI_STRIKE_REPAIR_ATTEMPTS=1`。它仅在第一次生成的 SQL 被 DuckDB 拒绝时才使用第二次模型调用;成功的 SQL 不会触发修复。 ### 5. 运行 Streamlit GUI ``` .\.venv\Scripts\streamlit.exe run app.py ``` Streamlit 启动后会打印一个本地 URL。在浏览器中打开该 URL: ``` http://localhost:8501 ``` GUI 默认以 Mock 模式打开。保持开启 Mock 模式即可进行离线演示。只有在 `.env` 中拥有有效的 `CEREBRAS_API_KEY` 并且在侧边栏中选择了某个 Cerebras 模型后,才能关闭 Mock 模式。在终端中按 `Ctrl+C` 可停止 GUI 服务器,并在修改 `.env` 或代码后重新启动它。 在 GUI 中切换到真实模式之前,请先运行此 CLI 预检: ``` .\.venv\Scripts\python.exe launch_check.py --real ``` ### 6. 使用 Docker Compose 运行 必须单独安装 Docker Desktop 或 Docker Engine。请将 `nineteenFeaturesDf.csv` 保留在仓库根目录中;Compose 会将其以只读方式挂载到容器中。 ``` docker compose build docker compose run --rm ai-strike-cli docker compose run --rm ai-strike-cli python main.py --mock-llm --prompt-strategy aws_domain --limit 1 docker compose up ai-strike-demo ``` Docker GUI 也会在 `http://localhost:8501` 打开。 ## 设置 请使用本地虚拟环境,以便将本作业的依赖保留在此项目文件夹内。 ``` python -m venv .venv .\.venv\Scripts\Activate.ps1 python -m pip install --upgrade pip python -m pip install -r requirements.txt ``` ## Cerebras 配置 Mock 模式不需要凭证。若要进行真实的模型调用,请将 `.env.example` 复制到 `.env` 并设置 Cerebras 的 key 和模型: ``` Copy-Item .env.example .env ``` ``` CEREBRAS_API_KEY=your_cerebras_key_here CEREBRAS_BASE_URL=https://api.cerebras.ai/v1 AI_STRIKE_PROVIDER=cerebras AI_STRIKE_MODEL=gpt-oss-120b AI_STRIKE_PROMPT_STRATEGY=aws_domain AI_STRIKE_REPAIR_ATTEMPTS=1 AI_STRIKE_REQUEST_BUDGET=25 ``` 使用 `AI_STRIKE_MODEL` 指定你要测试的 Cerebras 模型 ID。已保存的对比报告选择 `gpt-oss-120b` 作为主要提交模型,以 `qwen-3-235b-a22b-instruct-2507` 作为最强的备选方案,并以 `llama3.1-8b` 作为更便宜/轻量化的选项。`AI_STRIKE_REPAIR_ATTEMPTS=1` 是默认设置;它仅在 DuckDB 拒绝第一次生成的 SQL 时才会消耗额外的请求。 ## Mock / 离线模式 Mock 模式可在无网络访问的情况下运行生成器、DuckDB 执行器、评估器、产物生成器、报告、基准测试钩子以及 Streamlit 路径: ``` .\.venv\Scripts\python.exe main.py --mock-llm --limit 1 .\.venv\Scripts\python.exe main.py --hypothesis-id 1 --mock-llm --verbose .\.venv\Scripts\python.exe main.py --mock-llm --prompt-strategy aws_domain --limit 2 ``` Mock 生成器是确定性的。它用于冒烟测试和可重复的本地评估,并不代表真实模型的质量。 ## 真实 Cerebras 运行 真实运行会消耗服务商的请求和 token。请从小规模开始,在单个假设上验证 JSON/SQL 行为,只有在启动检查通过后才进行扩展。 ``` .\.venv\Scripts\python.exe launch_check.py --real $env:AI_STRIKE_REQUEST_BUDGET="1"; .\.venv\Scripts\python.exe main.py --hypothesis-id 1 --prompt-strategy aws_domain --model gpt-oss-120b --repair-attempts 0 --verbose .\.venv\Scripts\python.exe main.py --hypothesis-id 4 --model gpt-oss-120b .\.venv\Scripts\python.exe main.py --prompt-strategy aws_domain ``` 也可使用离线启动检查: ``` .\.venv\Scripts\python.exe launch_check.py ``` ## Streamlit GUI Streamlit 演示是一个轻量级的 UI,运行在与 CLI 相同的 pipeline 之上。它支持假设选择、Mock 或真实模式、prompt 策略选择、修复尝试控制、SQL/解释显示、指标、查询建议以及结果预览。 ``` .\.venv\Scripts\streamlit.exe run app.py ``` GUI 默认为 Mock 模式,因此无需 API key 即可打开。 真实模式故障排除: - 如果 `.env` 发生更改,请使用 `Ctrl+C` 停止所有正在运行的 Streamlit 终端,然后重新启动: `.\.venv\Scripts\streamlit.exe run app.py` - 如果你看到 `[WinError 10061]` / `ConnectionRefusedError`,说明本地机器无法从运行中的 Streamlit 进程连接到 `https://api.cerebras.ai/v1`。常见原因包括: 无网络连接、防火墙/代理策略、DNS/网络问题,或 Streamlit 进程已过期。 这是一个服务商连接问题,而不是 SQL/prompt/自定义指令失败。 - 某些环境会导出无效的本地代理变量(例如: `HTTP_PROXY=http://127.0.0.1:9`, `HTTPS_PROXY=http://127.0.0.1:9`, `ALL_PROXY=http://127.0.0.1:9`)。本项目中的 Cerebras/OpenAI 客户端现在默认忽略代理环境变量(`trust_env=False`)以避免出现该故障。 - 要诊断 shell 中的代理变量: `Get-ChildItem Env: | Where-Object { $_.Name -match 'proxy' }` - 在重试真实 GUI 模式之前,请运行 `.\.venv\Scripts\python.exe launch_check.py --real`。 修复/自愈默认尝试一次。它仅在 DuckDB 拒绝第一次生成的 SQL 时触发,因此首次通过的查询成功不会消耗额外的模型请求。你依然可以在每次运行时覆盖它: ``` .\.venv\Scripts\python.exe main.py --hypothesis-id 4 --repair-attempts 1 .\.venv\Scripts\python.exe main.py --hypothesis-id 4 --repair-attempts 0 $env:AI_STRIKE_REPAIR_ATTEMPTS = "1"; .\.venv\Scripts\streamlit.exe run app.py ``` ## 实验 使用相同的评估器对比 prompt 策略和模型标签: ``` .\.venv\Scripts\python.exe experiments.py --mock-llm --strategies base,structured,multi_step,aws_domain --limit 2 .\.venv\Scripts\python.exe experiments.py --models gpt-oss-120b,qwen-3-235b-a22b-instruct-2507 --strategies aws_domain --limit 3 --request-budget 20 ``` 输出: - `comparison_results.json` - `comparison_summary.csv` - `MODEL_COMPARISON_REPORT.md` 真实实验会在开始前估算请求数量,并拒绝超过 `AI_STRIKE_REQUEST_BUDGET` 或 `--request-budget` 的限制。 ## 基准测试 对生成、DuckDB 执行、评估及总运行时间进行基准测试: ``` .\.venv\Scripts\python.exe benchmark.py --mock-llm --limit 2 .\.venv\Scripts\python.exe benchmark.py --mock-llm --prompt-strategy aws_domain --limit 2 .\.venv\Scripts\python.exe benchmark.py --hypothesis-id 4 --prompt-strategy aws_domain ``` 输出: - `benchmark_results.json` - `BENCHMARK_REPORT.md` ## 输出文件 每次 CLI 运行都会在 `outputs/` 下写入一个带有时间戳的文件夹: ``` outputs/ run_YYYYMMDD_HHMMSS/ generated_queries.json evaluation_results.json summary.csv errors.json ``` 根目录下的 `evaluation_results.json` 也会被写入,因为作业将其指定为交付物。在已提交的状态下,它反映了最新的离线冒烟测试运行结果。`EVALUATION_REPORT.md` 保留了该当前产物,并总结了保存在 `benchmark_results.json` 和 `MODEL_COMPARISON_REPORT.md` 中的最终全假设 Cerebras 对比结果。 主要提交交付物: - `main.py`, `pipeline.py`, `query_generator.py`, `evaluator.py`, `executor.py` - `README.md`, `APPROACH.md`, `EVALUATION_REPORT.md` - `evaluation_results.json` - `requirements.txt` - 附加产物:`app.py`, `Dockerfile`, `docker-compose.yml`, `benchmark.py`, `experiments.py`, `BENCHMARK_REPORT.md`, `MODEL_COMPARISON_REPORT.md` ## 提交清单 所需交付物: - [x] 核心查询生成逻辑:`query_generator.py`, `prompts.py`, `llm_client.py`, 和 `pipeline.py` - [x] 评估框架实现:`evaluator.py` - [x] 运行完整评估的入口点:`main.py` - [x] 依赖项:`requirements.txt` - [x] 关键组件的单元测试 - [x] 包含设置说明、架构概述、设计决策、权衡取舍和扩展指南的 README - [x] 包含 prompting 策略、迭代过程、挑战、解决方案、局限性和未来工作的 APPROACH.md - [x] `evaluation_results.json` 包含的评估输出产物 - [x] `EVALUATION_REPORT.md` 包含总体指标、按假设划分的明细以及修改前后的说明 - [x] 可解释的生成输出:解释、推理、假设、威胁说明和置信度 - [x] 确保预期结果仅由评估器在 SQL 执行后使用的防护机制 可选和附加项: - [x] 交互式演示:`app.py` 中的 Streamlit UI - [x] 容器化:`Dockerfile` 和 `docker-compose.yml` - [x] 查询优化建议:`query_advisor.py` 中确定性的评估后建议 - [x] prompt 策略和多步 prompting:`base`, `structured`, `multi_step`, 和 `aws_domain` - [x] 每个生成的查询中都包含带有解释的置信度评分 - [x] 在 DuckDB 失败后,通过默认的 `AI_STRIKE_REPAIR_ATTEMPTS=1`、`--repair-attempts` 或 Streamlit 进行自动化 SQL 修复/自愈 - [x] 扩展评估:使用 `experiments.py` 进行 prompt 策略对比 - [x] 通过 `experiments.py --models` 支持 A/B 模型测试 - [x] 使用 `benchmark.py` 和 `BENCHMARK_REPORT.md` 进行性能基准测试 - [x] 在 `MODEL_COMPARISON_REPORT.md` 中进行 Cerebras 模型对比 - [x] 用于测试、演示、Docker 冒烟检查和可重复本地评估的离线 Mock 模式 ## 架构 ``` hypotheses.json + CSV schema + optional AWS domain context | v prompts.py -> query_generator.py -> Cerebras or MockLLMClient | v DuckDB SQL against cloudtrail view over nineteenFeaturesDf.csv | v executor.py -> evaluator.py -> query_advisor.py | v outputs/, evaluation_results.json, reports, Streamlit, experiments, benchmarks ``` 预期结果仅在 SQL 执行后由评估器加载。它们不会包含在 prompt、修复 prompt、领域上下文或重用的聊天历史中。 ## Docker 可选选项 Docker 是可选的,并且独立于 `.venv` 工作流。必须在外部安装 Docker Desktop 或 Docker Engine;正常的本地运行不需要它。 首先将 `nineteenFeaturesDf.csv` 放在项目根目录中。该大型 CSV 会通过 `.dockerignore` 被排除在镜像之外,并在运行时由 Compose 以只读方式挂载。 Mock CLI 冒烟测试: ``` docker compose build docker compose run --rm ai-strike-cli docker compose run --rm ai-strike-cli python main.py --mock-llm --prompt-strategy aws_domain --limit 2 ``` Streamlit 演示: ``` docker compose up ai-strike-demo ``` 演示服务在 `http://localhost:8501` 上监听。 在 PowerShell 中使用宿主机上已加载的环境变量运行真实的 Cerebras 单假设测试: ``` $env:CEREBRAS_API_KEY = "your_cerebras_key_here" docker compose run --rm -e CEREBRAS_API_KEY -e AI_STRIKE_PROVIDER=cerebras -e AI_STRIKE_MODEL=gpt-oss-120b ai-strike-cli python main.py --hypothesis-id 1 --prompt-strategy aws_domain ``` ## 扩展至其他数据集 要使本项目适应另一个安全数据集: 1. 将 `AI_STRIKE_DATA_PATH` 指向新的 CSV,或更新执行器以适配其他数据源。 2. 更新 `hypotheses.json` 和 `hypotheses_outcomes.json`。 3. 调整 `aws_domain_prompt_context.md`,或针对新的 schema 和平台添加新的领域上下文文件。 4. 如果数据集使用的是与 `eventID`、`row_id` 或聚合 `count` 不同的稳定标识符,请更新评估器的身份验证规则。 5. 仅从安全的领域知识中添加 prompt 示例或策略说明,切勿使用预期结果行中的内容。 ## 测试 ``` .\.venv\Scripts\python.exe -m pytest .\.venv\Scripts\python.exe main.py --mock-llm --limit 1 ```
标签:AI代码生成, AWS CloudTrail, DLL 劫持, DuckDB, Kubernetes, Streamlit, 反取证, 大语言模型, 安全评估, 访问控制, 请求拦截, 逆向工具