dleeceffp/openimpactcascade
GitHub: dleeceffp/openimpactcascade
OpenImpactCascade 是一个基于 FAIR 方法论与 AI 技术的网络安全风险量化评估平台,旨在为企业提供数据驱动的财务风险概率分布与安全投资 ROI 分析。
Stars: 0 | Forks: 0
# OpenImpactCascade - AI 驱动的风险评估平台
**版本:** v3.1.0 (文件树 Context,增强的 LEF 分解,结合 TEF × Vulnerability 控制评分,OT 的 cascade archetype 样本以及一个通用的勒索软件 archetype)
**端口:** 8080
**Python:** 3.8 - 3.11 (推荐 3.11)
这是一个由 AI 驱动的风险评估问卷生成器,具备增强的 FAIR 方法论 (TEF/LEF 分解)、MITRE ATT&CK 集成、Markdown+Frontmatter 知识库检索、智能网络搜索以及全面的安全防护措施。专为 SaaS 免费增值模式部署而构建。
## 🔧 技术栈
- **后端:** Flask 3.0+, Python 3.11
- **AI/ML:** Anthropic Claude Sonnet 4.6 (通过 API)
- **知识库:** 基于文件的 Markdown + Frontmatter 语料库,带缓存注入
- **网络搜索:** Google Custom Search (用于信息填补)
- **模拟:** NumPy, SciPy (使用对数正态分布的蒙特卡洛模拟)
- **部署:** Gunicorn, Docker, GCP Cloud Run, Cloud SQL
## 🎯 概述
OpenImpactCascade 是一个基于 Flask 的 Web 应用程序,它生成针对特定行业和地区定制的网络安全风险评估。它结合了:
- 基于经过验证的威胁情报的 **AI 生成的问卷**
- 用于定量风险分析的 **FAIR 方法论**
- 用于风险分布建模的 **蒙特卡洛模拟**
- 引导用户完成评估的 **实时聊天助手**
- 用于防止滥用和确保合规性的 **API 安全防护**
## ✨ 关键特性
### 🤖 AI 生成的问卷
- 根据行业和地区定制的风险评估
- 基于权威来源 (MITRE ATT&CK, CISA, Verizon DBIR)
- 实时的网络搜索以获取最新威胁情报
- 引用前的来源验证
- 对数据局限性保持透明
### 🧬 Cascade-Archetype Grounding (路径 A) — 标志位控制
可选的 **AI 生成问卷** 的 grounded-analysis 模式。在选择行业和地区(以及组织规模)后,展示者可以选择一个 **精心策划的 cascade archetype** — 一个经过压缩的、权威的攻击级联 — 作为评估的锚点。
- **选择步骤:** 生成表单上的下拉菜单列出了可用的 archetype 以及 *"Let AI suggest threats"* (现有的仅基于网络的回退机制,保持不变)。
- **完整级联视图:** *"View full cascade ↗"* 链接会在 **新标签页** 中作为渲染后的 HTML 页面 (`/archetype/view/`) 打开完整的卡片,并带有返回按钮 — 这样进行中的选择永远不会丢失。
- **Grounding 流水线 (提升问题质量):** 当选择一个 archetype 时,生成器会 **在调用 LLM 之前** 组装:
1. **cascade card** (权威的、逐字的 — 基础构建块),
2. 一次 **cascade-grounded 网络搜索** — 行业 + 地区 + 卡片事实 (`dbir_pattern`、锚定事件、监管驱动因素) 构成查询集,因此 Google Custom Search 丰富了 *频率/幅度* 的框架,而不是重新发现威胁,以及
3. **系统上下文**。
执行优先级规则:网络/行业上下文用于了解发生的频率/成本,并且 **不得** 更改级联的步骤或瓶颈点。
- **元数据:** 生成的问卷会记录 `grounding_mode` (`cascade` | `web_only`)、`selected_archetype_id` 和 `selected_card_ids`。
- **卡片位置:** `app/generated/cascade_archetypes/oic-ca-*.md`。只有这个文件夹会被复制到 Docker 镜像中;详细的源数据流目前仍保留在代码库中。
- **默认关闭。** 如果不设置标志位,应用程序的行为将与以前完全相同(仅基于网络的生成)。请参阅下面的 **配置**。
### 🎯 自定义风险场景 (路径 B) — 方向性
“自定义风险评估场景”卡片是一个 **快速的、方向性** 选项:用您自己的话定义任何威胁场景,并获得针对该场景的快速问卷。最适合没有合适的 grounded archetype 的情况;如果需要可信的结构化分析,请使用带有 cascade archetype 的路径 A。
### 📊 增强的 FAIR 风险分析
- **TEF × Vulnerability 分解**:将攻击尝试与成功概率区分开来
- **Threat Event Frequency (TEF)**:攻击者尝试攻击的频率
- **Vulnerability 评估**:控制有效性映射到攻击成功率
- **Loss Event Frequency (LEF)**:根据 TEF × Vulnerability 自动计算
- **Loss Magnitude (LM)**:每次成功入侵造成的财务影响
- 所有组件的 **三点 PERT 估计**(最小值、最可能值、最大值)
- 蒙特卡洛模拟(10,000+ 次迭代),使用 PERT 和对数正态分布
- 风险分布可视化,提供百分位报告
- **控制 ROI 分析**:了解安全投资如何降低风险
### 💬 交互式聊天助手
- 每个问题的上下文感知帮助
- 针对特定行业和地区的指导
- 实用的示例和解释
- 使用 Claude Sonnet 4 的对话式界面
- 记住对话历史
### 🛡️ 安全与合规
- 使用加密哈希进行用户追踪
- 用于滥用调查的 API 调用日志
- 符合 Anthropic 安全防护要求
- 隐私保护的最小化日志记录
- 详情请参阅 **[SAFEGUARDS_README.md](SAFEGUARDS_README.md)**
### 🎨 响应式设计
- 桌面端:持久的聊天侧边栏
- 移动端:带浮动按钮的可折叠助手
- 专业的风险评估界面
- 实时验证和反馈
## 📁 项目结构
```
app/
├── main.py # Main Flask application with LEF decomposition
├── ai_question_generator.py # AI generator with Corpus grounding, web search, and TEF/Vulnerability
├── simulation.py # Monte Carlo simulation with PERT and lognormal distributions
├── user_tracking.py # User tracking & API safeguards
├── persistence.py # Cloud SQL access (replaces SQLite context_storage)
├── corpus/ # Markdown + Frontmatter Knowledge Base package
│ ├── retrieve.py # Deterministic slice retrieval from index
│ ├── build_index.py # Scans and validates corpus, builds _index.json
│ └── schema.py # Frontmatter schema, vocabularies, and governance
├── cards/ # Cascade-archetype card library (flag-gated)
│ └── library.py # Card loader (frontmatter+body parse, archetypes_for)
├── templates/
│ ├── home.html # Landing page
│ ├── generate.html # Standard questionnaire form (+ archetype dropdown)
│ ├── archetype_view.html # Full cascade archetype rendered as HTML
│ ├── generate_custom.html # Custom scenario generator
│ ├── questionnaire_chat_rationale.html # Interactive questionnaire with chat
│ ├── results.html # Analysis results with chat sidebar
│ ├── error.html # Error page
│ ├── about_fair.html # FAIR methodology documentation
│ ├── about_mitre.html # MITRE ATT&CK integration info
│ └── about_probability_weighting.html # Probability weighting explanation
├── static/ # Static assets (CSS, JS, images)
├── generated/ # Generated questionnaires saved here
│ └── cascade_archetypes/ # Curated cascade-archetype cards (oic-ca-*.md)
├── logs/
│ └── api_calls/ # API call logs (JSONL format)
├── requirements.txt # Python dependencies
└── README.md # This file
```
## 🚀 快速开始
### 1. 安装依赖
```
pip install -r requirements.txt
```
**requirements.txt:**
```
# Web Framework
Flask>=3.0.0,<4.0
gunicorn>=21.2.0,<22.0
# AI/ML
anthropic>=0.39.0,<0.50
httpx>=0.25.0,<1.0
# GCP Vertex AI (RAG)
google-cloud-aiplatform>=1.70.0,<1.80
google-auth>=2.25.0,<3.0
# 科学计算
numpy>=1.26.2,<2.0
scipy>=1.11.4,<1.13
# 实用工具
python-dotenv>=1.0.0,<2.0
typing-extensions>=4.8.0,<5.0
```
**Python 版本:** 3.8 - 3.11 (推荐 3.11)
### 2. 设置环境变量
**必需项:**
- `ANTHROPIC_API_KEY` - 从 https://console.anthropic.com 获取
- `SECRET_KEY` - Flask session 密钥 (使用 `python -c "import secrets; print(secrets.token_hex(32))"` 生成)
**GCP 服务 (Cloud Run, Cloud SQL, Secret Manager):**
- `GOOGLE_APPLICATION_CREDENTIALS` - 服务账号 JSON 密钥的路径
- `GOOGLE_CLOUD_PROJECT` - 您的 GCP 项目 ID
- `GCP_LOCATION` - GCP 区域 (默认: us-central1)
```
# 选项 1:环境变量
export ANTHROPIC_API_KEY='sk-ant-xxxxx'
export SECRET_KEY='your-secure-secret-key'
export GOOGLE_APPLICATION_CREDENTIALS='/path/to/service-account-key.json'
export GOOGLE_CLOUD_PROJECT='your-project-id'
# 选项 2:.env file
cat > .env << EOF
ANTHROPIC_API_KEY=sk-ant-xxxxx
SECRET_KEY=your-secure-secret-key
GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account-key.json
GOOGLE_CLOUD_PROJECT=your-project-id
EOF
```
**Cascade-Archetype Grounding (可选,默认关闭):**
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `OIC_CARDS_ENABLED` | `0` | 加载 cascade-archetype 卡片库并允许卡片 grounding。设置为 `1` 以启用。 |
| `OIC_ARCHETYPE_SELECT` | `0` | 在生成表单上显示 archetype 选择下拉菜单。设置为 `1` 以启用。 |
| `OIC_ARCHETYPE_LIMIT` | `3` | 下拉菜单中显示的 archetype 的最大数量。 |
| `OIC_CARDS_DIR` | `generated/cascade_archetypes` | 包含 `oic-ca-*.md` 卡片的目录 (相对于应用程序工作目录 / Docker 中的 `/app`)。 |
```
# 为 demo 启用 Path A cascade-archetype grounding
export OIC_CARDS_ENABLED=1
export OIC_ARCHETYPE_SELECT=1
```
### 3. 创建目录
```
mkdir -p generated logs/api_calls static
```
### 4. 运行应用程序
**开发环境:**
```
python main.py
```
**生产环境 (使用 Gunicorn):**
```
gunicorn -w 4 -b 0.0.0.0:8080 --timeout 300 main:app
```
**Docker:**
```
docker build -t openimpactcascade:latest .
docker run -p 8080:8080 \
-e ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY \
-e SECRET_KEY=$SECRET_KEY \
-e GOOGLE_APPLICATION_CREDENTIALS=/app/service-account-key.json \
-v $(pwd)/service-account-key.json:/app/service-account-key.json \
openimpactcascade:latest
```
访问地址: **http://localhost:8080**
**默认端口:** 8080 (可通过 `PORT` 环境变量配置)
## 📖 用户指南
### 工作流程
1. **主页** → 选择 "AI 生成的问卷"
2. **生成** → 选择行业和地区 (20-40 秒)
3. **完成** → 在 AI 聊天助手的帮助下回答问题
4. **分析** → 查看蒙特卡洛模拟结果
5. **调整** → 修改控制措施以查看风险降低的影响
### 示例会话
```
1. Select: Healthcare / Canada
↓
2. AI generates questionnaire based on:
- Canadian threat landscape
- Healthcare-specific attacks
- Verified CISA/ACSC advisories
- MITRE ATT&CK techniques
↓
3. Answer questions with chat help:
- "How to estimate ransomware frequency?"
- "What costs to include in data breach?"
↓
4. View results:
- Expected Annual Loss: $1,250,000
- 90th percentile: $3,500,000
- Risk reduction scenarios
```
### 聊天助手使用
**快速帮助按钮** (上下文感知):
- 对于频率问题:"How to estimate frequency?"
- 对于影响幅度问题:"What costs to include?"
- 对于控制措施:"How to improve security?"
**聊天示例:**
```
You: "What's a typical ransomware frequency for hospitals?"
AI: For Canadian healthcare organizations with moderate security...
You: "Should I include reputation damage in the cost?"
AI: Yes! Reputation costs for healthcare breaches typically include...
You: "How does MFA reduce my risk?"
AI: Multi-factor authentication reduces likelihood by preventing...
```
## 📐 FAIR 方法论:TEF × Vulnerability 方法
### 理解 LEF 分解
该平台通过将 Loss Event Frequency (LEF) 分解为其基本组件,实现了用于风险量化的 **Open FAIR 标准**:
```
LEF = TEF × Vulnerability
```
**其中:**
- **TEF (Threat Event Frequency)**:威胁行为者 **尝试** 攻击的频率 (事件/年)
- **Vulnerability**:攻击尝试 **成功** 并造成损失的概率 (0.0 到 1.0)
- **LEF (Loss Event Frequency)**:攻击 **成功造成损失** 的频率 (事件/年)
### 为什么这很重要
**问题所在:** 大多数用户很难区分“我们被攻击的频率”和“攻击成功的频率”。这是 **FAIR 认证考试中最容易答错的问题**。
**解决方案:** 为以下内容提供独立的问题:
1. **威胁频率** (尝试) - 基于威胁情报
2. **控制有效性** (vulnerability) - 基于您的安全态势
3. **损失频率** (成功) - 根据 TEF × Vulnerability 自动计算
### 真实世界示例
**场景:** 针对医疗保健组织的勒索软件
**步骤 1 - Threat Event Frequency:**
```
"How often do ransomware groups attempt attacks?"
→ Answer: 6 attempts per year (based on CISA data)
```
**步骤 2 - 控制有效性:**
```
"What ransomware defenses do you have?"
→ Answer: EDR + training + tested backups = 15% vulnerability
(Meaning: 15% of attacks succeed, 85% are blocked)
```
**步骤 3 - 计算出的 Loss Event Frequency:**
```
LEF = 6 attempts/year × 0.15 vulnerability = 0.9 successful breaches/year
Interpretation: ~1 successful breach every 13 months
```
### 控制有效性映射
| 控制成熟度 | Vulnerability | 攻击成功率 |
|-----------------|---------------|---------------------|
| **最低** (仅基本 AV) | 70% | 10 次攻击中有 7 次成功 |
| **基础** (AV + 邮件过滤) | 40% | 10 次攻击中有 4 次成功 |
| **中级** (EDR + 培训 + 备份) | 15% | 10 次攻击中有 1.5 次成功 |
| **高级** (EDR + SIEM + MFA + 不可变备份) | 5% | 10 次攻击中有 0.5 次成功 |
### 优势
**对于用户:**
- ✅ 更清晰的心智模型 (将“尝试”与“成功”分开)
- ✅ 更好的控制评估 (查看安全投资的直接影响)
- ✅ 更准确的估计 (更容易单独考虑各个组成部分)
- ✅ 学习正确的 FAIR 方法论
**对于风险分析:**
- ✅ 更高保真度的风险量化
- ✅ 独立的敏感性分析 (单独改变 TEF 或 Vulnerability)
- ✅ 控制 ROI 计算 (展示投资如何降低 LEF)
- ✅ 完整的风险估计审计追踪
### 文档
有关完整的实现细节,请参阅:
- **[FAIR_LEF_DECOMPOSITION_PROPOSAL.md](documentation/FAIR_LEF_DECOMPOSITION_PROPOSAL.md)** - 完整的方法论
- **[about_fair.html](app/templates/about_fair.html)** - 面向用户的 FAIR 解释
- **FAIR Institute:** https://www.fairinstitute.org/blog/fair-terminology-101-risk-threat-event-frequency-and-vulnerability
## 🔧 API Endpoint
### 公共 Endpoint
| 方法 | 路径 | 描述 |
|--------|------|-------------|
| GET | `/` | 主页 |
| GET | `/generate` | 问卷生成表单 (启用标志位时显示 archetype 下拉菜单) |
| POST | `/generate` | 生成问卷 (需要行业、地区;可选 `selected_archetype_id`) |
| GET | `/archetype/view/` | 将完整的 cascade archetype 渲染为 HTML 页面 (受标志位控制) |
| GET | `/questionnaire` | 显示生成的问卷 |
| POST | `/analyze` | 运行蒙特卡洛模拟 |
| POST | `/chat/assist` | AI 聊天助手 (AJAX) |
| POST | `/recalculate` | 使用调整后的控制措施重新计算 (AJAX) |
| GET | `/download/` | 下载问卷 JSON |
| GET | `/health` | 健康检查 |
### 请求示例
**生成问卷:**
```
curl -X POST http://localhost:8080/generate \
-F "industry=Healthcare" \
-F "region=Canada" \
-F "organization_size=500 employees"
```
**聊天助手:**
```
curl -X POST http://localhost:8080/chat/assist \
-H "Content-Type: application/json" \
-d '{
"message": "How to estimate ransomware frequency?",
"context": {
"question_type": "pert_estimate",
"fair_component": "LEF",
"industry": "Healthcare",
"region": "Canada"
},
"history": []
}'
```
## 🛡️ 安全与防护
### 用户追踪 (已实现)
该应用程序实现了 Anthropic 推荐防护措施:
**追踪内容:**
- ✅ 基于 session 的用户 ID (评估模式)
- ✅ 加密哈希 ID (SHA-256)
- ✅ API 调用日志 (时间戳、类型、模型)
- ✅ 最小化元数据 (行业、地区)
**不追踪的内容:**
- ❌ Prompt 或响应
- ❌ 用户账户信息
- ❌ 个人身份信息 (PII)
**优势:**
- 响应 Anthropic 的滥用投诉
- 在不存储用户数据的情况下调查违规行为
- 在实现问责的同时维护隐私
**详情:** 请参阅 **[SAFEGUARDS_README.md](SAFEGUARDS_README.md)**
### 当前模式:评估
系统生成基于会话的随机用户 ID:
- 格式:`eval-user-{random-12-chars}`
- 每次应用启动时生成新 ID
- 允许在没有真实用户账户的情况下进行测试
### 生产就绪
当与用户注册系统集成时:
1. 更新 `flask_app_chat.py` 以使用真实的用户 ID
2. 从您的身份验证系统传递 ID
3. 维护哈希和日志记录
4. 有关迁移指南,请参阅 SAFEGUARDS_README
## 💰 成本分析
### Anthropic API 成本 (Claude Sonnet 4)
**单次请求:**
- 输入: $3.00 / 百万个 token
- 输出: $15.00 / 百万个 token
**典型使用量:**
| 操作 | Token | 成本 |
|--------|--------|------|
| 问卷生成 | ~5,600 | $0.05-0.15 |
| 聊天消息 | ~1,200 | $0.01-0.02 |
| 分析 (本地) | 0 | $0.00 |
**月度估算:**
| 规模 | 问卷 | 聊天 | 总计/月 |
|--------|---------------|------|-------------|
| 小型 | 10 | 100 | $1.50-2.50 |
| 中型 | 100 | 1,000 | $15-25 |
| 大型 | 1,000 | 10,000 | $150-250 |
**注意:**
- 蒙特卡洛模拟在本地运行 (无 API 成本)
- 用户追踪增加的 API 开销极小 (~0.1%)
- 用于验证的网络搜索时间已包含在生成时间内
- 重试 (如果需要) 可能会使成本增加 2-3 倍
### 成本优化建议
1. **缓存问卷**: 为常见的行业/地区组合存储生成的问题
2. **批量生成**: 在非高峰时段预先生成热门组合
3. **速率限制**: 限制免费用户以防止滥用
4. **会话管理**: 清理旧会话以减少存储
## 🔐 安全最佳实践
### API 密钥保护
- ✅ 切勿将 API 密钥提交到版本控制中
- ✅ 使用环境变量或 `.env` 文件
- ✅ 定期轮换密钥
- ✅ 在开发/预发布/生产环境中使用不同的密钥
### Session 安全
- ✅ 在生产环境中使用强大的随机密钥
- ✅ 仅限 HTTPS (绝不要使用 HTTP)
- ✅ 安全的 cookie 标志 (HttpOnly, Secure, SameSite)
- ✅ Session 超时 (30-60 分钟)
### 输入验证
- ✅ 验证所有表单输入
- ✅ 行业/地区白名单验证
- ✅ PERT 值范围检查
- ✅ 通过模板转义提供 XSS 保护
### API 安全防护
- ✅ 启用用户追踪
- ✅ 激活 API 调用日志记录
- ✅ 将哈希 ID 传递给 Anthropic
- ✅ 准备好调查工具
### 日志安全
- ✅ 限制日志文件访问权限
- ✅ 日志中不包含 PII
- ✅ 定期进行日志轮转
- ✅ 静态加密 (推荐)
## 📊 监控与运维
### 健康监控
```
curl http://localhost:8080/health
```
响应:
```
{
"status": "healthy",
"ai_enabled": true
}
```
### 日志位置
| 日志类型 | 位置 | 格式 |
|----------|----------|--------|
| API 调用 | `./logs/api_calls/YYYY-MM-DD_api_calls.jsonl` | JSONL |
| 应用程序 | stdout/stderr | 文本 |
| Flask | Flask 控制台 | 文本 |
### 问题排查
**检查 API 调用日志:**
```
# 查看今天的 API 调用
tail -f ./logs/api_calls/$(date +%Y-%m-%d)_api_calls.jsonl
# 按 user ID 搜索
python investigate_abuse.py --user-id eval-user-abc123
# 获取用户统计信息
python investigate_abuse.py --user-id eval-user-abc123 --stats
```
**检查错误:**
```
# 如果 JSON 解析失败,请检查 debug 文件
cat json_error_debug.json
# 检查 Flask 日志
tail -f /path/to/flask.log
```
## 🚀 部署
### Docker
**Dockerfile:**
```
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# 创建目录
RUN mkdir -p generated logs/api_calls
CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8080", "main:app"]
```
**构建并运行:**
```
docker build -t openimpactcascade .
docker run -p 8080:8080 \
-e ANTHROPIC_API_KEY='your-key' \
-e SECRET_KEY='your-secret' \
-v $(pwd)/logs:/app/logs \
openimpactcascade
```
### Google Cloud Run
```
# 构建
gcloud builds submit --tag gcr.io/$PROJECT_ID/openimpactcascade
# 部署
gcloud run deploy openimpactcascade \
--image gcr.io/$PROJECT_ID/openimpactcascade \
--platform managed \
--region us-central1 \
--allow-unauthenticated \
--set-env-vars ANTHROPIC_API_KEY='your-key',SECRET_KEY='your-secret' \
--memory 1Gi \
--timeout 300
```
### 环境变量
| 变量 | 必需 | 默认值 | 描述 |
|----------|----------|---------|-------------|
| `ANTHROPIC_API_KEY` | 是 | - | 从 console.anthropic.com 获取的 API 密钥 |
| `SECRET_KEY` | 是 (生产环境) | - | Flask session 密钥 (使用 `openssl rand -hex 32` 生成) |
| `FLASK_ENV` | 否 | production | `development` 或 `production` |
| `PORT` | 否 | 8080 | 应用程序运行端口 |
## 🧪 测试
### 手动测试
```
# 测试问卷生成
python ai_question_generator.py
# 测试模拟
python simulation.py
# 测试用户跟踪
python user_tracking.py
```
### 集成测试
```
# 启动应用
python main.py
# 在另一个终端中:
# 测试 health endpoint
curl http://localhost:8080/health
# 测试问卷生成
curl -X POST http://localhost:8080/generate \
-F "industry=Healthcare" \
-F "region=Canada"
# 检查日志
ls -la ./logs/api_calls/
```
## ✅ Cascade-Archetype 测试计划
在演示前或演示时使用此检查清单来验证 cascade-archetype grounding 功能 (路径 A)。
它的组织结构允许您先运行 **标志位关闭回归测试** (证明没有破坏任何功能),然后再运行
**标志位开启功能** 测试。
### 预检
```
# 1. 确认卡片存在并解析(无需服务器)
python -c "import sys; sys.path.insert(0,'app'); from cards.library import CardLibrary; \
lib=CardLibrary('app/generated/cascade_archetypes'); lib.load(); \
print('cards:', [c.id for c in lib.all()])"
# 预期:cards: ['oic-ca-001-b', 'oic-ca-010', 'oic-ca-011']
# 2. Byte-compile 已编辑的模块
python -m py_compile app/config.py app/cards/library.py app/ai_question_generator.py app/main.py
```
### A. 回归测试 — 标志位关闭 (默认)
| # | 步骤 | 预期结果 |
|---|------|-----------------|
| A1 | 在 `OIC_CARDS_ENABLED` / `OIC_ARCHETYPE_SELECT` **未设置** 的情况下启动应用 | 应用启动;`/health` 返回健康 |
| A2 | 打开 `/generate` | **不** 显示 archetype 下拉菜单;仅显示行业/地区/组织规模 |
| A3 | 生成问卷 (医疗保健 / 加拿大) | 完全像以前一样成功;元数据 `grounding_mode` = `web_only` (或缺失) |
| A4 | 访问 `/archetype/view/oic-ca-010` | 返回 HTTP 404 错误页面 ("not enabled") |
| A5 | 主页 | 路径 A = "grounded analysis",路径 B = "directional" 文案正确渲染 |
### B. 功能测试 — 标志位开启
```
export OIC_CARDS_ENABLED=1
export OIC_ARCHETYPE_SELECT=1
# 重启应用
```
| # | 步骤 | 预期结果 |
|---|------|-----------------|
| B1 | 打开 `/generate` | 组织规模下方出现 archetype **下拉菜单**,默认为 *"Let AI suggest threats"* |
| B2 | 打开下拉菜单 | 列出 3 个 archetype (`001-b` 勒索软件,`010` IT→OT 枢轴,`011` SIS),每个都带有 `[IT]`/`[OT]` 徽章;场景提示随更改而更新 |
| B3 | 选择一个 archetype (例如 `010`) | 出现 *"View full cascade ↗"* 链接 |
| B4 | 点击 *"View full cascade ↗"* | 在 **新标签页** 中打开 `/archetype/view/oic-ca-010`,呈现为 HTML (标题、列表),带有 **返回** 按钮;原始标签页中的生成表单保持不变 |
| B5 | 在视图页面点击 **返回** | 新标签页关闭 (或导航回表单);进行中的选择被保留 |
| B6 | 选择 `oic-ca-001-b` + 医疗保健/加拿大并生成 | 服务器日志显示 `Grounding on cascade archetype: oic-ca-001-b` 和 **cascade-grounded** 网络搜索;问卷已生成 |
| B7 | 检查生成的问卷元数据 | `grounding_mode` = `cascade`,`selected_archetype_id` = `oic-ca-001-b`,`selected_card_ids` = `["oic-ca-001-b"]` |
| B8 | 查看问题 | 暴露问题反映了 cascade 的瓶颈点;理由引用了 archetype/锚定事件;网络上下文塑造了频率/幅度 (而不是新的威胁) |
| B9 | 选择 *"Let AI suggest threats"* 并生成 | 回退到现有的纯网络路径;`grounding_mode` = `web_only` |
| B10 | 使用 OT archetype (`010`/`011`) 生成 | Cascade-grounded 查询使用卡片的 `dbir_pattern` 和锚定事件 (检查服务器日志查询行) |
### C. 边缘情况
| # | 步骤 | 预期结果 |
|---|------|-----------------|
| C1 | 带有未知 `selected_archetype_id` 的 POST `/generate` | 记录警告并回退到纯网络生成 (无崩溃) |
| C2 | 访问 `/archetype/view/does-not-exist` (标志位开启) | 错误页面,HTTP 404 ("not found") |
| C3 | 缺少 `markdown` 包 | 视图页面仍将卡片渲染为预格式化文本 (优雅降级) |
| C4 | 在缺少网络搜索密钥的情况下生成 | 仅卡片 grounding 仍能生成问卷 |
### D. Docker / 部署验证
```
docker build -t openimpactcascade:demo .
# 确认 image 中附带的卡片
docker run --rm openimpactcascade:demo ls /app/generated/cascade_archetypes
# 预期这三个 oic-ca-*.md 文件
docker run -p 8080:8080 \
-e ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY \
-e SECRET_KEY=$SECRET_KEY \
-e OIC_CARDS_ENABLED=1 -e OIC_ARCHETYPE_SELECT=1 \
openimpactcascade:demo
# 然后针对 container 重新运行 B 部分
```
## 🐛 故障排除
### 常见问题
**"ANTHROPIC_API_KEY environment variable must be set"**
```
# 检查是否已设置
echo $ANTHROPIC_API_KEY
# 设置它
export ANTHROPIC_API_KEY='your-key-here'
```
**JSON 解析错误**
- AI 偶尔会生成无效的 JSON
- 应用程序最多重试 3 次并调整参数
- 检查 `json_error_debug.json` 获取详情
- 尝试不同的行业/地区组合
**生成时间长 (20-40 秒)**
- **这是正常的!** AI 正在:
- 搜索威胁情报来源
- 验证咨询内容
- 交叉引用 MITRE ATT&CK
- 研究记录在案的事件
- 在生成期间显示进度消息
**聊天助手不工作**
```
# 检查是否启用 AI
curl http://localhost:8080/health
# 检查浏览器控制台是否有错误
# 验证 API key 是否已设置
# 检查 Flask 日志是否有异常
```
**Session Cookie 警告**
- 在生产环境中设置 `SECRET_KEY`:
export SECRET_KEY=$(openssl rand -hex 32)
**日志文件未创建**
```
# 确保目录存在
mkdir -p ./logs/api_calls
# 检查权限
chmod 755 ./logs/api_calls
```
## 🔄 路线图与未来增强
### 计划功能
1. **用户身份验证**
- 注册和登录系统
- 多租户支持
- 团队协作
2. **增强分析**
- 历史风险追踪
- 趋势分析
- 行业基准测试
3. **高级控制**
- 控制有效性评分
- ROI 计算
- 控制推荐引擎
4. **报告**
- PDF 报告生成
- 执行摘要
- 自定义报告模板
5. **API 增强**
- 用于集成的 RESTful API
- Webhook 支持
- 批处理
6. **性能**
- 问卷缓存 (未来的优化方向)
- 通过优化的 prompt 实现更快的生成
- 大型分析的后台处理
### 📚 检索架构 (基于文件的语料库)
OpenImpactCascade 现在使用 **Markdown + Frontmatter** 架构,而不是依赖托管的 Vector DB (如 Vertex AI RAG) (详见 `ADR-0012`):
- **确定性过滤**: 根据 `_index.json` 中的特定元数据切面 (行业、地区、标签) 检索上下文切片。
- **低边际成本**: 通过注入稳定的文档切片来最大化 prompt 缓存,从而实现可行的免费层 SaaS 扩展。
- **可追溯的治理**: 带有结构化 YAML frontmatter 的 Markdown 语料库确保了透明的来源可追溯性以及对摄取内容的严格治理。
- **网络搜索填补**: 仅在语料库缺乏覆盖范围时动态执行网络搜索,受域/组织级别的策略规则监管。
## 📚 文档
### 核心文档
- **README.md** (此文件) - 主要应用程序文档
- **SAFEGUARDS_README.md** - API 安全防护和防止滥用
- **flask_readme.md** - 额外的 Flask 实现细节
### 代码文档
- `ai_question_generator.py` - 有关 AI 生成的信息,请参阅文档字符串
- `simulation.py` - 有关蒙特卡洛分析的信息,请参阅文档字符串
- `user_tracking.py` - 有关追踪系统的信息,请参阅文档字符串
### 外部资源
- [Anthropic API 文档](https://docs.anthropic.com)
- [FAIR 方法论](https://www.fairinstitute.org)
- [MITRE ATT&CK](https://attack.mitre.org)
- [Anthropic API 安全防护](https://support.claude.com/en/articles/9199617-api-safeguards-tools)
## 🤝 贡献
### 开发设置
1. 克存储库
2. 创建虚拟环境: `python -m venv venv`
3. 激活: `source venv/bin/activate`
4. 安装依赖: `pip install -r requirements.txt`
5. 设置 API 密钥: `export ANTHROPIC_API_KEY='your-key'`
6. 运行测试: `python -m pytest tests/`
7. 启动应用: `python flask_oic_v215.py`
### 代码风格
- 遵循 PEP 8
- 尽可能使用类型提示
- 为所有函数添加文档字符串
- 保持功能集中且小规模
### 提交更改
1. 创建功能分支: `git checkout -b feature/your-feature`
2. 通过清晰的提交记录进行更改
3. 彻底测试
4. 更新文档
5. 提交 Pull Request
## 📄 许可证
[在此处填写您的许可证]
## 📞 支持
### 获取帮助
1. **文档**: 查看此 README 和 SAFEGUARDS_README.md
2. **日志**: 查看应用程序和 API 调用日志
3. **健康检查**: `curl http://localhost:8080/health`
4. **调试文件**: 检查 `json_error_debug.json` 以排查解析错误
### 报告问题
报告问题时,请包含:
- 应用程序版本
- 环境 (开发/生产)
- 复现步骤
- 来自日志的错误消息
- 浏览器控制台错误 (如果是 UI 问题)
### 联系方式
有关以下内容的问题:
- **应用程序**: 查看文档
- **API 安全防护**: 请参阅 SAFEGUARDS_README.md
- **Anthropic API**: 联系 [email protected]
- **安全问题**: 私下向维护者报告
## 🎯 快速参考
### 常用命令
```
# 启动应用程序
python main.py
# 检查 health
curl http://localhost:8080/health
# 查看 API 日志
tail -f ./logs/api_calls/$(date +%Y-%m-%d)_api_calls.jsonl
# 测试用户跟踪
python user_tracking.py
# 调查用户
python investigate_abuse.py --user-id
# 生成 requirements
pip freeze > requirements.txt
```
### 关键文件
| 文件 | 用途 |
|------|---------|
| `main.py` | 带有 LEF 分解的主 Flask 应用程序 |
| `ai_question_generator.py` | 带有 TEF/Vulnerability 的 AI 问题生成 |
| `simulation.py` | 带有 PERT/对数正态分布的蒙特卡洛模拟 |
| `corpus/` | Markdown + Frontmatter 知识库包 |
| `user_tracking.py` | 用户追踪和 API 安全防护 |
| `templates/questionnaire_chat_rationale.html` | 带有理由显示的交互式 UI |
| `documentation/FAIR_LEF_DECOMPOSITION_PROPOSAL.md` | TEF × Vulnerability 方法论 |
| `SAFEGUARDS_README.md` | 防止滥用文档 |
### 重要 URL
| URL | 用途 |
|-----|---------|
| http://localhost:8080 | 应用程序主页 |
| http://localhost:8080/health | 健康检查 |
| http://localhost:8080/generate | 生成问卷 |
| https://console.anthropic.com | API 密钥管理 |
## ✅ 部署检查清单
部署到生产环境之前:
- [ ] 设置 `ANTHROPIC_API_KEY`
- [ ] 设置 `SECRET_KEY` (使用 `openssl rand -hex 32` 生成)
- [ ] 设置 `FLASK_ENV=production`
- [ ] 仅启用 HTTPS
- [ ] 配置安全的 session cookie
- [ ] 设置日志轮转
- [ ] 启用速率限制
- [ ] 配置用户身份验证 (如果需要)
- [ ] 测试健康检查 endpoint
- [ ] 测试问卷生成
- [ ] 测试聊天助手
- [ ] 验证用户追踪日志
- [ ] 编写滥用响应流程文档
- [ ] 更新隐私政策
- [ ] 培训支持团队
**版本**: 2.2.1 (LEF 分解) + Cascade-Archetype Grounding (路径 A,受标志位控制)
**最后更新**: 2026 年 6 月
**状态**: 生产就绪 (评估模式)
**关键增强**: TEF × Vulnerability 分解;可选的带有 cascade-grounded 网络搜索的 cascade-archetype grounding
有关安全防护的详细实现,请参阅 **[SAFEGUARDS_README.md](SAFEGUARDS_README.md)**
有关 LEF 分解方法论,请参阅 **[FAIR_LEF_DECOMPOSITION_PROPOSAL.md](documentation/FAIR_LEF_DECOMPOSITION_PROPOSAL.md)**
标签:FAIR模型, Flask, 人工智能辅助, 威胁情报, 开发者工具, 网络安全, 蒙特卡洛模拟, 请求拦截, 逆向工具, 隐私保护