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.20 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
和域 Windows 用户MyDomain\domain_user
应该映射到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.9 节,“无登录可插拔身份验证”。)有关保护代理帐户免受直接使用的其他方法,请参见 防止直接登录代理帐户。您还应该执行
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 安装有匿名用户,它们可能会与默认代理用户发生冲突。有关此问题的更多信息以及解决此问题的办法,请参见 默认代理用户和匿名用户冲突。
要在 Connector/NET 8.4 及更高版本中使用 Connector/NET 连接字符串与 Windows 身份验证插件一起使用,请参见 Connector/NET 身份验证。