你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

为 Azure VM 上的 SQL Server 启用 Microsoft Entra 身份验证

适用于: Azure VM 上的 SQL Server

本文介绍如何为 Azure 虚拟机 (VM) 上的 SQL Server 启用 Microsoft Entra ID(以前称为 Azure Active Directory)身份验证。

概述

从 SQL Server 2022 开始,可以使用以下 Microsoft Entra 身份验证方法之一连接到 Azure VM 上的 SQL Server:

  • 密码通过 Microsoft Entra 凭据提供身份验证
  • 通用且具有 MFA”添加多重身份验证
  • “集成”将使用 Active Directory 联合身份验证服务 (ADFS) 等联合提供程序来启用单一登录 (SSO) 体验
  • 服务主体”实现了从 Azure 应用程序进行身份验证的功能
  • 托管标识从应用程序分配的 Microsoft Entra 标识启用身份验证

为 SQL Server 创建 Microsoft Entra 登录名以及用户使用该登录名连接时,SQL Server 使用托管标识来查询 Microsoft Graph。 为 Azure VM 上的 SQL Server 启用 Microsoft Entra 身份验证时,需要提供 SQL Server 可用于与 Microsoft Entra ID 通信的托管标识。 此托管标识需要具有查询 Microsoft Graph 的权限。

为 Azure 中的资源启用托管标识时,标识的安全边界是标识附加到的资源。 例如,启用了 Azure 资源托管标识的虚拟机的安全边界是虚拟机。 在该 VM 上运行的任何代码都可以调用托管标识终结点和请求令牌。 为 Azure VM 上的 SQL Server 启用托管标识时,该标识会附加到虚拟机,因此安全边界是虚拟机。 在使用支持托管标识的其他资源时,体验是相似的。 有关详细信息,请阅读托管标识常见问题解答

使用 Azure VM 上的 SQL Server 进行 Microsoft Entra 身份验证的系统分配和用户分配的托管标识具有以下优势:

  • 系统分配的托管标识提供了简化的配置过程。 由于托管标识的生存期与虚拟机相同,因此在删除虚拟机时无需单独删除它。
  • 用户分配的托管标识提供可伸缩性,因为它可以附加到 Azure VM 上的多个 SQL Server,并用于 Microsoft Entra 身份验证。

若要开始使用托管标识,请查看使用 Azure 门户配置托管标识

先决条件

要在 SQL Server 上启用 Microsoft Entra 身份验证,需要满足以下先决条件:

授予权限

对于你为了方便进行 SQL Server 与 Microsoft Entra ID 之间的身份验证而选择的托管标识,必须具有以下三种 Microsoft Graph 应用程序权限(应用角色):User.Read.AllGroupMember.Read.AllApplication.Read.All

或者,将托管标识添加到“Microsoft Entra 目录读取者角色”就可授予足够的权限。 将“目录读取者角色”分配给托管标识的另一种方法是将“目录读取者角色”分配给 Microsoft Entra ID 中的组。 然后,组所有者可以将虚拟机托管标识添加为此组的成员。 这将最大限度地减少 Microsoft Entra 全局管理员的参与,并将责任委派给组所有者。

将托管标识添加到角色

本部分介绍如何将托管标识添加到 Microsoft Entra ID 中的“目录读取者”角色。 需要具有全局管理员权限才能更改目录读取者角色分配。 如果没有足够的权限,请与 Microsoft Entra 管理员合作执行以下步骤。

要向托管标识授予“目录读取者”角色,请执行以下步骤:

  1. 在 Azure 门户中打开 Microsoft Entra ID 角色和管理员

  2. 在搜索框中键入“目录读取者”,然后选择角色“目录读取者”以打开“目录读取者 | 分配”页面:

    Azure 门户的“角色和管理员”页面的屏幕截图,其中搜索并选择了“目录读取者”角色。

  3. 在“目录读取者 | 分配”页面上,选择“+ 添加分配”以打开“添加分配”页面。

    Azure 门户的“目录读取者”页的屏幕截图。

  4. 在“添加分配”页面上,选择“选择成员”下的“未选择成员”以打开“选择成员”页面。

    Azure 门户的“添加分配”页的屏幕截图,其中突出显示了“未选择成员”。

  5. 在“选择成员”页面上,搜索要用于 SQL Server VM 的托管标识的名称并将其添加到“目录读取者”角色。 对于系统分配的托管标识,搜索 VM 名称。 使用“选择”以确认标识并返回到“添加分配”页面。

    在 Azure 门户中搜索要选择的成员的屏幕截图。

  6. 确认在“选择成员”下看到了所选的标识,然后选择“下一步”。

    Azure 门户中“添加分配”页的屏幕截图,其中 VM2 已添加为分配。

  7. 确认分配类型设置为“活动”并且选中了“永久分配”旁边的框。 输入业务理由,例如将目录读取者角色权限添加到 VM2 的系统分配的标识,然后选择“分配”以保存设置并返回到“目录读取者 | 分配”页面。

    Azure 门户中“添加分配”设置的屏幕截图。

  8. 在“目录读取者 | 分配”页面,确认在“目录读取者”下看到了新添加的标识。

    Azure 门户的“目录读取者”页的屏幕截图,其中显示了已添加到角色的 VM 分配。

添加应用角色权限

可以使用 Azure 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 可能会遇到中断。

  1. 连接到 Microsoft Graph

    Connect-MgGraph -Scopes "AppRoleAssignment.ReadWrite.All" -TenantId "<tenant id>"
    
  2. 检索托管标识:

    $Graph_SP = Get-MgServicePrincipal -Filter "DisplayName eq 'Microsoft Graph'"
    $MSI = Get-MgServicePrincipal -Filter "displayName eq '<your managed identity display name>'"
    
  3. User.Read.All 角色分配给标识:

    $AAD_AppRole = $Graph_SP.AppRoles | Where-Object {$_.Value -eq "User.Read.All"}  
    New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $MSI.Id -BodyParameter @{principalId=$MSI.Id; resourceId=$Graph_SP.Id; appRoleId=$AAD_AppRole.Id}
    
  4. GroupMember.Read.All 角色分配给标识:

    $AAD_AppRole = $Graph_SP.AppRoles | Where-Object {$_.Value -eq "GroupMember.Read.All"}  
    New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $MSI.Id -BodyParameter @{principalId=$MSI.Id; resourceId=$Graph_SP.Id; appRoleId=$AAD_AppRole.Id}
    
  5. Application.Read.All 角色分配给标识:

    $AAD_AppRole = $Graph_SP.AppRoles | Where-Object {$_.Value -eq "Application.Read.All"}  
    New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $MSI.Id -BodyParameter @{principalId=$MSI.Id; resourceId=$Graph_SP.Id; appRoleId=$AAD_AppRole.Id}
    

可以通过执行以下操作来验证是否已将权限分配给托管标识:

  1. Azure 门户中,转到 Microsoft Entra ID。
  2. 选择“企业应用程序”,然后在“管理”下选择“所有应用程序”。
  3. Managed identities 筛选应用程序类型
  4. 选择托管标识,然后在“安全性”下选择“权限”。 你应该会看到以下权限:User.Read.AllGroupMember.Read.AllApplication.Read.All

启用出站通信

要使 Microsoft Entra 身份验证正常工作,需要满足以下条件:

  • 从 SQL Server 到 Microsoft Entra ID 和 Microsoft Graph 终结点的出站通信。
  • 从 SQL 客户端到 Microsoft Entra ID 的出站通信。

使用默认 Azure VM 配置,可与 Microsoft Graph 终结点以及 Microsoft Entra ID 进行出站通信,但某些用户选择使用 OS 级别防火墙或 Azure VNet 网络安全组 (NSG) 来限制出站通信。

SQL Server VM 上的防火墙和任何 SQL 客户端都需要允许端口 80 和 443 上的出站流量。

托管 SQL Server VM 的 VNet 的 Azure VNet NSG 规则应满足以下条件:

  • 具有 AzureActiveDirectory 的服务标记。
  • 目标端口范围:80、443。
  • “操作”设置为“允许”。
  • 高优先级(一个较小的数字)。

启用 Microsoft Entra 身份验证

可以使用 Azure 门户或 Azure CLI 启用对 SQL Server VM 的 Microsoft Entra 身份验证。

注意

启用 Microsoft Entra 身份验证后,可以按照本部分中的相同步骤将配置更改为使用不同的托管标识。

要为 SQL Server VM 启用 Microsoft Entra 身份验证,请执行以下步骤:

  1. 在 Azure 门户中导航到 SQL 虚拟机资源

  2. 在“安全”下,选择“安全配置”。

  3. 在“Microsoft Entra 身份验证”下选择“启用”。

  4. 从下拉列表中选择托管标识类型,“系统分配”或“用户分配”。 如果选择用户分配的标识,则从显示的“用户分配的托管标识”下拉列表中,选择要用于对 Azure VM 上的 SQL Server 进行身份验证的标识。

    屏幕截图,其中显示了 Azure 门户中 SQL VM 的安全配置页,页面上“Microsoft Entra 身份验证”被选中。

启用 Microsoft Entra 身份验证后,可以按照相同的步骤更改哪些托管标识可以对 SQL Server VM 进行身份验证。

注意

错误 The selected managed identity does not have enough permissions for Microsoft Entra authentication 指示未正确将权限分配给所选标识。 请查看授予权限部分以分配适当的权限。

限制

请考虑以下限制:

  • Microsoft Entra 身份验证仅支持在注册到 SQL IaaS 代理扩展的 Windows VM 上运行的 SQL Server 2022(部署到任何云)。 仅支持 SQL IaaS 代理扩展支持的应用场景,例如默认实例或单个命名实例。 不支持故障转移群集实例。
  • 你选择对 SQL Server 进行身份验证的标识须具有 Microsoft Entra ID 中的“目录读取者”角色或以下三个 Microsoft Graph 应用程序权限(应用角色):User.Read.AllGroupMember.Read.AllApplication.Read.All
  • 启用 Microsoft Entra 身份验证后,无法将其禁用。
  • 目前,不支持使用 FIDO2 方法通过 Microsoft Entra 身份验证对 Azure VM 上的 SQL Server 进行身份验证。

后续步骤

查看 SQL Server 的安全最佳做法。

有关其他与在 Azure VM 中运行 SQL Server 相关的文章,请参阅 Azure 虚拟机上的 SQL Server 概述。 如果对 SQL Server 虚拟机有任何疑问,请参阅常见问题解答

有关详细信息,请参阅本最佳做法系列中的其他文章: