6.4.1.7 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.13 PAM 身份验证的插件和库名称

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

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

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

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

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.5.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.5.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 Authentication without Proxy Users

This authentication scenario uses PAM to check external users defined in terms of operating system user names and LDAP passwords, without proxying. Every such external user permitted to connect to MySQL Server should have a matching MySQL account that is defined to use PAM authentication through LDAP.

To use PAM LDAP pluggable authentication for MySQL, these prerequisites must be satisfied:

  • An LDAP server must be available for the PAM LDAP service to communicate with.

  • Each LDAP user to be authenticated by MySQL must be present in the directory managed by the LDAP server.

Note

Another way to use LDAP for MySQL user authentication is to use the LDAP-specific authentication plugins. See Section 6.4.1.9, “LDAP Pluggable Authentication”.

Configure MySQL for PAM LDAP authentication as follows:

  1. Verify that Unix authentication permits logins to the operating system with the user name antonio and password antonio_password.

  2. Set up PAM to authenticate MySQL connections using LDAP by creating a mysql-ldap PAM service file named /etc/pam.d/mysql-ldap. The file contents are system dependent, so check existing login-related files in the /etc/pam.d directory to see what they look like. On Linux, the mysql-ldap file might look like this:

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

    If PAM object files have a suffix different from .so on your system, substitute the correct suffix.

    The PAM file format might differ on some systems.

  3. Create a MySQL account with the same user name as the operating system user name and define it to authenticate using the PAM plugin and the mysql-ldap PAM service:

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

    Here, the authentication string contains only the PAM service name, mysql-ldap, which authenticates using LDAP.

  4. Connecting to the server is the same as described in PAM Unix Password Authentication without Proxy Users.

PAM Unix Password Authentication with Proxy Users and Group Mapping

The authentication scheme described here uses proxying and PAM group mapping to map connecting MySQL users who authenticate using PAM onto other MySQL accounts that define different sets of privileges. Users do not connect directly through the accounts that define the privileges. Instead, they connect through a default proxy account authenticated using PAM, such that all the external users are mapped to the MySQL accounts that hold the privileges. Any user who connects using the proxy account is mapped to one of those MySQL accounts, the privileges for which determine the database operations permitted to the external user.

The procedure shown here uses Unix password authentication. To use LDAP instead, see the early steps of PAM LDAP Authentication without Proxy Users.

Note

Traditional Unix passwords are checked using the /etc/shadow file. For information regarding possible issues related to this file, see PAM Authentication Access to Unix Password Store.

  1. Verify that Unix authentication permits logins to the operating system with the user name antonio and password antonio_password.

  2. Verify that antonio is a member of the root or users PAM group.

  3. Set up PAM to authenticate the mysql-unix PAM service through operating system users by creating a file named /etc/pam.d/mysql-unix. The file contents are system dependent, so check existing login-related files in the /etc/pam.d directory to see what they look like. On Linux, the mysql-unix file might look like this:

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

    For macOS, use login rather than password-auth.

    The PAM file format might differ on some systems. For example, on Ubuntu and other Debian-based systems, use these file contents instead:

    @include common-auth
    @include common-account
    @include common-session-noninteractive
  4. Create a default proxy user (''@'') that maps external PAM users to the proxied accounts:

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

    Here, the authentication string contains the PAM service name, mysql-unix, which authenticates Unix passwords. The authentication string also maps external users in the root and users PAM groups to the developer and data_entry MySQL user names, respectively.

    The PAM group mapping list following the PAM service name is required when you set up proxy users. Otherwise, the plugin cannot tell how to perform mapping from external user names to the proper proxied MySQL user names.

    Note

    If your MySQL installation has anonymous users, they might conflict with the default proxy user. For more information about this issue, and ways of dealing with it, see Default Proxy User and Anonymous User Conflicts.

  5. Create the proxied accounts and grant to each one the privileges it should have:

    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';

    The proxied accounts use the mysql_no_login authentication plugin to prevent clients from using the accounts to log in directly to the MySQL server. Instead, it is expected that users who authenticate using PAM use the developer or data_entry account by proxy based on their PAM group. (This assumes that the plugin is installed. For instructions, see Section 6.4.1.10, “No-Login Pluggable Authentication”.) For alternative methods of protecting proxied accounts against direct use, see Preventing Direct Login to Proxied Accounts.

  6. Grant to the proxy account the PROXY privilege for each proxied account:

    GRANT PROXY
      ON 'developer'@'localhost'
      TO ''@'';
    GRANT PROXY
      ON 'data_entry'@'localhost'
      TO ''@'';
  7. Use the mysql command-line client to connect to the MySQL server as antonio.

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

    The server authenticates the connection using the default ''@'' proxy account. The resulting privileges for antonio depend on which PAM groups antonio is a member of. If antonio is a member of the root PAM group, the PAM plugin maps root to the developer MySQL user name and returns that name to the server. The server verifies that ''@'' has the PROXY privilege for developer and permits the connection. The following query returns output as shown:

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

    This demonstrates that the antonio operating system user is authenticated to have the privileges granted to the developer MySQL user, and that proxying occurs through the default proxy account.

    If antonio is not a member of the root PAM group but is a member of the users PAM group, a similar process occurs, but the plugin maps user PAM group membership to the data_entry MySQL user name and returns that name to the server:

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

    This demonstrates that the antonio operating system user is authenticated to have the privileges of the data_entry MySQL user, and that proxying occurs through the default proxy account.

Note

The client-side mysql_clear_password authentication plugin leaves the password untouched, so client programs send it to the MySQL server as cleartext. This enables the password to be passed as is to PAM. A cleartext password is necessary to use the server-side PAM library, but may be a security problem in some configurations. These measures minimize the risk:

PAM Authentication Access to Unix Password Store

On some systems, Unix authentication uses a password store such as /etc/shadow, a file that typically has restricted access permissions. This can cause MySQL PAM-based authentication to fail. Unfortunately, the PAM implementation does not permit distinguishing password could not be checked (due, for example, to inability to read /etc/shadow) from password does not match. If you are using Unix password store for PAM authentication, you may be able to enable access to it from MySQL using one of the following methods:

  • Assuming that the MySQL server is run from the mysql operating system account, put that account in the shadow group that has /etc/shadow access:

    1. Create a shadow group in /etc/group.

    2. Add the mysql operating system user to the shadow group in /etc/group.

    3. Assign /etc/group to the shadow group and enable the group read permission:

      chgrp shadow /etc/shadow
      chmod g+r /etc/shadow
    4. Restart the MySQL server.

  • If you are using the pam_unix module and the unix_chkpwd utility, enable password store access as follows:

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

    Adjust the path to unix_chkpwd as necessary for your platform.

PAM Authentication Debugging

The PAM authentication plugin checks at initialization time whether the AUTHENTICATION_PAM_LOG environment value is set (the value does not matter). If so, the plugin enables logging of diagnostic messages to the standard output. These messages may be helpful for debugging PAM-related issues that occur when the plugin performs authentication.

Some messages include reference to PAM plugin source files and line numbers, which enables plugin actions to be tied more closely to the location in the code where they occur.

Another technique for debugging connection failures and determining what is happening during connection attempts is to configure PAM authentication to permit all connections, then check the system log files. This technique should be used only on a temporary basis, and not on a production server.

Configure a PAM service file named /etc/pam.d/mysql-any-password with these contents (the format may differ on some systems):

#%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 服务文件以禁用任意密码访问。