响应MCP服务器
一个模型上下文协议(MCP)服务器,它使用GitHub Copilot的VS Code等编排器来执行Microsoft Defender XDR响应操作,从而启用代理SecOps。部署到Azure容器应用程序,以实现安全、经过身份验证的基于云的访问。
概述
此MCP服务器公开了Microsoft Defender XDR功能,作为代理SecOps工作流的工具。安全分析师通过GitHub Copilot等编排器使用自然语言来管理事件、隔离受感染的设备、运行防病毒扫描、收集取证包和执行事件响应操作。
与Sentinel MCP协同工作
此响应MCP服务器与 哨兵MCP服务器 提供完整的代理SecOps工作流程:
- 哨兵MCP:数据探索和威胁分类
- 使用KQL查询安全日志 - 调查警报并运行搜索查询 - 分析攻击模式和指标 - 实体分析
- 响应MCP (此服务器):事件响应和补救
- 执行设备响应操作(隔离、限制、隔离) - 采取身份响应操作(禁用帐户、重置密码) - 管理事件(分类、分配、评论)
它们共同实现了端到端的事件响应:从检测和分类到遏制和补救,所有这些都通过自然语言交互和代理编排。
交互示例:
- “检查设备WORKSTATION-01的状态”
- “立即隔离受损的笔记本电脑”
- “在服务器上运行完整的防病毒扫描”
- “显示此设备上最近的响应操作”
建筑
┌─────────────────┐ ┌──────────────────────┐
│ VS Code + │────SSE────────▶│ Azure Container App │
│ GitHub Copilot │ X-API-Key │ (Response MCP) │
└─────────────────┘ Authentication└──────────────────────┘
│
│ Client Credentials
│ (Service Principal)
│
┌───────────────────┴───────────────────┐
▼ ▼
┌─────────────────────────────┐ ┌─────────────────────────────┐
│ Microsoft Defender │ │ Microsoft Graph API │
│ for Endpoint │ │ - Incident management │
│ - Device response actions │ │ - Identity actions (MDI) │
│ - Investigation packages │ └─────────────────────────────┘
└─────────────────────────────┘SSE(服务器发送事件): 一种维护持久HTTP连接的web标准,允许MCP服务器将实时响应流式传输回AI助手。
可用工具
设备响应操作(端点防御器)
| 工具 | 说明 |
|---|---|
echo | 测试服务器连接 |
get_machine_by_name | 按主机名查找设备 |
get_machine_actions | 列出响应操作历史记录 |
isolate_device | 将设备与网络隔离 |
release_device | 释放隔离装置 |
run_antivirus_scan | 启动快速或完整AV扫描 |
stop_and_quarantine | 停止进程和隔离文件 |
restrict_code_execution | 阻止未签名的应用程序 |
remove_code_restriction | 删除代码限制 |
collect_investigation_package | 收集法医数据 |
get_investigation_package_uri | 获取调查包的下载URL |
isolate_multiple | 批量隔离多个设备 |
身份响应行动(身份和入境者ID的防御者)
| 工具 | 描述 | 提供者 |
|---|---|---|
disable_ad_account | 禁用Active Directory帐户 | Active Directory |
enable_ad_account | 重新启用Active Directory帐户 | Active Directory |
force_ad_password_reset | 强制用户在下次登录时更改密码 | Active Directory |
revoke_entra_sessions | 撤销所有Entra ID会话并刷新令牌 | Entra ID |
confirm_user_compromised | 将用户标记为身份保护已受损 | Entra ID |
confirm_user_safe | 在身份保护中消除用户风险(标记为安全) | Entra ID |
事件管理
| 工具 | 说明 |
|---|---|
update_incident_status | 将事件标记为活动/已解决 |
assign_incident | 将事件分配给分析师 |
classify_incident | 设置分类(TP/FP)和确定 |
add_incident_tags | 添加自定义标签进行分类 |
add_incident_comment | 添加调查意见 |
先决条件
1.参赛者ID应用程序注册
步骤:
- 导航到 Azure门户 > Entra ID > 应用程序注册 > 新注册
- 姓名: Response MCP Server (或您喜欢的名字) - 支持的帐户类型: 仅此组织目录中的帐户 - 点击 注册
- 保存这些值 (部署所需):
- 应用程序(客户端)ID - 目录(租户)ID
- 创建 客户端密钥:
- 首选 证书和秘密 > 新客户机密 - 说明: Response MCP Secret - 到期:选择到期期限(例如,12个月) - 点击 添加 - 立即复制机密值 (仅显示一次)
- 添加 API权限:
- 首选 API权限 > 添加权限 - 添加下面列出的权限 - 授予管理员同意 对于所有权限
必需的权限
WindowsDefenderATP(端点防御器)
| 权限 | 类型 | 描述 |
|---|---|---|
Machine.ReadWrite.All | 应用程序 | 读取机器操作并获取调查包URI |
Machine.Isolate | 应用 | 隔离/释放机器 |
Machine.Scan | 应用程序 | 运行防病毒扫描 |
Machine.StopAndQuarantine | 应用程序 | 停止和隔离文件 |
Machine.RestrictExecution | 应用程序 | 限制/取消限制代码执行 |
Machine.CollectForensics | 申请 | 收集调查包 |
Microsoft Graph API
| 权限 | 类型 | 描述 |
|---|---|---|
SecurityAlert.ReadWrite.All | 应用程序 | 读取和更新安全警报 |
SecurityIdentitiesAccount.Read.All | 应用程序 | 从MDI读取身份帐户 |
SecurityIdentitiesActions.ReadWrite.All | 应用程序 | 对身份帐户调用操作 |
SecurityIncident.ReadWrite.All | 应用程序 | 读取和更新安全事件 |
User.Read.All | 应用程序 | 将UPN解析为用户ID |
User.RevokeSessions.All | 应用程序 | 撤消用户会话 |
IdentityRiskyUser.ReadWrite.All | 应用程序 | 在身份保护中将用户标记为已泄露 |
2.Azure订阅
用于部署到Azure容器应用程序。
Azure基础架构:
┌─────────────────────────────────────────────────────────────┐
│ Resource Group: response-mcp-rg │
│ │
│ ┌────────────────────────────────────────────────────┐ │
│ │ Container Apps Environment │ │
│ │ - Managed Kubernetes infrastructure │ │
│ │ - Auto-scaling (min: 0, max: 3 replicas) │ │
│ │ │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ Container App: response-mcp │ │ │
│ │ │ - SSE endpoint on port 8000 │ │ │
│ │ │ - API key authentication │ │ │
│ │ │ - Environment secrets (Defender creds) │ │ │
│ │ │ - HTTPS ingress │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ │ │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────────┐ │
│ │ Azure Container Registry (Basic) │ │
│ │ - Stores Docker images │ │
│ │ - ACR Tasks for cloud builds │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────────┐ │
│ │ Log Analytics Workspace │ │
│ │ - Container App logs │ │
│ │ - Request/response tracing │ │
│ │ - 30-day retention │ │
│ └────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘部署到Azure容器应用程序
先决条件
- Azure命令行界面 (v2.20.0+)- 安装 或
winget install Microsoft.AzureCLI - Bicep -包含在Azure CLI中,使用进行升级
az bicep upgrade如有需要 - 已验证 -快跑
az login部署前 - Entra ID应用程序注册 具有所需的API权限(请参阅上面的“先决条件”部分)
- Azure订阅 具有创建资源的权限
步骤1:部署基础设施(一次性设置)
部署Azure基础架构(容器注册表、日志分析、容器应用程序环境):
.\infra\deploy-infrastructure.ps1 `
-ResourceGroup "response-mcp-rg" `
-Location "westeurope" `
-DefenderClientId "your-app-client-id" `
-DefenderClientSecret (ConvertTo-SecureString "your-client-secret" -AsPlainText -Force) `
-DefenderTenantId "your-tenant-id"发生了什么:
- 创建资源组、Azure容器注册表、日志分析工作区
- 部署具有托管环境和自动扩展功能的容器应用程序
- 自动生成MCP API密钥 并将其配置为机密
- 输出SSE端点URL和 显示API密钥 (保存它-不会再显示!)
可选: 提供您自己的API密钥:
-McpApiKey (ConvertTo-SecureString "your-custom-api-key" -AsPlainText -Force)步骤2:构建和部署容器
构建Docker镜像并将其部署到容器应用程序:
.\infra\deploy-container.ps1 -ResourceGroup "response-mcp-rg"发生了什么:
- 在Azure容器注册表中构建Docker镜像 (云构建-不需要本地Docker)
- 将源代码上传到Azure
- 在Azure基础架构上构建容器映像
- 创建带有时间戳的新修订版
- 更新容器应用程序并激活新版本
注: Docker Desktop不是必需的——构建完全在Azure中使用ACR任务进行。
后续更新: 只需再次运行步骤2即可部署代码更改。
步骤3:配置VS代码
添加到MCP设置中:
{
"mcpServers": {
"response-mcp": {
"type": "sse",
"url": "https://your-app.azurecontainerapps.io/sse",
"headers": {
"X-API-Key": ""
}
}
}
}将URL和API键替换为步骤1输出中的值。
安全强化:IP允许列表(推荐)
限制从特定IP地址访问您的容器应用程序:
允许单个IP:
az containerapp ingress access-restriction set `
--name `
--resource-group response-mcp-rg `
--rule-name "AllowMyIP" `
--action Allow `
--ip-address "203.0.113.42/32" `
--description "My workstation"允许多个IP或范围:
# Add office network
az containerapp ingress access-restriction set `
--name `
--resource-group response-mcp-rg `
--rule-name "AllowOffice" `
--action Allow `
--ip-address "203.0.113.0/24" `
--description "Office network"
# Add VPN endpoint
az containerapp ingress access-restriction set `
--name `
--resource-group response-mcp-rg `
--rule-name "AllowVPN" `
--action Allow `
--ip-address "198.51.100.10/32" `
--description "VPN gateway"列出当前规则:
az containerapp ingress access-restriction list `
--name `
--resource-group response-mcp-rg `
-o table删除规则:
az containerapp ingress access-restriction remove `
--name `
--resource-group response-mcp-rg `
--rule-name "AllowMyIP"注: 按顺序评估IP限制。确保在删除不受限制的访问之前,不要将自己锁定在允许的IP上进行测试。
安全考虑
| 层 | 保护 |
|---|---|
| 传输 | HTTPS/TLS加密 |
| 身份验证 | 中的API密钥 X-API-Key 头球 |
| 网络 | 容器应用程序上的IP分配列表(标准) |
| 网络(高级) | ExpressRoute集成+专用链接/VPN(可选) |
| 机密 | 存储在Azure容器应用程序机密中 |
| Defender API | 具有最低权限的服务主体 |
标准安全(当前部署):
- 具有IP分配限制的公共端点
- API密钥验证
- HTTPS/TLS加密
- 适用于大多数组织
高级安全(ExpressRoute部署):
对于需要专用网络访问权限的组织,请将容器应用程序部署到ExpressRoute中:
优点:
- 仅限私人访问(不公开互联网)
- 通过VPN网关、ExpressRoute或Azure Bastion访问
- 网络安全组(NSG)和防火墙规则
- 遵守严格的网络隔离政策
要求:
- 为容器应用程序自定义具有委派子网的ExpressRoute
- VPN网关(约140美元/月)或ExpressRoute用于远程访问
- 具有ExpressRoute集成的容器应用程序环境(
internal: true) - 更高的基本成本(工作量概况约为每月200美元以上)
何时使用:
- 公司政策要求所有流量都通过VPN/ExpressRoute
- 不允许使用公共互联网端点
- 需要访问私有Azure服务(具有私有终结点的SQL数据库)
- 合规要求强制要求网络隔离
不建议在以下情况下使用:
- 从单个分析师工作站访问(IP分配列表更简单)
- 对成本敏感的环境
- 标准互联网连接是可以接受的
看 Azure容器应用程序ExpressRoute集成 了解实施细节。
建议:
- 定期旋转API键
- 在生产环境中使用IP分配(最简单)
- 仅在策略/合规性要求时才考虑进行ExpressRoute部署
- 监控容器应用程序日志以查找可疑活动
- 仅授予所需的Defender API权限
- 定期轮换客户端机密
- 永远不要将API密钥提交到源代码管理
成本估算
预计每月Azure成本: 约12-18美元/月 用于典型用途(很少有分析师,仅限工作时间)。可扩展到零,以最大限度地降低闲置成本。全天候运营(每月约30-40美元)或更高的日志保留率会增加成本。
故障排除
连接被拒绝:
- 检查容器应用程序是否正在运行:
az containerapp show --name your-app -g your-rg - 验证与Azure的网络连接
401未经授权:
- 验证您的API密钥是否正确
- 检查
X-API-Key正在发送标头 - 确保
MCP_API_KEY在容器应用程序环境中设置
Defender API错误:
- 验证应用程序注册权限和管理员同意
- 检查客户端密码是否未过期
- 确保服务主体具有所需的Defender API权限
许可证
麻省理工学院
