mysql社区版不支持authentication_ldap_simple或authentication_ldap_sasl插件,因其未编译进二进制,install plugin必报error 1126;唯一官方支持路径是authentication_pam插件配合系统pam_ldap.so或pam_sss.so,且需严格匹配pam配置文件名与identified with子句。

MySQL 社区版无法直接配置 LDAP 身份认证,企业版虽支持但需严格满足部署条件;生产环境唯一可行路径是 authentication_pam + 系统级 pam_ldap.so 或 pam_sss.so,且仅适用于本地 socket 连接。
为什么直接 INSTALL authentication_ldap_* 插件会失败
社区版 MySQL 二进制中根本未编译 authentication_ldap_simple 或 authentication_ldap_sasl 插件,执行 INSTALL PLUGIN 必报 ERROR 1126 (HY000): Can't open shared library。这不是文件路径或权限问题,而是插件压根不存在。官方文档明确标注这些插件仅限 MySQL Enterprise Edition(8.0.28+),且依赖 SASL、OpenLDAP、TLS 配置等额外组件。下载第三方编译的 .so 文件强行加载,大概率导致 mysqld 启动崩溃或认证逻辑错乱。
authentication_pam + pam_ldap 的最小可用配置
这是当前唯一被 MySQL 官方支持、且在 CentOS/RHEL、Ubuntu 上验证可行的路径,但必须同步完成两层配置:
- 确认 MySQL 已启用 PAM 插件:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'authentication_pam';,返回ACTIVE才可继续 - 创建系统级 PAM 配置文件:
/etc/pam.d/mysqld(注意不是mysql),内容至少含一行:auth [success=done default=bad] pam_ldap.so - MySQL 中建用户时,
IDENTIFIED WITH必须精确匹配 PAM 配置文件名:CREATE USER 'alice'@'localhost' IDENTIFIED WITH authentication_pam AS 'mysqld'; - LDAP 用户登录时,MySQL 不校验密码,而是把凭据透传给 PAM;PAM 再调用
ldap_bind向 LDAP 服务器发起验证——这意味着 MySQL 永远看不到明文密码,也无法缓存
PAM 方案的关键限制与坑点
这个方案看似“集成”,实则存在几个硬性约束,容易被忽略:
- 仅对
localhost的 socket 连接有效;TCP 远程连接(如'alice'@'192.168.1.%')会被拒绝,因为 PAM 认证不参与网络层 handshake - 用户名必须与 LDAP 中的
uid字段完全一致,大小写敏感,且不能含@符号(除非 SSSD 配置了use_fully_qualified_names = False) - 若改用
pam_sss.so(推荐用于新版系统),需先配好/etc/sssd/sssd.conf,并确保ldap_id_use_start_tls = True或ldap_tls_ciphers = NORMAL,否则 TLS 握手失败 - SSSD 默认缓存 15 分钟,LDAP 中禁用用户后,MySQL 仍可能接受其后续连接;调试时建议临时加
debug_level = 9并重启sssd服务
代理层或同步层才是远程场景的真实解法
如果必须支持远程连接或需要更灵活的映射逻辑(比如 LDAP 用户 joe 映射为 MySQL 账户 developer),就只能跳出 mysqld 原生认证流程:
- ProxySQL 方案:配置
mysql_users表中所有用户统一用ldap_proxy@'%'登录,再通过mysql_query_rules拦截 AUTH 包,调用外部脚本做ldapsearch -x -D ... -w ...验证;但所有连接最终都共用同一个 MySQL 账户的GRANT权限 - 同步脚本方案:定时运行
ldapsearch拉取用户列表,生成CREATE USER ... IDENTIFIED WITH mysql_native_password AS 'xxx'语句导入 MySQL;缺点是密码变更延迟、无法实时感知账户禁用、且需自行处理哈希格式兼容性(AD 的userPassword多为 SSHA 或 NTLM,MySQL 8.0+ 默认要求mysql_native_password哈希)
真正难的不是“怎么连上”,而是“谁该有哪条数据的读写权”——LDAP 只管身份,MySQL 权限模型仍得靠 GRANT 显式控制,这两层永远无法自动对齐。











