8.4.1.6 Windows 插件式认证
Windows 插件式认证是 MySQL Enterprise Edition 的一个扩展,一个商业产品。要了解更多关于商业产品,请见https://www.mysql.com/products/.
MySQL Enterprise Edition for Windows 支持使用 Windows 的外部认证方法,使 MySQL 服务器可以使用 native Windows 服务来认证客户端连接。已登录到 Windows 的用户可以从 MySQL 客户端程序连接到服务器,而无需指定额外的密码。
客户端和服务器在认证握手中交换数据包。结果,服务器创建了一个安全上下文对象,该对象代表客户端在 Windows OS 中的身份。这包括客户端账户的名称。Windows 插件式认证使用客户端的身份来检查是否是给定的账户或组成员。默认情况下,negotiation 使用 Kerberos 进行认证,然后是 NTLM,如果 Kerberos unavailable。
Windows 插件式认证提供以下功能:
-
外部认证:Windows 认证使得 MySQL 服务器可以接受来自定义在 MySQL 授予表外的用户的连接。
-
代理用户支持:Windows 认证可以返回与客户端程序传递的外部用户名不同的 MySQL 用户名。这意味着插件可以返回 MySQL 用户,该用户定义了外部 Windows 认证用户应该拥有的权限。例如,Windows 用户名为
joe
可以连接,并且拥有 MySQL 用户名为developer
的权限。
以下表格显示了插件和库文件名。文件必须位于由plugin_dir
系统变量指定的目录中。
表 8.20 Windows 认证插件和库文件名
Plugin or File | Plugin or File Name |
---|---|
Server-side 插件 | authentication_windows |
客户端插件 | authentication_windows_client |
库文件 | authentication_windows.dll |
库文件仅包含服务器端插件。客户端插件是 libmysqlclient
客户端库的一部分。
服务器端 Windows 认证插件仅在 MySQL Enterprise Edition 中包含,不在 MySQL 社区发行版中包含。客户端插件在所有发行版中都包含,这使得来自任何发行版的客户端可以连接到具有服务器端插件加载的服务器。
以下部分提供了 Windows 插件式认证的安装和使用信息:
关于 MySQL 中的插件式认证信息,请见第8.2.17节,“插件式认证”。关于代理用户信息,请见第8.2.19节,“代理用户”。
安装 Windows 插件式认证
本节描述了如何安装服务器端 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
。
验证插件安装,可以查看信息架构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 插件式认证
卸载 Windows 认证插件的方法取决于您如何安装它:
-
如果您使用
--plugin-load-add
选项在服务器启动时安装插件,重新启动服务器而不使用该选项。 -
如果您使用
INSTALL PLUGIN
语句在运行时安装插件,它将在服务器重启后仍然安装。要卸载它,请使用UNINSTALL PLUGIN
:UNINSTALL PLUGIN authentication_windows;
此外,还需要删除设置 Windows 插件相关系统变量的启动选项。
使用 Windows 插件式认证
Windows 认证插件支持使用 MySQL 账户,以便用户可以在不需要指定额外密码的情况下连接到 MySQL 服务器。假设服务器正在使用服务器端插件,详见安装 Windows 插件式认证。DBA 一旦启用了服务器端插件,并设置了账户以使用它,客户端可以使用账户连接到 MySQL 服务器而无需进行其他设置。
在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
关键字后面的字符串是身份验证字符串。它指定了 Windows 用户名为 Rafal
或 Tasha
的用户,以及任何在 Administrators
或 Power Users
组中的 Windows 用户,可以作为 MySQL 用户 sql_admin
进行身份验证。后者组名包含空格,因此必须使用双引号将其括起来。
创建 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 字符串中的.escape 字符。 -
不在双引号中的前导和尾部空格将被忽略。
-
未引号的
win_user_or_group_name
和mysql_user_name
值可以包含任何字符,除了等号、逗号或空格。 -
如果
win_user_or_group_name
和/ormysql_user_name
值被双引号括起来,双引号中的所有字符都是该值的一部分。这是必要的,例如,如果名称包含空格字符。双引号中的所有字符都是合法的,除了双引号和反斜杠。要包括其中任何一个字符,使用反斜杠将其转义。 -
win_user_or_group_name
值使用传统的 Windows 主要语法,或者是本地的或在域中的。示例(注意反斜杠的双倍):domain\\user .\\user domain\\group .\\group BUILTIN\\WellKnownGroup
当服务器调用插件来身份验证客户端时,插件从左到右扫描身份验证字符串,寻找 Windows 用户或组匹配。如果找到匹配,插件将返回对应的 mysql_user_name
到 MySQL 服务器。如果没有匹配,身份验证失败。
用户名称匹配优先于组名称匹配。假设 Windows 用户名为 win_user
是 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.escape 字符。
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 服务器的代理帐户,并配置该帐户,以便用户和组映射到适当的 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节,“No-Login Pluggable Authentication”。)对于保护代理帐户免受直接使用的其他方法,请见Preventing Direct Login to Proxied Accounts。您还应该执行
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
可以连接到MySQL服务器作为win_proxy
,并在身份验证后拥有该身份验证字符串中指定的账户的特权(在这个例子中是local_wlad
)。MyDomain\Developers组中的用户连接到win_proxy
时拥有local_dev
账户的特权。BUILTIN\Administrators组中的用户拥有local_admin
账户的特权。
要配置身份验证,使所有没有自己的MySQL账户的Windows用户通过代理账户,请将默认代理账户(''@''
)替换为win_proxy
在前面的指令中。关于默认代理账户的信息,请见第8.2.19节,“代理用户”。
如果您的MySQL安装中有匿名用户,他们可能与默认代理用户冲突。关于这个问题和解决方法,请见Default Proxy User and Anonymous User Conflicts。
要使用Windows身份验证插件与Connector/NET连接字符串在Connector/NET 8.4及更高版本中,请见Connector/NET身份验证。