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 用户。有关显示如何设置 MySQL 帐户以使用特定 PAM 服务的示例,请参阅 使用 PAM 可插入身份验证。
客户端程序与服务器通信,客户端向服务器发送客户端用户名(默认为操作系统用户名)和密码:
客户端用户名是外部用户名。
对于使用 PAM 服务器端认证插件的账户,对应的客户端插件是
mysql_clear_password
. 此客户端插件不执行密码散列,结果客户端将密码以明文形式发送到服务器。
服务器根据外部用户名和客户端连接的主机找到匹配的 MySQL 帐户。PAM 插件使用 MySQL 服务器传递给它的信息(例如用户名、主机名、密码和身份验证字符串)。当您定义使用 PAM 进行身份验证的 MySQL 帐户时,身份验证字符串包含:
PAM 服务名称,系统管理员可以使用该名称来指代特定应用程序的身份验证方法。可以有多个应用程序与单个数据库服务器实例关联,因此服务名称的选择留给 SQL 应用程序开发人员。
可选地,如果要使用代理,从 PAM 组到 MySQL 用户名的映射。
该插件使用身份验证字符串中指定的 PAM 服务来检查用户凭据并返回or 。密码必须适用于 PAM 服务使用的密码存储。例子:
'Authentication succeeded, Username is
user_name
''Authentication failed'
对于传统的 Unix 密码,该服务会查找存储在
/etc/shadow
文件中的密码。对于 LDAP,该服务查找存储在 LDAP 目录中的密码。
如果凭据检查失败,服务器将拒绝连接。
否则,身份验证字符串指示是否发生代理。如果字符串不包含 PAM 组映射,则不会发生代理。在这种情况下,MySQL 用户名与外部用户名相同。
否则,根据PAM组映射指示代理,MySQL用户名根据映射列表中的第一个匹配组确定。“ PAM 组”的含义 取决于 PAM 服务。例子:
对于传统的 Unix 密码,组是在文件中定义的 Unix 组
/etc/group
,可能在文件中补充了额外的 PAM 信息,例如/etc/security/group.conf
.对于 LDAP,组是在 LDAP 目录中定义的 LDAP 组。
如果代理用户(外部用户)拥有被
PROXY
代理 MySQL 用户名的权限,代理就会发生,代理用户会承担被代理用户的权限。
本节介绍如何安装服务器端 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 身份验证插件的方法取决于您的安装方式:
如果您在服务器启动时使用
--plugin-load-add
选项安装了插件,请在不使用该选项的情况下重新启动服务器。如果您在运行时使用
INSTALL PLUGIN
语句安装插件,它会在服务器重新启动后保持安装状态。要卸载它,请使用UNINSTALL PLUGIN
:UNINSTALL PLUGIN authentication_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 用户,则使用如下语句:
root
users
developer
data_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_name
的pam_group_name
、 和mysql_user_name
值可以包含除等号、逗号或空格之外的任何内容。如果
pam_service_name
、pam_group_name
或mysql_user_name
值用双引号引起来,则引号之间的所有内容都是该值的一部分。这是必需的,例如,如果值包含空格字符。除双引号和反斜杠 (\
) 外,所有字符都是合法的。要包含任一字符,请使用反斜杠将其转义。
如果插件成功验证了外部用户名(客户端传递的名称),它会在验证字符串中查找 PAM 组映射列表,如果存在,则使用它向 MySQL 服务器返回一个不同的 MySQL 用户名基于外部用户是哪个 PAM 组的成员:
如果身份验证字符串不包含 PAM 组映射列表,则插件返回外部名称。
如果身份验证字符串确实包含 PAM 组映射列表,则插件 从左到右检查列表中的每一对,并尝试 在分配给经过身份验证的用户的组的非 MySQL 目录中找到值的匹配项,并 返回它找到的第一个匹配项。如果插件找不到任何 PAM 组的匹配项,它会返回外部名称。如果插件无法在目录中查找组,它会忽略 PAM 组映射列表并返回外部名称。
pam_group_name
=mysql_user_name
pam_group_name
mysql_user_name
以下部分介绍如何设置使用 PAM 身份验证插件的几种身份验证方案:
没有代理用户。这仅使用 PAM 来检查登录名和密码。每个允许连接到 MySQL 服务器的外部用户都应该有一个匹配的 MySQL 帐户,该帐户被定义为使用 PAM 身份验证。 (对于与外部用户匹配的 MySQL 帐户 ,必须是外部用户名,并且必须与客户端连接的主机匹配。)可以通过各种 PAM 支持的方法执行身份验证。稍后的讨论将展示如何使用传统的 Unix 密码和 LDAP 中的密码来验证客户端凭据。
'
user_name
'@'host_name
'user_name
host_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
为其他用户使用。
这些示例做出以下假设。如果您的系统设置不同,您可能需要进行一些调整。
登录名和密码分别是
antonio
和antonio_password
。更改这些以对应于您要验证的用户。PAM 配置目录为
/etc/pam.d
.PAM 服务名称对应于身份验证方法(
mysql-unix
或mysql-ldap
在本讨论中)。要使用给定的 PAM 服务,您必须在 PAM 配置目录中设置一个同名的 PAM 文件(如果该文件不存在则创建该文件)。此外,CREATE USER
对于使用该 PAM 服务进行身份验证的任何帐户,您必须在语句的身份验证字符串中命名 PAM 服务。
PAM 身份验证插件在初始化时检查是否AUTHENTICATION_PAM_LOG
在服务器的启动环境中设置了环境值。如果是这样,该插件允许将诊断消息记录到标准输出。根据服务器的启动方式,该消息可能会出现在控制台或错误日志中。这些消息有助于调试插件执行身份验证时发生的与 PAM 相关的问题。有关详细信息,请参阅
PAM 身份验证调试。
此身份验证方案使用 PAM 检查根据操作系统用户名和 Unix 密码定义的外部用户,无需代理。每个允许连接到 MySQL 服务器的外部用户都应该有一个匹配的 MySQL 帐户,该帐户被定义为通过传统的 Unix 密码存储使用 PAM 身份验证。
/etc/shadow
使用该文件
检查传统的 Unix 密码
。有关与此文件相关的可能问题的信息,请参阅
PAM Authentication Access to Unix Password Store。
antonio
验证 Unix 身份验证是否允许使用用户名和密码 登录操作系统antonio_password
。通过创建一个
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
创建一个与操作系统用户名具有相同用户名的 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 密码进行身份验证。使用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
操作系统用户已通过身份验证,拥有授予antonio
MySQL 用户的权限,并且没有发生代理。
客户端mysql_clear_password
身份验证插件保持密码不变,因此客户端程序将其以明文形式发送到 MySQL 服务器。这使得密码可以按原样传递给 PAM。使用服务器端 PAM 库需要明文密码,但在某些配置中可能是安全问题。这些措施将风险降至最低:
To make inadvertent use of the
mysql_clear_password
plugin less likely, MySQL clients must explicitly enable it (for example, with the--enable-cleartext-plugin
option). See Section 6.4.1.6, “Client-Side Cleartext Pluggable Authentication”.To avoid password exposure with the
mysql_clear_password
plugin enabled, MySQL clients should connect to the MySQL server using an encrypted connection. See Section 6.3.1, “Configuring MySQL to Use Encrypted Connections”.
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.
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:
Verify that Unix authentication permits logins to the operating system with the user name
antonio
and passwordantonio_password
.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, themysql-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.
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.Connecting to the server is the same as described in PAM Unix Password Authentication without Proxy Users.
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.
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.
Verify that Unix authentication permits logins to the operating system with the user name
antonio
and passwordantonio_password
.Verify that
antonio
is a member of theroot
orusers
PAM group.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, themysql-unix
file might look like this:#%PAM-1.0 auth include password-auth account include password-auth
For macOS, use
login
rather thanpassword-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
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 theroot
andusers
PAM groups to thedeveloper
anddata_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.
NoteIf 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.
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 thedeveloper
ordata_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.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 ''@'';
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 forantonio
depend on which PAM groupsantonio
is a member of. Ifantonio
is a member of theroot
PAM group, the PAM plugin mapsroot
to thedeveloper
MySQL user name and returns that name to the server. The server verifies that''@''
has thePROXY
privilege fordeveloper
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 thedeveloper
MySQL user, and that proxying occurs through the default proxy account.If
antonio
is not a member of theroot
PAM group but is a member of theusers
PAM group, a similar process occurs, but the plugin mapsuser
PAM group membership to thedata_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 thedata_entry
MySQL user, and that proxying occurs through the default proxy account.
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:
To make inadvertent use of the
mysql_clear_password
plugin less likely, MySQL clients must explicitly enable it (for example, with the--enable-cleartext-plugin
option). See Section 6.4.1.6, “Client-Side Cleartext Pluggable Authentication”.To avoid password exposure with the
mysql_clear_password
plugin enabled, MySQL clients should connect to the MySQL server using an encrypted connection. See Section 6.3.1, “Configuring MySQL to Use Encrypted Connections”.
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 theshadow
group that has/etc/shadow
access:Create a
shadow
group in/etc/group
.Add the
mysql
operating system user to theshadow
group in/etc/group
.Assign
/etc/group
to theshadow
group and enable the group read permission:chgrp shadow /etc/shadow chmod g+r /etc/shadow
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.
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-password
PAM 服务文件以禁用任意密码访问。