jonarm/erp-identity-security-reference-architecture
GitHub: jonarm/erp-identity-security-reference-architecture
该项目为 SaaS ERP 迁移构建了一套基于微软安全生态的零信任身份与访问安全参考架构,解决了云上核心业务系统的身份治理、特权管控与威胁自动化响应问题。
Stars: 0 | Forks: 0
# SaaS ERP 的零信任身份安全
### Microsoft Dynamics 365 — 使用 Entra ID、Sentinel 和 Defender for Cloud Apps 的参考架构
## 概述
本项目为一家正在将其 ERP 迁移至 Microsoft Dynamics 365 的中型金融服务机构构建了身份与访问安全架构。它演示了如何保护身份层、监控特定于金融 ERP 工作负载的威胁,以及如何使用 Microsoft 的原生安全工具栈在整个 SaaS 环境中实施访问治理。
该架构围绕三个核心原则设计:
- **无长期特权访问** — 所有 Dynamics 365 管理员角色均通过 PIM 进行时间限制
- **身份即边界** — Conditional Access 为每个 ERP 会话强制执行 Zero Trust
- **假设违规** — Sentinel 自动检测并响应特定于 ERP 的威胁场景
## 架构概述
```
graph TD
subgraph TENANT["FINANCIAL SERVICES TENANT"]
ENTRA["Entra ID P2"]
D365["Dynamics 365 F&O SaaS ERP"]
ENTRA <-->|SSO/SAML| D365
ENTRA --> CA
subgraph CONTROLS["Identity Controls"]
CA["Conditional Access 6 Policies"]
PIM["PIM JIT Admin"]
EM["Entitlement Management"]
end
CA --> SENTINEL
subgraph SIEM["Detection and Response"]
SENTINEL["Microsoft Sentinel SIEM\nEntra ID Logs | M365 Logs | Defender XDR Alerts\n8 Custom KQL Rules → 3 SOAR Playbooks"]
end
subgraph CASB["Session Security"]
MCAS["Defender for Cloud Apps CASB\nSession Controls | Activity Policies | Anomaly"]
end
end
classDef identity fill:#0078d4,stroke:#005a9e,color:#fff
classDef erp fill:#107c10,stroke:#0a5c0a,color:#fff
classDef monitoring fill:#8764b8,stroke:#6b4f9e,color:#fff
classDef casb fill:#c43e1c,stroke:#a33519,color:#fff
class ENTRA,CA,PIM,EM identity
class D365 erp
class SENTINEL monitoring
class MCAS casb
```
## 模拟组织
| 属性 | 详情 |
|---|---|
| **组织** | Contoso Financial Services(虚构) |
| **行业** | 金融服务 |
| **ERP** | Microsoft Dynamics 365 Finance and Operations |
| **用户** | 分布在 4 个部门的 25 名用户 |
| **部门** | 财务部、采购部、IT 部、风险与合规部 |
| **部署** | SaaS(Microsoft 托管) |
### ERP 角色结构
| 角色 | 部门 | 敏感度 | 访问方式 |
|---|---|---|---|
| 财务用户 | 财务部 | 中 | 标准 + MFA |
| 财务经理 | 财务部 | 高 | 合规设备 + MFA |
| 采购专员 | 采购部 | 中 | 标准 + MFA |
| 采购审批人 | 采购部 | 高 | 合规设备 + MFA |
| ERP 系统管理员 | IT 部 | 严重 | PIM JIT + MFA + PAW |
| 风险审计员 | 风险与合规部 | 高 | 只读 + MFA |
| 全局管理员 | IT 部 | 严重 | PIM JIT + MFA + PAW |
## 已实施的安全控制
| 控制 | 实施方式 | 框架映射 |
|---|---|---|
| 所有用户的 MFA | Entra ID CA Policy CA001 | Essential Eight ML2 |
| 阻止旧版身份验证 | CA Policy CA002 | Essential Eight ML1 |
| ERP 需要合规设备 | CA Policy CA003 | NIST 800-207 |
| 基于风险的逐步升级认证 | CA Policy CA004 | VPDSF ICT Security |
| ERP 管理员会话保护 | CA Policy CA005 | Essential Eight ML2 |
| 非托管设备的会话控制 | CA Policy CA006 + MCAS | NIST 800-207 |
| JIT 特权访问 | 带有审批工作流的 PIM | Essential Eight ML3 |
| 自动化用户配置 | SCIM + Entitlement Management | VPDSF Personnel Security |
| ERP 威胁检测 | 8 条自定义 Sentinel KQL 规则 | MITRE ATT&CK |
| 自动化事件响应 | 3 个 Logic App SOAR playbook | NIST CSF Respond |
| 批量导出检测 | Defender for Cloud Apps 策略 | VPDSF Information Security |
| 职责分离 | Entra ID 应用角色限制 | ISO 27001 A.9 |
## 威胁场景
完整演练见 [`attack-simulation/`](attack-simulation/)
### 场景 1 — 内部威胁:批量数据外泄
一名拥有合法 Dynamics 365 访问权限的财务用户在辞职前开始导出大量供应商付款数据。Defender for Cloud Apps 检测到异常的下载量。Sentinel 触发 `erp-bulk-data-export` 分析规则。SOAR playbook 暂停该会话并在几分钟内通知安全团队。
### 场景 2 — 通过撞库接管账户
攻击者使用泄露的凭证列表攻击 Dynamics 365 SSO 登录端点。在多次失败尝试后,紧接着是一次来自异常地点的成功登录。`erp-credential-stuffing` KQL 规则在 Sentinel 中触发。Conditional Access 登录风险策略会自动触发升级 MFA。
### 场景 3 — 休眠特权账户重新激活
former ERP System Admin 账户因配置错误的 HR 同步被重新激活。`erp-dormant-account-activation` 规则立即触发。此场景用于演示入职/调岗/离职(joiner/mover/leaver)控制的缺口以及自动化离职流程的预防作用。
## 仓库结构
```
graph LR
ROOT["📁 erp-identity-security\nreference-architecture"]
ROOT --> README["📄 README.md"]
ROOT --> DOCS["📁 docs/"]
ROOT --> TERRAFORM["📁 terraform/"]
ROOT --> SENTINEL["📁 sentinel/"]
ROOT --> ENTRAID["📁 entra-id/"]
ROOT --> SCRIPTS["📁 scripts/"]
ROOT --> ATTACK["📁 attack-simulation/"]
%% Docs
DOCS --> ARCH["📄 architecture-overview.md"]
DOCS --> THREAT["📄 erp-threat-model.md"]
DOCS --> LIFECYCLE["📄 identity-lifecycle.md"]
DOCS --> SOD["📄 segregation-of-duties.md"]
DOCS --> FRAMEWORK["📄 framework-mapping.md"]
DOCS --> ADR["📁 adr/"]
ADR --> ADR1["📄 ADR-001\nsso-saml-vs-oidc"]
ADR --> ADR2["📄 ADR-002\npim-for-erp-admin"]
ADR --> ADR3["📄 ADR-003\nmcas-session-controls"]
ADR --> ADR4["📄 ADR-004\nscim-vs-manual-provisioning"]
%% Sentinel
SENTINEL --> RULES["📁 analytics-rules/"]
SENTINEL --> WORKBOOKS["📁 workbooks/"]
SENTINEL --> PLAYBOOKS["📁 playbooks/"]
%% Entra ID
ENTRAID --> CA["📁 conditional-access\n-policies/"]
ENTRAID --> ROLES["📁 app-roles/"]
ENTRAID --> PACKAGES["📁 access-packages/"]
ENTRAID --> PIM["📁 pim-configuration/"]
%% Attack Simulation
ATTACK --> S1["📁 scenario-01\nmfa-fatigue"]
ATTACK --> S2["📁 scenario-02\ndormant-account\nreactivation"]
ATTACK --> S3["📁 scenario-03\nbulk-data\nexfiltration"]
classDef folder fill:#0078d4,stroke:#005a9e,color:#fff
classDef file fill:#505050,stroke:#383838,color:#fff
classDef adr fill:#8764b8,stroke:#6b4f9e,color:#fff
classDef sentinel fill:#c43e1c,stroke:#a33519,color:#fff
classDef attack fill:#107c10,stroke:#0a5c0a,color:#fff
class ROOT,DOCS,TERRAFORM,SENTINEL,ENTRAID,SCRIPTS,ATTACK,ADR folder
class README,ARCH,THREAT,LIFECYCLE,SOD,FRAMEWORK file
class ADR1,ADR2,ADR3,ADR4 adr
class RULES,WORKBOOKS,PLAYBOOKS,CA,ROLES,PACKAGES,PIM sentinel
class S1,S2,S3 attack
```
## 部署前提条件
- Azure 订阅(免费层即可满足实验室需求)
- 带有 Entra ID P2 的 Microsoft 365 租户
- Terraform >= 1.5
- Azure CLI
- PowerShell 7 及 Microsoft.Graph 模块
完整部署说明请参阅 [`terraform/README.md`](terraform/README.md)。
## 框架映射
完整控制映射见 [`docs/framework-mapping.md`](docs/framework-mapping.md)
| 框架 | 覆盖范围 |
|---|---|
| ACSC Essential Eight | MFA (ML2), 限制管理员 (ML2), 应用程序控制 |
| VPDSF / VPDSS | ICT 安全, 信息安全, 人员安全 |
| NIST 800-207 | Zero Trust 架构原则 |
| MITRE ATT&CK | T1078, T1530, T1136, T1098, T1110 |
| ISO 27001 | A.9 访问控制, A.12 操作安全 |
## 免责声明
这是一个使用虚构组织数据的实验室环境。未使用任何真实的个人或财务数据。所有用户账户、组织结构和场景均为教育和作品集目的进行模拟。
*作者:Jonar | GitHub: [jonarm](https://github.com/jonarm)*
标签:AI合规, Microsoft Entra ID, SaaS安全, SIEM/SOAR, 身份与访问管理, 零信任架构