Configures Microsoft Entra Privileged Identity Management (PIM) for just-in-time role activation, approval workflows, and access reviews of Azure AD privileged roles. Useful for zero-trust identity governance setups.
npx claudepluginhub killvxk/cybersecurity-skills-zhThis skill uses the workspace's default tool permissions.
Microsoft Entra 特权身份管理(Privileged Identity Management,PIM)提供基于时间和基于审批的角色激活,以降低对关键资源的过度、不必要或滥用访问的风险。PIM 将永久(常设)权限分配替换为有资格的分配,要求用户在使用前显式激活其角色,并可配置持续时间、MFA 强制执行、审批工作流和理由要求。这是 Microsoft 环境中零信任(Zero Trust)身份治理的核心组件。
Configures Microsoft Entra Privileged Identity Management (PIM) for just-in-time role activation, approval workflows, and access reviews for Azure AD privileged roles.
Configures Microsoft Entra PIM for just-in-time role activation, approval workflows, and access reviews of Azure AD privileged roles.
Configures Azure AD PIM via Microsoft Graph API to manage eligible role assignments, just-in-time activation, access reviews, and zero-trust policies. Audits activations and over-privileged accounts using Python.
Share bugs, ideas, or general feedback.
Microsoft Entra 特权身份管理(Privileged Identity Management,PIM)提供基于时间和基于审批的角色激活,以降低对关键资源的过度、不必要或滥用访问的风险。PIM 将永久(常设)权限分配替换为有资格的分配,要求用户在使用前显式激活其角色,并可配置持续时间、MFA 强制执行、审批工作流和理由要求。这是 Microsoft 环境中零信任(Zero Trust)身份治理的核心组件。
| 类型 | 行为 | 使用场景 |
|---|---|---|
| 有资格的 | 用户在使用前必须激活角色;在配置的持续时间后过期 | 日常管理工作 |
| 活跃的 | 角色始终处于激活状态;无需激活 | 服务账户、紧急访问账户 |
| 时限型 | 任一类型,带有明确的开始/结束日期 | 临时项目访问、承包商访问 |
具有有资格分配的用户
│
├── 打开 PIM 门户 → 我的角色
│
├── 点击所需角色上的"激活"
│
├── 提供理由和可选的工单号
│
├── 完成 MFA 挑战(如需要)
│
├── [如需审批] → 向审批者发送通知
│ │
│ ├── 审批者审查并批准/拒绝
│ └── 用户收到决定通知
│
├── 角色激活,持续配置的时间(如 8 小时)
│
└── 持续时间到期后角色自动停用
审计当前的永久角色分配并确定哪些应转换为有资格状态:
| 当前角色 | 永久持有者 | 行动 |
|---|---|---|
| 全局管理员 | 2-3 名管理员 | 转换为有资格,保留 1 个紧急访问账户为活跃 |
| Exchange 管理员 | IT 团队 | 全部转换为有资格 |
| 安全管理员 | SOC 团队 | 转换为有资格 |
| 用户管理员 | 帮助台 | 转换为有资格 |
| 应用程序管理员 | DevOps | 转换为有资格 |
最佳实践:维护不超过 2 个永久的全局管理员(紧急访问账户)。
对每个 Entra 目录角色,配置 PIM 设置:
通过 Microsoft Entra 管理中心:
激活设置:
分配设置:
通知设置:
import requests
# 获取 Microsoft Graph 令牌
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": "P180D" # 180 天有资格窗口
}
}
}
response = requests.post(url, headers=headers, json=body)
return response.json()
# 激活角色(用户自助服务)
def activate_role(token, role_definition_id, principal_id, justification,
duration_hours=8):
url = "https://graph.microsoft.com/v1.0/roleManagement/directory/roleAssignmentScheduleRequests"
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}
body = {
"action": "selfActivate",
"principalId": principal_id,
"roleDefinitionId": role_definition_id,
"directoryScopeId": "/",
"justification": justification,
"scheduleInfo": {
"startDateTime": None, # 立即
"expiration": {
"type": "afterDuration",
"duration": f"PT{duration_hours}H"
}
}
}
response = requests.post(url, headers=headers, json=body)
return response.json()
设置定期访问审查以验证有资格的分配仍然适当:
启用 PIM 安全告警:
| 告警 | 触发条件 | 行动 |
|---|---|---|
| 全局管理员过多 | > 5 个全局管理员 | 审查并减少 |
| 在 PIM 外分配角色 | 直接角色分配 | 调查并转换为 PIM |
| 角色不要求 MFA | 无 MFA 激活 | 启用 MFA 要求 |
| 过时的有资格分配 | 90 天内未激活 | 审查并可能移除 |
| 潜在过时的服务账户 | 未使用的活跃分配 | 调查并停用 |