ARMAlyzer-Azure安全分析套件
一个使用MCP(模型上下文协议)和PydanticAI的Azure ARM模板和Entra ID配置的全面安全分析工具。
概述
ARMAlyzer为两个关键的Azure组件提供安全分析:
ARM模板分析
- MCP服务器:通过模型上下文协议公开分析工具
- Pydanticai代理:智能分析和报告
- 安全检查:自动检测常见的Azure ARM安全问题
- 评估框架:测试和验证能力
Entra ID分析
- 备份分析:分析EntraExporter备份文件的安全配置错误
- 政策审查:检查授权策略、安全默认值和身份验证方法
- 角色分析:标识特权用户和角色分配
- 同步设置:审查本地同步安全设置
特性
ARM模板安全检查
- 图像版本固定:检测“最新”图像版本的使用情况
- 管理员凭据:标识硬编码的管理员用户名
- 身份管理:分析托管身份配置
- 参数验证:检查是否为null或缺少参数
- 网络安全:审查网络接口配置
入境者身份安全检查
- 组织设置:意外删除保护、通知电子邮件
- 授权策略:访客访问权限、用户权限、应用创建权限
- 目录角色:特权用户分析,全局管理员计数
- 同步设置:密码回写、用户回写、设备回写
- 安全默认值:MFA执行、安全策略合规
- 身份验证方法:弱身份验证与强身份验证方法分析
建筑
├── server.py # MCP server entry point
├── tools/
│ ├── arm_checks.py # ARM template security analysis
│ ├── arm_ingest.py # ARM MCP tool wrapper
│ ├── entra_analyzer.py # Entra ID security analysis
│ └── entra_ingest.py # Entra ID MCP tool wrapper
├── agent/
│ └── run_agent.py # PydanticAI agent implementation
├── evals/
│ └── test_eval.py # Evaluation tests
├── fixtures/
│ ├── template.json # Sample ARM template
│ └── parameters.json # Sample parameters
├── test_entra_analyzer.py # Entra ID analysis test script
└── test_entra_mcp_client.py # Entra ID MCP client test安装
- 克隆和设置:
git clone
cd mcp_server
pip install -r requirements.txt- 设置OpenAI API密钥 (适用于PydanticAI代理):
export OPENAI_API_KEY="your-api-key"用法
1.MCP服务器
启动MCP服务器:
python server.py服务器公开 analyze_arm 工具接受:
template_text:ARM模板的JSON内容parameters_text:参数文件的JSON内容
2.直接分析(代理)
使用代理运行ARM模板分析:
python agent/run_agent.py arm fixtures/template.json fixtures/parameters.json使用代理运行Entra ID分析:
python agent/run_agent.py entra c:/EntraBackup该代理提供基于AI的分析,包括:
- 行政摘要
- 详细调查结果表
- 具体建议
- 结构化报告
直接分析(无试剂):
直接运行Entra ID分析:
python test_entra_analyzer.py c:/EntraBackup3.程序化使用
ARM模板分析:
from tools.arm_ingest import analyze_arm, IngestArgs
# Load your template and parameters
template_text = open("template.json").read()
params_text = open("parameters.json").read()
# Analyze
findings = analyze_arm(IngestArgs(
template_text=template_text,
parameters_text=params_text
))
print(f"Found {findings.stats['total']} issues")
for finding in findings.findings:
print(f"- {finding.severity}: {finding.message}")Entra ID分析:
from tools.entra_analyzer import analyze_entra_backup
# Analyze Entra ID backup
findings = analyze_entra_backup("c:/EntraBackup")
print(f"Found {findings.stats['total']} issues")
for finding in findings.findings:
print(f"- {finding.severity}: {finding.message}")4.MCP客户端集成
从任何兼容MCP的客户端连接到MCP服务器:
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def analyze_template():
server_params = StdioServerParameters(
command='python',
args=['server.py']
)
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
# ARM Template Analysis
result = await session.call_tool('analyze_arm', {
'template_text': template_json,
'parameters_text': parameters_json
})
# Entra ID Analysis
result = await session.call_tool('analyze_entra', {
'backup_path': 'c:/EntraBackup',
'include_summary': True
})
print(result.content[0].text)
asyncio.run(analyze_template())测试
运行评估测试:
ARM模板测试:
python evals/test_eval.pyEntra ID测试:
python evals/test_entra_eval.py所有测试:
python evals/test_eval.py
python evals/test_entra_eval.py测试使用经过净化的夹具数据来确保一致、可预测的结果。
安全调查结果
ARM模板结果
| ID | 严重性 | 描述 |
|---|---|---|
| IMG-001 | 中等 | 图像版本设置为“最新” |
| OS-001 | 中等 | 模板中硬编码的管理员用户名 |
| MI-001 | 中等 | 分配了多个受管身份 |
| PAR-001 | 低 | 具有空值的参数 |
Entra ID调查结果
| ID | 严重性 | 类别 | 描述 |
|---|---|---|---|
| AUTH-008 | 关键 | 策略 | 默认用户可以创建租户 |
| AUTH-002 | 高 | 政策 | 允许所有人邀请客人 |
| AUTH-006 | 高 | 策略 | 默认用户可以创建应用程序 |
| ORG-004 | 中等 | 组织 | 无安全合规通知电子邮件 |
| AUTH-003 | 中等 | 策略 | 允许基于电子邮件的订阅注册 |
| SYNC-002 | 中等 | 同步 | 密码回写已禁用 |
| AUTH-METHOD-FIDO2 | 中等 | AUTH | FIDO2身份验证方法已禁用 |
| ORG-005 | 低 | 组织 | 使用旧Azure AD租户类型 |
配置
环境变量
OPENAI_API_KEY:PydanticAI代理功能所需MCP_LOG_LEVEL:设置日志记录级别(调试、信息、警告、错误)
自定义检查
修改 tools/arm_checks.py 要添加新的安全检查,请执行以下操作:
def check_custom_security(template: Dict[str, Any], parameters: Dict[str, Any]) -> List[Finding]:
findings = []
# Add your custom security checks here
return findings发展
添加新的安全检查
- 添加检查逻辑
tools/arm_checks.py - 更新
check_vm_template函数 - 将测试用例添加到
evals/test_eval.py - 更新文档
MCP工具开发
MCP服务器使用FastMCP进行工具注册:
@mcp.tool()
def your_custom_tool(param: str) -> str:
"""Your tool description."""
return "result"贡献
- 复刻仓库
- 创建要素分支
- 添加新功能的测试
- 提交拉取请求
许可证
MIT许可证-有关详细信息,请参阅许可证文件。
支持
对于问题和疑问:
- 在存储库中创建问题
- 检查文档
- 查看测试用例中的使用示例
