应用同意授权调查

本文提供了有关识别和调查应用同意攻击、保护信息并最大程度降低未来风险的指南。

本文包含以下各节:

  • 先决条件:介绍在开始调查之前需要完成的特定要求。 例如,应启用的日志记录、所需的角色和权限,等等。
  • 工作流:显示执行此调查应遵循的逻辑流。
  • 清单:包含流程图中每个步骤的任务列表。 此清单有助于在高度管控的环境中验证已采取的步骤或仅用作自我质量检验的标准。
  • 调查步骤:包括用于此特定调查的详细分步指南。
  • 恢复:包含有关如何从非法应用程序同意授权攻击中恢复/缓解的高级别步骤。
  • 参考:包含更多阅读和参考资料。

先决条件

下面是执行应用程序同意授权调查时应完成的常规设置和配置。 在开始调查之前,请确保已阅读同意权限类型中介绍的各类同意权限。

客户数据

若要开始调查过程,需要以下数据:

  • 入侵指标 (IoC) 的详细信息
  • 注意到此事件的日期和时间
  • 日期范围
  • 遭入侵帐户的数量
  • 遭入侵帐户的名称
  • 遭入侵帐户的角色(一个或多个)
  • 这些帐户是否具有高特权(GA Microsoft Exchange、SharePoint)?
  • 是否有与此事件相关的企业应用程序?
  • 是否有用户报告有应用程序代表他们请求访问数据的权限?

系统要求

请确保完成以下安装和配置要求:

  • 已安装 AzureAD PowerShell 模块。
  • 你对运行脚本的租户拥有全局管理员权限。
  • 在要运行脚本的计算机上,你被分配为本地管理员角色。

注意

自 2024 年 3 月 30 日起,Azure AD 和 MSOnline PowerShell 模块已弃用。 若要了解详细信息,请阅读有关弃用的更新。 在此日期之后,对这些模块的支持仅限于到 Microsoft Graph PowerShell SDK 的迁移帮助和安全性修复。 弃用的模块将持续运行至 2025 年 3 月 30 日。

我们建议迁移到 Microsoft Graph PowerShell,以便与 Microsoft Entra ID(以前称为 Azure AD)进行交互。 有关常见迁移问题,请参阅迁移常见问题解答注意:2024 年 6 月 30 日之后,MSOnline 版本 1.0.x 可能会遇到中断。

安装 AzureAD 模块

请使用此命令安装 AzureAD 模块。

Install-Module -Name AzureAD -Verbose

注意

如果系统提示你从不受信任的仓库中安装此模块,请键入“Y”,然后按 Enter

安装 MSOnline PowerShell 模块

  1. 使用提升的权限(以管理员角色运行)运行 Windows PowerShell 应用。

  2. 运行此命令以允许 PowerShell 运行签名脚本。

    Set-ExecutionPolicy RemoteSigned
    
  3. 运行此命令以安装 MSOnline 模块。

    Install-Module -Name MSOnline -Verbose
    

    注意

    如果系统提示你从不受信任的仓库中安装此模块,请键入“Y”,然后按 Enter

从 GitHub 下载 AzureADPSPermissions 脚本

  1. Get-AzureADPSPermissions.ps1 脚本从 GitHub 下载到要从中运行此脚本的文件夹。 输出文件 "permissions.csv" 也将写入此同一文件夹。

  2. 以管理员角色打开 PowerShell 实例,然后打开保存此脚本的文件夹。

  3. 使用 Connect-AzureAD cmdlet 连接到目录。 下面是一个示例。

    Connect-AzureAD -tenantid "2b1a14ac-2956-442f-9577-1234567890ab" -AccountId "user1@contoso.onmicrosoft.com"
    
  4. 运行以下 PowerShell 命令。

    Get-AzureADPSPermissions.ps1 | Export-csv -Path "Permissions.csv" -NoTypeInformation
    

    使用此命令断开 AzureAD 会话。

    Disconnect-AzureAD
    

同意是指授权应用程序代表用户访问受保护资源的过程。 应用程序可能会要求管理员或用户同意其访问组织/个人数据。

应用程序被授予访问数据的权限,该权限或是基于特定用户,或是适用于整个组织。 攻击者可能会滥用这些同意,使其持久存在于环境中并访问敏感数据。 这种类型的攻击称为非法同意授权,可通过网络钓鱼电子邮件、密码喷射入侵用户帐户等方式或攻击者以合法用户身份注册应用程序时发生。 在管理员帐户遭到入侵的情况下,注册和同意授权适用于租户范围,而非仅适用于一个用户。

用户必须先授权应用程序访问,然后应用程序才可访问你组织的数据。 权限不同,访问级别就不同。 默认情况下,允许所有用户同意应用程序获取无需管理员同意的权限。 例如,默认情况下,用户可同意应用访问其邮箱,但无法同意应用获得不受限制的访问权限来读写你组织中的所有文件。

注意

通过允许用户向应用授予对数据的访问权限,用户可轻松获取有用的应用程序并提高工作效率。 但在某些情况下,如果不对其仔细监视和控制,该配置可能会带来风险。

若要授予租户范围的管理员同意,必须至少使用下述角色之一登录:

  • 应用程序管理员
  • 云应用程序管理员
  • 管理员 - 表明此同意由管理员(代表组织)授予
  • 个人用户 - 表明此同意由用户授予,且仅有权访问该用户的信息
  • 接受的值
    • AllPrincipals - 获得管理员同意,可访问所有租户
    • Principal - 获得个人用户同意,仅可访问与该帐户相关的数据

授予同意的实际用户体验将根据用户租户上设置的策略、用户的授权作用域(或角色)以及客户端应用程序请求的权限类型而有所不同。 这意味着应用程序开发人员和租户管理员可以对许可体验进行一些控制。 管理员可以在租户或应用上灵活地设置和停用策略,以控制其租户的同意体验。 应用程序开发人员可以指示请求的访问权限类型以及是否希望引导用户完成用户同意流或管理员同意流。

  • 用户许可流 - 应用程序开发人员将用户定向到授权终结点,意图为记录仅限当前用户的同意。

  • 管理员许可流 - 应用程序开发人员将用户定向到管理员同意终结点,意图为记录所有租户的许可。 若要确保管理员同意流正常工作,应用程序开发人员必须列出应用程序清单内“RequiredResourceAccess”属性中的所有权限。

委托的权限与应用程序权限的比较

委托的权限由已存在已登录用户的应用使用,并可由管理员或用户授予同意。

应用程序权限由在没有登录用户的情况下运行的应用使用。 例如,作为后台服务或守护程序运行的应用。 应用程序权限只能由管理员授予同意。

有关详细信息,请参阅:

对具有风险的权限进行分类

系统中(至少)有数千个权限,要列出或分析所有这些权限是不切实际的。 以下列表提及了经常被滥用的权限,以及被滥用时会造成灾难性影响的其他权限。

在高级别上,Microsoft 观察到以下“根”委托 (App+User) 权限在同意网络钓鱼攻击中被滥用。 根相当于顶级级别。 例如,Contacts.* 表示包含联系人权限的所有委托排列:Contacts.ReadContacts.ReadWriteContacts.Read.SharedContacts.ReadWrite.Shared

  1. Mail.*(包括 Mail.Send*,但不包括 Mail.ReadBasic*)
  2. 联系人。 *
  3. MailboxSettings.*
  4. People.*
  5. Files.*
  6. 注意。*
  7. Directory.AccessAsUser.All
  8. User_Impersonation

前面列表中的前七个权限适用于 Microsoft Graph 和“旧版”API 等效项,例如 Azure Active Directory (Azure AD) Graph 和 Outlook REST。 第八个权限适用于 Azure 资源管理器 (ARM),并且在与此覆盖层模拟作用域公开敏感数据的 API 上也十分危险。

根据 Microsoft 事件响应团队的观察,攻击者在 99% 的同意网络钓鱼攻击中组合使用了前六个权限。 大多数人不会将 Mail.Read 或 Files.Read 的委托版本视为高风险权限,然而,这些攻击通常是针对最终用户的广泛攻击,而不是针对会同意危险权限的管理员的鱼叉式网络钓鱼。 我们建议对具有这些“关键”级别影响权限的应用设置气泡。 即使应用程序没有恶意,如果不良参与者盗用了应用标识,整个组织就可能面临风险。

涉及最高风险影响的权限,请从此处开始:

  • 上述所有权限的应用程序权限 (AppOnly/AppRole) 版本(如果适用)

以下权限的委托和 AppOnly 版本:

  • Application.ReadWrite.All
  • Directory.ReadWrite.All
  • Domain.ReadWrite.All*
  • EduRoster.ReadWrite.All*
  • Group.ReadWrite.All
  • Member.Read.Hidden*
  • RoleManagement.ReadWrite.Directory
  • User.ReadWrite.All*
  • User.ManageCreds.All
  • 允许写入权限的所有其他 AppOnly 权限

涉及最低风险影响权限的列表,请从此处开始:

  • User.Read
  • User.ReadBasic.All
  • Open_id
  • 电子邮件
  • Profile
  • Offline_access(仅当与此“最低风险”列表中的其他权限配对时)

查看权限

  1. 若要查看权限,请导航到企业应用程序中的“注册”屏幕。

    如何查看不同权限的屏幕截图。

  2. 选择“查看 API 权限”

    如何查看和添加 API 权限的屏幕截图。

  3. 选择“添加权限”,将显示以下屏幕。

    如何请求 API 权限的屏幕截图。

  4. 选择“Microsoft Graph”以查看不同类型的权限。

    不同类型的 API 权限的屏幕截图。

  5. 选择已注册应用程序使用的权限类型:“委托的权限”或“应用程序权限”。 在上图中,选择的是“应用程序权限”

  6. 你可以搜索其中一项高风险影响的权限,例如“EduRoster”

    示例 API 权限请求的屏幕截图。

  7. 选择“EduRoster”并展开权限。

    包含工具提示的 API 权限项的屏幕截图。

  8. 你现在可以分配或查看这些权限。

    有关详细信息,请阅读 Graph 权限

Workflow

[应用同意授予调查工作流的流程图。]

也可执行以下操作:

  • PDF 格式下载应用同意授权和其他事件响应 playbook 工作流。
  • Visio 文件格式下载应用同意授权和其他事件响应 playbook 工作流。

清单

请使用此清单执行应用程序同意授权验证。

  • 入侵指标 (IoC)

    请检查以下入侵指标 (IoC):

    • 你何时注意到该事件?
    • 该事件的日期范围(距离达到入侵目标有多远?)
    • 遭入侵帐户的数量
    • 遭入侵帐户的名称
    • 遭入侵帐户的角色
    • 遭到入侵的帐户是高特权用户、标准用户还是两者的组合
  • 角色

    你必须分配为以下角色:

    • 有权从计算机上运行脚本的本地管理员角色
  • PowerShell 配置

    请使用这些步骤配置 PowerShell 环境:

    1. 安装 Azure AD PowerShell 模块。
    2. 使用提升的特权运行 Windows PowerShell 应用。 (以管理员角色运行)。
    3. 配置 PowerShell 以运行已签名的脚本。
    4. 下载 Get-AzureADPSPermissions.ps1 脚本。
  • 调查触发器

    • 帐户入侵
    • 在租户上的应用同意设置遭修改
    • 检测到警报/审核事件状态的原因为“有风险的应用程序”
    • 发现看起来奇怪的应用程序

还可以 Excel 文件格式下载应用同意授权和其他事件 playbook 清单。

调查步骤

可以使用以下两种方法调查应用程序同意授权:

  • Azure 门户
  • PowerShell 脚本

注意

使用 Azure 门户将仅允许你查看最近 90 天内的管理员同意授权,基于这一点,我们建议仅使用 PowerShell 脚本方法来减少攻击者注册的调查步骤。

方法 1 – 使用 Azure 门户

你可以使用 Microsoft Entra 管理中心来查找单个用户已授予权限的应用程序。

  1. 以管理员身份登录到 Azure 门户
  2. 选择 “Microsoft Entra ID” 图标。
  3. 选择用户
  4. 选择要查看的用户。
  5. 选择“应用程序”。
  6. 你可以查看分配给用户的应用列表,以及这些应用具有哪些权限。

方法 2 - 使用 PowerShell

你可以使用几个 PowerShell 工具来调查非法同意授权,例如:

PowerShell 是最简单的工具,而且不要求你修改租户中的任何内容。 我们将基于从非法同意授权攻击中获得的公共文档开展调查。

运行 Get-AzureADPSPermissions.ps1,将租户中全部用户的所有 OAuth 同意授权和 OAuth 应用导出到 .csv 文件中。 若要下载并运行 Get-AzureADPSPermissions 脚本,请参阅先决条件部分。

  1. 以管理员角色打开 PowerShell 实例,然后打开保存该脚本的文件夹。

  2. 使用以下 Connect-AzureAD 命令连接到你的目录。 下面是一个示例。

    Connect-AzureAD -tenantid "2b1a14ac-2956-442f-9577-1234567890ab" -AccountId "user1@contoso.onmicrosoft.com"
    
  3. 运行以下 PowerShell 命令。

    Get-AzureADPSPermissions.ps1 | Export-csv c:\temp\consentgrants\Permissions.csv -NoTypeInformation
    
  4. 脚本完成运行后,建议使用此命令断开 Microsoft Entra 会话的连接。

     Disconnect-AzureAD
    

    注意

    脚本可能需要几个小时才能完成运行,具体取决于文件大小、配置的权限以及连接的情况。

  5. 此脚本将创建一个名为 Permissions.csv 的文件。

  6. 打开该文件,对数据进行筛选或将格式设置为表格,然后将其另存为 .xlxs 文件。

    输出的列标题显示在此图像中。

    Excel 列标题的屏幕截图。

  7. 在“ConsentType”列 (G) 中,搜索值“AllPrinciples”。 “AllPrincipals”权限允许客户端应用程序访问租户中每个人的内容。 本机的 Microsoft 365 应用程序需要此权限才能正常工作。 应仔细查看每个拥有此权限的非 Microsoft 应用程序

  8. 在“Permission”列 (F) 中,查看每个委托应用程序拥有的权限。 查找 ReadWrite 权限或 *.All 权限,然后仔细检查这些权限,因为它们可能不合适。 F 列中应用权限的屏幕截图。

    注意

    审查已授予同意的特定用户。 如果高配置文件或高影响用户已授予了不当同意,则应作进一步调查。

  9. 在“ClientDisplayName”列 (C)中,查找看起来可疑的应用,例如:

    • 名称拼写错误的应用 拼写错误的名称的屏幕截图示例。

    • 异常或普通的名称 异常名称的屏幕截图示例。

    • 听起来像黑客的名称。 请务必仔细审查这些名称。 黑客名称的屏幕截图示例。

示例输出:AllPrincipals 和 read write all。 应用程序可能没有任何可疑事项(例如,平淡无奇的名称),并且正在使用 MS graph。 即使如此,也应该进行研究并确定应用程序的目的以及应用程序在租户中的实际权限,如本示例所示。

具有 AllPrincipals ConsentType 的应用程序的屏幕截图示例。

下面是在查看信息安全策略 (ISP) 调查时的一些有用提示:

  • ReplyURL/RedirectURL
    • 查找可疑的 URL
  • 此 URL 是否托管在可疑域上?
    • 此 URL 是否已遭入侵?
    • 此域最近是否已注册?
    • 此域是否为临时域?
  • 应用注册中是否存在服务条款/服务协议链接?
  • 内容对于用程序/发布服务器是否是唯一的和特定的?
  • 注册应用程序的租户是否是新创建的或曾遭入侵的(例如,此应用是否由风险用户注册)?

攻击技术

尽管每次攻击往往各不相同,但核心攻击技术通常包括以下内容

  • 攻击者通过 OAuth 2.0 提供程序(如 Microsoft Entra ID)注册应用。

  • 应用程序的配置情况使其看起来好像合法。 例如,攻击者可能使用同一生态系统中提供的常用产品的名称。

  • 攻击者直接从用户处获取一个链接,该行为可能通过使用传统的网络钓鱼电子邮件、入侵非恶意网站或其他技术来完成。

  • 用户选择该链接后收到一条可信的同意提示,要求他们向恶意应用授予数据访问权限。

  • 如果用户选择“接受”,则他们将授予应用访问敏感数据的权限。

  • 该应用将获取一个授权代码,应用使用该代码兑换访问令牌,并可能获得刷新令牌。

  • 访问令牌用于代表用户进行 API 调用。

  • 如果用户接受,则攻击者可以获得授权访问用户的邮件、转发规则、文件、联系人、便笺、配置文件以及其他敏感的数据和资源。

    权限请求的屏幕截图示例。

查找攻击迹象

  1. 在 Microsoft 365 Defender 门户 https://security.microsoft.com 中,转到“审核”。 或者,若要直接转到“审核”页,请使用 https://security.microsoft.com/auditlogsearch

  2. 在“审核”页上,搜索所有活动和所有用户,并输入开始日期和结束日期(如果需要),然后选择“搜索”。

    审核日志搜索的屏幕截图示例。

  3. 选择“筛选器”结果,然后在“活动”字段中输入“同意应用程序”

    筛选审核日志搜索的屏幕截图示例。

  4. 如果你有同意授权的活动,请继续执行下一步骤。

  5. 选择结果以查看活动的详细信息。 选择“详细信息”以获取活动的详细信息。

  6. 检查 IsAdminContent 是否设置为 'True'。

    注意

    事件发生后,此过程可能需要 30 分钟到 24 小时才能在搜索结果中显示相应的审核日志条目。

    审核记录被保留和在审核日志中可搜索的时间范围取决于你的 Microsoft 365 订阅,特别是分配给特定用户的许可证类型。 如果此值为 true,则表示有人可能已被授予对数据的广泛访问权限。 如果这是意外情况,请立即采取措施以确认攻击。

如何确认攻击?

如果你有上面列出的一个或多个 IoC 实例,则需要进一步调查以确认攻击确实已发生。

清点组织中具有访问权限的应用

你可以使用 Microsoft Entra 管理中心或 PowerShell 为用户清点应用,或让用户各自枚举他们的应用访问权限。

  • 使用 Microsoft Entra 管理中心清查应用程序及其权限。 这个方法是全面的,但一次只能检查一个用户,如果你必须检查多个用户的权限,这可能会非常耗时。
  • 使用 PowerShell 清点应用程序及它们的权限。 这种方法最快、最全面,而且开销最小。
  • 鼓励用户各自检查其应用和权限,并将结果报告给管理员以供修正。

清点分配给用户的应用

你可以使用 Microsoft Entra 管理中心查看各个用户向其授予了权限的应用的列表。

  1. 使用管理权限登录到“Azure 门户”
  2. 选择 “Microsoft Entra ID” 图标。
  3. 选择用户
  4. 选择要查看的用户。
  5. 选择“应用程序”。

你可以查看分配给用户的应用列表和授予这些应用的权限。

确定攻击的作用域

完成对应用程序访问的清点后,请查看审核日志以确定入侵的全部作用域。 搜索受影响的用户、非法应用程序有权访问组织的时间范围以及应用获得的权限。 你可以在 Microsoft 365 安全与 Microsoft Purview 合规性门户中搜索审核日志。

重要

如果在可能的攻击之前未启用审核,则无法调查,因为审核数据不可用。

如何防止攻击并缓解风险?

如果你的组织有适当的许可证:

  • 请使用 Microsoft Defender for Cloud Apps 中的更多 OAuth 应用程序审核功能。
  • 请使用 Azure Monitor 工作簿监视权限和同意相关活动。 Consent Insights 工作簿会按失败的同意请求数量提供应用视图。 这可能有助于确定应用程序优先级,以便管理员查看并决定是否向这些应用程序授予管理员同意。

识别具有非法权限的应用程序后,请按照禁用应用程序中的说明立即禁用此应用程序。 然后,请与 Microsoft 支持部门联系报告恶意应用程序。

在 Microsoft Entra 中禁用某个应用程序后,该应用程序无法获取新令牌来访问数据,并且其他用户无法登录或许可使用该应用。

注意

如果怀疑在组织中遇到恶意应用程序,最好禁用它而不是删除它。 如果仅删除应用程序,则在其他用户授予同意时,该应用程序可能会在稍后返回。 相反,禁用应用程序以确保它之后无法恢复。

保护组织的步骤

网络中存在各种类型的同意攻击,这些建议的防御措施可以缓解所有类型的攻击,尤其是同意网络钓鱼,在这种情况下攻击者会欺骗用户授予恶意应用访问敏感数据或其他资源的权限。 攻击者会寻求让受其控制的应用访问有价值的数据,而不是试图窃取用户的密码。

若要帮助防止同意攻击并避免影响 Microsoft Entra ID 和 Office 365,请参阅以下建议:

设置策略

  • 此设置会影响用户,并且可能不适用于某个环境。 如果打算允许任何同意,请确保管理员批准请求。

  • 允许对仅来自经验证发布者的应用程序和分类为低影响的特定权限类型表示同意。

    注意

    以上建议是基于最理想的、最安全的配置而提出的。 然而,由于安全性需要在功能和操作之间达到良好的平衡,因此最安全的配置可能会给管理员带来额外的开销。 请在咨询管理员后做出最佳决策。

    配置基于风险的升级同意 - 如果启用了用户同意授权,则默认情况下此项为启用状态

  • 基于风险的升级同意有助于减少用户遭受发出非法同意请求的恶意应用的攻击。 如果 Microsoft 检测到最终用户同意请求存在风险,该请求将需要“升级”,改为管理员同意。 此功能默认“启用”,但如果启用了最终用户同意,则仅会导致行为更改。

  • 当检测到同意请求存在风险时,同意提示将显示一条消息,指示需要管理员批准。 如果已启用管理员同意请求工作流,则用户可将请求发送给管理员,使其直接从同意提示中作进一步审查。 如果启用,则将显示以下消息:

    AADSTS90094:<clientAppDisplayName> 需要组织中资源的访问权限(只有管理员可以授予)。 使用应用前,请先向管理员请求授予此应用的权限。 在这种情况下,还将记录一个审核事件,其“类别”为"ApplicationManagement",“活动类型”为“许可应用程序”,“状态原因”为“检测到有风险的应用程序”

注意

任何需要管理员批准的任务都有运营开销。 “同意和权限、用户同意设置”目前处于“预览”阶段。 准备好公开发布 (GA) 后,“允许用户同意已验证的发布者,为所选权限”功能应降低管理员的开销,建议用于大多数组织。

许可权限的屏幕截图示例。

培训应用程序开发人员学习遵循可信的应用生态系统。 为了帮助开发人员构建高质量和安全的集成,我们还公布了 Microsoft Entra 应用注册集成助手的公共预览版。

  • 集成助手会分析应用注册,并对照一组建议的最佳安全做法对其设置基准。
  • 集成助手重点介绍了在集成生命周期每个阶段(从开发到监视)中相关的最佳做法,并确保每个阶段都获得正确的配置。
  • 无论是正在集成第一个应用的新手,还是希望提高技能的专家,它都会帮助你简化工作。

培训组织学习同意策略(网络钓鱼、管理员和用户同意):

  • 检查拼写和语法是否有误。 如果电子邮件消息或应用程序的同意屏幕出现拼写和语法错误,这可能是可疑应用程序。
  • 请密切注意应用名称和域 URL。 攻击者喜欢欺骗性的应用名称,这类名称看起来像是合法的应用程序或公司,但会驱使你同意恶意应用。
  • 在同意应用程序之前,请确保识别应用名称和域 URL。

推广并允许访问你信任的应用

  • 推广使用由发布者验证的应用程序。 发布者验证旨在帮助管理员和最终用户了解应用程序开发人员的真实身份。 到目前为止,有 390 个发布者验证了 660 多个应用程序。
  • 通过允许用户仅同意你信任的特定应用程序(例如组织开发的应用程序或来自经验证发布者的应用程序)来配置应用程序同意策略。
  • 培训组织了解权限和同意的框架的工作原理
  • 了解应用程序请求的数据和权限,以及权限和同意在平台内部如何工作。
  • 确保管理员知道如何管理和评估同意请求。

审核组织中的应用和已同意的特权,以确保所使用的应用仅可访问所需数据,并遵循最小特权原则。

缓解措施

  • 培训客户,使其具备保护应用程序同意授权的意识并接受相关训练
  • 使用组织策略和技术控制严控应用程序同意授权过程
  • 设置“创建计划”用于查看“已同意”的应用程序
  • 可以通过禁用应用,来使用 PowerShell 禁用可疑或恶意应用

其他事件响应剧本

请检查用于识别和调查这些其他类型攻击的指南:

事件响应资源