rfranca777/MDE-PolicyAutomation

GitHub: rfranca777/MDE-PolicyAutomation

一键自动化部署 MDE 设备治理体系,通过 Azure Policy 自动打标签、Entra ID 组同步、Intune 设备分组实现零接触的策略差异化治理。

Stars: 0 | Forks: 0

MDE Policy Automation — Azure Policy • Intune Groups • Device Tags • Zero-Touch Governance
[![版本](https://img.shields.io/badge/Version-1.1.0-00ff88?style=for-the-badge&logo=github)](CHANGELOG.md) [![许可证: MIT](https://img.shields.io/badge/License-MIT-green.svg?style=for-the-badge)](LICENSE) [![PowerShell](https://img.shields.io/badge/PowerShell-5.1+-5391FE?style=for-the-badge&logo=powershell&logoColor=white)](https://github.com/PowerShell/PowerShell) [![Azure Policy](https://img.shields.io/badge/Azure_Policy-0078D4?style=for-the-badge&logo=microsoftazure&logoColor=white)](https://learn.microsoft.com/azure/governance/policy/) [![ODefender](https://img.shields.io/badge/ODefender-Community-FF6F00?style=for-the-badge)](https://github.com/rfranca777/odefender-community)
### 部署。治理。组织。放松。 **停止手动创建 Intune 组。停止点击 MDE 门户。** **让 Azure Policy 自动执行 —— 针对每个订阅中的每台 VM。**
## ⚡ 30 秒推介 您拥有**多个 Azure 订阅**,Windows VM 分散在各处。Microsoft Defender for Endpoint 能看到它们 —— 但 MDE 门户却一团糟: - 所有服务器都堆在一个巨大的、未排序的设备清单中?😬 - 没有 Device Groups,所以无法应用差异化的 AV/ASR 策略?😤 - 新 VM 出现时没有标签,好几个星期都没人注意到?🤦 - Intune 组与 Azure 资源不同步?🫠 - 每次接入新订阅都要进行手动门户操作?💀 **MDE Policy Automation 解决所有这些问题。一个脚本。14 个阶段。完全自主。** ``` ┌──────────────────────────────────────────────────────────────────────────────────┐ │ │ │ ███╗ ███╗██████╗ ███████╗ ██████╗ ██████╗ ██╗ ██╗ ██████╗██╗ ██╗ │ │ ████╗ ████║██╔══██╗██╔════╝ ██╔══██╗██╔═══██╗██║ ██║██╔════╝╚██╗ ██╔╝ │ │ ██╔████╔██║██║ ██║█████╗ ██████╔╝██║ ██║██║ ██║██║ ╚████╔╝ │ │ ██║╚██╔╝██║██║ ██║██╔══╝ ██╔═══╝ ██║ ██║██║ ██║██║ ╚██╔╝ │ │ ██║ ╚═╝ ██║██████╔╝███████╗ ██║ ╚██████╔╝███████╗██║╚██████╗ ██║ │ │ ╚═╝ ╚═╝╚═════╝ ╚══════╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═════╝ ╚═╝ │ │ │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ ⚙️ Azure Policy — DeployIfNotExists for MDE Device Tags │ │ │ │ 👥 Entra ID Security Groups — Auto-sync VMs + Arc Machines │ │ │ │ 🏢 Intune Device Management — Groups always in sync │ │ │ │ 🛡️ MDE Device Groups — Differentiated policies per environment │ │ │ │ 🤖 Azure Automation — Hourly sync, zero human intervention │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ │ v1.1.0 │ 14-Stage Full Automation │ MIT License │ PowerShell 5.1+ │ │ │ └──────────────────────────────────────────────────────────────────────────────────┘ ``` ## 📊 影响对比
### ⏱️ 之前 **手动流程** ### ⚡ 之后 **MDE Policy Automation**
❌ MDE 门户:一个巨大的未排序设备列表 ❌ 没有针对不同环境的差异化 AV/ASR 策略 ❌ 新 VM 数天或数周未被打上标签 ❌ Intune 组手动创建,总是不同步 ❌ 每个订阅 = 数小时的门户点击操作 ❌ 没有设备组成员身份的审计记录 ❌ Azure Arc 机器?完全被忽略 ✅ 每个订阅的 **MDE Device Groups** —— 自动创建 ✅ PROD、DEV、TEST 环境的不同策略 ✅ Azure Policy 在创建时自动为 VM 打标签 ✅ Entra ID 组通过 Automation 每小时同步 ✅ 新订阅 → 运行脚本 → 10 分钟内搞定 ✅ 完整审计:谁在哪个组,何时,为何 ✅ Azure Arc 机器自动包含 ✅ 不活跃设备组(7d + 30d)每小时同步 ✅ 跟踪临时 VM(VMSS, K8s, Databricks, Spot) ✅ 保留已销毁的 VM 以供 SOC 调查
## ✨ 部署内容(14 个阶段) 这不仅仅是一个脚本 —— 它是一个**完全自主的部署流水线**: | 阶段 | 内容 | Azure 资源 | |-------|-------------|----------------| | 1 | 🔐 身份验证与订阅选择 | Azure CLI context | | 2 | 🏷️ 基于订阅的智能命名 | 规范:`rg-mde-{sub}`, `aa-mde-{sub}` 等 | | 3 | 📦 包含 8 个企业标签的资源组 | `Microsoft.Resources/resourceGroups` | | 4 | 👥 Entra ID Security Groups:主组(活跃 7d)、不活跃-7d、不活跃-30d | `Microsoft Graph API` | | 5 | ⚙️ Automation Account 配置 | `Microsoft.Automation/automationAccounts` | | 6 | 🔑 Managed Identity (Zero Trust) | `SystemAssigned` identity + 重试逻辑 | | 7 | 🛡️ RBAC Reader 角色分配 | 订阅范围的 Reader | | 8 | 📡 Graph API 权限 | `Group.ReadWrite.All`, `Device.Read.All` | | 9 | 📚 Az.Accounts 模块安装 | PowerShell Gallery → Automation | | 10 | 📜 Runbook 创建与发布 | VM ↔ Entra ID 同步逻辑 | | 11 | ⏰ Schedule + Job Schedule 链接 | 每小时执行 | | 12 | 📋 用于 VM 标记的 Azure Policy | `DeployIfNotExists` policy | | 13 | 🖥️ MDE Device Group 说明 | 自动生成的 HTML 指南 | | 14 | 🏷️ 通过 API 设置 MDE Machine Tags | App Registration + OAuth2 + 自动标记 | ## 🏗️ 工作原理 ``` ┌───────────────────────────────────────────────────────────────────────────────┐ │ MDE Policy Automation — Architecture │ ├───────────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────┐ │ │ │ You run the │ │ │ │ script ONCE │ │ │ └──────┬───────┘ │ │ │ │ │ ▼ │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ STAGE 1-3: Foundation │ │ │ │ Azure CLI auth → Naming convention → Resource Group │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ STAGE 4-8: Identity & Permissions │ │ │ │ Entra Group → Automation Account → Managed Identity → RBAC → Graph │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ STAGE 9-11: Automation Engine │ │ │ │ Az.Accounts module → Runbook (VM↔Entra sync) → Hourly Schedule │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ STAGE 12-14: Policy & Tagging │ │ │ │ Azure Policy (DeployIfNotExists) → MDE Device Groups → MDE API Tags│ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌──────────────────────────────────────────────────────────────────────┐ │ │ │ RUNS AUTOMATICALLY EVERY HOUR 🔄 │ │ │ │ Runbook: Discovers VMs → Matches Entra devices → Syncs group │ │ │ │ Policy: New VM created → Extension deployed → Tag configured │ │ │ │ MDE: Tag syncs → Device Group updated → Correct policies applied │ │ │ └──────────────────────────────────────────────────────────────────────┘ │ │ │ └───────────────────────────────────────────────────────────────────────────────┘ ``` ## 📁 项目结构 ``` MDE-PolicyAutomation/ ├── 📄 README.md ← You are here ├── 📄 CHANGELOG.md ← Version history │ ├── 🚀 full-automation/ │ └── 🔧 Deploy-MDE-Automation.ps1 ← 14-STAGE AUTONOMOUS DEPLOYMENT │ ├── 📋 azure-policy/ │ ├── 📄 policy-definition.json ← Azure Policy — Windows VMs (DeployIfNotExists) │ ├── 📄 policy-definition-linux.json ← Azure Policy — Linux VMs │ ├── 📄 policy-definition-arc-windows.json ← Azure Policy — Arc Windows │ ├── 📄 policy-definition-arc-linux.json ← Azure Policy — Arc Linux │ ├── 🔧 Set-MDEDeviceTag.ps1 ← Registry config script (Windows) │ └── 🔧 Set-MDEDeviceTag.sh ← Managed JSON config script (Linux) │ ├── docs/ │ ├── 📄 QUICK-START.md ← 5-minute quick start │ ├── 📄 ARCHITECTURE.md ← Technical architecture details │ └── 📄 MANUAL-DEPLOY.md ← Step-by-step manual deployment │ └── assets/ └── 🎨 banner.svg ← Project banner ``` ## 🚀 快速开始 ### 选项 A:完全自动化(推荐) **一个脚本部署所有内容 —— 14 个阶段,完全自主:** ``` # 克隆 repo git clone https://github.com/rfranca777/MDE-PolicyAutomation.git cd MDE-PolicyAutomation # 登录 Azure az login # 运行 full automation .\full-automation\Deploy-MDE-Automation.ps1 ``` 该脚本将: - 列出您的订阅供您选择 - 为所有资源生成智能命名 - 部署所有 14 个阶段,并在每一步进行验证 - 打开 MDE Device Group 创建的 HTML 指南(手动门户步骤) - 可选择自动标记所有现有的 MDE 设备 ### 选项 B:仅 Azure Policy(轻量级) **仅部署 Azure Policy —— 无需 Automation Account,无需组:** ``` # 上传 tag script 到 Storage Account $ctx = (Get-AzStorageAccount -ResourceGroupName "YourRG" -Name "yourstorage").Context New-AzStorageContainer -Name "mde-scripts" -Context $ctx -Permission Blob Set-AzStorageBlobContent -File ".\azure-policy\Set-MDEDeviceTag.ps1" ` -Container "mde-scripts" -Blob "Set-MDEDeviceTag.ps1" -Context $ctx # 创建 policy New-AzPolicyDefinition -Name "mde-device-tag" ` -Policy ".\azure-policy\policy-definition.json" # 分配 policy New-AzPolicyAssignment -Name "mde-tag-prod" ` -PolicyDefinition (Get-AzPolicyDefinition -Name "mde-device-tag") ` -Scope "/subscriptions/YOUR-SUB-ID" ` -AssignIdentity -Location "eastus" ` -PolicyParameterObject @{ tagValue = "PRODUCTION" scriptUri = "https://yourstorage.blob.core.windows.net/mde-scripts/Set-MDEDeviceTag.ps1" } ``` ## 🏷️ Device Tags 工作原理 ``` Azure Policy deploys Custom Script Extension on VM │ ▼ Set-MDEDeviceTag.ps1 configures Windows Registry: ┌────────────────────────────────────────────────────────────┐ │ HKLM:\SOFTWARE\Policies\Microsoft\ │ │ Windows Advanced Threat Protection\DeviceTagging │ │ Group = "PRODUCTION" ← Your tag value │ └────────────────────────────────────────────────────────────┘ │ ▼ MDE Agent reads registry key on next check-in (15-30 min) │ ▼ Tag appears in MDE Portal → Device Groups → Differentiated policies! ``` ### 使用案例 | 场景 | 标签策略 | 结果 | |----------|-------------|--------| | 🏢 **环境分割** | `PROD`, `DEV`, `TEST`, `STAGING` | 每个环境不同的 AV/ASR 策略 | | 📋 **合规要求** | `PCI`, `HIPAA`, `SOC2` | 基于合规性的安全组 | | 🌍 **地理分布** | `US-EAST`, `EU-WEST`, `APAC` | 特定区域策略 | | 👥 **团队所有权** | `Engineering`, `Finance`, `HR` | 基于团队的设备管理 | | 🖥️ **服务器角色** | `SQL`, `WEB`, `DC`, `APP` | 特定角色的加固 | ## 🔄 自动化循环 部署完成后,系统将自动运行: ``` ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ New VM │ │ Azure │ │ Registry │ │ MDE Portal │ │ Created │───▶│ Policy │───▶│ Configured │───▶│ Tag Synced │ │ in Azure │ │ Triggers │ │ on VM │ │ (15-30 min) │ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │ ▼ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ Correct AV/ │ │ MDE Device │ │ Entra ID │ │ Runbook │ │ ASR Policy │◀───│ Group │◀───│ Group Sync │◀───│ (Hourly) │ │ Applied │ │ Matches │ │ Updated │ │ Discovers │ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ ``` ## ⚙️ 要求 | 要求 | 详情 | |-------------|---------| | **Azure CLI** | 2.0+ ([安装](https://aka.ms/installazurecli)) | | **PowerShell** | 5.1+ (推荐 7.x) | | **Azure 权限** | 订阅上的 Contributor + Policy Contributor | | **Entra ID 权限** | `Group.ReadWrite.All`, `Device.Read.All`(用于完全自动化) | | **MDE 权限** | `Machine.ReadWrite.All`(用于 API 标记 —— 第 14 阶段) | | **平台** | Windows, Linux, Cloud Shell | ## 🔍 故障排除
Policy 未应用于 VM - 验证 Managed Identity 是否具有 `Virtual Machine Contributor` 角色 - 检查脚本 URI 是否可访问(Blob 容器必须公开或使用 SAS token) - 查看 Activity Log:`Azure Portal → Monitor → Activity Log → Filter by Policy`
Tag 未出现在 MDE 门户中 - 等待 15-30 分钟以便 MDE agent 同步 - 验证 MDE agent 是否正在运行:`Get-Service -Name Sense` - 检查注册表:`Get-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows Advanced Threat Protection\DeviceTagging"`
Managed Identity 传播错误 - Microsoft 建议等待 30 秒以便 AAD 传播 - 脚本内置了重试逻辑(3 次尝试,每次延迟 20 秒) - 如果问题持续,等待 2-3 分钟并运行:`az automation account update --name --resource-group --set identity.type=SystemAssigned`
Extension 无法在 VM 上安装 - 检查 VM 是否具有互联网连接 - 验证 CustomScriptExtension 尚未以不同名称安装 - 查看日志:`C:\WindowsAzure\Logs\Plugins\Microsoft.Compute.CustomScriptExtension\`
## 🔮 路线图 | 功能 | 描述 | ETA | |---------|-------------|-----| | 🤖 **AI Agent 集成** | 用于 Device Group 优化和策略调整的自主 agent | Q4 2025 | | 📊 **合规仪表板** | 包含每个订阅策略合规状态的 HTML/PDF 报告 | Q3 2025 | | 🔗 **多租户支持** | 跨托管租户的 Lighthouse 兼容部署 | 2026 | ## 📚 文档 | 文档 | 描述 | |----------|-------------| | 📖 [**分步指南**](docs/STEP-BY-STEP-GUIDE.md) | 包含门户截图和验证命令的所有 14 个阶段的完整演示 | | 🎨 [**可视化指南 (HTML)**](docs/STEP-BY-STEP-GUIDE.html) | 包含终端模拟、门户模型和支持打印为 PDF 的丰富 HTML 版本 | | 🏗️ [**架构**](docs/ARCHITECTURE.md) | 3 层架构深入剖析、安全模型和命名约定 | | ⚡ [**快速开始**](docs/QUICK-START.md) | 5 分钟内开始运行 —— 选项 A(完全自动化)或选项 B(仅策略) | | 🔧 [**手动部署**](docs/MANUAL-DEPLOY.md) | 逐步手动部署,以实现最大控制 | ## 🤝 贡献 欢迎贡献!请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解指南。 **我们需要帮助的关键领域:** - 📊 增强的 HTML 报告 - 🧪 用于验证阶段的 Pester 测试 - 📖 文档改进 - 🌐 多租户 Lighthouse 支持 ## 👤 作者 **Rafael França** **Microsoft 网络安全客户成功架构师** 构建和分享开源工具,帮助安全团队成就更多 —— 因为共享的知识即是倍增的防御。 [![LinkedIn](https://img.shields.io/badge/LinkedIn-Rafael_França-0A66C2?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/rfranca777/) [![Email](https://img.shields.io/badge/Email-rafael.franca@live.com-D14836?style=for-the-badge&logo=gmail&logoColor=white)](mailto:rafael.franca@live.com) [![ODefender](https://img.shields.io/badge/ODefender-Community-FF6F00?style=for-the-badge)](https://github.com/rfranca777/odefender-community) ## 📜 许可证 MIT 许可证 —— 详情见 [LICENSE](LICENSE)。 ## ⚠️ 免责声明 本项目**未受 Microsoft 官方支持**。它是由 Microsoft 员工以 MIT 许可证共享的独立社区贡献。使用风险自负。请始终先在非生产环境中进行测试。 Microsoft Defender for Endpoint、Azure、Intune 及相关商标均为 Microsoft Corporation 的财产。
**[ODefender Community](https://github.com/rfranca777/odefender-community) 计划的一部分。** *从手动混乱到自动治理 —— 一次一个策略。*
[![Stars](https://img.shields.io/github/stars/rfranca777/MDE-PolicyAutomation?style=social)](https://github.com/rfranca777/MDE-PolicyAutomation)
标签:AI合规, ASR 规则, Azure Policy, Azure 虚拟机, Defender for Endpoint, Intune, IPv6, IT 运维, Libemu, MDE, Microsoft Defender for Endpoint, PowerShell, 企业防御, 安全合规, 杀毒软件策略, 端点安全, 网络代理, 自动化运维, 补丁管理, 设备分组, 设备标签, 资源治理, 零接触治理