本教程介绍如何为 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 灵活服务器的实例。
在“安全”窗格下,选择“ 身份验证:
从三种类型的身份验证中进行选择:
- 仅 MySQL 身份验证 - 默认情况下,MySQL 使用内置
mysql_native_password身份验证插件,该插件使用本机密码哈希方法执行身份验证。 -
仅Microsoft Entra身份验证 - 仅允许使用Microsoft Entra帐户进行身份验证。 禁用
mysql_native_password身份验证,并启用服务器参数aad_auth_only。 -
MySQL 和Microsoft Entra身份验证 - 允许使用本机 MySQL 密码或Microsoft Entra帐户进行身份验证。
关闭服务器参数
aad_auth_only。
- 仅 MySQL 身份验证 - 默认情况下,MySQL 使用内置
选择标识 - 选择或添加用户分配的托管标识。 若要允许 UAMI 以服务器标识身份读取 Microsoft Graph,需要以下权限。 或者,为用户分配的托管标识提供 目录读取者 角色。
- User.Read.All:允许访问 Microsoft Entra 用户信息。
- GroupMember.Read.All:允许访问 Microsoft Entra 组信息。
- Application.Read.ALL:允许访问 Microsoft Entra 服务主体(应用程序)信息。
Important
只有至少具有 特权角色管理员 角色的用户才能授予这些权限。
选择租户中的有效Microsoft Entra用户或Microsoft Entra组,作为您的数据库服务器的Microsoft Entra管理员。
注释
每个 MySQL 服务器只能创建一个Microsoft Entra管理员。 选择另一位管理员会替换服务器上已配置的现有 Microsoft Entra 管理员。
向用户分配的托管标识授予权限
以下示例 PowerShell 脚本授予 UMI 所需的权限。 此示例向 UMI umiservertest分配权限。
若要运行脚本,请使用特权角色管理员角色以用户身份登录。
该脚本授予 UMI 访问 User.Read.All 的 GroupMember.Read.All、Application.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、管理员 ID00000000-0000-0000-0000-000000000000和标识创建Active Directory管理员test-identityaz 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数据库,请在连接后完成以下步骤:
- 确保Microsoft Entra用户
<user>@yourtenant.partner.onmschina.cn是Microsoft Entra租户中的有效用户。 - 以Microsoft Entra管理员用户身份登录到Azure Database for MySQL实例。
- 在 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';
注释
- MySQL 忽略前导空格和尾随空格,因此用户名不应包含任何前导空格或尾随空格。
- 通过 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设置
- Connector/J(mysql-connector-java):受支持,但必须使用
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
- go-sql-driver: 支持,在连接字符串中添加
PHP
mysqli扩展:支持PDO_MYSQL驱动程序:支持