6.4.1.8 Windows 可插入身份验证

Note

Windows 可插入身份验证是商业产品 MySQL Enterprise Edition 中包含的扩展。要了解有关商品的更多信息,请参阅https://www.mysql.com/products/

适用于 Windows 的 MySQL 企业版支持一种在 Windows 上执行外部身份验证的身份验证方法,使 MySQL Server 可以使用本机 Windows 服务来身份验证 Client 端连接。登录到 Windows 的用户可以根据环境中的信息从 MySQLClient 端程序连接到服务器,而无需指定其他密码。

Client 端和服务器在身份验证握手中交换数据包。交换的结果是,服务器创建一个安全上下文对象,该对象 table 示 Windows OS 中 Client 端的身份。此身份包括 Client 帐户的名称。 Windows 可插入身份验证使用 Client 端的身份来检查它是给定帐户还是组成员。默认情况下,协商使用 Kerberos 进行身份验证,如果 Kerberos 不可用,则使用 NTLM 进行身份验证。

Windows 可插入身份验证提供以下功能:

  • 外部身份验证:Windows 身份验证使 MySQL Server 可以接受来自已在 Windows 上的 MySQL 授权 table 外部定义的用户的连接。

  • 代理用户支持:Windows 身份验证可以向 MySQL 返回与 Client 端程序传递的外部用户名不同的用户名。这意味着插件可以返回定义外部 Windows 身份验证用户应具有的特权的 MySQL 用户。例如,一个名为joe的 Windows 用户可以连接并具有一个名为developer的 MySQL 用户的特权。

下 table 显示了插件和库文件名。该文件必须位于plugin_dir系统变量命名的目录中。

table6.14 Windows 身份验证的插件和库名称

插件或文件插件或文件名
Server-side pluginauthentication_windows
Client-side pluginauthentication_windows_client
Library fileauthentication_windows.dll

该库文件仅包含服务器端插件。Client 端插件内置在libmysqlclientClient 端库中。

服务器端 Windows 身份验证插件仅包含在 MySQL Enterprise Edition 中。它不包括在 MySQL 社区发行版中。Client 端插件包含在所有发行版中,包括社区发行版。这允许来自任何发行版的 Client 端连接到已加载服务器端插件的服务器。

MySQL 5.7 支持的任何 Windows 版本都支持 Windows 身份验证插件(请参见https://www.mysql.com/support/supportedplatforms/database.html)。

以下各节提供特定于 Windows 可插拔身份验证的安装和使用信息:

有关 MySQL 中可插拔身份验证的一般信息,请参见第 6.2.13 节“可插入身份验证”。有关代理用户的信息,请参见第 6.2.14 节“代理用户”

安装 Windows 可插入身份验证

本节介绍如何安装 Windows 身份验证插件。有关安装插件的一般信息,请参见第 5.5.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系统 table 中,以使服务器为每次后续的正常启动加载该插件,而无需--plugin-load-add

要验证插件安装,请检查INFORMATION_SCHEMA.PLUGINStable 或使用SHOW PLUGINS语句(请参见第 5.5.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_nameauthentication_windows_log_level系统变量提供了附加的插件控件。参见第 5.1.7 节“服务器系统变量”

卸载 Windows 可插入身份验证

用来卸载 Windows 身份验证插件的方法取决于安装方式:

  • 如果您在服务器启动时使用--plugin-load-add选项安装了插件,请在不使用该选项的情况下重新启动服务器。

  • 如果您在运行时使用INSTALL PLUGIN语句安装了插件,则在服务器重新启动后仍会安装该插件。要卸载它,请使用UNINSTALL PLUGIN

UNINSTALL PLUGIN authentication_windows;

此外,删除所有设置 Windows 插件相关系统变量的启动选项。

使用 Windows 可插入身份验证

Windows 身份验证插件支持使用 MySQL 帐户,以便已登录 Windows 的用户可以连接到 MySQL 服务器,而无需指定其他密码。如安装 Windows 可插入身份验证中所述,假定服务器正在启用服务器端插件的情况下运行。一旦 DBA 启用了服务器端插件并设置了使用它的帐户,Client 端就可以使用这些帐户进行连接,而无需进行其他任何设置。

要在CREATE USER语句的IDENTIFIED WITH子句中引用 Windows 身份验证插件,请使用名称authentication_windows。假设应该允许 Windows 用户RafalTasha以及AdministratorsPower Users组中的任何用户连接到 MySQL。要进行设置,请创建一个名为sql_admin的 MySQL 帐户,该帐户使用 Windows 插件进行身份验证:

CREATE USER sql_admin
  IDENTIFIED WITH authentication_windows
  AS 'Rafal, Tasha, Administrators, "Power Users"';

插件名称为authentication_windowsAS关键字后的字符串是身份验证字符串。它指定允许名为RafalTasha的 Windows 用户作为 MySQL 用户sql_admin向服务器进行身份验证,与AdministratorsPower Users组中的任何 Windows 用户一样。后面的组名包含一个空格,因此必须用双引号引起来。

创建sql_admin帐户后,已登录 Windows 的用户可以尝试使用该帐户连接到服务器:

C:\> mysql --user=sql_admin

此处不需要密码。 authentication_windows插件使用 Windows 安全 API 来检查正在连接的 Windows 用户。如果该用户名为RafalTasha,或者是AdministratorsPower Users组的成员,则服务器将授予访问权限,并且 Client 端将被认证为sql_admin,并且具有授予sql_admin帐户的任何特权。否则,服务器将拒绝访问。

Windows 身份验证插件的身份验证字符串语法遵循以下规则:

  • 该字符串由一个或多个用逗号分隔的用户 Map 组成。

  • 每个用户 Map 都将 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

由服务器调用以对 Client 端进行身份验证时,该插件从左到右扫描身份验证字符串,以查找与 Windows 用户匹配的用户或组。如果匹配,则插件将对应的* mysql_user_name *返回给 MySQL 服务器。如果不匹配,则身份验证失败。

用户名匹配优先于组名匹配。假设名为win_user的 Windows 用户是win_group的成员,并且身份验证字符串如下所示:

'win_group = sql_user1, win_user = sql_user2'

win_user连接到 MySQL 服务器时,同时匹配win_groupwin_user。该插件将用户身份验证为sql_user2,因为更具体的用户匹配优先于组匹配,即使该组在身份验证字符串中排在最前面。

Windows 身份验证始终适用于来自运行服务器的同一台计算机的连接。对于跨计算机连接,两台计算机都必须在 Windows Active Directory 中注册。如果它们在同一 Windows 域中,则无需指定域名。也可以允许来自其他域的连接,如以下示例所示:

CREATE USER sql_accounting
  IDENTIFIED WITH authentication_windows
  AS 'SomeDomain\\Accounting';

SomeDomain是另一个域的名称。反斜杠字符加倍,因为它是字符串中的 MySQL 转义字符。

MySQL 支持代理用户的概念,Client 端可以使用一个帐户连接到 MySQL 服务器并对其进行身份验证,但是在连接时,Client 端具有另一个帐户的特权(请参见第 6.2.14 节“代理用户”)。假设您希望 Windows 用户使用一个用户名进行连接,但要根据 Windows 用户名和组名将其 Map 到特定的 MySQL 帐户,如下所示:

  • local_userMyDomain\domain_user Windows 和本地 Windows 用户应 Map 到local_wlad MySQL 帐户。

  • MyDomain\Developers域组中的用户应 Map 到local_dev MySQL 帐户。

  • 本地计算机 Management 员应 Map 到local_admin MySQL 帐户。

要进行此设置,请创建一个供 Windows 用户连接的代理帐户,然后配置该帐户,以便用户和组 Map 到适当的 MySQL 帐户(local_wladlocal_devlocal_admin)。另外,授予 MySQL 帐户适合于他们需要执行的操作的特权。以下说明使用win_proxy作为代理帐户,并使用local_wladlocal_devlocal_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身份验证插件来防止 Client 端使用帐户直接登录到 MySQL 服务器。相反,预期使用 Windows 进行身份验证的用户将使用win_proxy代理帐户。 (这假定已安装插件.有关说明,请参阅第 6.4.1.10 节“无登录可插入身份验证”。)有关防止代理帐户直接使用的替代方法,请参阅防止直接登录到代理帐户

您还应该执行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_userMyDomain\domain_user可以以win_proxy的身份连接到 MySQL 服务器,并且在通过身份验证时,将具有在身份验证字符串中指定的帐户的特权(在本例中为local_wlad)。 MyDomain\Developers组中以win_proxy身份连接的用户拥有local_dev帐户的特权。 BUILTIN\Administrators组中的用户具有local_admin帐户的特权。

要配置身份验证,以便所有没有自己的 MySQL 帐户的 Windows 用户都可以使用代理帐户,请在前面的说明中用win_proxy替换默认的代理帐户(''@'')。有关默认代理帐户的信息,请参阅第 6.2.14 节“代理用户”

Note

如果您的 MySQL 安装中有匿名用户,则它们可能与默认代理用户冲突。有关此问题及其处理方式的更多信息,请参见默认代理用户和匿名用户冲突

要将 Windows 身份验证插件与 Connector/NET 6.4.4 及更高版本中的 Connector/NET 连接字符串一起使用,请参阅使用 Windows 本机身份验证插件