# Implementing Azure Ad Privileged Identity Management

> 配置 Microsoft Entra 特权身份管理（PIM）以强制执行即时角色激活（Just-in-Time）、审批工作流和 Azure AD 特权角色的访问审查。

- Skill: `killvxk/implementing-azure-ad-privileged-identity-management` (Agent Skill, multi-file: 8 files)
- Install (CLI): `npx skillmds@latest add killvxk/implementing-azure-ad-privileged-identity-management`
- Raw SKILL.md: https://api.skillmd.com/api/skills/killvxk/implementing-azure-ad-privileged-identity-management/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- License: Apache-2.0
- Author: killvxk (https://skillmd.com/u/killvxk)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/killvxk/implementing-azure-ad-privileged-identity-management

---


# 实施 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 小时）
        │
        └── 持续时间到期后角色自动停用
```

### 支持的资源类型

1. **Microsoft Entra 角色**：全局管理员、Exchange 管理员、安全管理员等
2. **Azure 资源角色**：订阅/资源组上的所有者、参与者、用户访问管理员
3. **PIM 用于组**：管理特权安全组的成员身份

## 实施步骤

### 步骤 1：规划角色分配

审计当前的永久角色分配并确定哪些应转换为有资格状态：

| 当前角色 | 永久持有者 | 行动 |
|-------------|-------------------|--------|
| 全局管理员 | 2-3 名管理员 | 转换为有资格，保留 1 个紧急访问账户为活跃 |
| Exchange 管理员 | IT 团队 | 全部转换为有资格 |
| 安全管理员 | SOC 团队 | 转换为有资格 |
| 用户管理员 | 帮助台 | 转换为有资格 |
| 应用程序管理员 | DevOps | 转换为有资格 |

最佳实践：维护不超过 2 个永久的全局管理员（紧急访问账户）。

### 步骤 2：配置角色设置

对每个 Entra 目录角色，配置 PIM 设置：

**通过 Microsoft Entra 管理中心：**
1. 导航到"身份治理 > 特权身份管理 > Microsoft Entra 角色"
2. 选择"设置"并选择要配置的角色
3. 配置以下内容：

**激活设置：**
- 最大激活持续时间：8 小时（推荐；最大 72 小时）
- 激活时要求 MFA：启用
- 要求理由：启用
- 要求工单信息：启用（用于变更管理集成）
- 要求审批：对全局管理员、安全管理员启用

**分配设置：**
- 允许永久有资格分配：否（设置过期）
- 有资格分配在以下时间后过期：6 个月（需要重新认证）
- 允许永久活跃分配：仅用于紧急访问账户
- 活跃分配时要求 MFA：启用
- 活跃分配时要求理由：启用

**通知设置：**
- 成员被分配有资格时发送电子邮件：角色分配者、管理员
- 成员激活时发送电子邮件：管理员、安全团队
- 有资格成员激活角色时发送电子邮件：角色受让人

### 步骤 3：通过 Microsoft Graph API 配置

```python
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()
```

### 步骤 4：配置访问审查

设置定期访问审查以验证有资格的分配仍然适当：

1. 导航到"身份治理 > 访问审查 > 新建访问审查"
2. 配置：
   - 审查范围：特权身份管理角色分配
   - 角色：选择所有关键角色（全局管理员、安全管理员等）
   - 审查者：经理或带理由的自我审查
   - 频率：关键角色每季度，其他每半年
   - 自动应用结果：对无响应的审查移除访问权限
   - 持续时间：审查者 14 天内响应

### 步骤 5：配置告警

启用 PIM 安全告警：

| 告警 | 触发条件 | 行动 |
|-------|---------|--------|
| 全局管理员过多 | > 5 个全局管理员 | 审查并减少 |
| 在 PIM 外分配角色 | 直接角色分配 | 调查并转换为 PIM |
| 角色不要求 MFA | 无 MFA 激活 | 启用 MFA 要求 |
| 过时的有资格分配 | 90 天内未激活 | 审查并可能移除 |
| 潜在过时的服务账户 | 未使用的活跃分配 | 调查并停用 |

## 验证清单

- [ ] 所有永久特权角色分配已转换为有资格（紧急访问除外）
- [ ] 紧急访问账户配置为活跃并设置监控告警
- [ ] 所有角色激活要求 MFA
- [ ] 全局管理员和安全管理员配置了审批工作流
- [ ] 关键角色的最大激活持续时间设置为 8 小时或更短
- [ ] 有资格分配在 6 个月后过期（需要重新认证）
- [ ] 激活要求理由和工单信息
- [ ] 角色分配和激活的电子邮件通知已配置
- [ ] 所有特权角色已安排季度访问审查
- [ ] PIM 告警已启用并每周审查
- [ ] 审计日志已转发到 SIEM 进行监控

## 参考资料

- [Microsoft Entra PIM 文档](https://learn.microsoft.com/en-us/entra/id-governance/privileged-identity-management/pim-configure)
- [规划 PIM 部署](https://learn.microsoft.com/en-us/entra/id-governance/privileged-identity-management/pim-deployment-plan)
- [开始使用 PIM](https://learn.microsoft.com/en-us/entra/id-governance/privileged-identity-management/pim-getting-started)
- [Microsoft Graph PIM API](https://learn.microsoft.com/en-us/graph/api/resources/privilegedidentitymanagementv3-overview)

