使用 Microsoft Entra ID 进行 MySQL 身份验证

适用于:Azure Database for MySQL - 单一服务器

重要

Azure Database for MySQL 单一服务器即将停用。 强烈建议升级到 Azure Database for MySQL 灵活服务器。 若要详细了解如何迁移到 Azure Database for MySQL 灵活服务器,请参阅《Azure Database for MySQL 单一服务器将会怎么样?

本文将介绍如何配置 Azure Database for MySQL 的 Microsoft Entra ID 访问,以及如何使用 Microsoft Entra 令牌进行连接。

重要

Microsoft Entra 身份验证仅适用于 MySQL 5.7 及更高版本。

设置 Microsoft Entra 管理员用户

只有 Microsoft Entra 管理员用户才能为基于 Microsoft Entra ID 的身份验证创建/启用用户。 若要创建 Microsoft Entra 管理员用户,请按照以下步骤操作

  1. 在 Azure 门户中,选择要启用 Microsoft Entra ID 的 Azure Database for MySQL 实例。
  2. 在“设置”下,选择“Active Directory 管理员”:

set Microsoft Entra administrator

  1. 在客户租户中选择有效的 Microsoft Entra 用户成为 Microsoft Entra 管理员。

重要

设置管理员时,将向具有完全管理员权限的 Azure Database for MySQL 服务器添加新用户。

每个 MySQL 服务器只能创建一个 Microsoft Entra 管理员,选择另一个管理员后,将会覆盖为服务器配置的现有 Microsoft Entra 管理员。

配置管理员后,现在就可以登录了:

使用 Microsoft Entra ID 连接到 Azure Database for MySQL

以下概要关系图概述了将 Microsoft Entra 身份验证与 Azure Database for MySQL 配合使用的工作流:

authentication flow

我们设计了 Microsoft Entra 集成以便使用常见的 MySQL 工具(例如 mysql CLI),这些工具不能识别 Microsoft Entra,并且仅支持在连接到 MySQL 时指定用户名和密码。 我们将 Microsoft Entra 令牌作为密码传递,如上图所示。

目前已测试以下客户端:

  • MySQLWorkbench
  • MySQL CLI

我们还测试了最常用的应用程序驱动程序,你可以在本页面末尾查看详细信息。

以下是用户/应用程序使用 Microsoft Entra ID 进行身份验证所需的步骤:

先决条件

请确保已安装 Azure CLI

步骤 1:使用 Microsoft Entra ID 进行身份验证

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

az login

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

步骤 2:检索 Microsoft Entra 访问令牌

调用 Azure CLI 工具,获取步骤 1 中经过 Microsoft Entra 身份验证的用户的访问令牌,以访问 Azure Database for MySQL。

示例:

az account get-access-token --resource https://ossrdbms-aad.database.chinacloudapi.cn

上述资源值必须完全按所示方式指定。 可以使用以下命令来查看资源值:

az cloud show

对于 Azure CLI 版本 2.0.71 和更高版本,可在以下更方便的版本中指定该命令:

az account get-access-token --resource-type oss-rdbms

使用 PowerShell 时,可以使用以下命令获取访问令牌:

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

身份验证成功后,Microsoft Entra ID 将返回访问令牌:

{
  "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 用户密码。 使用 GUI 客户端(如 MySQLWorkbench)时,可以使用上述方法来检索令牌。

使用 MySQL CLI

使用 CLI 时,可以使用下面的方法快速连接:

示例 (Linux/macOS):

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

使用 MySQL Workbench

  • 启动 MySQL Workbench 并单击“数据库”选项,然后单击“连接到数据库”
  • 在“主机名”字段中,输入 MySQL FQDN(例如,mydb.mysql.database.chinacloudapi.cn)
  • 在用户名字段中,输入 MySQL Microsoft Entra 管理员名称,并在该名称后面追加 MySQL 服务器名称而非 FQDN,例如 user@tenant.partner.onmschina.cn@mydb
  • 在密码字段中,单击“在保管库中存储”,在其中粘贴文件中的访问令牌,例如 C:\temp\MySQLAccessToken.txt
  • 单击“高级”选项卡,确保选中“启用明文身份验证插件”
  • 单击“确定”以连接到数据库

连接时的重要注意事项如下:

  • user@tenant.partner.onmschina.cn 是你尝试连接时所用的 Microsoft Entra 用户或组的名称
  • 始终在 Microsoft Entra 用户/组名称后面追加服务器名称(例如 @mydb
  • 请确保使用 Microsoft Entra 用户或组名称的准确拼写方式
  • Microsoft Entra 的用户名和组名区分大小写
  • 在作为组进行连接时,请只使用组名称(例如 GroupName@mydb
  • 如果名称包含空格,请在每个空格前使用 \ 对该空格进行转义

请注意“enable-cleartext-plugin”设置 - 需要对其他客户端使用类似的配置,以确保令牌在不进行哈希处理的情况下发送到服务器。

现在,你已使用 Microsoft Entra 身份验证方法向 MySQL 服务器进行了身份验证。

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

要向 Azure Database for MySQL 数据库添加 Microsoft Entra 用户,请在连接后执行以下步骤(请参阅后面有关如何连接的部分):

  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

示例:

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

如果用户名超过 32 个字符,建议改用别名,以供连接时使用:

示例:

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 组以访问数据库,请使用与用户相同的机制,只不过要指定组名称:

示例:

CREATE AADUSER 'Prod_DB_Readonly';

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

令牌验证

Azure Database for MySQL 中的 Microsoft Entra 身份验证可确保 MySQL 服务器中存在用户,并通过验证令牌的内容来检查令牌的有效性。 执行以下令牌验证步骤:

  • 令牌由 Microsoft Entra ID 签名,并且未被篡改
  • 令牌由 Microsoft Entra ID 为与服务器关联的租户颁发
  • 令牌尚未过期
  • 令牌是否用于 Azure Database for MySQL 资源(而不是其他 Azure 资源)

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

大部分驱动程序均受支持,但请确保使用以明文形式发送密码的设置,这样,无需进行修改就能发送令牌。

  • 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 添加到连接字符串

后续步骤