AhmedamineJebali1/active-directory-audit-platform

GitHub: AhmedamineJebali1/active-directory-audit-platform

一个基于 AI 和图分析的 Active Directory 自动化安全审计平台,支持攻击路径提取、MITRE ATT&CK 映射与专业审计报告生成。

Stars: 0 | Forks: 0

# AD Audit AI **自动化 Active Directory 安全审计平台** [![Python](https://img.shields.io/badge/Python-3.11-3776AB?style=flat-square&logo=python&logoColor=white)](https://python.org) [![FastAPI](https://img.shields.io/badge/FastAPI-0.115-009688?style=flat-square&logo=fastapi&logoColor=white)](https://fastapi.tiangolo.com) [![Docker](https://img.shields.io/badge/Docker-Compose-2496ED?style=flat-square&logo=docker&logoColor=white)](https://docker.com) [![PostgreSQL](https://img.shields.io/badge/PostgreSQL-16-4169E1?style=flat-square&logo=postgresql&logoColor=white)](https://postgresql.org) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](LICENSE) *检测攻击路径。使用 AI 评分。生成审计就绪的 PDF 报告。*
**AD Audit AI** 是一个多用户平台,可自动化对 Active Directory 环境的安全审计。上传 BloodHound JSON 或 ZIP 导出文件——或通过 LDAP 直接连接到域控制器——该平台将提取每条通往特权账户的可行攻击路径,使用可插拔的 LLM 对其进行评分,将每一跳映射到 MITRE ATT&CK,并生成可交付的法语版 PDF 报告。 ## 功能 | | | |---|---| | **真正的 BloodHound CE 支持** | 解析实际的 SharpHound 2.x / BloodHound CE v6 ZIP 格式、BloodHound v5 JSON、BloodHound v4 分区格式以及简单的自定义格式。与语言环境无关——适用于法语 / 德语 / 英语域控制器 | | **正确合成 DCSync** | 对 Domain 对象同时拥有 `GetChanges` 和 `GetChangesAll` 权限的主体将生成一个合成的 `DCSync` 边——与 BloodHound 自身的推导逻辑相匹配 | | **实时 LDAP 收集** | 连接到域控制器(LDAP 或 LDAPS),解析用于 ACL 边的二进制安全描述符,解析 `primaryGroupID`、`msDS-AllowedToDelegateTo`、`msDS-AllowedToActOnBehalfOfOtherIdentity`、`sIDHistory`、Kerberoastable、AS-REP roastable。基于 SMB 的边(AdminTo、HasSession 等)会被明确标记为启发式方法 | | **AI 驱动的评分** | 可插拔的 LLM 提供商——Mistral、Gemini、OpenAI、Anthropic、OpenRouter、Ollama。通过 `response_format` 强制执行严格的 JSON 输出。当 LLM 不可用时提供启发式后备方案,确保平台绝不会产生空结果 | | **MITRE ATT&CK 矩阵** | 将每一条 BloodHound 边映射到 MITRE 技术。任务视图展示按检测次数着色的战术 × 技术热力图 | | **PDF 报告** | 通过 WeasyPrint + Jinja2 生成的多页样式报告:封面、执行摘要、路径列表、MITRE 附录、ISO 27001 / NIST CSF 合规性映射 | | **带 RBAC 的多用户支持** | 三个全局角色(admin / manager / auditor)加上每个任务的成员资格(lead / contributor / viewer)。每个审计员只能看到他们被添加到的任务 | | **审计日志** | 记录每一个修改性请求(POST/PATCH/PUT/DELETE)及其用户、IP、路由、延迟和状态。提供管理员查看器和过滤 UI | | **邀请 + 重置流程** | 管理员可以通过电子邮件邀请用户;用户通过一次性 token 设置自己的密码。提供带速率限制且无电子邮件枚举的忘记密码流程 | | **实时进度** | 通过 WebSocket 流式传输 pipeline 阶段,并带有 HTTP 轮询后备机制 | | **100% 本地模式** | Ollama 提供商将 AD 数据保留在本地——不会向外部 API 发送任何内容 | ## 快速开始 ### 前置条件 - **Docker** ≥ 24 和 **Docker Compose v2**(运行 `docker compose version` 进行检查) - 一个空闲的 TCP 端口 **443**(如果发生冲突,请在 `docker-compose.yml` 中进行更改) - 约 2 GB 可用磁盘空间(Postgres + Neo4j + 应用镜像) - 可选:LLM API 密钥(Mistral、Gemini、OpenAI、Anthropic 或 OpenRouter)。如果没有,平台将在 **mock** 模式下运行并显示模拟分析 ### 一键设置 ``` # 1. Clone the repo git clone https://github.com/AhmedamineJebali1/active-directory-audit-platform.git cd active-directory-audit-platform # 2. 从模板创建你的 .env cp .env.example .env # 3. 生成一个安全的 secret key(运行以下命令之一并将结果粘贴到 .env 中作为 APP_SECRET_KEY) # Linux/macOS: openssl rand -hex 32 # Windows PowerShell: # [Convert]::ToBase64String([System.Security.Cryptography.RandomNumberGenerator]::GetBytes(32)) # 4. 编辑 .env —— 至少需要包含: # APP_SECRET_KEY=<粘贴上面的输出> # SEED_ADMIN_PASSWORD=<你自己的密码,≥ 12 个字符,混合多种类型> # POSTGRES_PASSWORD=<随机值> # NEO4J_PASSWORD=<随机值> # 5. Launch docker compose up -d --build # 6. 等待约 30 秒让 stack 启动,然后检查: docker compose ps # all services should be "running" / "healthy" docker compose logs backend # look for "db_schema_ready_alembic" # 7. 在浏览器中打开 https://localhost # 开发环境使用自签名 cert —— 接受警告,或者导入 caddy/data/caddy/pki/authorities/local/root.crt ``` ### 首次登录 使用您在 `.env` 中设置的凭据: ``` Email: admin@adauditai.local (or whatever SEED_ADMIN_EMAIL is set to) Password: ``` 第一个用户始终是管理员。使用侧边栏中的 **Utilisateurs** 来邀请团队成员。 ### 开发模式(热重载) ``` docker compose -f docker-compose.yml -f docker-compose.dev.yml up --build ``` 这会将后端源代码作为卷挂载并运行 `uvicorn --reload`。前端更改需要重新构建前端容器(nginx 提供静态文件服务)。 ### 故障排除 | 症状 | 修复方法 | |---|---| | 浏览器无法访问 `https://localhost` | 运行 `docker compose ps` —— `caddy` 是否在 `0.0.0.0:443→443` 上运行?如果另一个进程占用了 443,请释放它或更改绑定 | | 日志中出现 "Configuration de production invalide" | `APP_ENV=production` 需要非默认的 `APP_SECRET_KEY`、`SEED_ADMIN_PASSWORD`、`POSTGRES_PASSWORD`、`NEO4J_PASSWORD`。请设置它们或使用 `APP_ENV=development` | | 登录返回 500 | 迁移未应用。运行 `docker compose exec backend alembic upgrade head`,然后重启 backend | | 登录后立即显示 "Session expirée" | 您可能输入了错误的密码或触发了 5 次尝试 / 5 分钟的锁定。等待 15 分钟或运行 `docker compose restart backend` 清除内存中的桶 | | 分析始终显示 `llm=mock` | 转到侧边栏中的 **Configuration LLM**(仅限管理员),选择您的提供商,粘贴 API 密钥,然后点击 "Tester la connexion" | | 上传时提示 "Aucun chemin d'attaque trouvé" | 当提取的图中没有从非特权用户到特权组的路径时,这是正常的。尝试更大的 BloodHound 导出文件——小型的实验室域通常没有可利用的路径 | ### 部署到真实域名 1. 在 `.env` 中设置 `APP_ENV=production` 2. 设置 `PUBLIC_DOMAIN=adaudit.your-domain.com` 3. 将该 DNS 记录指向主机 4. 向公网开放端口 **80** 和 **443** 5. 运行 `docker compose up -d --build` Caddy 会自动签发 Let's Encrypt 证书。在生产环境中会自动启用 HSTS。 ## LLM 提供商设置 选择任何受支持的提供商。您稍后也可以通过侧边栏中的 **Configuration LLM** 进行更改(仅限管理员)——应用内的配置会覆盖 `.env`。 | 提供商 | 模型 | API 密钥 URL | |---|---|---| | **Mistral** | `mistral-small-latest`, `mistral-large-latest` | https://console.mistral.ai/api-keys | | **Google Gemini** | `gemini-2.0-flash`, `gemini-1.5-pro` | https://aistudio.google.com/apikey | | **OpenAI** | `gpt-4o`, `gpt-4o-mini`, `gpt-4-turbo` | https://platform.openai.com/api-keys | | **Anthropic** | `claude-sonnet-4-5`, `claude-opus-4-5` | https://console.anthropic.com | | **OpenRouter** | 许多模型,包括免费层的 Llama、Gemma、Mistral | https://openrouter.ai/keys | | **Ollama** | 本地 —— `llama3.1:8b`, `mistral:7b` 等 | 无需密钥 —— 在主机上运行 `ollama serve` | | **mock** | 确定性的模拟输出 —— 仅用于测试 | 平台会向每个支持它的提供商发送 `response_format={"type":"json_object"}`。如果模型拒绝该参数,它将自动在不带该参数的情况下重试。 ## 架构 ``` ┌──────────────────────────────────────────────────────────┐ │ Browser (Auditor) │ │ Alpine.js · Chart.js · Cytoscape.js │ └─────────────────────────┬────────────────────────────────┘ │ HTTPS / WebSocket ┌───────▼────────┐ │ Caddy │ Reverse proxy + Auto-TLS └───────┬────────┘ │ ┌─────────────▼──────────────────┐ │ FastAPI Backend │ │ │ │ ┌───────────────────────────┐ │ │ │ Pipeline Modules │ │ │ │ ingestion → paths │ │ │ │ → mitre → agent → report │ │ │ └──────────────┬────────────┘ │ │ │ │ │ ┌─────────────▼───────────┐ │ │ │ LLM Providers │ │ │ │ Mistral · Gemini │ │ │ │ OpenAI · Anthropic │ │ │ │ OpenRouter · Ollama │ │ │ └─────────────────────────┘ │ └────────┬────────────┬───────────┘ │ │ ┌──────────▼──┐ ┌─────▼──────┐ │ PostgreSQL │ │ Neo4j │ │ (app + logs)│ │ (graph) │ └─────────────┘ └────────────┘ ``` ## 工作流 1. 在 `https://localhost`(或您的 `PUBLIC_DOMAIN`)**登录** 2. **创建任务**(admin 或 manager),包含客户名称 + 任务代码 3. **上传 BloodHound JSON / ZIP**,拖放或点击。或使用实时 LDAP 收集器 4. 通过 WebSocket 观看 **进度条** 更新,经历提取 → 路径提取 → MITRE 丰富 → AI 分析 5. 浏览: - **Analyse** —— pipeline 状态 + 操作 - **Graphe AD** —— 交互式 Cytoscape 图 - **Chemins d'attaque** —— 带有风险 + 评分过滤器的可排序表格 - **Matrice MITRE** —— 战术 × 技术热力图 6. 点击任何路径查看详细视图:SVG 迷你图、MITRE 技术、AI 解释、嵌入式修复手册、在相关路径间的上一个/下一个导航 7. **下载** PDF 报告或按路径划分的修复 ZIP 包 8. 通过 Utilisateurs 页面**邀请团队成员**(仅限管理员) ## 技术栈 | 层级 | 技术 | |---|---| | 后端 | Python 3.11, FastAPI 0.115+, Uvicorn, WebSocket | | 数据库 | PostgreSQL 16(应用数据),Neo4j 5 Community(图) | | ORM / 迁移 | SQLAlchemy 2, Alembic(启动时自动应用) | | 图分析 | NetworkX 3,带有每个源-目标对实际时间预算的 BFS | | LLM 编排 | 带有 JSON 模式强制的自定义多提供商抽象 | | 验证 | Pydantic v2 | | PDF 生成 | WeasyPrint 62, Jinja2 3 | | 身份验证 | python-jose (JWT), passlib + bcrypt, token-version 吊销 | | 前端 | HTML5, CSS3, Alpine.js 3, Chart.js 4, Cytoscape.js 3 —— 零构建步骤 | | 反向代理 | Caddy 2(在生产环境中通过 Let's Encrypt 自动启用 HTTPS) | | 容器化 | Docker, Docker Compose v2 | | 测试 | pytest, pytest-asyncio, httpx | ## 项目结构 ``` ad-audit-ai/ ├── backend/ │ ├── app/ │ │ ├── api/v1/ # REST endpoints │ │ │ ├── auth.py # /login, /refresh, /logout, /invite, /reset │ │ │ ├── engagements.py # Mission CRUD + member management │ │ │ ├── analyses.py # Upload, pipeline, /detect-format preview │ │ │ ├── paths.py # Attack paths with filters │ │ │ ├── reports.py # PDF download │ │ │ ├── stats.py / mitre.py # Stats + MITRE coverage │ │ │ ├── ldap_collector.py # Live LDAP collection │ │ │ ├── llm_settings.py # LLM provider config UI backend │ │ │ ├── admin.py # Admin audit log + user management │ │ │ └── ws.py # WebSocket real-time progress │ │ ├── core/ │ │ │ ├── security.py # JWT + RBAC dependencies │ │ │ ├── engagement_access.py # Per-engagement membership gate │ │ │ ├── audit.py # Audit log middleware │ │ │ ├── rate_limit.py # Login bucket │ │ │ ├── auth_tokens.py # Invite + reset token issuance │ │ │ ├── password_policy.py # 12+ chars, 3-of-4 classes │ │ │ └── notifications.py # Email service (console + SMTP) │ │ ├── models/ # SQLAlchemy ORM │ │ ├── schemas/ # Pydantic v2 request/response │ │ └── modules/ │ │ ├── ingestion.py # BloodHound JSON/ZIP → NetworkX │ │ ├── paths.py # BFS path extraction with budget │ │ ├── agent.py # LLM agent + heuristic fallback │ │ ├── mitre.py # MITRE enrichment │ │ ├── report.py # WeasyPrint PDF generation │ │ ├── remediation.py # Per-path mitigation playbook │ │ ├── ldap_collector.py # Binary SD parser + LDAP queries │ │ └── llm_providers/ # Mistral, Gemini, OpenAI, Anthropic, OpenRouter, Ollama │ ├── data/ │ │ ├── mitre_mapping.json # 60+ edge types → MITRE techniques │ │ ├── compliance_mapping.json # MITRE → ISO 27001 / NIST CSF │ │ └── sample_graph.json # Synthetic test export │ ├── templates/ # Jinja2 PDF template │ ├── alembic/versions/ # 0001–0006 schema migrations │ └── tests/ # Unit + integration tests ├── frontend/ │ ├── public/ # HTML pages (Alpine.js, no build) │ ├── js/ # Vanilla JS modules │ ├── css/ # Tokens + components + toast │ └── nginx.conf # Cache control + security headers ├── caddy/ # Caddyfile (PUBLIC_DOMAIN-driven) ├── docs/ # Architecture docs ├── docker-compose.yml # Production stack └── docker-compose.dev.yml # Dev override (hot reload, exposed ports) ``` ## API 参考 Swagger UI: `https://localhost/api/docs` ``` # Auth POST /api/v1/auth/login POST /api/v1/auth/refresh POST /api/v1/auth/logout GET /api/v1/auth/me POST /api/v1/auth/invite (admin) POST /api/v1/auth/accept-invite POST /api/v1/auth/forgot-password POST /api/v1/auth/reset-password # Engagements + 成员 GET /api/v1/engagements POST /api/v1/engagements (admin/manager) PATCH /api/v1/engagements/{id} (lead-on-engagement or admin) GET /api/v1/engagements/{id}/members POST /api/v1/engagements/{id}/members DELETE /api/v1/engagements/{id}/members/{user_id} # 分析 POST /api/v1/analyses/detect-format # Preview before full pipeline POST /api/v1/engagements/{id}/analyses # Upload → launch pipeline POST /api/v1/engagements/{id}/ldap-collect # Live LDAP collection GET /api/v1/analyses/{id} # Status GET /api/v1/analyses/{id}/events # WS replay buffer + error_message GET /api/v1/analyses/{id}/graph # Cytoscape data GET /api/v1/analyses/{id}/paths # ?risk=critique&min_score=7 GET /api/v1/analyses/{id}/mitre # Coverage map GET /api/v1/analyses/{id}/stats GET /api/v1/analyses/{id}/report.pdf # Remediation GET /api/v1/analyses/{id}/paths/{path_id}/remediation-script # Markdown GET /api/v1/analyses/{id}/remediation-bundle.zip # All paths zipped # 管理 GET /api/v1/admin/audit-logs (admin) GET /api/v1/admin/users (admin) PATCH /api/v1/admin/users/{id} (admin) POST /api/v1/admin/users/{id}/disable (admin) POST /api/v1/admin/users/{id}/enable (admin) POST /api/v1/auth/admin/users/{id}/force-logout (admin) # LLM GET /api/v1/llm/providers GET /api/v1/llm/config PUT /api/v1/llm/config (admin) POST /api/v1/llm/test (admin) # WebSocket WS /ws/analyses/{id} # Real-time pipeline events ``` ## 运行测试 ``` # 所有测试 docker compose exec backend pytest -q # 仅 ingestion + paths 逻辑(无需 DB) docker compose exec backend pytest tests/unit/test_ingestion.py tests/unit/test_paths.py -q ``` ## 安全与道德 此工具**仅**用于对您拥有或获得明确书面测试许可的 Active Directory 环境进行安全审计。 - 使用 Ollama 提供商时,所有 AD 数据均保留在本地 - INFO 日志级别下不记录任何 AD 标识符(默认 `AUDIT_DEBUG_DATA=false`) - 审计日志中记录每一个修改性操作 - JWT 访问 token 将在 15 分钟后过期;刷新 token 在 7 天后过期 - 通过 `users.token_version` 进行服务器端会话吊销——注销会使所有会话失效 - 登录按(电子邮件,IP)进行速率限制;5 次失败尝试后锁定 15 分钟 - 密码策略:≥ 12 个字符,包含 {大写字母,小写字母,数字,特殊符号} 中的 3 种 - 纵深防御请求头(在生产环境中启用 HSTS、X-Frame-Options DENY、CSP、Permissions-Policy) - 在 `production` 模式下拒绝使用默认密钥启动 ## 许可证 [MIT](LICENSE)
标签:Active Directory, AV绕过, BloodHound, FastAPI, LLM, Plaso, Unmanaged PE, Web报告查看器, 攻击路径分析, 测试用例, 特权检测, 请求拦截, 逆向工具