通过 Azure 自动化和 Microsoft Graph 自动完成 Microsoft Entra ID 治理任务

Azure 自动化是一个 Azure 云服务,可用于将常用或重复性的系统管理与过程自动化。 Microsoft Graph 是 Microsoft 统一 API 终结点,它用于管理目录中的用户、组、访问包、访问评审和其他资源的 Azure AD 功能。 可使用 Microsoft Graph PowerShell SDK 从 PowerShell 命令行大规模管理 Microsoft Entra ID。 还可添加 Azure 自动化中基于 PowerShell 的 runbook 中的 Microsoft Graph PowerShell cmdlet,以便可通过简单的脚本自动完成 Microsoft Entra 任务。

Azure 自动化和 PowerShell Graph SDK 支持基于证书的身份验证和应用程序权限,因此你可以让 Azure 自动化 runbook 向 Microsoft Entra ID 进行身份验证,而无需用户上下文。

本文通过 Microsoft Graph PowerShell 创建一个可查询权利管理的简单 runbook,以此介绍如何开始对 Microsoft Entra ID 治理使用 Azure 自动化。

创建 Azure 自动化帐户

提示

本文中的步骤可能因开始使用的门户而略有不同。

Azure 自动化提供一个云托管环境用于执行 Runbook。 这些 Runbook 可按计划自动启动,也可以由 Webhook 或逻辑应用触发。

需有一个 Azure 订阅才能使用 Azure 自动化。

必备角色:Azure 订阅或资源组所有者

  1. 登录到 Azure 门户。 确保你有权访问 Azure 自动化帐户所在的订阅或资源组。

  2. 选择该订阅或资源组,然后选择“创建”。 键入“自动化”,选择 Microsoft 的 Azure 服务“自动化”,然后选择“创建”。

  3. 创建 Azure 自动化帐户后,选择“访问控制(IAM)”。 然后,在“对此资源的查看访问权限”中选择“查看”。 随后,这些用户和服务主体能够通过将在该 Azure 自动化帐户中创建的脚本来与 Microsoft 服务交互。

  4. 查看此处列出的用户和服务主体,并确保他们已获授权。 删除所有未获授权的用户。

在计算机上创建自签名密钥对和证书

因此,它可在无需个人凭据的情况下运行,所创建的 Azure 自动化帐户需要使用证书在 Microsoft Entra ID 中对自身进行身份验证。

如果你已有一个密钥对用于在 Microsoft Entra ID 中对服务进行身份验证,并有一个从证书颁发机构获得的证书,请跳到下一部分。

若要生成自签名证书,请执行以下操作:

  1. 按照如何创建自签名证书“选项 2”中的说明创建一个证书并连同其私钥一起导出该证书。

  2. 显示证书的指纹。

     $cert | ft Thumbprint
    
  3. 导出文件后,可以从本地用户证书存储中删除证书和密钥对。 在后续步骤中,将证书和私钥已上传到 Azure 自动化和 Microsoft Entra 服务后,你还要删除 .pfx.crt 文件。

将密钥对上传到 Azure 自动化

Azure 自动化中的 Runbook 从 .pfx 文件中检索私钥,并使用它来向 Microsoft Graph 进行身份验证。

  1. 在 Azure 门户中,针对 Azure 自动化帐户选择“证书”和“添加证书”。

  2. 上传先前创建的 .pfx 文件,然后键入在创建该文件时提供的密码。

  3. 上传私钥后,请记下证书过期日期。

  4. 现在可以从本地计算机中删除 .pfx 文件。 但是,暂时请不要删除 .crt 文件,因为在后续步骤中需要此文件。

将 Microsoft Graph 的模块添加到 Azure 自动化帐户

默认情况下,Azure 自动化中未预加载 Microsoft Graph 的任何 PowerShell 模块。 需要依次将库中的 Microsoft.Graph.Authentication 和其他模块添加到自动化帐户

  1. 在 Azure 门户中,针对 Azure 自动化帐户依次选择“模块”和“浏览库”。

  2. 在搜索栏中,键入“Microsoft.Graph.Authentication”。 选择模块,选择“导入”,然后选择“确定”,让 Microsoft Entra ID 开始导入该模块。 选择“确定”后,导入模块可能需要几分钟时间。 在 Microsoft.Graph.Authentication 模块导入完成之前,请不要尝试添加其他 Microsoft Graph 模块,因为只有导入了 Microsoft.Graph.Authentication,才能添加其他这些模块。

  3. 返回“模块”列表并选择“刷新”。 在 Microsoft.Graph.Authentication 模块的状态更改为“可用”后,即可导入下一个模块。

  4. 如果将 cmdlet 用于 Microsoft Entra ID 治理功能(例如权利管理),请重复 Microsoft.Graph.Identity.Governance 模块导入过程。

  5. 导入脚本可能需要的其他模块,例如 Microsoft.Graph.Users

创建应用注册并分配权限

接下来,你将在 Microsoft Entra ID 中创建一个应用注册,使 Microsoft Entra ID 能够识别 Azure 自动化 Runbook 用于身份验证的证书。

  1. 至少以应用程序管理员的身份登录到 Microsoft Entra 管理中心
  2. 浏览到“标识”>“应用程序”>“应用注册”。
  3. 选择“新注册”。
  4. 键入应用程序的名称并选择“注册”。
    1. 创建应用程序注册后,请记下“应用程序(客户端) ID”和“目录(租户) ID”,因为稍后需要用到这些项
  5. 选择“证书和密码”>“证书”>“上传证书”。
    1. 上传先前创建的 .crt 文件。
  6. 选择“API 权限”>“添加权限” 。
  7. 选择“Microsoft Graph”>“应用程序权限”。
    1. 选择 Azure 自动化帐户所需的每个权限,然后选择“添加权限”

      • 如果 runbook 仅在单个目录中执行查询或更新,则无需为其分配租户范围的应用程序权限;而是可以将服务主体分配给目录的“目录所有者”或“目录读取者”角色。
      • 如果 Runbook 仅对权利管理执行查询,则它可以使用 EntitlementManagement.Read.All 权限。
      • 如果 Runbook 要更改权利管理(例如跨多个目录创建分配),则使用 EntitlementManagement.ReadWrite.All 权限。
      • 对于其他 API,请确保添加所需的权限。

在上一部分中创建的应用程序具有权限,需要至少具有特权角色管理员角色的人员批准后才能按预期运行。

  1. 至少以特权角色管理员身份登录到 Microsoft Entra 管理中心
  2. 浏览到“标识”>“应用程序”>“应用注册”>“所有应用程序”。
  3. 选择在上一部分中创建的应用。
  4. 选择“API 权限”并查看所需的权限。
  5. 如果合适,请选择“授予“租户名称”管理员同意,以授予应用程序这些权限。

创建 Azure 自动化变量

你将通过此步骤在 Azure 自动化帐户中创建三个变量,Runbook 将使用这些变量来确定如何向 Microsoft Entra ID 进行身份验证。

  1. 在 Azure 门户中,返回到 Azure 自动化帐户。

  2. 选择“变量”和“添加变量”。

  3. 创建名为“Thumbprint”的变量。 键入先前生成的证书指纹作为该变量的值。

  4. 创建名为“ClientId”的变量。 键入在 Microsoft Entra ID 中注册的应用程序的客户端 ID 作为该变量的值。

  5. 创建名为“TenantId”的变量。 键入在其中注册了该应用程序的目录的租户 ID 作为该变量的值。

创建可使用 Graph 的 Azure 自动化 PowerShell Runbook

在此步骤中,你将创建一个初始 Runbook。 可以触发此 Runbook 来验证使用先前创建的证书进行身份验证是否成功。

  1. 选择“Runbook”和“创建 Runbook”。

  2. 键入 Runbook 的名称,选择“PowerShell”作为要创建的 Runbook 类型,然后选择“创建”。

  3. 创建 Runbook 后,会出现一个文本编辑窗格,可在其中键入该 Runbook 的 PowerShell 源代码。

  4. 在文本编辑器中键入以下 PowerShell。

Import-Module Microsoft.Graph.Authentication
$ClientId = Get-AutomationVariable -Name 'ClientId'
$TenantId = Get-AutomationVariable -Name 'TenantId'
$Thumbprint = Get-AutomationVariable -Name 'Thumbprint'
Connect-MgGraph -Environment China -clientId $ClientId -tenantId $TenantId -certificatethumbprint $Thumbprint
  1. 选择“测试”窗格,然后选择“开始”。 等待几秒钟,让 Azure 自动化处理完 Runbook 脚本。

  2. 如果 Runbook 运行成功,则会显示消息“欢迎使用 Microsoft Graph!”。

现在你已经验证 runbook 可向 Microsoft Graph 进行身份验证,接下来请通过添加用于与 Microsoft Entra 功能进行交互的 cmdlet 来扩展该 runbook。

扩展 Runbook 以使用权利管理

如果 Runbook 的应用注册拥有 EntitlementManagement.Read.All 或 EntitlementManagement.ReadWrite.All 权限,则它可以使用权利管理 API。

  1. 例如,若要获取 Microsoft Entra 权利管理访问包的列表,可以更新上面创建的 runbook,并将文本替换为以下 PowerShell。
Import-Module Microsoft.Graph.Authentication
$ClientId = Get-AutomationVariable -Name 'ClientId'
$TenantId = Get-AutomationVariable -Name 'TenantId'
$Thumbprint = Get-AutomationVariable -Name 'Thumbprint'
$auth = Connect-MgGraph -Environment China -clientId $ClientId -tenantid $TenantId -certificatethumbprint $Thumbprint
Import-Module Microsoft.Graph.Identity.Governance
$ap = @(Get-MgEntitlementManagementAccessPackage -All -ErrorAction Stop)
if ($null -eq $ap -or $ap.Count -eq 0) {
   ConvertTo-Json @()
} else {
   $ap | Select-Object -Property Id,DisplayName | ConvertTo-Json -AsArray
}
  1. 选择“测试”窗格,然后选择“开始”。 等待几秒钟,让 Azure 自动化处理完 Runbook 脚本。

  2. 如果运行成功,则输出将是一个 JSON 数组,而不是欢迎消息。 该 JSON 数组包含查询返回的每个访问包的 ID 和显示名称。

向 Runbook 提供参数(可选)

还可以通过在 PowerShell 脚本顶部添加 Param 部分,将输入参数添加到 Runbook。 例如,

Param
(
    [String] $AccessPackageAssignmentId
)

允许的参数的格式取决于调用服务。 如果 Runbook 确实从调用方获取参数,那么你需要向 Runbook 添加验证逻辑,以确保提供的参数值适用于 Runbook 的启动方式。 例如,如果 Runbook 由 Webhook 启动,则只要 Webhook 请求是对正确的 URL 发出的,Azure 自动化就不会对此请求执行任何身份验证,因此你需要一种验证请求的替代方法。

配置 Runbook 输入参数后,在测试 Runbook 时,可以通过“测试”页提供值。 稍后,发布 Runbook 时,可以在从 PowerShell、REST API 或逻辑应用启动 Runbook 时提供参数。

在逻辑应用中分析 Azure 自动化帐户的输出(可选)

发布 Runbook 后,可以在 Azure 自动化中创建计划,并将该 Runbook 链接到该计划以自动运行。 对于不需要与没有 PowerShell 接口的其他 Azure 或 Office 365 服务交互的 Runbook,适合在 Azure 自动化中计划这些 Runbook。

如果你要将 Runbook 的输出发送到另一个服务,建议考虑使用 Azure 逻辑应用来启动 Azure 自动化 Runbook,因为逻辑应用也可以分析结果。

  1. 在 Azure 逻辑应用设计器中,创建一个最初计划为“重复”的逻辑应用。

  2. 在 Azure 自动化中添加操作“创建作业”。 向 Microsoft Entra ID 进行身份验证,然后选择先前创建的订阅、资源组和自动化帐户。 选择“等待作业”。

  3. 添加参数“Runbook 名称”,并键入要启动的 Runbook 的名称。 如果 Runbook 具有输入参数,你可以向其提供值。

  4. 选择“新建步骤”,并添加操作“获取作业输出”。 选择在上一步骤中所选的同一订阅、资源组和自动化帐户,然后选择在上一步骤中获取的“作业 ID”的动态值。

  5. 然后,可将更多操作添加到逻辑应用,例如“分析 JSON”操作,该操作使用 Runbook 完成时返回的内容。 (如果要从示例有效负载自动生成“分析 JSON”架构,请确保考虑到 PowerShell 脚本可能返回 null;你可能需要在架构中将 "type": ​"string" 的部分内容更改为 "type": [​"string",​ "null"​]。)

在 Azure 自动化中,如果 PowerShell Runbook 尝试同时将大量数据写入输出流,则它可能无法完成。 要解决此问题,通常可以让 Runbook 仅输出逻辑应用所需的信息,例如,使用 Select-Object -Property cmdlet 排除不需要的属性。

计划使证书保持最新

如果按照上述步骤创建了用于身份验证的自签名证书,请记住,该证书的生存期有限,超过该生存期即会过期。 需要在过期日期之前重新生成证书并上传新证书。

可在 Azure 门户中的两个位置查看过期日期。

  • 在 Azure 自动化中,“证书”屏幕会显示证书的过期日期。
  • 在 Microsoft Entra ID 中,在应用注册时,“证书和机密”屏幕会显示用于 Azure 自动化帐户的证书的到期日期。

后续步骤