MySQL LDAP认证必须通过mysql_pam.so调用系统PAM,再由pam_ldap.so或pam_sss.so连接LDAP;需正确安装插件、配置/etc/pam.d/mysqld、创建用户时指定IDENTIFIED WITH auth_pam AS 'mysqld',并确保用户名与LDAP uid完全一致。

mysql_pam.so 插件必须配合 Linux PAM 使用,不能直连 LDAP
MySQL 本身不内置 LDAP 协议客户端,所谓“LDAP 认证”实际是通过 mysql_pam.so 把认证请求转给系统级 PAM 模块,再由 PAM 的 pam_ldap.so 或 pam_sss.so 去连 LDAP 服务器。跳过 PAM 这一层,mysql_pam.so 会直接报错 Plugin 'mysql_pam' is not loaded 或认证始终失败。
- 确认 MySQL 已加载插件:
INSTALL PLUGIN auth_pam SONAME 'auth_pam.so';,且SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'auth_pam';返回ACTIVE - Linux 系统必须已配置好 PAM + LDAP(例如通过
authconfig --enableldap --enableldapauth或手动编辑/etc/pam.d/mysqld) -
/etc/pam.d/mysqld文件必须存在,且至少包含一行:auth [success=done default=bad] pam_ldap.so(或pam_sss.so)
创建外部用户时必须显式指定 AUTHENTICATION STRING
用 PAM 做外部认证的用户,不能设密码,也不能省略认证方式声明。如果只写 CREATE USER 'alice'@'%' IDENTIFIED BY 'xxx';,MySQL 会按本地密码验证,完全绕过 LDAP。
- 正确语法:
CREATE USER 'alice'@'%' IDENTIFIED WITH auth_pam AS 'mysqld';,其中'mysqld'是 PAM service name,对应/etc/pam.d/mysqld - service name 必须和 PAM 配置文件名严格一致(不含路径、不含扩展名),大小写敏感
- 若 LDAP 用户在不同 OU 下有同名账号(如
alice@eng和alice@hr),需在AUTHENTICATION STRING中传入完整 DN 或映射规则,例如:IDENTIFIED WITH auth_pam AS 'mysqld;cn=alice,ou=eng,dc=example,dc=com'(取决于 PAM 模块是否支持)
连接时用户名必须和 LDAP uid 完全一致,且 host 匹配受限
MySQL 不会帮你做用户名归一化。如果 LDAP 中用户 uid 是 alice.zhang,但你用 mysql -ualice -h... 连接,认证必然失败——PAM 收到的是 alice,查不到该 uid。
- 确保应用连接字符串中的用户名字段,和 LDAP 的
uid属性值逐字相同(注意大小写、点、下划线) -
host部分受 MySQL 权限系统约束:即使 LDAP 认证成功,alice@'10.20.%'也无法登录alice@'192.168.%',除非显式授权 - 调试时可用
tail -f /var/log/secure查看 PAM 实际收到的用户名和认证结果,比 MySQL 错误日志更直接
auth_pam.so 不支持 TLS 双向认证,LDAP 通信安全依赖 PAM 层
MySQL 插件本身不处理 LDAP 的 SSL/TLS 设置。加密和证书校验全由底层 PAM 模块(如 pam_ldap.so)控制。如果 LDAP 服务强制 LDAPS 或 STARTTLS,MySQL 层面不会报错,但 PAM 日志里会出现 ldap_simple_bind_s failed。
- 检查
/etc/ldap.conf或/etc/sssd/sssd.conf:确认ssl start_tls或ssl on已启用,且 CA 证书路径正确(如tls_cacertfile /etc/openldap/certs/ca.crt) - 禁用 SELinux 或为 mysqld 添加
auth_use_nss布尔值:setsebool -P auth_use_nss on,否则可能因策略拦截 PAM 调用 - MySQL 8.0.27+ 支持
auth_pam_compat插件,兼容旧版 PAM 配置,但默认不启用;如遇PAM authentication failed: Conversation error,可尝试切换
/etc/pam.d/mysqld 是否被读取、uid 字段是否被 LDAP server 正确返回、以及系统级 TLS 信任链有没有断。










