使用 Azure SQL 的 Microsoft Entra 服务主体

适用于:Azure SQL 数据库Azure SQL 托管实例

Azure SQL 资源支持使用 Microsoft Entra ID(以前为 Azure Active Directory)中的服务主体和托管标识,以编程方式访问应用程序。

服务主体(Microsoft Entra 应用程序)支持

本文适用于在 Microsoft Entra ID 中注册的应用程序。 使用应用程序凭证访问 Azure SQL 支持职责分离的安全原则,使组织能够为每个连接到其数据库的应用程序配置精确的访问。 托管标识是一种特殊的服务主体形式,特别推荐使用,因为它们是无密码的,并且无需开发人员管理的凭证。

Microsoft Entra ID 进一步启用高级身份验证方案,例如 OAuth 2.0 代理流 (OBO)。 在没有委派权限时不应对应用程序本身授予数据库访问权限,在这种情况下,OBO 允许应用程序请求已注册用户的凭据。

有关 Microsoft Entra 应用程序的详细信息,请参阅 Microsoft Entra 中的应用程序和服务主体对象使用 Azure PowerShell 创建 Azure 服务主体

使用服务主体创建 Microsoft Entra 用户

在无需人工交互就能在 SQL 数据库或 SQL 托管实例中创建和维护 Microsoft Entra 主体的 Microsoft Entra 应用程序自动化流程中,支持此功能非常有用。 服务主体可以是 SQL 逻辑服务器或 SQL 托管实例的 Microsoft Entra 管理员(作为组成员或作为单个标识)。 应用程序可以在 SQL 数据库或 SQL 托管实例中自动创建 Microsoft Entra 对象,从而完全自动化数据库用户创建。

启用服务主体创建 Microsoft Entra 用户

使用应用程序访问 Azure SQL 时,默认情况下,创建 Microsoft Entra 用户和登录名需要未分配给服务主体或托管标识的权限:能够从 Microsoft Graph 读取租户中的用户、组和应用程序。 这些权限是 SQL 引擎验证在 CREATE LOGINCREATE USER 中指定的标识时所必需的,并拉取重要信息,包括标识的对象或应用程序 ID,这些信息用于创建登录名或用户。

当 Microsoft Entra 用户执行这些命令时,Azure SQL 的 Microsoft 应用程序使用委托的权限来模拟登录用户,并使用其权限查询 Microsoft Graph。 服务主体无法使用此流,因为一个应用程序无法模拟另一个应用程序。 相反,SQL 引擎会尝试使用其服务器标识,该标识是分配给 SQL 托管实例、Azure SQL 逻辑服务器或 Azure Synapse 工作区的主托管标识。 服务器标识必须存在且具有 Microsoft Graph 查询权限,否则操作将失败。

以下步骤说明如何将托管标识分配给服务器,并向其分配 Microsoft Graph 权限,以允许服务主体在数据库中创建 Microsoft Entra 用户和登录名。

  1. 分配服务器标识。 服务器标识可以是系统分配的托管标识,也可以是用户分配的托管标识。 有关详细信息,请参阅 Microsoft Entra ID 中适用于 Azure SQL 的用户分配的托管标识

    • 以下 PowerShell 命令创建使用系统分配的托管标识预配的新逻辑服务器:
    New-AzSqlServer -ResourceGroupName <resource group> -Location <Location name> -ServerName <Server name> -ServerVersion "12.0" -SqlAdministratorCredentials (Get-Credential) -AssignIdentity
    

    有关详细信息,请参阅 SQL 托管实例的 New-AzSqlServer 命令或 New-AzSqlInstance 命令。

    • 对于现有逻辑服务器,请执行以下命令,向其添加系统分配的托管标识:
    Set-AzSqlServer -ResourceGroupName <resource group> -ServerName <Server name> -AssignIdentity
    

    有关详细信息,请参阅 SQL 托管实例的 Set-AzSqlServer 命令或 Set-AzSqlInstance 命令。

    注意

    也可以使用 REST API 和 CLI 命令分配服务器标识。 有关详细信息,请参阅 az sql server createaz sql server update服务器 - REST API

  2. 授予服务器标识查询 Microsoft Graph 的权限。 可以通过多种方式完成此操作:通过将标识添加到 Microsoft Entra Directory 读者角色、为标识分配单个 Microsoft Graph 权限,或将标识添加到具有目录读取者角色的可分配角色的组:

    • 将服务器标识添加到可分配角色的组

      在生产环境中,建议租户管理员创建可分配角色的组,并向其分配目录读取者角色。 然后,组所有者可以将服务器标识添加到组,从而继承这些权限。 现在不需要全局管理员特权角色管理员向每个单独的服务器标识授予权限,使管理员能够将权限分配委托给此方案的组所有者。 有关详细信息,请参阅 Azure SQL 的 Microsoft Entra ID 中的目录读取者角色

    • 为服务器标识分配 Microsoft Graph 权限

      若要将单个 Microsoft Graph 权限分配给服务器标识,必须具有 Microsoft Entra 全局管理员特权管理员角色。 建议不要分配目录读取者角色,因为该角色中包含了服务器标识不需要的权限。 仅分配单个 Microsoft Graph 读取权限会限制服务器标识在租户中的权限,并维持最低权限原则。 有关说明,请参阅 Microsoft Entra ID 中用于 Azure SQL 的用户分配的托管标识

    • 将服务器标识添加到目录读取者角色

      若要将服务器标识添加到目录读取者角色,你必须是 Microsoft Entra 全局管理员特权角色管理员角色的成员。 在生产环境中,不建议使用此选项,原因有两个:目录读取者角色提供的权限比服务器标识所需的权限更多,并且对于每个服务器标识,角色分配流程仍需要管理员批准(与使用组不同)。 按照预配 Microsoft Entra 管理员(SQL 托管实例)一文中提供的 SQL 托管实例说明进行操作。

故障排除

进行故障排除时,可能会遇到以下错误:

Msg 33134, Level 16, State 1, Line 1
Principal 'test-user' could not be resolved.
Error message: 'Server identity is not configured. Please follow the steps in "Assign an Azure AD identity to your server and add Directory Reader permission to your identity" (https://aka.ms/sqlaadsetup)'

此错误表示服务器标识尚未创建或尚未对其分配 Microsoft Graph 权限。 请执行相关步骤,为逻辑服务器分配标识为逻辑服务器标识分配目录读取者权限

限制

  • 服务主体无法跨租户边界进行身份验证。 尝试使用在不同租户中创建的 Microsoft Entra 应用程序访问 SQL 数据库或 SQL 托管实例的操作失败。

  • 将 Microsoft Entra 应用程序设置为 Azure SQL 的 Microsoft Entra 管理员时,需要使用 Az.Sql 2.9.0 模块或更高版本。 确保已升级到最新模块。

后续步骤