| name | implementing-azure-ad-privileged-identity-management |
| description | 配置 Microsoft Entra 特权身份管理(PIM)以强制执行即时角色激活(Just-in-Time)、审批工作流和 Azure AD 特权角色的访问审查。 |
| domain | cybersecurity |
| subdomain | identity-access-management |
| tags | ["azure-ad","pim","entra-id","just-in-time","privileged-roles","identity-governance","zero-trust"] |
| version | 1.0 |
| author | mahipal |
| license | Apache-2.0 |
实施 Azure AD 特权身份管理
概述
Microsoft Entra 特权身份管理(Privileged Identity Management,PIM)提供基于时间和基于审批的角色激活,以降低对关键资源的过度、不必要或滥用访问的风险。PIM 将永久(常设)权限分配替换为有资格的分配,要求用户在使用前显式激活其角色,并可配置持续时间、MFA 强制执行、审批工作流和理由要求。这是 Microsoft 环境中零信任(Zero Trust)身份治理的核心组件。
前置条件
- Microsoft Entra ID P2 或 Microsoft Entra ID Governance 许可证
- 全局管理员或特权角色管理员角色
- 用于 Azure 资源角色管理的 Azure 订阅
- 为所有特权用户配置 MFA
- 管理员账户配备 Microsoft Authenticator 或 FIDO2 密钥
核心概念
分配类型
| 类型 | 行为 | 使用场景 |
|---|
| 有资格的 | 用户在使用前必须激活角色;在配置的持续时间后过期 | 日常管理工作 |
| 活跃的 | 角色始终处于激活状态;无需激活 | 服务账户、紧急访问账户 |
| 时限型 | 任一类型,带有明确的开始/结束日期 | 临时项目访问、承包商访问 |
PIM 激活流程
具有有资格分配的用户
│
├── 打开 PIM 门户 → 我的角色
│
├── 点击所需角色上的"激活"
│
├── 提供理由和可选的工单号
│
├── 完成 MFA 挑战(如需要)
│
├── [如需审批] → 向审批者发送通知
│ │
│ ├── 审批者审查并批准/拒绝
│ └── 用户收到决定通知
│
├── 角色激活,持续配置的时间(如 8 小时)
│
└── 持续时间到期后角色自动停用
支持的资源类型
- Microsoft Entra 角色:全局管理员、Exchange 管理员、安全管理员等
- Azure 资源角色:订阅/资源组上的所有者、参与者、用户访问管理员
- PIM 用于组:管理特权安全组的成员身份
实施步骤
步骤 1:规划角色分配
审计当前的永久角色分配并确定哪些应转换为有资格状态:
| 当前角色 | 永久持有者 | 行动 |
|---|
| 全局管理员 | 2-3 名管理员 | 转换为有资格,保留 1 个紧急访问账户为活跃 |
| Exchange 管理员 | IT 团队 | 全部转换为有资格 |
| 安全管理员 | SOC 团队 | 转换为有资格 |
| 用户管理员 | 帮助台 | 转换为有资格 |
| 应用程序管理员 | DevOps | 转换为有资格 |
最佳实践:维护不超过 2 个永久的全局管理员(紧急访问账户)。
步骤 2:配置角色设置
对每个 Entra 目录角色,配置 PIM 设置:
通过 Microsoft Entra 管理中心:
- 导航到"身份治理 > 特权身份管理 > Microsoft Entra 角色"
- 选择"设置"并选择要配置的角色
- 配置以下内容:
激活设置:
- 最大激活持续时间:8 小时(推荐;最大 72 小时)
- 激活时要求 MFA:启用
- 要求理由:启用
- 要求工单信息:启用(用于变更管理集成)
- 要求审批:对全局管理员、安全管理员启用
分配设置:
- 允许永久有资格分配:否(设置过期)
- 有资格分配在以下时间后过期:6 个月(需要重新认证)
- 允许永久活跃分配:仅用于紧急访问账户
- 活跃分配时要求 MFA:启用
- 活跃分配时要求理由:启用
通知设置:
- 成员被分配有资格时发送电子邮件:角色分配者、管理员
- 成员激活时发送电子邮件:管理员、安全团队
- 有资格成员激活角色时发送电子邮件:角色受让人
步骤 3:通过 Microsoft Graph API 配置
import requests
def get_graph_token(tenant_id, client_id, client_secret):
url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token"
data = {
"grant_type": "client_credentials",
"client_id": client_id,
"client_secret": client_secret,
"scope": "https://graph.microsoft.com/.default"
}
response = requests.post(url, data=data)
return response.json()["access_token"]
def create_eligible_assignment(token, role_definition_id, principal_id,
directory_scope="/", duration_hours=8):
url = "https://graph.microsoft.com/v1.0/roleManagement/directory/roleEligibilityScheduleRequests"
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}
body = {
"action": "adminAssign",
"justification": "PIM 有资格分配",
"roleDefinitionId": role_definition_id,
"directoryScopeId": directory_scope,
"principalId": principal_id,
"scheduleInfo": {
"startDateTime": "2025-01-01T00:00:00Z",
"expiration": {
"type": "afterDuration",
"duration":
}
}
}
response = requests.post(url, headers=headers, json=body)
response.json()
():
url =
headers = {
: ,
:
}
body = {
: ,
: principal_id,
: role_definition_id,
: ,
: justification,
: {
: ,
: {
: ,
:
}
}
}
response = requests.post(url, headers=headers, json=body)
response.json()
步骤 4:配置访问审查
设置定期访问审查以验证有资格的分配仍然适当:
- 导航到"身份治理 > 访问审查 > 新建访问审查"
- 配置:
- 审查范围:特权身份管理角色分配
- 角色:选择所有关键角色(全局管理员、安全管理员等)
- 审查者:经理或带理由的自我审查
- 频率:关键角色每季度,其他每半年
- 自动应用结果:对无响应的审查移除访问权限
- 持续时间:审查者 14 天内响应
步骤 5:配置告警
启用 PIM 安全告警:
| 告警 | 触发条件 | 行动 |
|---|
| 全局管理员过多 | > 5 个全局管理员 | 审查并减少 |
| 在 PIM 外分配角色 | 直接角色分配 | 调查并转换为 PIM |
| 角色不要求 MFA | 无 MFA 激活 | 启用 MFA 要求 |
| 过时的有资格分配 | 90 天内未激活 | 审查并可能移除 |
| 潜在过时的服务账户 | 未使用的活跃分配 | 调查并停用 |
验证清单
参考资料