使用 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 管理员”。
  3. 在客户租户中选择有效的 Microsoft Entra 用户成为 Microsoft Entra 管理员。

重要

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

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

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

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

我们将 Microsoft Entra 集成设计为可与常见 MySQL 工具(例如 mysql CLI)结合使用,这些工具并非 Microsoft Entra 感知工具,并且在连接到 MySQL 时仅支持指定用户名和密码。 我们将 Microsoft Entra 令牌作为密码传递。

目前已测试以下客户端:

  • MySQLWorkbench
  • MySQL CLI

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

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

先决条件

可以在 Azure Cloud Shell、Azure VM 或本地计算机上继续操作。 请确保已安装 Azure CLI

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

首先使用 Azure CLI 工具向 Microsoft Entra ID 进行身份验证。 对于 Azure Cloud Shell 不需要执行此步骤。

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.windows.net

上述资源值必须完全按所示方式指定。 对于其他云,可以使用以下命令查看资源值:

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.windows.net
$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.azure.com \ 
  --user user@tenant.onmicrosoft.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.azure.com
  • 在用户名字段中,输入 MySQL Microsoft Entra 管理员名称,并在该名称后面追加 MySQL 服务器名称而非 FQDN,例如 user@tenant.onmicrosoft.com@mydb
  • 在密码字段中,单击“在保管库中存储”,在其中粘贴文件中的访问令牌,例如 C:\temp\MySQLAccessToken.txt
  • 单击“高级”选项卡,确保选中“启用明文身份验证插件”
  • 单击“确定”以连接到数据库

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

  • user@tenant.onmicrosoft.com 是你尝试连接时所用的 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.onmicrosoft.com 是 Microsoft Entra 租户中的有效用户。
  2. 以 Microsoft Entra 管理员用户身份登录到 Azure Database for MySQL 实例。
  3. 在 Azure Database for MySQL 中创建用户 <user>@yourtenant.onmicrosoft.com

示例:

CREATE AADUSER 'user1@yourtenant.onmicrosoft.com';

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

示例:

CREATE AADUSER 'userWithLongName@yourtenant.onmicrosoft.com' 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 添加到连接字符串

后续步骤