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

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

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

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

先决条件

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

配置 Microsoft Entra 管理员

若要创建Microsoft Entra管理员用户,请执行以下步骤:

  • 在 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,需要以下权限。 或者,为用户分配的托管标识提供 目录读取者 角色。

Important

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

  • 选择租户中的有效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 "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
#--------                             -----                                -----------
#44444444-4444-4444-4444-444444444444 00000003-0000-0000-c000-000000000000 Microsoft Graph
#44444444-4444-4444-4444-444444444444 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

在脚本的最后步骤中,如果有更多具有类似名称的 UMIs,则必须使用正确的 $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 Flexible Server

使用 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管理员用户身份登录到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

    • Connector/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驱动程序:支持

后续步骤