Documentation Home
MySQL 8.0 参考手册  / 第 6 章 安全  / 6.4 安全组件和插件  / 6.4.1 认证插件  /  6.4.1.5 PAM 可插拔认证

6.4.1.5 PAM 可插拔认证

笔记

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

MySQL Enterprise Edition 支持一种身份验证方法,使 MySQL Server 可以使用 PAM(Pluggable Authentication Modules)对 MySQL 用户进行身份验证。PAM 使系统能够使用标准接口访问各种身份验证方法,例如传统的 Unix 密码或 LDAP 目录。

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

  • 外部身份验证:PAM 身份验证使 MySQL 服务器能够接受来自 MySQL 授权表之外定义的用户的连接,并使用 PAM 支持的方法进行身份验证。

  • 代理用户支持:基于外部用户所属的 PAM 组和提供的身份验证字符串,PAM 身份验证可以向 MySQL 返回一个不同于客户端程序传递的外部用户名的用户名。这意味着该插件可以返回定义外部 PAM 身份验证用户应具有的权限的 MySQL 用户。例如,名为 的操作系统用户 joe可以连接并拥有名为 的 MySQL 用户的权限developer

PAM 可插入身份验证已在 Linux 和 macOS 上进行了测试。

下表显示了插件和库文件名。文件名后缀在您的系统上可能不同。该文件必须位于 plugin_dir系统变量命名的目录中。有关安装信息,请参阅 安装 PAM 可插入身份验证

表 6.20 PAM 验证的插件和库名称

插件或文件 插件或文件名
服务器端插件 authentication_pam
客户端插件 mysql_clear_password
库文件 authentication_pam.so

mysql_clear_password 与服务器端 PAM 插件通信 的客户端明文插件内置于libmysqlclient 客户端库中,并包含在所有发行版中,包括社区发行版。在所有 MySQL 发行版中包含客户端明文插件,使来自任何发行版的客户端都可以连接到加载了服务器端 PAM 插件的服务器。

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

有关 MySQL 中可插入身份验证的一般信息,请参阅第 6.2.17 节,“可插入身份验证”。有关该mysql_clear_password插件的信息,请参阅 第 6.4.1.4 节,“客户端明文可插入身份验证”。有关代理用户信息,请参阅第 6.2.19 节,“代理用户”

MySQL 用户的 PAM 身份验证如何工作

本节概述了 MySQL 和 PAM 如何协同工作来验证 MySQL 用户。有关显示如何设置 MySQL 帐户以使用特定 PAM 服务的示例,请参阅 使用 PAM 可插入身份验证

  1. 客户端程序与服务器通信,客户端向服务器发送客户端用户名(默认为操作系统用户名)和密码:

    • 客户端用户名是外部用户名。

    • 对于使用 PAM 服务器端认证插件的账户,对应的客户端插件是mysql_clear_password. 此客户端插件不执行密码散列,结果客户端将密码以明文形式发送到服务器。

  2. 服务器根据外部用户名和客户端连接的主机找到匹配的 MySQL 帐户。PAM 插件使用 MySQL 服务器传递给它的信息(例如用户名、主机名、密码和身份验证字符串)。当您定义使用 PAM 进行身份验证的 MySQL 帐户时,身份验证字符串包含:

    • PAM 服务名称,系统管理员可以使用该名称来指代特定应用程序的身份验证方法。可以有多个应用程序与单个数据库服务器实例关联,因此服务名称的选择留给 SQL 应用程序开发人员。

    • 可选地,如果要使用代理,从 PAM 组到 MySQL 用户名的映射。

  3. 该插件使用身份验证字符串中指定的 PAM 服务来检查用户凭据并返回or 。密码必须适用于 PAM 服务使用的密码存储。例子: 'Authentication succeeded, Username is user_name''Authentication failed'

    • 对于传统的 Unix 密码,该服务会查找存储在 /etc/shadow文件中的密码。

    • 对于 LDAP,该服务查找存储在 LDAP 目录中的密码。

    如果凭据检查失败,服务器将拒绝连接。

  4. 否则,身份验证字符串指示是否发生代理。如果字符串不包含 PAM 组映射,则不会发生代理。在这种情况下,MySQL 用户名与外部用户名相同。

  5. 否则,根据PAM组映射指示代理,MySQL用户名根据映射列表中的第一个匹配组确定。PAM 组的含义 取决于 PAM 服务。例子:

    • 对于传统的 Unix 密码,组是在文件中定义的 Unix 组/etc/group,可能在文件中补充了额外的 PAM 信息,例如 /etc/security/group.conf.

    • 对于 LDAP,组是在 LDAP 目录中定义的 LDAP 组。

    如果代理用户(外部用户)拥有被 PROXY代理 MySQL 用户名的权限,代理就会发生,代理用户会承担被代理用户的权限。

安装 PAM 可插入身份验证

本节介绍如何安装服务器端 PAM 身份验证插件。有关安装插件的一般信息,请参阅第 5.6.1 节,“安装和卸载插件”

为了被服务器使用,插件库文件必须位于MySQL插件目录(由plugin_dir系统变量命名的目录)中。plugin_dir如有必要,通过在服务器启动时 设置值来配置插件目录位置 。

插件库文件的基本名称是 authentication_pam. 文件名后缀因平台而异(例如,.so 对于 Unix 和类 Unix 系统,.dll对于 Windows)。

要在服务器启动时加载插件,请使用 --plugin-load-add选项命名包含它的库文件。使用这种插件加载方法,每次服务器启动时都必须给出该选项。例如,将这些行放在服务器 my.cnf文件中, .so根据需要调整平台的后缀:

[mysqld]
plugin-load-add=authentication_pam.so

修改my.cnf后重启服务器使新设置生效。

或者,要在运行时加载插件,请使用此语句,.so根据需要调整平台的后缀:

INSTALL PLUGIN authentication_pam SONAME 'authentication_pam.so';

INSTALL PLUGIN立即加载插件,并将其注册在 mysql.plugins系统表中,使服务器在后续每次正常启动时加载它,而无需--plugin-load-add.

要验证插件安装,请检查 INFORMATION_SCHEMA.PLUGINS表格或使用SHOW PLUGINS 语句(请参阅 第 5.6.2 节,“获取服务器插件信息”)。例如:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%pam%';
+--------------------+---------------+
| PLUGIN_NAME        | PLUGIN_STATUS |
+--------------------+---------------+
| authentication_pam | ACTIVE        |
+--------------------+---------------+

如果插件无法初始化,请检查服务器错误日志以获取诊断消息。

要将 MySQL 帐户与 PAM 插件相关联,请参阅 使用 PAM 可插入身份验证

卸载 PAM 可插入身份验证

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

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

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

    UNINSTALL PLUGIN authentication_pam;
使用 PAM 可插入身份验证

本节概括介绍了如何使用 PAM 身份验证插件从 MySQL 客户端程序连接到服务器。以下部分提供了以特定方式使用 PAM 身份验证的说明。假定服务器在启用服务器端 PAM 插件的情况下运行,如 安装 PAM 可插入身份验证中所述。

IDENTIFIED WITH要在语句的子句中 引用 PAM 身份验证插件 CREATE USER,请使用名称authentication_pam. 例如:

CREATE USER user
  IDENTIFIED WITH authentication_pam
  AS 'auth_string';

身份验证字符串指定以下类型的信息:

  • PAM 服务名称(请参阅 MySQL 用户的 PAM 身份验证如何工作)。以下讨论中的示例使用服务名称 mysql-unix来使用传统 Unix 密码 mysql-ldap进行身份验证,并使用 LDAP 进行身份验证。

  • 对于代理支持,PAM 为 PAM 模块提供了一种方法,可以向服务器返回一个 MySQL 用户名,而不是客户端程序在连接到服务器时传递的外部用户名。使用认证字符串控制外部用户名到MySQL用户名的映射。如果您想利用代理用户功能,身份验证字符串必须包含这种映射。

例如,如果一个帐户使用 PAM 服务名称,并且应该将和 PAM 组中 mysql-unix的操作系统用户分别映射到和 MySQL 用户,则使用如下语句: rootusersdeveloperdata_entry

CREATE USER user
  IDENTIFIED WITH authentication_pam
  AS 'mysql-unix, root=developer, users=data_entry';

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

  • 该字符串由一个 PAM 服务名称组成,后跟一个 PAM 组映射列表(可选),该映射列表由一个或多个关键字/值对组成,每个关键字/值对指定一个 PAM 组名和一个 MySQL 用户名:

    pam_service_name[,pam_group_name=mysql_user_name]...

    该插件会为每次使用该帐户的连接尝试解析身份验证字符串。为了尽量减少开销,请使字符串尽可能短。

  • 每 对必须以逗号开头。 pam_group_name=mysql_user_name

  • 不在双引号内的前导和尾随空格将被忽略。

  • 不带引号pam_service_namepam_group_name、 和 mysql_user_name值可以包含除等号、逗号或空格之外的任何内容。

  • 如果pam_service_namepam_group_namemysql_user_name值用双引号引起来,则引号之间的所有内容都是该值的一部分。这是必需的,例如,如果值包含空格字符。除双引号和反斜杠 ( \) 外,所有字符都是合法的。要包含任一字符,请使用反斜杠将其转义。

如果插件成功验证了外部用户名(客户端传递的名称),它会在验证字符串中查找 PAM 组映射列表,如果存在,则使用它向 MySQL 服务器返回一个不同的 MySQL 用户名基于外部用户是哪个 PAM 组的成员:

  • 如果身份验证字符串不包含 PAM 组映射列表,则插件返回外部名称。

  • 如果身份验证字符串确实包含 PAM 组映射列表,则插件 从左到右检查列表中的每一对,并尝试 在分配给经过身份验证的用户的组的非 MySQL 目录中找到值的匹配项,并 返回它找到的第一个匹配项。如果插件找不到任何 PAM 组的匹配项,它会返回外部名称。如果插件无法在目录中查找组,它会忽略 PAM 组映射列表并返回外部名称。 pam_group_name=mysql_user_namepam_group_namemysql_user_name

以下部分介绍如何设置使用 PAM 身份验证插件的几种身份验证方案:

  • 没有代理用户。这仅使用 PAM 来检查登录名和密码。每个允许连接到 MySQL 服务器的外部用户都应该有一个匹配的 MySQL 帐户,该帐户被定义为使用 PAM 身份验证。 (对于与外部用户匹配的 MySQL 帐户 ,必须是外部用户名,并且必须与客户端连接的主机匹配。)可以通过各种 PAM 支持的方法执行身份验证。稍后的讨论将展示如何使用传统的 Unix 密码和 LDAP 中的密码来验证客户端凭据。 'user_name'@'host_name'user_namehost_name

    PAM 身份验证,当不通过代理用户或 PAM 组完成时,要求 MySQL 用户名与操作系统用户名相同。MySQL 用户名限制为 32 个字符(请参阅第 6.2.3 节,“授权表”),这将 PAM 非代理身份验证限制为名称最多为 32 个字符的 Unix 帐户。

  • 仅限代理用户,具有 PAM 组映射。对于这种情况,创建一个或多个定义不同权限集的 MySQL 帐户。(理想情况下,没有人应该直接使用这些帐户进行连接。)然后定义一个默认用户通过 PAM 进行身份验证,该用户使用某种映射方案(通常基于用户所属的外部 PAM 组)将所有外部用户名映射到少数 MySQL持有权限集的帐户。任何连接并指定外部用户名作为客户端用户名的客户端都映射到其中一个 MySQL 帐户并使用其权限。讨论展示了如何使用传统的 Unix 密码进行设置,

这些场景的变化是可能的:

  • 您可以允许某些用户直接登录(无需代理),但要求其他用户通过代理帐户连接。

  • 您可以对某些用户使用一种 PAM 身份验证方法,对其他用户使用另一种方法,方法是在您的 PAM 身份验证帐户中使用不同的 PAM 服务名称。例如,您可以mysql-unix为某些用户使用 PAM 服务,而mysql-ldap 为其他用户使用。

这些示例做出以下假设。如果您的系统设置不同,您可能需要进行一些调整。

  • 登录名和密码分别是antonioantonio_password。更改这些以对应于您要验证的用户。

  • PAM 配置目录为 /etc/pam.d.

  • PAM 服务名称对应于身份验证方法(mysql-unixmysql-ldap在本讨论中)。要使用给定的 PAM 服务,您必须在 PAM 配置目录中设置一个同名的 PAM 文件(如果该文件不存在则创建该文件)。此外, CREATE USER对于使用该 PAM 服务进行身份验证的任何帐户,您必须在语句的身份验证字符串中命名 PAM 服务。

PAM 身份验证插件在初始化时检查是否AUTHENTICATION_PAM_LOG 在服务器的启动环境中设置了环境值。如果是这样,该插件允许将诊断消息记录到标准输出。根据服务器的启动方式,该消息可能会出现在控制台或错误日志中。这些消息有助于调试插件执行身份验证时发生的与 PAM 相关的问题。有关详细信息,请参阅 PAM 身份验证调试

无需代理用户的 PAM Unix 密码验证

此身份验证方案使用 PAM 检查根据操作系统用户名和 Unix 密码定义的外部用户,无需代理。每个允许连接到 MySQL 服务器的外部用户都应该有一个匹配的 MySQL 帐户,该帐户被定义为通过传统的 Unix 密码存储使用 PAM 身份验证。

笔记

/etc/shadow使用该文件 检查传统的 Unix 密码 。有关与此文件相关的可能问题的信息,请参阅 PAM Authentication Access to Unix Password Store

  1. antonio验证 Unix 身份验证是否允许使用用户名和密码 登录操作系统 antonio_password

  2. 通过创建一个 mysql-unix名为 /etc/pam.d/mysql-unix. 文件内容取决于系统,因此请检查目录中现有的与登录相关的文件/etc/pam.d 以查看它们的外观。在 Linux 上,该 mysql-unix文件可能如下所示:

    #%PAM-1.0
    auth            include         password-auth
    account         include         password-auth

    对于 macOS,使用login而不是 password-auth.

    PAM 文件格式在某些系统上可能不同。例如,在 Ubuntu 和其他基于 Debian 的系统上,请改用这些文件内容:

    @include common-auth
    @include common-account
    @include common-session-noninteractive
  3. 创建一个与操作系统用户名具有相同用户名的 MySQL 帐户,并将其定义为使用 PAM 插件和mysql-unix PAM 服务进行身份验证:

    CREATE USER 'antonio'@'localhost'
      IDENTIFIED WITH authentication_pam
      AS 'mysql-unix';
    GRANT ALL PRIVILEGES
      ON mydb.*
      TO 'antonio'@'localhost';

    此处,身份验证字符串仅包含 PAM 服务名称,mysql-unix用于对 Unix 密码进行身份验证。

  4. 使用mysql命令行客户端以antonio. 例如:

    $> mysql --user=antonio --password --enable-cleartext-plugin
    Enter password: antonio_password

    服务器应允许连接并且以下查询返回如下所示的输出:

    mysql> SELECT USER(), CURRENT_USER(), @@proxy_user;
    +-------------------+-------------------+--------------+
    | USER()            | CURRENT_USER()    | @@proxy_user |
    +-------------------+-------------------+--------------+
    | antonio@localhost | antonio@localhost | NULL         |
    +-------------------+-------------------+--------------+

    这表明antonio 操作系统用户已通过身份验证,拥有授予antonioMySQL 用户的权限,并且没有发生代理。

笔记

客户端mysql_clear_password 身份验证插件保持密码不变,因此客户端程序将其以明文形式发送到 MySQL 服务器。这使得密码可以按原样传递给 PAM。使用服务器端 PAM 库需要明文密码,但在某些配置中可能是安全问题。这些措施将风险降至最低:

没有代理用户的 PAM LDAP 身份验证

此身份验证方案使用 PAM 检查根据操作系统用户名和 LDAP 密码定义的外部用户,无需代理。每个允许连接到 MySQL 服务器的外部用户都应该有一个匹配的 MySQL 帐户,该帐户被定义为通过 LDAP 使用 PAM 身份验证。

要对 MySQL 使用 PAM LDAP 可插入身份验证,必须满足以下先决条件:

  • LDAP 服务器必须可供 PAM LDAP 服务与之通信。

  • 每个要由 MySQL 进行身份验证的 LDAP 用户都必须存在于 LDAP 服务器管理的目录中。

笔记

另一种使用 LDAP 进行 MySQL 用户身份验证的方法是使用 LDAP 特定的身份验证插件。请参阅 第 6.4.1.7 节,“LDAP 可插入身份验证”

为 PAM LDAP 身份验证配置 MySQL,如下所示:

  1. antonio验证 Unix 身份验证是否允许使用用户名和密码 登录操作系统 antonio_password

  2. 通过创建一个mysql-ldap名为/etc/pam.d/mysql-ldap. 文件内容取决于系统,因此请检查目录中现有的与登录相关的文件/etc/pam.d 以查看它们的外观。在 Linux 上,该 mysql-ldap文件可能如下所示:

    #%PAM-1.0
    auth        required    pam_ldap.so
    account     required    pam_ldap.so

    如果 PAM 目标文件的后缀与 .so您系统上的不同,请替换为正确的后缀。

    PAM 文件格式在某些系统上可能不同。

  3. 创建一个与操作系统用户名具有相同用户名的 MySQL 帐户,并将其定义为使用 PAM 插件和mysql-ldap PAM 服务进行身份验证:

    CREATE USER 'antonio'@'localhost'
      IDENTIFIED WITH authentication_pam
      AS 'mysql-ldap';
    GRANT ALL PRIVILEGES
      ON mydb.*
      TO 'antonio'@'localhost';

    此处,身份验证字符串仅包含 PAM 服务名称mysql-ldap,它使用 LDAP 进行身份验证。

  4. 连接到服务器与无代理用户的 PAM Unix 密码验证 中描述的相同 。

使用代理用户和组映射的 PAM Unix 密码验证

此处描述的身份验证方案使用代理和 PAM 组映射将使用 PAM 进行身份验证的连接 MySQL 用户映射到定义不同权限集的其他 MySQL 帐户。用户不通过定义权限的帐户直接连接。相反,它们通过使用 PAM 进行身份验证的默认代理帐户进行连接,以便所有外部用户都映射到拥有特权的 MySQL 帐户。使用代理帐户连接的任何用户都映射到这些 MySQL 帐户之一,这些帐户的权限决定了允许外部用户进行的数据库操作。

此处显示的过程使用 Unix 密码验证。要改用 LDAP,请参阅 无代理用户的 PAM LDAP 身份验证的早期步骤。

笔记

/etc/shadow使用该文件 检查传统的 Unix 密码 。有关与此文件相关的可能问题的信息,请参阅 PAM Authentication Access to Unix Password Store

  1. antonio验证 Unix 身份验证是否允许使用用户名和密码 登录操作系统 antonio_password

  2. 验证它antonio是 PAM 组 root的成员。users

  3. mysql-unix通过创建一个 名为 /etc/pam.d/mysql-unix. 文件内容取决于系统,因此请检查目录中现有的与登录相关的文件/etc/pam.d 以查看它们的外观。在 Linux 上,该 mysql-unix文件可能如下所示:

    #%PAM-1.0
    auth            include         password-auth
    account         include         password-auth

    对于 macOS,使用login而不是 password-auth.

    PAM 文件格式在某些系统上可能不同。例如,在 Ubuntu 和其他基于 Debian 的系统上,请改用这些文件内容:

    @include common-auth
    @include common-account
    @include common-session-noninteractive
  4. 创建''@''将外部 PAM 用户映射到代理帐户的默认代理用户 ( ):

    CREATE USER ''@''
      IDENTIFIED WITH authentication_pam
      AS 'mysql-unix, root=developer, users=data_entry';

    此处,身份验证字符串包含 PAM 服务名称mysql-unix,它对 Unix 密码进行身份验证。身份验证字符串还将PAM 组中的外部用户分别映射到 rootMySQL 用户 名。 usersdeveloperdata_entry

    PAM 服务名称后面的 PAM 组映射列表在您设置代理用户时是必需的。否则,插件无法告知如何执行从外部用户名到正确的代理 MySQL 用户名的映射。

    笔记

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

  5. 创建代理帐户并授予每个代理帐户应有的权限:

    CREATE USER 'developer'@'localhost'
      IDENTIFIED WITH mysql_no_login;
    CREATE USER 'data_entry'@'localhost'
      IDENTIFIED WITH mysql_no_login;
    
    GRANT ALL PRIVILEGES
      ON mydevdb.*
      TO 'developer'@'localhost';
    GRANT ALL PRIVILEGES
      ON mydb.*
      TO 'data_entry'@'localhost';

    被代理的账户使用 mysql_no_login认证插件来防止客户端使用该账户直接登录MySQL服务器。相反,使用 PAM 进行身份验证的用户应该使用基于其 PAM 组的代理developer 或帐户。data_entry(这假定安装了插件。有关说明,请参阅 第 6.4.1.9 节,“无登录可插入身份验证”。)有关保护代理帐户不被直接使用的替代方法,请参阅 防止直接登录到代理帐户

  6. 向代理帐户 PROXY授予每个代理帐户的权限:

    GRANT PROXY
      ON 'developer'@'localhost'
      TO ''@'';
    GRANT PROXY
      ON 'data_entry'@'localhost'
      TO ''@'';
  7. 使用mysql命令行客户端以antonio.

    $> mysql --user=antonio --password --enable-cleartext-plugin
    Enter password: antonio_password

    服务器使用默认 ''@''代理帐户验证连接。产生的特权antonio取决于 PAM 组antonio是哪个成员。如果 antoniorootPAM 组的成员,则 PAM 插件映射 rootdeveloperMySQL 用户名并将该名称返回给服务器。服务器验证是否 ''@''PROXY权限 developer并允许连接。以下查询返回如下所示的输出:

    mysql> SELECT USER(), CURRENT_USER(), @@proxy_user;
    +-------------------+---------------------+--------------+
    | USER()            | CURRENT_USER()      | @@proxy_user |
    +-------------------+---------------------+--------------+
    | antonio@localhost | developer@localhost | ''@''        |
    +-------------------+---------------------+--------------+

    这表明antonio 操作系统用户已通过身份验证,拥有授予developer MySQL 用户的权限,并且代理是通过默认代理帐户进行的。

    如果antonio不是 rootPAM 组的成员但是是 PAM 组的成员, users则会发生类似的过程,但是插件将userPAM 组成员身份映射到data_entry MySQL 用户名并将该名称返回给服务器:

    mysql> SELECT USER(), CURRENT_USER(), @@proxy_user;
    +-------------------+----------------------+--------------+
    | USER()            | CURRENT_USER()       | @@proxy_user |
    +-------------------+----------------------+--------------+
    | antonio@localhost | data_entry@localhost | ''@''        |
    +-------------------+----------------------+--------------+

    这表明antonio 操作系统用户已通过身份验证,拥有data_entryMySQL 用户的权限,并且代理是通过默认代理帐户进行的。

笔记

客户端mysql_clear_password 身份验证插件保持密码不变,因此客户端程序将其以明文形式发送到 MySQL 服务器。这使得密码可以按原样传递给 PAM。使用服务器端 PAM 库需要明文密码,但在某些配置中可能是安全问题。这些措施将风险降至最低:

PAM 身份验证访问 Unix 密码存储

在某些系统上,Unix 身份验证使用密码存储,例如/etc/shadow通常具有受限访问权限的文件。这可能会导致基于 MySQL PAM 的身份验证失败。不幸的是,PAM 实现不允许区分密码无法检查(例如,由于无法读取/etc/shadow)和密码不匹配”。如果您使用 Unix 密码存储进行 PAM 身份验证,您可以使用以下方法之一从 MySQL 启用对其的访问:

  • 假设 MySQL 服务器是从 mysql操作系统帐户运行的,将该帐户放在shadow具有/etc/shadow访问权限的组中:

    1. 在 中创建一个shadow/etc/group

    2. mysql操作系统用户添加到shadow组中 /etc/group

    3. 分配/etc/groupshadow组并启用组读取权限:

      chgrp shadow /etc/shadow
      chmod g+r /etc/shadow
    4. 重新启动 MySQL 服务器。

  • 如果您正在使用该pam_unix模块和unix_chkpwd实用程序,请按如下方式启用密码存储访问:

    chmod u-s /usr/sbin/unix_chkpwd
    setcap cap_dac_read_search+ep /usr/sbin/unix_chkpwd

    根据您的平台的需要 调整unix_chkpwd的路径。

PAM认证调试

PAM 身份验证插件在初始化时检查是否AUTHENTICATION_PAM_LOG 设置了环境值(值无关紧要)。如果是这样,该插件允许将诊断消息记录到标准输出。这些消息可能有助于调试插件执行身份验证时发生的与 PAM 相关的问题。

一些消息包括对 PAM 插件源文件和行号的引用,这使得插件操作能够更紧密地绑定到代码中它们发生的位置。

另一种调试连接失败和确定在连接尝试期间发生了什么的技术是配置 PAM 身份验证以允许所有连接,然后检查系统日志文件。此技术应仅在临时基础上使用,而不应在生产服务器上使用。

配置以 /etc/pam.d/mysql-any-password这些内容命名的 PAM 服务文件(格式在某些系统上可能不同):

#%PAM-1.0
auth        required    pam_permit.so
account     required    pam_permit.so

mysql-any-password创建一个使用 PAM 插件并命名PAM 服务 的帐户 :

CREATE USER 'testuser'@'localhost'
  IDENTIFIED WITH authentication_pam
  AS 'mysql-any-password';

服务文件会mysql-any-password导致任何身份验证尝试返回 true,即使密码不正确也是如此。如果身份验证尝试失败,则表明配置问题出在 MySQL 端。否则,问题出在操作系统/PAM 端。要查看可能发生的情况,请检查系统日志文件,例如 /var/log/secure/var/log/audit.log/var/log/syslog/var/log/messages

确定问题所在后,删除 mysql-any-passwordPAM 服务文件以禁用任意密码访问。