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

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

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

SMI 会在创建后自动分配给 Azure SQL 托管实例。 如果使用 Azure SQL 数据库进行 Microsoft Entra 身份验证,使用 Azure 服务主体在 SQL 数据库中创建 Microsoft Entra 用户时,必须分配 SMI。

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

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

若要检索 Azure SQL 托管实例或 Azure SQL 数据库的当前 UMI 或 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 分配给不同的服务器或实例。

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

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

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

注意

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

创建用户分配的托管标识

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

权限

创建 UMI 后,需要一些权限才能允许 UMI 作为服务器标识从 Microsoft Graph 中读取。 授予以下权限,或授予 UMI 目录读者角色。

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

重要

只有全局管理员特权角色管理员可以授予这些权限。

授予权限

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

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

该脚本向托管标识授予访问 Microsoft GraphUser.Read.AllGroupMember.Read.AllApplication.Read.ALL 权限。

# 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 "Global Administrator" or "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,然后转到“安全”下的“权限”设置。

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

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

若要使用 UMI 创建服务器,请参阅以下指南:使用用户分配的托管标识创建 Azure SQL 逻辑服务器

获取 Azure SQL 数据库逻辑服务器的 SMI

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

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

  • 若要检索 Azure SQL 托管实例或 Azure SQL 数据库的 UMI,请使用以下 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 命令。

    • 例如,若要检索逻辑服务器的 UMI,请查找每个服务器的 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 命令。

    • 例如,若要检索托管实例的 UMI,请查找每个实例的 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 门户授予这些权限。