Microsoft Entra 中用于 Azure SQL 的托管标识

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

Microsoft Entra ID(旧称 Azure Active Directory)支持两种类型的托管标识:系统分配的托管标识 (SMI) 和用户分配的托管标识 (UMI)。 如需更多信息,请参阅托管标识类型

SMI 会在创建后自动分配给 Azure SQL 托管实例。 当您使用 Microsoft Entra 身份验证与 Azure SQL Database 配合使用时,在 Azure 服务主体在 SQL 数据库中创建 Microsoft Entra 用户时,必须分配一个 SMI。

以前,只能将 SMI 分配给 Azure SQL Managed Instance,或 SQL 数据库服务器标识。 现在,可以将 UMI 分配到SQL Managed Instance或 SQL 数据库作为实例或服务器标识。

除了将 UMI 和 SMI 用作实例或服务器标识外,还可以使用它们通过 SQL 连接字符串选项 Authentication=Active Directory Managed Identity 来访问数据库。 需要使用 CREATE USER 语句通过目标数据库中的托管标识创建 SQL 用户。 有关详细信息,请参阅使用 Microsoft Entra 身份验证与 SqlClient

若要检索 Azure SQL 托管实例或 Azure SQL 数据库的当前 UMIs 或 SMI,请参阅本文后面的 获取或设置逻辑服务器或托管实例的托管标识

使用用户分配的托管标识的优势

将 UMI 用作服务器标识可提供以下几个优势:

  • 用户可以灵活地为租户创建和保留自己的 UMI。 UMI 可用作 Azure SQL 的服务器标识。 自行管理 UMI,而系统单独定义并为每个服务器分配 SMI。

  • 过去,当使用 SMI 作为服务器或实例标识时,需要 Microsoft Entra ID 目录读取者角色。 由于引入了通过 Microsoft Graph 访问 Microsoft Entra ID 的方法,关注于向 SMI 或 UMI 授予高级权限(例如“目录读取者”角色)的用户可以选择授予较低级别的权限,以便服务器或实例标识可以访问 Microsoft Graph。

    有关提供目录读取者权限及其功能的详细信息,请参阅 Azure SQL 的 Microsoft Entra ID 中的目录读取者角色

  • 用户可以选择特定的 UMI 作为租户中所有数据库或托管实例的服务器或实例标识。 或者,可以将多个 UMI 分配给不同的服务器或实例。

    可以在不同的服务器中使用 UMIs 来表示不同的功能。 例如,一个 UMI 在一个服务器中提供透明数据加密 (TDE),一个 UMI 在另一台服务器中提供 Microsoft Entra 身份验证。

  • 要使用客户管理的密钥 (CMK) 来创建配置了 TDE 的 Azure 中的逻辑服务器,UMI 是必需的。 有关详细信息,请参阅使用用户分配的托管标识进行客户管理的透明数据加密

  • UMI 独立于逻辑服务器或托管实例。 删除逻辑服务器或实例时,系统也会删除 SMI。 UMI 不会随服务器一起删除。

注意

必须启用实例标识(SMI 或 UMI)才能支持 SQL 托管实例中的 Microsoft Entra 身份验证。 对于 SQL 数据库,启用服务器标识是可选的,并且仅当 Microsoft Entra 服务主体(Microsoft Entra 应用程序)监督在服务器中创建和管理 Microsoft Entra 用户、组或应用程序时才需要。 有关详细信息,请参阅 Microsoft Entra 服务主体与 Azure SQL

创建用户分配的托管标识

有关如何创建 UMI 的信息,请参阅管理用户分配的托管标识

权限

创建 UMI 后,必须授予一些权限,以允许 UMI 从 Microsoft Graph 作为服务器标识进行读取。 授予以下权限,或授予 UMI Directory Readers角色。

在预配逻辑服务器或托管实例之前,应授予这些权限。 向 UMI 授予权限后,使用 UMI 分配为服务器标识创建的所有服务器或实例将应用这些权限。

重要

只有特权角色管理员或更高角色才能授予这些权限。

SMI 的权限

SMI 需要相同的Microsoft Graph应用程序权限。

仅适用于 Azure SQL 数据库:使用 SMI 提供了不显式预配 Microsoft Graph 权限的机会。 仍可以使用 T-SQL 语法创建 Microsoft Entra 用户,而无需具有所需的 Microsoft Graph 权限 CREATE USER 。 这将要求使用 CREATE SID 一文中所述的TYPE语法和语法。

CREATE USER
    {
    Microsoft_Entra_principal FROM EXTERNAL PROVIDER [ WITH <limited_options_list> [ ,... ] ]
    | Microsoft_Entra_principal WITH <options_list> [ ,... ]
    }
 [ ; ]

<limited_options_list> ::=
      DEFAULT_SCHEMA = schema_name
    | OBJECT_ID = 'objectid'
<options_list> ::=
      DEFAULT_SCHEMA = schema_name
    | SID = sid
    | TYPE = { X | E }

上述语法允许在不进行验证的情况下创建 Microsoft Entra 用户。为使其生效,必须提供 Microsoft Entra 主体的 ,并在 T-SQL 语句中将其用作 Object Id,如 SID 中所述。

对象 ID 的有效性检查由运行 T-SQL 语句的用户负责。

授予权限

以下示例 PowerShell 脚本为托管标识授予必要的权限。 此示例将为用户分配的托管标识 umiservertest 分配权限。

若要运行脚本,必须以具有“特权角色管理员”或更高角色的用户身份登录。

该脚本授予托管标识 User.Read.AllGroupMember.Read.AllApplication.Read.ALL 的权限,以访问 Microsoft Graph

# Script to assign permissions to an existing UMI
# The following required Microsoft Graph permissions will be assigned:
#   User.Read.All
#   GroupMember.Read.All
#   Application.Read.All

Import-Module Microsoft.Graph.Authentication
Import-Module Microsoft.Graph.Applications

$tenantId = "<tenantId>"        # Your tenant ID
$MSIName = "<managedIdentity>"; # Name of your managed identity

# Log in as a user with the "Privileged Role Administrator" role
Connect-MgGraph -Environment China -TenantId $tenantId -Scopes "AppRoleAssignment.ReadWrite.All,Application.Read.All"

# Search for Microsoft Graph
$MSGraphSP = Get-MgServicePrincipal -Filter "DisplayName eq 'Microsoft Graph'";
$MSGraphSP

# Sample Output

# DisplayName     Id                                   AppId                                SignInAudience      ServicePrincipalType
# -----------     --                                   -----                                --------------      --------------------
# Microsoft Graph 47d73278-e43c-4cc2-a606-c500b66883ef 00000003-0000-0000-c000-000000000000 AzureADMultipleOrgs Application

$MSI = Get-MgServicePrincipal -Filter "DisplayName eq '$MSIName'"
if($MSI.Count -gt 1)
{
Write-Output "More than 1 principal found with that name, please find your principal and copy its object ID. Replace the above line with the syntax $MSI = Get-MgServicePrincipal -ServicePrincipalId <your_object_id>"
Exit
}

# Get required permissions
$Permissions = @(
  "User.Read.All"
  "GroupMember.Read.All"
  "Application.Read.All"
)

# Find app permissions within Microsoft Graph application
$MSGraphAppRoles = $MSGraphSP.AppRoles | Where-Object {($_.Value -in $Permissions)}

# Assign the managed identity app roles for each permission
foreach($AppRole in $MSGraphAppRoles)
{
    $AppRoleAssignment = @{
        principalId = $MSI.Id
        resourceId = $MSGraphSP.Id
        appRoleId = $AppRole.Id
    }

    New-MgServicePrincipalAppRoleAssignment `
    -ServicePrincipalId $AppRoleAssignment.PrincipalId `
    -BodyParameter $AppRoleAssignment -Verbose
}

查看用户指定的托管标识的权限

若要检查 UMI 的权限,请转到 Azure 门户。 在“Microsoft Entra ID”资源中,转到“企业应用程序”。 选择所有应用程序作为应用程序类型,然后搜索您创建的 UMI。

Azure 门户中企业应用程序设置的屏幕截图。

选择 UMI,然后转到“安全”下的“权限”设置。

用户分配的托管标识权限的屏幕截图。

获取或设置逻辑服务器或 SQL 托管实例的托管标识

若要使用 UMI 创建服务器或实例,请参阅以下指南:

设置 SMI

若要在 Azure 门户中为 Azure SQL 数据库逻辑服务器设置系统托管标识,请执行以下步骤:

  1. 转到你的 SQL 服务器或 SQL 托管实例资源。

  2. 在“安全性”下,选择“标识”。

  3. 系统分配的托管标识下,将 “状态 ”设置为 “打开”:

    Azure 门户中逻辑服务器的标识窗格的屏幕截图。

  4. 选择 保存 以保存更改。

若要在 Azure 门户中为 Azure SQL 托管实例设置系统托管标识,请执行以下步骤:

  1. 转到 SQL 托管实例 资源。

  2. 在“安全性”下,选择“标识”。

  3. 系统分配的托管标识下,将 状态 设置为 “打开”。

    Azure 门户中 SQL 托管实例的标识窗格的屏幕截图。

  4. 选择 保存 以保存更改。

获取 SMI

Azure 门户在 Azure SQL 数据库逻辑服务器的“属性”菜单中显示系统分配的托管身份 (SMI) ID。

Azure SQL 数据库逻辑服务器的 Azure 门户页的屏幕截图。在“属性”菜单中,突出显示了系统分配的托管标识。

  • 若要检索 Azure SQL 托管实例或 Azure SQL 数据库的 UMIs,请使用本文后面的 PowerShell 或 Azure CLI 示例。
  • 若要检索 Azure SQL 托管实例的 SMI,请使用本文后面的 PowerShell 或 Azure CLI 示例。

在 Azure 门户中设置用户托管标识

Azure 门户中设置 Azure SQL 数据库逻辑服务器或 Azure SQL 托管实例的用户管理的身份:

  1. 转到你的 SQL 服务器或 SQL 托管实例资源。
  2. 安全性下,选择身份设置。
  3. 在“用户分配的托管标识”下,选择“添加”。
  4. 选择一个订阅,然后为“主标识”选择订阅的托管标识。 然后选择“选择”按钮。

Azure 门户屏幕截图,显示配置现有服务器标识时选择用户分配的托管标识。

使用 Azure CLI 创建或设置托管标识

使用 UMI 运行这些命令需要 Azure CLI 2.26.0(或更高版本)。

使用 Azure CLI 的 Azure SQL 数据库托管身份验证

  • 若要使用用户分配的托管标识预配新服务器,请使用 az sql server create 命令。

  • 若要获取逻辑服务器的托管标识,请使用 az sql server show 命令。

    • 例如,若要检索逻辑服务器的用户分配的托管标识,请查找每个服务器的 principalId

      az sql server show --resource-group "resourcegroupnamehere" --name "sql-logical-server-name-here" --query identity.userAssignedIdentities
      
    • 若要检索Azure SQL 数据库逻辑服务器的系统分配的托管标识,请执行以下操作:

      az sql server show --resource-group "resourcegroupnamehere" --name "sql-logical-server-name-here" --query identity.principalId
      
  • 若要更新 UMI 的服务器设置,请使用 az sql server update 命令。

使用 Azure CLI 的 Azure SQL 托管实例托管标识

  • 若要使用 UMI 预配新托管实例,请使用 az sql mi create 命令。

  • 若要获取托管实例的系统分配和用户分配的托管标识,请使用 az sql mi show 命令。

    • 例如,若要检索托管实例的 UMI,请查找每个实例的标识符 principalId

      az sql mi show --resource-group "resourcegroupnamehere" --name "sql-mi-name-here" --query identity.userAssignedIdentities
      
    • 检索托管实例的 SMI:

      az sql mi show --resource-group "resourcegroupnamehere" --name "sql-mi-name-here" --query identity.principalId
      
  • 若要更新 UMI 的托管实例设置,请使用 az sql mi update 命令。

使用 PowerShell 创建或设置托管标识

将 PowerShell 与 UMI 一起使用时,需要 Az.Sql 模块 3.4 或更高版本。 建议使用最新版本的 PowerShell

使用 PowerShell 管理的 Azure SQL 数据库标识

  • 若要使用 UMI 预配新服务器,请使用 New-AzSqlServer 命令。

  • 若要获取逻辑服务器的托管标识,请使用 Get-AzSqlServer 命令。

    • 例如,若要检索逻辑服务器的 UMIs,请查找每个项目的 principalId

      $MI = Get-AzSqlServer -ResourceGroupName "resourcegroupnamehere" -Name "sql-logical-server-name-here"
      $MI.Identity.UserAssignedIdentities | ConvertTo-Json
      
    • 获取 Azure SQL 数据库逻辑服务器的 SMI 信息:

      $MI = Get-AzSqlServer -ResourceGroupName "resourcegroupnamehere" -Name "sql-logical-server-name-here"
      $MI.Identity.principalId
      
  • 若要更新 UMI 的服务器设置,请使用 Set-AzSqlServer 命令。

使用 PowerShell 的 Azure SQL 托管实例托管标识

  • 若要使用 UMI 预配新托管实例,请使用 New-AzSqlInstance 命令。

  • 若要获取托管实例的托管标识,请使用 Get-AzSqlInstance 命令。

    • 例如,若要检索托管实例的唯一分子标识符 (UMIs),请查找每个实例的 principalId

      $MI = Get-AzSqlInstance -ResourceGroupName "resourcegroupnamehere" -Name "sql-mi-name-here"
      $MI.Identity.UserAssignedIdentities | ConvertTo-Json
      
    • 检索托管实例的 SMI:

      $MI = Get-AzSqlInstance -ResourceGroupName "resourcegroupnamehere" -Name "sql-mi-name-here"
      $MI.Identity.principalId
      
  • 若要更新 UMI 的托管实例设置,请使用 Set-AzSqlInstance 命令。

使用 REST API 创建或设置托管标识

若要更新服务器的 UMI 设置,可使用在使用用户分配的托管标识创建逻辑服务器使用用户分配的托管标识创建托管实例中使用的 REST API 预配脚本。 使用更新后的用户分配托管标识属性重新运行指南中要更新的预配命令。

使用 ARM 模板创建或设置托管标识

若要更新服务器的 UMI 设置,可使用在使用用户分配的托管标识创建逻辑服务器使用用户分配的托管标识创建托管实例中使用的 Azure 资源管理器模板(ARM 模板)。 在更新用户分配的托管标识属性后,重新运行指南中的预配命令。

注意

无法通过重新运行 ARM 模板的预配命令来更改服务器管理员或密码,也无法通过这种方式来更改 Microsoft Entra 管理员。

限制和已知问题

  • 创建托管实例后,Azure 门户中的“Microsoft Entra 管理员”窗格会显示警告:Managed Instance needs permissions to access Microsoft Entra ID. Click here to grant "Read" permissions to your Managed Instance. 如果向 UMI 提供了前文讨论的相应权限,则可忽略此警告。
  • 如果使用 SMI 或 UMI 作为服务器或实例标识,则删除标识会使服务器或实例无法访问Microsoft Graph。 Microsoft Entra身份验证和其他函数失败。 若要还原 Microsoft Entra 功能,请用相应的权限将新的 SMI 或 UMI 分配给服务器。
  • 若要授予通过 SMI 或 UMI 访问 Microsoft Graph 的权限,需要使用 PowerShell。 不能通过 Azure 门户授予这些权限。