扩展 MySQL 8.0  / 第 4 章 MySQL 插件 API  / 4.4 编写插件  / 4.4.9 编写认证插件  /  6.4.1.7 Windows 可插拔身份验证

6.4.1.7 Windows 可插拔身份验证

笔记

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

MySQL Enterprise Edition for Windows 支持在 Windows 上执行外部认证的认证方法,使 MySQL Server 可以使用本机 Windows 服务来认证客户端连接。登录到Windows的用户可以根据他们环境中的信息从MySQL客户端程序连接到服务器,而无需指定额外的密码。

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

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

  • 外部身份验证:Windows 身份验证使 MySQL 服务器能够接受来自已登录到 Windows 的 MySQL 授权表之外定义的用户的连接。

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

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

表 6.13 Windows 身份验证的插件和库名称

插件或文件 插件或文件名
服务器端插件 authentication_windows
客户端插件 authentication_windows_client
库文件 authentication_windows.dll

库文件仅包含服务器端插件。客户端插件内置于 libmysqlclient客户端库中。

服务器端 Windows 身份验证插件仅包含在 MySQL 企业版中。它不包含在 MySQL 社区发行版中。客户端插件包含在所有发行版中,包括社区发行版。这使来自任何发行版的客户端都可以连接到加载了服务器端插件的服务器。

以下部分提供特定于 Windows 可插入身份验证的安装和使用信息:

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

安装 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系统表中,使服务器在后续每次正常启动时加载它,而无需--plugin-load-add.

要验证插件安装,请检查 INFORMATION_SCHEMA.PLUGINS表格或使用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 启用了服务器端插件并设置帐户来使用它,客户端就可以使用这些帐户进行连接,而无需进行其他设置。

要在or 语句的IDENTIFIED WITH子句中 引用 Windows 身份验证插件 ,请使用名称 . 假设 Windows 用户和 应该被允许连接到 MySQL,以及 或组中的任何用户。要设置它,请创建一个名为的 MySQL 帐户,该帐户使用 Windows 插件进行身份验证: CREATE USERGRANTauthentication_windowsRafalTashaAdministratorsPower Userssql_admin

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

插件名称是authentication_windows. AS关键字后面的字符串是身份验证字符串。它指定名为Rafalor的 Windows 用户Tasha被允许作为 MySQL 用户向服务器进行身份验证 ,就像or组sql_admin中的任何 Windows 用户一样 。后面的组名包含空格,所以必须用双引号字符引起来。 AdministratorsPower Users

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

C:\> mysql --user=sql_admin

这里不需要密码。该 authentication_windows插件使用 Windows 安全 API 来检查哪个 Windows 用户正在连接。如果该用户名为Rafalor Tasha,或者是 AdministratorsorPower 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_namemysql_user_name值可以包含除等号、逗号或空格之外的任何内容。

  • 如果一个win_user_or_group_nameand 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 服务器时,towin_group和 to 都匹配win_user。该插件对用户进行身份验证,sql_user2因为更具体的用户匹配优先于组匹配,即使该组在身份验证字符串中列在第一位。

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

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

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

MySQL 支持代理用户的概念,客户端可以使用一个帐户连接到 MySQL 服务器并进行身份验证,但在连接时具有另一个帐户的权限(请参阅 第 6.2.12 节,“代理用户”)。假设您希望 Windows 用户使用单个用户名进行连接,但基于他们的 Windows 用户名和组名映射到特定的 MySQL 帐户,如下所示:

  • 本地和域 Windows 用户应映射到 local_userMySQL 帐户。 MyDomain\domain_userlocal_wlad

  • 域组中的用户MyDomain\Developers应映射到local_devMySQL 帐户。

  • 本地机器管理员应该映射到 local_adminMySQL 帐户。

要设置它,请为 Windows 用户创建一个代理帐户以连接,并配置此帐户,以便用户和组映射到适当的 MySQL 帐户(local_wlad、、、local_devlocal_admin。此外,授予 MySQL 帐户适合他们需要执行的操作的权限。以下说明使用 win_proxy作为代理帐户,和 local_wladlocal_devlocal_admin作为代理帐户。

  1. 创建代理 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';
  2. 为了代理工作,代理帐户必须存在,所以创建它们:

    CREATE USER local_wlad IDENTIFIED BY 'secret_wlad_pass';
    CREATE USER local_dev IDENTIFIED BY 'secret_dev_pass';
    CREATE USER local_admin IDENTIFIED BY  'secret_admin_pass';

    如果您不让任何人知道这些帐户的密码,客户端将无法使用它们直接连接到 MySQL 服务器。相反,希望使用 Windows 进行身份验证的用户使用 win_proxy代理帐户。

    您还应该执行 GRANT语句(未显示)以授予每个代理帐户访问 MySQL 所需的权限。

  3. 向代理帐户 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;

local_user现在, Windows 用户MyDomain\domain_user可以在经过身份验证时连接到 MySQL 服务器,win_proxy并拥有身份验证字符串中给定的帐户的权限(在本例中为 local_wlad)。MyDomain\Developers组中以 身份连接 的用户 win_proxy具有该 local_dev帐户的权限。该 BUILTIN\Administrators组中的用户具有该local_admin帐户的权限。

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

笔记

如果您的 MySQL 安装有匿名用户,他们可能会与默认代理用户发生冲突。有关此问题及其处理方法的更多信息,请参阅 默认代理用户和匿名用户冲突

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