slavicbob/M365-License-Auditor-Tool-MCP
GitHub: slavicbob/M365-License-Auditor-Tool-MCP
一款结合身份风险检测、许可证成本优化、登录威胁分析和自然语言 AI 助手的 Microsoft 365 全栈治理仪表板。
Stars: 0 | Forks: 0
# M365 License Auditor Tool MCP
这是一个全栈 Microsoft 365 治理智能仪表板,结合了身份风险检测、许可证成本优化、登录威胁分析以及自然语言分析师助手。
本项目旨在作为以下方面的高质量作品集展示:
- 从 Microsoft Graph 安全检索数据
- 对身份、许可和访问遥测进行可操作的分析
- 具备缓存和可组合洞察的 API 优先后端架构
- 用于操作决策支持的简洁 React 仪表板
- 基于治理和成本数据的 LLM 辅助查询体验
## 目录
- 概述
- 核心功能
- 架构
- API 端点
- 前端体验
- 数据源和检测逻辑
- 实际应用场景
- 业务应用
- 技术栈
- 本地设置
- 环境变量
- 注意事项和限制
- 路线图建议
- 作品集定位
## 概述
M365 License Auditor Tool MCP 帮助 IT、SecOps 和 FinOps 团队回答以下关键问题:
- 从身份治理的角度来看,哪些用户属于高风险?
- 我们在 Microsoft 365 许可证上的开支在哪些方面过高?
- 哪些登录模式表明存在可疑活动?
- 本周为了降低风险和成本,我们应优先采取哪些行动?
该系统聚合 Microsoft Graph 数据,计算分数和洞察,并同时提供表格详情和管理层摘要。
## 核心功能
### 1. 治理风险扫描
在 app/scanner.py 中实现。
将治理检测结果检测并分类为高风险和中风险级别。
主要检测项:
- 未启用 MFA 的高级许可证用户
- 持有基础许可证的特权用户(许可证不足的管理员风险)
- 未启用 MFA 的特权用户
- 不活跃的许可证用户(阈值设为 90 天以上)
- 被分配高级许可证的承包商
- 仍保留许可证的已禁用账户
- 使用自定义安全属性的产假排除逻辑
输出:
- 满分 100 的风险评分
- 针对用户级别的发现与建议
- 高风险、中风险、排除用户和已禁用许可证用户的摘要计数
### 2. 许可证成本优化
在 app/cost.py 中实现。
计算租户许可证支出和优化空间。
主要分析项:
- 每月总许可证成本
- 因许可证用户不活跃而产生的每月浪费成本
- 高级用户群体
- 承包商高级许可证分配过多
- 基于 30 天 M365 活动信号的未充分利用的高级用户:
- 电子邮件
- Teams
- OneDrive
- SharePoint
- 基于可配置 SKU 降级映射的潜在降级节省
- 主要成本驱动因素和许可证分布
输出:
- 满分 100 的成本评分
- 每月和年度化的浪费/节省指标
- 针对单个用户的可操作降级或回收建议
### 3. 威胁活动分析
在 app/threats.py 中实现。
分析 Entra 登录遥测数据,检测过去 7 天内的可疑行为。
主要检测项:
- 登录失败爆发(可能是暴力破解)
- 来自 Entra ID 保护信号的风险登录
- 异常国家/地区的成功登录
- 不可能旅行事件(在极短的时间窗口内进行跨国登录)
输出:
- 威胁摘要指标
- 按威胁类别划分的详细事件表
- 调查和策略强化建议
### 4. 管理层概述汇总
在 app/main.py 的 /overview 路由中实现。
将治理、成本和威胁摘要整合为管理层数据快照,包括:
- 风险和成本评分
- 威胁量
- 年度化浪费和潜在节省
- 基于类别导航的首选建议操作
### 5. AI 治理助手
在 app/agent.py 中实现,并通过 /agent 路由暴露。
支持对治理和成本数据集进行自然语言查询。
设计特点:
- 数据集压缩,以控制 token 占用
- 截断洞察的同时保留摘要总计
- 查询关键字路由(仅成本、仅扫描或组合查询)
- 为前端渲染提供的结构化 JSON 响应契约
## 架构
### 后端
- 入口点:app/main.py
- 为本地 Vite 前端 (localhost:5173) 启用 CORS
- 具备按 key 锁定的内存响应缓存
- 缓存 TTL:30 分钟
- 端点:scan, cost, threats, overview, agent
### Graph 访问层
- 在 app/graph.py 中实现
- MSAL 机密客户端凭证流
- 带有过期处理的 token 复用
- 针对 Graph 429/5xx 响应的重试和感知限流处理
- 带有可选页面限制的分页处理
- 为活动分析引入 CSV 报告
### 前端 (React + Vite)
- frontend/src/App.jsx 中的选项卡式应用外壳
- 页面模块:
- 概述
- 治理
- 成本
- 威胁
- AI Agent
- 可复用组件:
- 摘要卡片
- 可搜索、可排序的用户表
## API 端点
所有端点均由 FastAPI 提供(默认本地基础 URL:http://127.0.0.1:8000)。
- GET /
- 健康/状态检查
- GET /scan?refresh=true|false
- 治理扫描摘要和结果
- GET /cost?refresh=true|false
- 成本分析摘要和优化洞察
- GET /threats?refresh=true|false
- 登录威胁分析摘要和事件洞察
- GET /overview?refresh=true|false
- 聚合的管理层仪表板 payload
- POST /agent
- 请求体:{ "query": "..." }
- 返回用于 UI 渲染的强类型 JSON payload
## 前端体验
仪表板支持:
- 用于领导层汇报的管理层 KPI 摘要
- 面向分析师工作流的深度下钻结果表
- 全局表格搜索和可排序列
- 一键刷新获取最新概述数据
- 用于探索性分析的 AI 辅助问答
## 数据源和检测逻辑
主要数据来自 Microsoft Graph API:
- 用户、角色和订阅的 SKU
- MFA 注册报告
- M365 使用情况报告(CSV 端点)
- 审计日志登录
评分模型亮点:
- 治理风险评分会对高风险和中风险的发生率进行扣分
- 成本评分会对不活跃的许可用户和承包商高级版比例进行扣分
## 实际应用场景
- 季度 M365 许可证规模调整计划
- 针对特权身份的安全态势审查
- 检测过时、高风险或过度配置的账户
- 面向 IT 领导层的全租户操作就绪仪表板
- 为身份治理委员会提供基于证据的建议
## 业务应用
- 减少经常性的 Microsoft 365 许可浪费
- 改善特权访问控制的合规性结果
- 更早发现可疑的登录行为
- 在 SecOps、IAM 和 FinOps 之间建立共享的全局运作视图
## 技术栈
后端:
- Python
- FastAPI
- MSAL
- Requests
- Azure OpenAI SDK
前端:
- React
- Vite
- Axios
其他支持:
- Microsoft Graph API
- 带有应用程序权限的 Entra ID 应用注册
## 本地设置
### 1. 克隆并进入项目
- 克隆此存储库
- 打开项目根文件夹
### 2. 后端设置
在项目根目录下执行:
```
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
```
运行 API 服务器:
```
uvicorn app.main:app --reload --host 127.0.0.1 --port 8000
```
### 3. 前端设置
在 frontend 目录下执行:
```
npm install
npm run dev
```
默认前端 URL:
- http://127.0.0.1:5173
如有需要,可以使用 VITE_API_BASE_URL 设置前端 API 目标。
## 环境变量
在项目根目录下创建一个 .env 文件用于后端设置:
Microsoft Graph 必需项:
- CLIENT_ID
- CLIENT_SECRET
- TENANT_ID
AI 助手必需项:
- AZURE_OPENAI_KEY
- AZURE_OPENAI_ENDPOINT
- AZURE_OPENAI_DEPLOYMENT
可选项目:
- AZURE_OPENAI_API_VERSION(代码默认值:2024-12-01-preview)
- AGENT_MAX_RECORDS_PER_INSIGHT(默认值:100)
- SIGNIN_PAGE_LIMIT(默认值:50)
前端可选项目 (frontend/.env):
- VITE_API_BASE_URL
## 注意事项和限制
本节内容对于展示项目的真实生产情况和作品集可信度至关重要。
### 1. 必须替换定价占位符
在 app/cost.py 中,许可证定价和降级节省目前包含占位符(例如 XYZ 和 ABC)。这不是可执行的 Python 代码,必须在运行成本分析之前将其替换为真实的数值。
### 2. 权限范围要求
此项目使用的 Graph 端点需要提升的应用程序权限(例如:审计日志、报告、目录数据)。缺少权限将导致洞察不完整或端点失败。
### 3. 仅支持内存缓存
缓存是进程本地且非分布式的。它适用于本地使用和演示,但不足以支持水平扩展的生产部署。
### 4. 启发式检测模型
威胁和治理逻辑使用确定性启发式算法(阈值和规则),不能完全替代完整的 SIEM/SOAR 或事件响应 pipeline。
### 5. AI 响应依赖性
AI 助手需要配置好的 Azure OpenAI 部署,并且可能会根据模型行为和 prompt 路由返回不同的输出。
### 6. 数据新鲜度和 API 限制
Graph 报告端点可能会有延迟,且尽管有重试/退避处理,大批量租户可能仍会遇到限流。
## 路线图建议
提升生产就绪程度的潜在升级方向:
- 外部持久化缓存
- 带有快照历史记录的后台定时扫描
- 针对仪表板本身的多租户 RBAC 和身份验证
- 导出功能(CSV/PDF 管理层报告)
- 用于修复工作流的策略即代码集成
- 扩展单元和集成测试,包括模拟的 Graph 固件
- 支持 SIEM 连接器
## 作品集定位
本项目在以下方面展示了实用的云工程和产品思维:
- API 工程和集成弹性
- 安全和治理分析设计
- 成本优化智能
- 具备 payload 整形和结构化输出契约的 LLM 功能集成
- 专注于操作员工作流的前端交付
## 架构图 (ASCII)
```
+--------------------------------------+
| React Frontend |
| Vite app with tabs and data tables |
| (Overview, Scan, Cost, Threats, AI) |
+------------------+-------------------+
|
| HTTP/JSON
v
+--------------------------------------+
| FastAPI Backend |
| app/main.py |
| - /scan /cost /threats /overview |
| - /agent |
| - In-memory cache (30 min TTL) |
+-----------+--------------+-----------+
| |
calls modules | | calls LLM
| |
+-----------------------+--+ +---+----------------------+
| Analytics Modules | | Azure OpenAI Service |
| scanner.py | | (structured JSON output) |
| cost.py | +--------------------------+
| threats.py |
| agent.py |
+------------+-------------+
|
| via graph.py (MSAL + retry + paging)
v
+--------------------------------------+
| Microsoft Graph APIs |
| Users, Roles, SKUs, Reports, SignIns |
+--------------------------------------+
```
## 免责声明
本项目是一个通用且经过脱敏处理的作品集实现,灵感来源于企业自动化场景。不包含任何专有的公司信息、凭证、生产配置或内部业务逻辑。
标签:DLL 劫持, FinOps, Microsoft 365, React, Syscalls, 大语言模型, 安全运营, 扫描框架, 身份风险检测, 运维治理, 逆向工具