本教程介绍如何为 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 灵活服务器的实例。
在“安全”窗格下,选择“ 身份验证:
有三种类型的身份验证可用:
- 仅 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 读取,需具备以下权限。 或者,为用户分配的托管标识提供 目录读取者 角色。
- User.Read.All:允许访问 Microsoft Entra 用户信息。
- GroupMember.Read.All:允许访问 Microsoft Entra 组信息。
- Application.Read.ALL:允许访问 Microsoft Entra 服务主体(应用程序)信息。
重要
只有至少具有 特权角色管理员 角色的用户才能授予这些权限。
选择租户中的有效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 "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、管理员 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 Admin 用户身份登录到 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
- 连接器/J(mysql-connector-java):支持,需要利用
useSSL设置
- 连接器/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驱动程序:支持