MySQL 8.0.27+需用authentication_pam插件对接系统用户,配置须严格匹配PAM文件名、用户名、权限及SELinux策略,否则报ERROR 1045或静默降级。

MySQL 8.0 社区版不能直接对接系统用户,必须用 authentication_pam 插件桥接,且配置错一个环节(比如 PAM 文件名、用户映射、权限)就会导致 ERROR 1045 (28000): Access denied 或静默降级为密码认证。
确认 MySQL 版本与插件已就位
低于 8.0.27 的版本不支持稳定版 authentication_pam,CREATE USER ... IDENTIFIED WITH authentication_pam 会报 ERROR 1064。先验证:
- 运行
SELECT VERSION();,确保输出 ≥8.0.27 - 执行
SHOW PLUGINS LIKE 'authentication_pam';,状态必须是ACTIVE - 若未启用,运行
INSTALL PLUGIN authentication_pam SONAME 'authentication_pam.so';;注意SONAME因发行版而异,可先查SELECT @@plugin_dir;,再确认该路径下是否存在对应文件(如auth_pam.so或authentication_pam.so)
创建并配置 /etc/pam.d/mysqld
PAM 配置文件名必须与后续 CREATE USER 中的 AS 值严格一致,且不能是 mysql 或 mysqld_safe —— 否则认证链根本不会触发。
- 新建文件:
sudo tee /etc/pam.d/mysqld,权限设为644,属主root:root - 内容至少包含一行认证模块,例如纯本地用户密码验证:
auth required pam_unix.so - 若要叠加 TOTP,加第二行:
auth [success=done default=bad] pam_google_authenticator.so secret=/var/lib/google-authenticator/${USER} - 顺序不能颠倒:PAM 按行执行,
[success=done]表示当前模块通过就终止认证链,后续模块不执行
创建系统用户并匹配 MySQL 用户名
MySQL 用户名必须与 Linux 用户名**完全一致**(大小写、下划线、连字符),否则 PAM 根本收不到正确用户名去读取密钥或校验密码。
- 用
sudo useradd -m alice创建系统用户(不要跳过-m) - 切换过去生成密钥:
sudo -u alice google-authenticator -t -d -f -r 3 -w 3(仅当需 TOTP) - 确保密钥文件权限为
600,属主为alice;若 mysql 进程用户(通常是mysql)需读取,加 ACL:sudo setfacl -m u:mysql:r /var/lib/google-authenticator/alice - MySQL 中创建用户时,
@'%'部分可照常写,但用户名必须是'alice',不能是'alice@localhost'或别名
创建用户时禁用 IDENTIFIED BY,显式指定 AS 值
一旦启用 authentication_pam,IDENTIFIED BY 不仅无效,还会覆盖认证方式,导致登录失败或退化为弱密码认证。
- 正确写法:
CREATE USER 'alice'@'%' IDENTIFIED WITH authentication_pam AS 'mysqld';(注意末尾'mysqld'必须和/etc/pam.d/mysqld文件名一致) - 错误写法:
CREATE USER 'alice'@'%' IDENTIFIED BY 'xxx' IDENTIFIED WITH authentication_pam AS 'mysqld';—— 会报错或静默失效 - 客户端连接时必须启用明文插件:
mysql -u alice -p --enable-cleartext-plugin,否则提示Authentication plugin 'authentication_pam' cannot be loaded
最容易被忽略的是 mysql 进程用户对密钥文件的读取权限,以及 SELinux 策略(如启用时需 setsebool -P authlogin_nsswitch_use_ldap on)。PAM 链中任意一环失败,整个认证就终止,但日志往往只在 /var/log/secure 里留一行,不进 MySQL error log。


















