为 Azure Database for MySQL 灵活服务器设置Microsoft Entra 身份验证

本教程介绍如何为 Azure Database for MySQL 灵活服务器设置 Microsoft Entra 身份验证。

本教程中,您将学习如何:

  • 配置 Microsoft Entra Admin。
  • 使用 Microsoft Entra ID 连接到 Azure Database for MySQL 灵活服务器。

先决条件

  • 拥有有效订阅的 Azure 帐户。
  • 如果没有 Azure 订阅,可在开始前创建一个 Azure 试用帐户
  • 安装 Azure CLI 或将其升级到最新版本。 请参阅安装 Azure CLI

配置 Microsoft Entra 管理员

若要创建Microsoft Entra Admin 用户,请执行以下步骤。

  • 在 Azure 门户中,选择要为 Microsoft Entra ID 启用的 Azure Database for MySQL 灵活服务器的实例。

  • 在“安全”窗格下,选择“ 身份验证如何配置Microsoft Entra 身份验证的关系图。

  • 有三种类型的身份验证可用:

    • MySQL 身份验证 - 默认情况下,MySQL 使用内置的mysql_native_password身份验证插件,该插件使用本机密码哈希方法执行身份验证
    • 仅Microsoft Entra 身份验证 - 仅允许使用 Microsoft Entra 帐户进行身份验证。 禁用mysql_native_password身份验证,并将服务器参数aad_auth_only开启
    • MySQL 和Microsoft Entra 身份验证 - 允许使用本机 MySQL 密码或 Microsoft Entra 帐户进行身份验证。 关闭服务器参数aad_auth_only
  • 选择标识 - 选择或添加用户分配的托管标识。 为了允许 UAMI 以服务器身份从 Microsoft Graph 读取,需具备以下权限。 或者,为用户分配的托管标识提供 目录读取者 角色。

重要

只有至少具有 特权角色管理员 角色的用户才能授予这些权限。

  • 选择租户中的有效Microsoft Entra用户或Microsoft Entra组,作为您的数据库服务器的Microsoft Entra管理员

    注释

    每个 MySQL 服务器只能创建一个 Microsoft Entra 管理员,选择另一个管理员将会自动覆盖当前已配置的 Microsoft Entra 管理员。

向用户分配的托管标识授予权限

以下示例 PowerShell 脚本授予 UMI 所需的权限。 此示例向 UMI umiservertest分配权限。

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

该脚本授予 UMI 访问 User.Read.AllGroupMember.Read.AllApplication.Read.ALL 权限。

# Script to assign permissions to the UMI "umiservertest"

import-module Az.Resources
import-module Microsoft.Entra
$tenantId = '<tenantId>' # Your Azure AD tenant ID

Connect-Entra -TenantID $tenantId -Environment China
# Log in as a user with a "Global Administrator" or "Privileged Role Administrator" role
# Script to assign permissions to an existing UMI
# The following Microsoft Graph permissions are required:
#   User.Read.All
#   GroupMember.Read.All
#   Application.Read.ALL

# Search for Microsoft Graph
$AAD_SP = Get-AzADServicePrincipal -DisplayNameStartsWith "Microsoft Graph"
$AAD_SP
# Use Microsoft Graph; in this example, this is the first element $AAD_SP[0]

#Output

#ObjectId                             AppId                                DisplayName
#--------                             -----                                -----------
#47d73278-e43c-4cc2-a606-c500b66883ef 00000003-0000-0000-c000-000000000000 Microsoft Graph
#44e2d3f6-97c3-4bc7-9ccd-e26746638b6d 0bf30f3b-4a52-48df-9a82-234910c4a086 Microsoft Graph #Change

$MSIName = "<managedIdentity>";  # Name of your user-assigned
$MSI = Get-AzADServicePrincipal -DisplayNameStartsWith $MSIName
if($MSI.Count -gt 1)
{
Write-Output "More than 1 principal found, please find your principal and copy the right object ID. Now use the syntax $MSI = Get-AzureADServicePrincipal -ObjectId <your_object_id>"

# Choose the right UMI

Exit
}

# If you have more UMIs with similar names, you have to use the proper $MSI[ ]array number

# Assign the app roles

$AAD_AppRole = $AAD_SP.AppRole | Where-Object {$_.Value -eq "User.Read.All"}
New-AzADServicePrincipalAppRoleAssignment -ServicePrincipalId $MSI.Id -ResourceId $AAD_SP.Id -AppRoleId $AAD_AppRole.Id
$AAD_AppRole = $AAD_SP.AppRole | Where-Object {$_.Value -eq "GroupMember.Read.All"}
New-AzADServicePrincipalAppRoleAssignment -ServicePrincipalId $MSI.Id -ResourceId $AAD_SP.Id -AppRoleId $AAD_AppRole.Id
$AAD_AppRole = $AAD_SP.AppRole | Where-Object {$_.Value -eq "Application.Read.All"}
New-AzADServicePrincipalAppRoleAssignment -ServicePrincipalId $MSI.Id -ResourceId $AAD_SP.Id -AppRoleId $AAD_AppRole.Id

在脚本的最后步骤中,如果有更多具有相似名称的 UMI,您必须使用正确的 $MSI[ ]array 编号。 示例为 $AAD_SP.ObjectId[0]

检查用户分配的托管标识的权限

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

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

向 UMI 授予权限后,这些权限将启用于所有以 UMI 作为服务器身份创建的服务器。

使用 Microsoft Entra ID 连接到 Azure Database for MySQL 灵活服务器

1 - 使用 Microsoft Entra ID 进行身份验证

首先,使用 Azure CLI 工具通过 Microsoft Entra ID 进行身份验证。

  • 使用 az login 命令登录到 Azure 帐户。 请注意 ID 属性,该属性引用 Azure 帐户的订阅 ID:

    az login
    

该命令将启动浏览器窗口到Microsoft Entra 身份验证页。 它需要你提供 Microsoft Entra 用户 ID 和密码。

  • 如果有多个订阅,请使用 az account set 命令选择相应的订阅:

    az account set --subscription \<subscription id\>
    

2 - 检索 Microsoft Entra 访问令牌

调用 Azure CLI 工具,从步骤 1 获取 Microsoft Entra 身份验证的用户的访问令牌,以访问 Azure Database for MySQL 灵活服务器。

  • 用于获取访问令牌的 Azure CLI 示例:

    az account get-access-token --resource https://ossrdbms-aad.database.chinacloudapi.cn
    
  • 获取访问令牌的 Azure PowerShell 示例:

    $accessToken = Get-AzAccessToken -ResourceUrl https://ossrdbms-aad.database.chinacloudapi.cn
    $accessToken.Token | out-file C:\temp\MySQLAccessToken.txt
    

Microsoft Entra 返回访问令牌:

{
  "accessToken": "TOKEN",
  "expiresOn": "...",
  "subscription": "...",
  "tenant": "...",
  "tokenType": "Bearer"
}

该令牌是 Base 64 字符串,用于编码有关经过身份验证的用户的所有信息,并针对 Azure Database for MySQL 服务。

访问令牌有效性在 5 分钟到 60 分钟之间。 建议在启动登录到 Azure Database for MySQL 灵活服务器之前获取访问令牌。

  • 可以使用以下 PowerShell 命令查看令牌有效性。

    $accessToken.ExpiresOn.DateTime
    

3 - 将令牌用作使用 MySQL 登录的密码

连接时,需要使用访问令牌作为 MySQL 用户密码。

使用 MySQL CLI 连接到 Azure Database for MySQL 灵活服务器

使用 CLI 时,可以使用这种简写进行连接:

示例(Linux/macOS):

mysql -h mydb.mysql.database.chinacloudapi.cn \
  --user user@tenant.partner.onmschina.cn \
  --enable-cleartext-plugin \
  --password=`az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken`

示例(PowerShell):

mysql -h mydb.mysql.database.chinacloudapi.cn \
  --user user@tenant.partner.onmschina.cn \
  --enable-cleartext-plugin \
  --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken)

mysql -h mydb.mysql.database.chinacloudapi.cn \
  --user user@tenant.partner.onmschina.cn \
  --enable-cleartext-plugin \
  --password=$((Get-AzAccessToken -ResourceUrl https://ossrdbms-aad.database.chinacloudapi.cn).Token)

使用 MySQL Workbench 连接到 Azure Database for MySQL 灵活服务器

  • 启动 MySQL Workbench 并选择“数据库”选项,然后选择“ 连接到数据库”。
  • 在主机名字段中,输入 MySQL FQDN,例如 mysql.database.chinacloudapi.cn。
  • 在用户名字段中,输入 MySQL Microsoft Entra 管理员名称。 例如,user@tenant.partner.onmschina.cn
  • 在密码字段中,选择存储到保管库,然后从文件中粘贴访问令牌,例如C:\temp\MySQLAccessToken.txt
  • 选择高级选项卡并确保选中 “启用 Cleartext 身份验证插件”。
  • 选择“确定”以连接到数据库。

连接时的重要注意事项

  • user@tenant.partner.onmschina.cn 是您尝试连接的 Microsoft Entra 用户或组的名称
  • 请确保准确使用 Microsoft Entra 用户或组名称的拼写方式。
  • Microsoft Entra 用户和组名称区分大小写
  • 作为组进行连接时,仅使用组名称(例如 GroupName
  • 如果名称包含空格,则在每个空格之前使用 \ 以转义它

注释

“enable-cleartext-plugin” 设置——需要对其他客户端使用类似的配置,确保令牌在传输到服务器时未经过哈希处理。

现在,您已通过 Microsoft Entra 身份验证成功登录 MySQL 灵活服务器。

其他Microsoft Entra 管理员命令

  • 管理 Active Directory 服务器管理员

    az mysql flexible-server ad-admin
    
  • 创建 Active Directory 管理员

    az mysql flexible-server ad-admin create
    

    示例:使用用户 john@contoso.com、管理员 ID 00000000-0000-0000-0000-000000000000 和标识创建 Active Directory 管理员 test-identity

    az mysql flexible-server ad-admin create -g testgroup -s testsvr -u john@contoso.com -i 00000000-0000-0000-0000-000000000000 --identity test-identity
    
  • 删除 Active Directory 管理员

    az mysql flexible-server ad-admin delete
    

    示例:删除 Active Directory 管理员

    az mysql flexible-server ad-admin delete -g testgroup -s testsvr
    
  • 列出所有 Active Directory 管理员

    az mysql flexible-server ad-admin list
    

    示例:列出 Active Directory 管理员

    az mysql flexible-server ad-admin list -g testgroup -s testsvr
    
  • 指定 Active Directory 管理员

    az mysql flexible-server ad-admin show
    

    示例:获取 Active Directory 管理员

    az mysql flexible-server ad-admin show -g testgroup -s testsvr
    
  • 等待 Active Directory 管理员满足某些条件

    az mysql flexible-server ad-admin wait
    

    示例:

    • 等待 Active Directory 管理员就位

      az mysql flexible-server ad-admin wait -g testgroup -s testsvr --exists
      
    • 等待 Active Directory 管理员被删除

      az mysql flexible-server ad-admin wait -g testgroup -s testsvr -deleted
      

在 Azure Database for MySQL 中创建Microsoft Entra 用户

若要将 Microsoft Entra 用户添加到 Azure Database for MySQL 数据库,请在连接后执行以下步骤:

  1. 首先确保 Microsoft Entra 用户 <user>@yourtenant.partner.onmschina.cn 是 Microsoft Entra 租户中的有效用户。
  2. 以 Microsoft Entra Admin 用户身份登录到 Azure Database for MySQL 实例。
  3. 在 Azure Database for MySQL 中创建用户 <user>@yourtenant.partner.onmschina.cn

Example:

CREATE AADUSER 'user1@yourtenant.partner.onmschina.cn';

对于超过 32 个字符的用户名,请使用别名而不是完整用户名。

Example:

CREATE AADUSER 'userWithLongName@yourtenant.partner.onmschina.cn' as 'userDefinedShortName'; 

注释

  1. MySQL 忽略前导空格和尾随空格,因此用户名不应包含任何前导空格或尾随空格。
  2. 通过 Microsoft Entra ID 对用户进行身份验证不会向用户授予访问 Azure Database for MySQL 数据库中的对象的任何权限。 必须手动向用户授予所需的权限。

在 Azure Database for MySQL 中创建Microsoft Entra 组

若要启用 Microsoft Entra 组以访问数据库,请使用与用户相同的确切机制,但请指定组名称:

Example:

CREATE AADUSER 'Prod_DB_Readonly';

登录时,组成员使用其个人访问令牌,但使用指定为用户名的组名称登录。

与应用程序驱动程序的兼容性

支持大多数驱动程序;但是,请确保使用设置以明文形式发送密码,以便无需修改即可发送令牌。

  • C/C++

    • libmysqlclient:支持
    • mysql-connector-c++:支持
  • Java

    • 连接器/J(mysql-connector-java):支持,需要利用 useSSL 设置
  • Python

    • 连接器/Python:受支持
  • Ruby

    • mysql2:支持
  • .NET

    • mysql-connector-net:受支持,需要为mysql_clear_password添加插件
    • mysql-net/MySqlConnector:支持
  • Node.js

    • mysqljs:不支持(如果不修补则不会以明文形式发送令牌)
    • node-mysql2:支持
  • Perl

    • DBD::mysql:支持
    • Net::MySQL:不支持
  • Go

    • go-sql-driver: 支持,在连接字符串中添加?tls=true&allowCleartextPasswords=true
  • PHP

    • mysqli 扩展:支持

    • PDO_MYSQL驱动程序:支持

后续步骤