当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何确定您需要哪些 Microsoft Graph 权限

作者:精品下载站 日期:2024-12-14 04:05:47 浏览:14 分类:玩电脑

如何确定您需要哪些 Microsoft Graph 权限


使用 Microsoft Graph PowerShell SDK 时

现在,您应该知道 Microsoft 计划在 2022 年底或不久后停用 Azure AD 和 MSOL PowerShell 模块。已停用模块中的 cmdlet 之后将继续运行,但不会获得任何支持。 Microsoft 建议您升级脚本以使用 Microsoft Graph PowerShell SDK 中的 cmdlet。实际的转换通常是在 Microsoft 的 cmdlet 映射中找到匹配的 cmdlet 并切换到它。但是,在 cmdlet 顺利运行之前,还会遇到其他复杂问题。确定用于访问数据的正确 Microsoft Graph API 权限只是这些复杂性之一。

最小权限模型

Azure AD PowerShell 模块和 Microsoft Graph PowerShell SDK 之间的权限处理存在显着差异。使用 Connect-AzureAD cmdlet 登录时,您可以使用登录帐户拥有的所有管理权限。但是,Graph SDK 在最低权限模型上运行,这意味着即使在连接具有高权限的帐户时,您也必须请求权限才能执行操作。

将脚本从 Azure AD cmdlet 更新到 SDK cmdlet 的第一步是考虑脚本执行处理所需的权限。无论您如何使用 SDK cmdlet,此规则都适用 - 以交互方式、通过使用基于证书的身份验证的后台作业或在 Azure 自动化 Runbook 中。与从登录帐户继承的权限不同,SDK 使用的权限被授予用于运行 SDK cmdlet 的服务主体。对于交互式会话,服务主体是 Microsoft Graph

接下来的问题是如何找到执行操作所需的 Microsoft Graph API 权限。您可以通过四种方式实现目标:

猜测和过度许可

第一种方法是猜测和希望方法。换句话说,授予脚本可能使用的所有权限,或者继续添加权限直到代码运行。这里的危险在于,您最终会得到一个拥有大量权限的服务主体,而这将成为攻击者的有吸引力的目标。如果您使用交互式会话来运行 SDK cmdlet,则 Microsoft Graph PowerShell 服务主体很可能会随着时间的推移获得许多权限,并最终处于权限过多的状态(图 1)。我们稍后会回到这个问题。

[玩转系统] 如何确定您需要哪些 Microsoft Graph 权限

使用图形浏览器突出显示图形权限

接下来,如果您在 Graph Explorer 中运行查询,浏览器会在“修改权限”选项卡中显示运行查询所需的权限(图 2)。显示的权限集包括您可以使用的每个有效权限,因此您需要选择最合适的权限。在本例中,查询是获取租户中的用户帐户集(用户帐户操作的基本集之一),因此 User.Read.All 权限是一个不错的选择。

[玩转系统] 如何确定您需要哪些 Microsoft Graph 权限

Active Directory 的网络安全风险管理

了解如何通过这些网络安全风险管理解决方案预防 AD 攻击并从中恢复。

阅读图表文档

所有 SDK cmdlet 均源自图形查询。 Microsoft 使用名为 AutoRest 的进程来处理可用的图形查询并创建 SDK cmdlet。此过程每月进行一次,以创建新版本的 SDK。该过程还创建自动化文档,但机器生成的文本通常很晦涩且难以理解,这就是为什么我经常恢复到底层图形文档的原因。以列出用户帐户为例。快速搜索将我们带到“列表用户”页面,其中列出了委派(用于以登录用户身份访问数据)和应用程序(用于后台进程)所需的权限。在这种情况下,页面确认User.Read.All是一个不错的选择。

使用 SDK 帮助识别图形权限

该 SDK 包含两个 cmdlet,可帮助开发人员确定执行操作所需的权限。

  • Find-MgGraphPermission:列出不同操作的委派权限和应用程序权限。
  • Find-MgGraphCommand:列出可用于与不同类型的对象交互的 cmdlet,包括所需的权限。该 cmdlet 通过获取对象的 URI 来查找可用命令。

例如,假设我想要与存储在 Azure AD 中的组织信息进行交互。我可以首先运行 Find-MgGraphPermission cmdlet:

Find-MgGraphPermission organization | ? {$_.PermissionType -eq "Application"} | Format-List Name, Description

Name        : Organization.Read.All
Description : Allows the app to read the organization and related resources, on behalf of the signed-in user. Related resources include things like subscribed skus and tenant branding information.

Name        : Organization.ReadWrite.All
Description : Allows the app to read and write the organization and related resources, on behalf of the signed-in user. Related resources include things like subscribed skus and tenant branding information.

该命令通过管道将其输出过滤并显示应用程序权限(可以使用相同的委派权限)。从输出中可以明显看出,我们应该使用Organization.Read.All权限来读取组织信息(例如租户名称和标识符),并且Organization.ReadWrite.All我们是否需要更新可写设置。

为了简洁起见,我在上面仅显示了权限名称和描述。以下是更新 Azure AD 组(包括 Microsoft 365 组)属性所需的 Group.ReadWrite.All 权限的完整输出。

Id             : 62a82d76-70ea-41e2-9197-370581804d09
PermissionType : Application
Consent        : Admin
Name           : Group.ReadWrite.All
Description    : Allows the app to create groups, read all group properties and memberships, update group properties and memberships, and delete groups. Also allows the app to read and write group calendar and conversations.  All of these operations can be performed by the app without a signed-in user.

您可以尝试命令的修改版本,以查看与用户、组、Azure AD(目录)、应用程序(应用程序)等交互所需的权限。

Find-MgGraphCommand cmdlet 传递图形 URL 的一部分,以查看哪些 SDK cmdlet 可用于该 URL。 URL 类似于用户或组,用于列出可用于处理对象集的 cmdlet。如果添加 {id},则意味着您希望查看可用于处理各个对象的 cmdlet。

例如,让我们看看哪些 cmdlet 可用于处理各个组。该命令及其输出如下所示:

Find-MgGraphCommand -uri "/groups/{id}" | ? {$_.APIVersion -eq "v1.0"} | Fl Command, Method, Permissions

Command     : Get-MgGroup
Method      : GET
Permissions : {Directory.AccessAsUser.All, Directory.Read.All, Directory.ReadWrite.All, Group.Read.All...}

Command     : Remove-MgGroup
Method      : DELETE
Permissions : {Directory.AccessAsUser.All, Group.ReadWrite.All}

Command     : Update-MgGroup
Method      : PATCH
Permissions : {Directory.AccessAsUser.All, Directory.ReadWrite.All, Group.ReadWrite.All}

该图有两个端点:V1.0 和 beta。 V1.0 端点是生产版本,而 beta 端点正在开发中。在许多情况下,您将结合使用 cmdlet 和 beta 端点,因为它们提供了附加功能。例如,如果您针对 V1.0 端点运行 Get-MgUser cmdlet,它不会返回帐户的任何许可证信息,但在针对 beta 端点运行时会返回任何许可证信息。

在本例中,我已过滤输出以仅显示 V1.0 端点中可用的命令,我们可以看到三个 cmdlet 可用于列出组、删除组和更新组的属性。我们还可以看到,Group.Read.All 权限足以读取组信息,但我们需要 Group.ReadWriteAll 来删除或更新组。

范围界定

一旦找到脚本执行其负责的任何操作所需的 Microsoft Graph API 权限,您就可以在 Connect-MgGraph cmdlet 的 Scopes 参数中指定连接到 Graph 时所需的权限集。例如:

$RequiredScopes = ("Organization.ReadWrite.All”, "Directory.Read.All")
Connect-MgGraph -Scope $RequiredScopes

对于交互式会话,如果 Microsoft Graph PowerShell 服务主体不同意使用所请求的权限,系统将提示您同意(图 3)。

[玩转系统] 如何确定您需要哪些 Microsoft Graph 权限

如果您允许应用程序使用该权限,则会话可以在会话期间使用委派的权限。本质上,委托权限意味着用户可以访问自己拥有的数据,但不能访问属于其他用户的数据。但是,也可以通过分配给帐户的管理角色来获得对数据的访问权限。正如 Microsoft 在其文档中所解释的那样,“您的应用的有效权限是应用已(经同意)授予的委派权限与当前登录用户的权限的最低特权交集 ”。换句话说,如果您的帐户拥有管理员角色,那么您将能够访问比您的帐户没有管理员角色更多的数据。

如果您代表组织授予同意,Entra ID 会将权限添加到服务主体,并且此后该权限可用于所有会话。授予服务主体的同意是针对应用程序权限的,这意味着用户可以访问整个组织的数据。

连接后,您可以通过运行以下命令来检查哪些权限处于活动状态:

(Get-MgContext).Scopes

累计图表权限

Microsoft Graph PowerShell 服务主体不断积累的权限是值得警惕的。如果要删除服务主体的所有权限,可以通过 Azure AD 管理中心执行此操作(如图 1 所示),也可以删除服务主体。发生这种情况时,SDK 会在下次有人尝试登录时检测到服务主体丢失并重新创建它(服务主体的 AppId 始终为 14d82eec-204b-4c2f-b7e8-296a70dab67e) 。

要创建服务主体,请使用 Application.ReadWrite.All 权限连接到图表并运行以下命令:

Remove-MgServicePrincipal cmdlet 不会提示确认。幸运的是,很快 Azure AD 将证明能够恢复软删除的服务主体对象,以防万一您犯了错误。

$SDKServicePrincipalId = (Get-MgServicePrincipal -all | ? {$_.DisplayName -eq "Microsoft Graph PowerShell"}).Id
Remove-MgServicePrincipal -ServicePrincipalId $SDKServicePrincipalID

更复杂,更多控制

与 PowerShell 模块的标准(到目前为止)相比,使用 Microsoft Graph PowerShell SDK 需要更多地关注权限。您必须请求权限并仅使用所需的权限集,而不是假定管理权限。它需要一些时间来适应,并且是基于 Azure AD 和 MSOL 模块的脚本转换清单的一部分。就像生活中的大多数其他事情一样,我们会及时习惯连接的权限管理。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯