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.12 PAM 身份验证的插件和库名称
插件或文件 | 插件或文件名 |
---|---|
服务器端插件 | authentication_pam |
客户端插件 | mysql_clear_password |
库文件 | authentication_pam.so |
mysql_clear_password
与服务器端 PAM 插件通信
的客户端明文插件内置于libmysqlclient
客户端库中,并包含在所有发行版中,包括社区发行版。在所有 MySQL 发行版中包含客户端明文插件,使来自任何发行版的客户端都可以连接到加载了服务器端 PAM 插件的服务器。
以下部分提供特定于 PAM 可插入身份验证的安装和使用信息:
有关 MySQL 中可插入身份验证的一般信息,请参阅第 6.2.11 节,“可插入身份验证”。有关该mysql_clear_password
插件的信息,请参阅
第 6.4.1.5 节,“客户端明文可插入身份验证”。有关代理用户信息,请参阅第 6.2.12 节,“代理用户”。
本节概述了 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 可插入身份验证中所述。
要在or
语句的IDENTIFIED WITH
子句中
引用 PAM 身份验证插件
,请使用名称
. 例如:
CREATE USER
GRANT
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 用户名限制为 16 个字符(请参阅第 6.2.3 节,“授权表”),这将 PAM 非代理身份验证限制为名称最多为 16 个字符的 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 服务名称。GRANT
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 库需要明文密码,但在某些配置中可能是安全问题。这些措施将风险降至最低:
为了减少无意中使用
mysql_clear_password
插件的可能性,MySQL 客户端必须明确启用它(例如,使用--enable-cleartext-plugin
选项)。请参阅 第 6.4.1.5 节,“客户端明文可插入身份验证”。为避免
mysql_clear_password
启用插件时密码暴露,MySQL 客户端应使用加密连接连接到 MySQL 服务器。请参阅 第 6.3.1 节,“配置 MySQL 以使用加密连接”。
此身份验证方案使用 PAM 检查根据操作系统用户名和 LDAP 密码定义的外部用户,无需代理。每个允许连接到 MySQL 服务器的外部用户都应该有一个匹配的 MySQL 帐户,该帐户被定义为通过 LDAP 使用 PAM 身份验证。
要对 MySQL 使用 PAM LDAP 可插入身份验证,必须满足以下先决条件:
LDAP 服务器必须可供 PAM LDAP 服务与之通信。
由 MySQL 认证的 LDAP 用户必须存在于 LDAP 服务器管理的目录中。
为 PAM LDAP 身份验证配置 MySQL,如下所示:
antonio
验证 Unix 身份验证是否允许使用用户名和密码 登录操作系统antonio_password
。通过创建一个
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 文件格式在某些系统上可能不同。
创建一个与操作系统用户名具有相同用户名的 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 进行身份验证。连接到服务器与无代理用户的 PAM Unix 密码验证 中描述的相同 。
此处描述的身份验证方案使用代理和 PAM 组映射将使用 PAM 进行身份验证的连接 MySQL 用户映射到定义不同权限集的其他 MySQL 帐户。用户不通过定义权限的帐户直接连接。相反,它们通过使用 PAM 进行身份验证的默认代理帐户进行连接,以便所有外部用户都映射到拥有特权的 MySQL 帐户。使用代理帐户连接的任何用户都映射到这些 MySQL 帐户之一,这些帐户的权限决定了允许外部用户进行的数据库操作。
此处显示的过程使用 Unix 密码验证。要改用 LDAP,请参阅 无代理用户的 PAM LDAP 身份验证的早期步骤。
/etc/shadow
使用该文件
检查传统的 Unix 密码
。有关与此文件相关的可能问题的信息,请参阅
PAM Authentication Access to Unix Password Store。
antonio
验证 Unix 身份验证是否允许使用用户名和密码 登录操作系统antonio_password
。验证它
antonio
是 PAM 组root
的成员。users
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
创建
''@''
将外部 PAM 用户映射到代理帐户的默认代理用户 ( ):CREATE USER ''@'' IDENTIFIED WITH authentication_pam AS 'mysql-unix, root=developer, users=data_entry';
此处,身份验证字符串包含 PAM 服务名称
mysql-unix
,它对 Unix 密码进行身份验证。身份验证字符串还将PAM 组中的外部用户分别映射到root
MySQL 用户 名。users
developer
data_entry
PAM 服务名称后面的 PAM 组映射列表在您设置代理用户时是必需的。否则,插件无法告知如何执行从外部用户名到正确的代理 MySQL 用户名的映射。
笔记如果您的 MySQL 安装有匿名用户,他们可能会与默认代理用户发生冲突。有关此问题及其处理方法的更多信息,请参阅默认代理用户和匿名用户冲突。
创建代理帐户并授予每个代理帐户应有的权限:
CREATE USER 'developer'@'localhost' IDENTIFIED BY 'very secret password'; CREATE USER 'data_entry'@'localhost' IDENTIFIED BY 'very secret password'; GRANT ALL PRIVILEGES ON mydevdb.* TO 'developer'@'localhost'; GRANT ALL PRIVILEGES ON mydb.* TO 'data_entry'@'localhost';
如果您不让任何人知道这些帐户的密码,客户端将无法使用它们直接连接到 MySQL 服务器。相反,预计使用 PAM 进行身份验证的用户会使用 基于其 PAM 组的代理帐户
developer
。data_entry
向代理帐户
PROXY
授予每个代理帐户的权限:GRANT PROXY ON 'developer'@'localhost' TO ''@''; GRANT PROXY ON 'data_entry'@'localhost' TO ''@'';
使用mysql命令行客户端以
antonio
.$> mysql --user=antonio --password --enable-cleartext-plugin Enter password: antonio_password
服务器使用默认
''@''
代理帐户验证连接。产生的特权antonio
取决于 PAM 组antonio
是哪个成员。如果antonio
是root
PAM 组的成员,则 PAM 插件映射root
到developer
MySQL 用户名并将该名称返回给服务器。服务器验证是否''@''
有PROXY
权限developer
并允许连接。以下查询返回如下所示的输出:mysql> SELECT USER(), CURRENT_USER(), @@proxy_user; +-------------------+---------------------+--------------+ | USER() | CURRENT_USER() | @@proxy_user | +-------------------+---------------------+--------------+ | antonio@localhost | developer@localhost | ''@'' | +-------------------+---------------------+--------------+
这表明
antonio
操作系统用户已通过身份验证,拥有授予developer
MySQL 用户的权限,并且代理是通过默认代理帐户进行的。如果
antonio
不是root
PAM 组的成员但是是 PAM 组的成员,users
则会发生类似的过程,但是插件将user
PAM 组成员身份映射到data_entry
MySQL 用户名并将该名称返回给服务器:mysql> SELECT USER(), CURRENT_USER(), @@proxy_user; +-------------------+----------------------+--------------+ | USER() | CURRENT_USER() | @@proxy_user | +-------------------+----------------------+--------------+ | antonio@localhost | data_entry@localhost | ''@'' | +-------------------+----------------------+--------------+
这表明
antonio
操作系统用户已通过身份验证,拥有data_entry
MySQL 用户的权限,并且代理是通过默认代理帐户进行的。
客户端mysql_clear_password
身份验证插件保持密码不变,因此客户端程序将其以明文形式发送到 MySQL 服务器。这使得密码可以按原样传递给 PAM。使用服务器端 PAM 库需要明文密码,但在某些配置中可能是安全问题。这些措施将风险降至最低:
为了减少无意中使用
mysql_clear_password
插件的可能性,MySQL 客户端必须明确启用它(例如,使用--enable-cleartext-plugin
选项)。请参阅 第 6.4.1.5 节,“客户端明文可插入身份验证”。为避免
mysql_clear_password
启用插件时密码暴露,MySQL 客户端应使用加密连接连接到 MySQL 服务器。请参阅 第 6.3.1 节,“配置 MySQL 以使用加密连接”。
在某些系统上,Unix 身份验证使用密码存储,例如/etc/shadow
通常具有受限访问权限的文件。这可能会导致基于 MySQL PAM 的身份验证失败。不幸的是,PAM 实现不允许区分“密码无法检查”(例如,由于无法读取/etc/shadow
)和“密码不匹配”。”如果您使用 Unix 密码存储进行 PAM 身份验证,您可以使用以下方法之一从 MySQL 启用对其的访问:
假设 MySQL 服务器是从
mysql
操作系统帐户运行的,将该帐户放在shadow
具有/etc/shadow
访问权限的组中:在 中创建一个
shadow
组/etc/group
。将
mysql
操作系统用户添加到shadow
组中/etc/group
。分配
/etc/group
给shadow
组并启用组读取权限:chgrp shadow /etc/shadow chmod g+r /etc/shadow
重新启动 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 身份验证插件在初始化时检查是否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-password
PAM 服务文件以禁用任意密码访问。