通过


为Azure Arc启用的SQL Server设置托管标识和Microsoft Entra身份验证

适用于: SQL Server 2025 (17.x)

本文提供了有关为Azure Arc启用的SQL Server设置和配置Microsoft Entra ID托管标识的分步说明。

有关 SQL Server 的托管标识的概述,请参阅 由 Azure Arc 启用的 SQL Server 托管标识

先决条件

在使用 Azure Arc 为 SQL Server 启用托管身份之前,请确保您满足以下先决条件:

启用主要托管标识

如果已将用于SQL Server的 Azure 扩展安装到服务器,可以直接从 Azure 门户为 SQL Server 实例启用主托管标识。 还可以通过更新注册表手动启用主托管标识,但应谨慎行事。

若要在 Azure 门户中启用主托管标识,请执行以下步骤:

  1. 转到 Azure 门户中由 Azure Arc 启用的 SQL Server 资源。

  2. Settings 下,选择 Microsoft Entra ID 和 Purview打开 Microsoft Entra ID 和 Purview 页。

    注释

    如果未看到 启用 Microsoft Entra ID 身份验证 选项,请确保 SQL Server 实例已连接到 Azure Arc,并且已安装最新的 SQL 扩展。

  3. Microsoft Entra ID 和 Purview 页上,选中 使用主托管标识 的框,然后使用 保存 应用配置:

    Azure门户中Microsoft Entra选项的截图。

向标识授予应用程序权限

重要

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

若要为SQL Server实例启用Microsoft Entra身份验证,每个系统分配的托管标识都需要 User.Read.AllGroupMember.Read.AllApplication.Read.All 权限才能查询Microsoft Graph。 有关这些权限的详细信息,请参阅:

这些权限是应用程序级权限(应用角色),必须直接分配给每个托管标识。 他们不能手动分配到 Microsoft Entra 安全组,也不能通过组成员身份将权限授予成员。 对于具有许多计算机的环境,另一种方法是将 Directory Readers 角色分配给一个可分配的 Microsoft Entra 安全组,并将托管标识作为成员添加进去。 与应用角色权限不同,可以在组级别授予此Microsoft Entra角色,从而大规模简化管理。 但是,Directory Readers对所有目录对象授予广泛的读取访问权限,大大超过了三个目标图形 API权限。 对于需要最低特权访问的生产环境,不建议使用 “目录读取者” 角色。

以下 PowerShell 脚本向托管标识授予所需的权限。 请确保此脚本在 PowerShell 7.5 或更高版本上运行,并且已安装 Microsoft.Graph 模块 2.28 或更高版本。

# Set your Azure tenant and managed identity name
$tenantID = '<Enter-Your-Azure-Tenant-Id>'
$managedIdentityName = '<Enter-Your-Arc-HostMachine-Name>'

# Connect to Microsoft Graph
try {
    Connect-MgGraph -TenantId $tenantID -ErrorAction Stop
    Write-Output "Connected to Microsoft Graph successfully."
}
catch {
    Write-Error "Failed to connect to Microsoft Graph: $_"
    return
}

# Get Microsoft Graph service principal
$graphAppId = '00000003-0000-0000-c000-000000000000'
$graphSP = Get-MgServicePrincipal -Filter "appId eq '$graphAppId'"
if (-not $graphSP) {
    Write-Error "Microsoft Graph service principal not found."
    return
}

# Get the managed identity service principal
$managedIdentity = Get-MgServicePrincipal -Filter "displayName eq '$managedIdentityName'"
if (-not $managedIdentity) {
    Write-Error "Managed identity '$managedIdentityName' not found."
    return
}

# Define roles to assign
$requiredRoles = @(
    "User.Read.All",
    "GroupMember.Read.All",
    "Application.Read.All"
)

# Assign roles using scoped syntax
foreach ($roleValue in $requiredRoles) {
    $appRole = $graphSP.AppRoles | Where-Object {
        $_.Value -eq $roleValue -and $_.AllowedMemberTypes -contains "Application"
    }

    if ($appRole) {
        try {
            New-MgServicePrincipalAppRoleAssignment   -ServicePrincipalId $managedIdentity.Id `
                -PrincipalId $managedIdentity.Id `
                -ResourceId $graphSP.Id `
                -AppRoleId $appRole.Id `
                -ErrorAction Stop

            Write-Output "Successfully assigned role '$roleValue' to '$managedIdentityName'."
        }
        catch {
            Write-Warning "Failed to assign role '$roleValue': $_"
        }
    }
    else {
        Write-Warning "Role '$roleValue' not found in Microsoft Graph AppRoles."
    }
}

创建登录名和用户

按照 Microsoft Entra 教程中的步骤为托管标识创建登录名和用户。