Windows 可插拔身份验证是 MySQL 企业版(一种商业产品)中包含的扩展。要了解有关商业产品的更多信息,请参阅 https://www.mysqlserver.cn/products/.
适用于 Windows 的 MySQL 企业版支持一种身份验证方法,该方法在 Windows 上执行外部身份验证,使 MySQL 服务器能够使用本机 Windows 服务来验证客户端连接。已登录 Windows 的用户可以从 MySQL 客户端程序连接到服务器,并根据其环境中的信息进行连接,无需指定其他密码。
客户端和服务器在身份验证握手过程中交换数据包。通过这种交换,服务器创建一个安全上下文对象,该对象表示 Windows 操作系统中客户端的身份。此身份包括客户端帐户的名称。Windows 可插拔身份验证使用客户端的身份来检查它是否为给定帐户或组的成员。默认情况下,协商使用 Kerberos 进行身份验证,如果 Kerberos 不可用,则使用 NTLM。
Windows 可插拔身份验证提供以下功能
外部身份验证:Windows 身份验证使 MySQL 服务器能够接受来自在 MySQL 授权表之外定义的用户的连接,这些用户已登录 Windows。
代理用户支持:Windows 身份验证可以返回与客户端程序传递的外部用户名不同的用户名给 MySQL。这意味着插件可以返回定义外部 Windows 身份验证用户应该具有的权限的 MySQL 用户。例如,名为
joe
的 Windows 用户可以连接并拥有名为developer
的 MySQL 用户的权限。
下表显示了插件和库文件名。该文件必须位于 plugin_dir
系统变量指定的目录中。
表 8.19 Windows 身份验证的插件和库名称
插件或文件 | 插件或文件名 |
---|---|
服务器端插件 | authentication_windows |
客户端插件 | authentication_windows_client |
库文件 | authentication_windows.dll |
库文件仅包含服务器端插件。客户端插件内置于 libmysqlclient
客户端库中。
服务器端 Windows 身份验证插件仅包含在 MySQL 企业版中。它不包含在 MySQL 社区发行版中。客户端插件包含在所有发行版中,包括社区发行版。这使来自任何发行版的客户端能够连接到已加载服务器端插件的服务器。
以下部分提供特定于 Windows 可插拔身份验证的安装和使用信息
有关 MySQL 中可插拔身份验证的一般信息,请参阅 第 8.2.17 节,“可插拔身份验证”。有关代理用户的信息,请参阅 第 8.2.19 节,“代理用户”.
本节介绍如何安装服务器端 Windows 身份验证插件。有关安装插件的一般信息,请参阅 第 7.6.1 节,“安装和卸载插件”.
要使服务器可以使用插件库文件,该文件必须位于 MySQL 插件目录(由 plugin_dir
系统变量指定的目录)中。如有必要,请在服务器启动时通过设置 plugin_dir
的值来配置插件目录位置。
要在服务器启动时加载插件,请使用 --plugin-load-add
选项来命名包含插件的库文件。使用此插件加载方法,每次服务器启动时都必须给出此选项。例如,将以下行放入服务器 my.cnf
文件中
[mysqld]
plugin-load-add=authentication_windows.dll
修改 my.cnf
后,重新启动服务器以使新设置生效。
或者,要在运行时加载插件,请使用以下语句
INSTALL PLUGIN authentication_windows SONAME 'authentication_windows.dll';
INSTALL PLUGIN
会立即加载插件,并在 mysql.plugins
系统表中注册插件,使服务器在每次后续正常启动时加载该插件,而无需使用 --plugin-load-add
。
要验证插件安装,请检查 Information Schema PLUGINS
表或使用 SHOW PLUGINS
语句(参见 第 7.6.2 节“获取服务器插件信息”)。例如
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE '%windows%';
+------------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+------------------------+---------------+
| authentication_windows | ACTIVE |
+------------------------+---------------+
如果插件初始化失败,请检查服务器错误日志以获取诊断消息。
要将 MySQL 帐户与 Windows 身份验证插件关联,请参见 使用 Windows 可插拔身份验证。authentication_windows_use_principal_name
和 authentication_windows_log_level
系统变量提供了额外的插件控制。参见 第 7.1.8 节“服务器系统变量”。
卸载 Windows 身份验证插件的方法取决于安装方式
如果您在服务器启动时使用
--plugin-load-add
选项安装了插件,请在不使用该选项的情况下重新启动服务器。如果您在运行时使用
INSTALL PLUGIN
语句安装了插件,它将在服务器重启后保持安装状态。要卸载它,请使用UNINSTALL PLUGIN
UNINSTALL PLUGIN authentication_windows;
此外,请删除设置 Windows 插件相关系统变量的任何启动选项。
Windows 身份验证插件支持使用 MySQL 帐户,这样已登录 Windows 的用户就可以连接到 MySQL 服务器,而无需指定其他密码。假设服务器正在运行,并启用了服务器端插件,如 安装 Windows 可插拔身份验证 中所述。一旦 DBA 启用服务器端插件并设置帐户以使用它,客户端就可以使用这些帐户进行连接,而无需在他们的部分进行任何其他设置。
要在 CREATE USER
语句的 IDENTIFIED WITH
子句中引用 Windows 身份验证插件,请使用名称 authentication_windows
。假设 Windows 用户 Rafal
和 Tasha
应该被允许连接到 MySQL,以及 Administrators
或 Power Users
组中的任何用户。要设置此项,请创建一个名为 sql_admin
的 MySQL 帐户,该帐户使用 Windows 插件进行身份验证
CREATE USER sql_admin
IDENTIFIED WITH authentication_windows
AS 'Rafal, Tasha, Administrators, "Power Users"';
插件名称为 authentication_windows
。 AS
关键字后的字符串是身份验证字符串。它指定名为 Rafal
或 Tasha
的 Windows 用户被允许以 MySQL 用户 sql_admin
的身份进行身份验证,以及 Administrators
或 Power Users
组中的任何 Windows 用户。后者的组名包含一个空格,因此必须用双引号括起来。
创建 sql_admin
帐户后,已登录 Windows 的用户可以尝试使用该帐户连接到服务器
C:\> mysql --user=sql_admin
这里不需要密码。 authentication_windows
插件使用 Windows 安全 API 来检查哪个 Windows 用户正在连接。如果该用户的名称是 Rafal
或 Tasha
,或者该用户是 Administrators
或 Power Users
组的成员,则服务器会授予访问权限,并且客户端会以 sql_admin
的身份进行身份验证,并拥有授予 sql_admin
帐户的任何权限。否则,服务器会拒绝访问。
Windows 身份验证插件的身份验证字符串语法遵循以下规则
该字符串由一个或多个用户映射组成,它们用逗号分隔。
每个用户映射将 Windows 用户或组名与 MySQL 用户名相关联
win_user_or_group_name=mysql_user_name win_user_or_group_name
对于后者语法,没有给出
mysql_user_name
值,隐式值为由CREATE USER
语句创建的 MySQL 用户。因此,以下语句是等效的CREATE USER sql_admin IDENTIFIED WITH authentication_windows AS 'Rafal, Tasha, Administrators, "Power Users"'; CREATE USER sql_admin IDENTIFIED WITH authentication_windows AS 'Rafal=sql_admin, Tasha=sql_admin, Administrators=sql_admin, "Power Users"=sql_admin';
值中的每个反斜杠字符 (
\
) 必须加倍,因为反斜杠是 MySQL 字符串中的转义字符。双引号之外的开头和结尾空格将被忽略。
未加引号的
win_user_or_group_name
和mysql_user_name
值可以包含除等号、逗号或空格以外的任何字符。如果
win_user_or_group_name
或mysql_user_name
值用双引号括起来,引号之间的所有内容都是值的一部分。例如,如果名称包含空格字符,则需要这样做。双引号内的所有字符都是合法的,但双引号和反斜杠除外。要包含任何一个字符,请用反斜杠对其进行转义。win_user_or_group_name
值使用 Windows 主体的传统语法,可以是本地主体,也可以是域主体。示例(请注意反斜杠的加倍)domain\\user .\\user domain\\group .\\group BUILTIN\\WellKnownGroup
当服务器调用插件以验证客户端时,插件会从左到右扫描身份验证字符串,查找与 Windows 用户匹配的用户或组。如果找到匹配项,则插件会将相应的 mysql_user_name
返回到 MySQL 服务器。如果没有匹配项,则身份验证失败。
用户名匹配优先于组名匹配。假设名为 win_user
的 Windows 用户是 win_group
的成员,并且身份验证字符串如下所示
'win_group = sql_user1, win_user = sql_user2'
当 win_user
连接到 MySQL 服务器时,它与 win_group
和 win_user
都匹配。插件会将用户身份验证为 sql_user2
,因为更具体的用户名匹配优先于组名匹配,即使组在身份验证字符串中列在前面。
Windows 身份验证始终适用于来自与服务器运行在同一台计算机上的连接。对于跨计算机连接,两台计算机都必须注册到 Microsoft Active Directory。如果它们位于同一个 Windows 域中,则无需指定域名。也可以允许来自不同域的连接,例如在本例中
CREATE USER sql_accounting
IDENTIFIED WITH authentication_windows
AS 'SomeDomain\\Accounting';
这里 SomeDomain
是另一个域的名称。反斜杠字符加倍,因为它是在字符串内使用的 MySQL 转义字符。
MySQL 支持代理用户概念,即客户端可以使用一个帐户连接并验证到 MySQL 服务器,但在连接后拥有另一个帐户的权限(参见 第 8.2.19 节“代理用户”)。假设您希望 Windows 用户使用单个用户名进行连接,但根据他们的 Windows 用户名和组名映射到特定的 MySQL 帐户,如下所示
local_user
和MyDomain\domain_user
本地和域 Windows 用户应映射到local_wlad
MySQL 帐户。MyDomain\Developers
域组中的用户应映射到local_dev
MySQL 帐户。本地机器管理员应映射到
local_admin
MySQL 帐户。
要设置此项,请为 Windows 用户创建一个代理帐户以连接到,并配置此帐户,以便用户和组映射到相应的 MySQL 帐户 (local_wlad
、local_dev
、local_admin
)。此外,请向 MySQL 帐户授予执行所需操作的权限。以下说明使用 win_proxy
作为代理帐户,使用 local_wlad
、local_dev
和 local_admin
作为代理帐户。
创建代理 MySQL 帐户
CREATE USER win_proxy IDENTIFIED WITH authentication_windows AS 'local_user = local_wlad, MyDomain\\domain_user = local_wlad, MyDomain\\Developers = local_dev, BUILTIN\\Administrators = local_admin';
要使代理工作,代理帐户必须存在,因此请创建它们
CREATE USER local_wlad IDENTIFIED WITH mysql_no_login; CREATE USER local_dev IDENTIFIED WITH mysql_no_login; CREATE USER local_admin IDENTIFIED WITH mysql_no_login;
代理帐户使用
mysql_no_login
身份验证插件来阻止客户端使用这些帐户直接登录到 MySQL 服务器。相反,使用 Windows 进行身份验证的用户应该使用win_proxy
代理帐户。(这假设插件已安装。有关说明,请参见 第 8.4.1.8 节“无登录可插拔身份验证”。)有关保护代理帐户免受直接使用的替代方法,请参见 防止直接登录到代理帐户。您还应该执行
GRANT
语句(未显示),这些语句授予每个代理帐户访问 MySQL 所需的权限。向代理帐户授予每个代理帐户的
PROXY
权限GRANT PROXY ON local_wlad TO win_proxy; GRANT PROXY ON local_dev TO win_proxy; GRANT PROXY ON local_admin TO win_proxy;
现在,Windows 用户 local_user
和 MyDomain\domain_user
可以以 win_proxy
的身份连接到 MySQL 服务器,并在验证后拥有身份验证字符串中指定的帐户的权限(在本例中为 local_wlad
)。以 win_proxy
的身份连接的 MyDomain\Developers
组中的用户拥有 local_dev
帐户的权限。 BUILTIN\Administrators
组中的用户拥有 local_admin
帐户的权限。
要配置身份验证,以便所有没有自己的 MySQL 帐户的 Windows 用户都通过代理帐户,请在前面的说明中将默认代理帐户 (''@''
) 替换为 win_proxy
。有关默认代理帐户的信息,请参见 第 8.2.19 节“代理用户”。
如果您的 MySQL 安装具有匿名用户,它们可能会与默认代理用户冲突。有关此问题的更多信息以及解决方法,请参见 默认代理用户和匿名用户冲突。
要将 Windows 身份验证插件与 Connector/NET 9.0 及更高版本中的 Connector/NET 连接字符串一起使用,请参见 Connector/NET 身份验证。