Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Windows Pluggable Authentication

8.4.1.6 Windows 可插拔身份验证

Note

Windows 可插拔身份验证是 MySQL Enterprise Edition 的一部分,属于商业产品。要了解更多关于商业产品的信息,请参阅 https://www.mysql.com/products/

MySQL Enterprise Edition for Windows 支持一种身份验证方法,该方法使用 Windows 本机服务对客户端连接进行身份验证。已经登录 Windows 的用户可以从 MySQL 客户端程序连接到服务器,而无需指定额外的密码。

在身份验证握手机制中,客户端和服务器交换数据包。结果,服务器创建了一个安全上下文对象,该对象表示客户端在 Windows 操作系统中的身份。该身份包括客户端帐户的名称。Windows 可插拔身份验证使用客户端的身份来检查是否是给定的帐户或组成员。默认情况下,negotiation 使用 Kerberos 进行身份验证,然后是 NTLM 如果 Kerberos 不可用。

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

  • 外部身份验证:Windows 身份验证使 MySQL Server 能够接受来自外部定义的用户的连接,这些用户已经登录到 Windows。

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

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

表 8.21 Windows 身份验证插件和库文件名

Plugin or File Plugin or File Name
服务器端插件 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 选项。

要验证插件安装,请检查 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_nameauthentication_windows_log_level 系统变量的控制。见 第 7.1.8 节,“服务器系统变量”

卸载 Windows 可插拔认证

卸载 Windows 认证插件的方法取决于您安装它的方式:

  • 如果您使用 --plugin-load-add 选项在服务器启动时安装插件,只需重新启动服务器而不使用该选项。

  • 如果您使用 INSTALL PLUGIN 语句在运行时安装插件,它将在服务器重新启动时保留安装。要卸载它,请使用 UNINSTALL PLUGIN

    UNINSTALL PLUGIN authentication_windows;

此外,还需要删除任何设置 Windows 插件相关系统变量的启动选项。

使用 Windows 可插拔认证

Windows 认证插件支持使用 MySQL 帐户,使得已经登录 Windows 的用户可以连接到 MySQL 服务器,而不需要指定额外的密码。假设服务器已经启用了服务器端插件,如 安装 Windows 可插拔认证 中所述。然后,DBA 启用了服务器端插件并设置了帐户以使用它,客户端可以使用这些帐户连接到服务器,而不需要在他们的部分进行其他设置。

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

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

插件名称是 authentication_windows。字符串后面的 AS 关键字是身份验证字符串。它指定了 Windows 用户名为 RafalTasha 可以作为 MySQL 用户 sql_admin 认证到服务器,或者是 AdministratorsPower Users 组的任何 Windows 用户。后者组名包含空格,因此必须用双引号括起来。

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

C:\> mysql --user=sql_admin

这里不需要密码。authentication_windows 插件使用 Windows 安全 API 来检查哪个 Windows 用户正在连接。如果该用户是名为 RafalTasha,或者是 AdministratorsPower Users 组的成员,则服务器授予访问权限,并将客户端认证为 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_namemysql_user_name 值用双引号括起来,则引号之间的所有内容都是该值的一部分。这是必要的,例如,如果名称包含空格字符。所有双引号之间的字符都是合法的,除了双引号和反斜杠。要包含这两个字符,需要使用反斜杠转义。

  • win_user_or_group_name 值使用 Windows 主体的惯例语法,既可以是本地的,也可以是域中的。示例(注意反斜杠的加倍):

    domain\\user
    .\\user
    domain\\group
    .\\group
    BUILTIN\\WellKnownGroup

当服务器调用插件来认证客户端时,插件将从左到右扫描身份验证字符串,以查找与 Windows 用户的匹配。如果找到匹配项,插件将相应的 mysql_user_name 返回给 MySQL 服务器。如果没有匹配项,认证将失败。

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

'win_group = sql_user1, win_user = sql_user2'

win_user 连接到 MySQL 服务器时,有两个匹配项:win_groupwin_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_userMyDomain\domain_user 应该映射到 local_wlad MySQL 帐户。

  • 属于 MyDomain\Developers 域组的用户应该映射到 local_dev MySQL 帐户。

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

要设置此项,请创建一个代理账户供 Windows 用户连接到,并配置该账户,使用户和组映射到适当的 MySQL 账户(local_wladlocal_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 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 访问所需的权限。

  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;

现在,Windows 用户 local_userMyDomain\domain_user 可以以 win_proxy 连接到 MySQL 服务器,并在身份验证时拥有授予的账户权限(在本例中为 local_wlad)。MyDomain\Developers 组中的用户连接为 win_proxy,拥有 local_dev 账户的权限。BUILTIN\Administrators 组中的用户拥有 local_admin 账户的权限。

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

Note

如果您的 MySQL 安装有匿名用户,它们可能与默认代理用户冲突。有关此问题的更多信息,以及解决方法,请参阅 默认代理用户和匿名用户冲突

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