適用於 Azure SQL 的 Microsoft Entra 中的受控識別

適用於:Azure SQL 資料庫Azure SQL 受控執行個體

Microsoft Entra ID (先前稱為 Azure Active Directory) 支援兩個類型的受控識別:系統指派的受控識別 (SMI);使用者指派的受控識別 (UMI)。 如需詳細資訊,請參閱受控識別類型

SMI 會在建立時自動指派給 Azure SQL 受控執行個體。 當您搭配 Azure SQL 資料庫使用 Microsoft Entra 驗證時,必須使用 Azure 服務主體在 SQL Database 中建立 Microsoft Entra 使用者時指派 SMI。

之前,只有系 SIM 可以指派給 Azure SQL 受控執行個體或 SQL Database 伺服器身分識別。 現在可以作為執行個體或伺服器識別指派一個 UMI 至 SQL 受控執行個體或 SQL Database。

除了使用 UMI 和 SMI 作為執行個體或伺服器身分識別之外,您還可以使用 SQL 連接字串選項 Authentication=Active Directory Managed Identity 來存取資料庫。 您必須使用 CREATE USER 陳述式,從目標資料庫中的受控識別建立 SQL 使用者。 如需詳細資訊,請參閱對 SqlClient 使用 Microsoft Entra 驗證

若要擷取目前 UMI 或 SMI,以取得 Azure SQL 受控執行個體或 Azure SQL 資料庫,請參閱本文稍後的取得或設定邏輯伺服器或受控執行個體的受控識別

使用使用者指派的受控識別的優點

使用 UMI 作為伺服器身分識別有幾個優點:

  • 使用者可以彈性地為租用戶建立和維護自己的 UMI。 您可以使用 UMI 作為 Azure SQL 的伺服器身分識別。 相較於 SMI 會針對每一伺服器唯一地定義,且由系統指派的 SMI,UMI 會由使用者管理。

  • 在過去,使用 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 驗證。

  • 您需要 UMI,才能以透明資料加密在 Azure 中使用客戶管理的金鑰 (CMK) 在 Azure 中建立邏輯伺服器。 如需詳細資訊,請參閱以使用者指派的受控識別來進行客戶自控的透明資料加密

  • UMI 與邏輯伺服器或受控執行個體無關。 刪除邏輯伺服器或執行個體時,也會刪除 SMI。 UMI 不會與伺服器一起刪除。

注意

您必須啟用執行個體身分識別 (SMI 或 UMI),才能在 SQL 受控執行個體中允許支援 Microsoft Entra 驗證。 針對 SQL Database,啟用伺服器身分識別為選用,且只有當 Microsoft Entra 服務主體 (Microsoft Entra 應用程式) 會監看伺服器中的 Microsoft Entra 使用者、群組或應用程式建立和管理時才為必要。 如需詳細資訊,請參閱使用 Azure SQL 的 Microsoft Entra 服務主體

建立使用者指派的受控識別

如需如何建立 UMI 的詳細資訊,請參閱管理使用者指派的受控識別

權限

建立 UMI 後,需要某些權限,才能讓 UMI 以伺服器身分識別從 Microsoft Graph 讀取。 授與下列權限,或為 UMI 授與目錄讀取者角色。

在佈建邏輯伺服器或受控執行個體之前,應該先授與這些權限。 將權限授與 UMI 後,就會對將 UMI 指派為伺服器身分識別所建立的所有伺服器或執行個體啟用這些權限。

重要

只有全域管理員特殊權限角色管理員可以授與這些權限。

授與權限

下列 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 "Global Administrator" or "Privileged Role Administrator" role
Connect-MgGraph -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。

Screenshot of enterprise application settings in the Azure portal.

選取 UMI,然後移至 [安全性] 底下的 [權限] 設定。

Screenshot of user-assigned managed identity permissions.

取得或設定適用於邏輯伺服器或受控執行個體的受控識別

若要使用 UMI 建立伺服器,請參閱下列指南:使用使用者指派的受控識別建立 Azure SQL 邏輯伺服器

取得適用於 Azure SQL 資料庫邏輯伺服器的 SMI

Azure 入口網站會在 Azure SQL 資料庫邏輯伺服器的 [屬性] 功能表中,顯示系統指派的受控識別 (SMI) ID。

Screenshot of the Azure portal page for an Azure SQL Database logical server. In the Properties menu, the System Assigned Managed Identity is highlighted.

  • 若要擷取適用於 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 portal screenshot of selecting a user-assigned managed identity when configuring an existing server identity.

透過使用 Azure CLI 建立或設定受控識別

需要 Azure CLI 2.26.0 (或更新版本),才能使用 UMI 執行這些命令。

使用 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,或在 Azure 入口網站中使用 Azure Cloud Shell

使用 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 Resource Manager 範本 (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 入口網站來授與這些權限。