mysql官方不支持authentication_ldap插件,唯一受支持的外置认证路径是authentication_pam插件,需配合系统级pam_ldap.so或pam_sss.so实现ldap认证,且必须严格匹配pam配置文件名与identified with子句中的as值。

MySQL 本身不支持 LDAP 认证,所有“LDAP 集成”都必须绕过 mysqld 的原生认证逻辑,走 PAM 代理或外部网关。没有 CREATE USER ... IDENTIFIED WITH ldap_auth 这种语法,强行配置会失败。
为什么直接配置 authentication_ldap 插件会报错
MySQL 官方从未发布过 authentication_ldap 插件。社区或第三方打包的同名插件多为 fork 或封装,稳定性差、无官方维护、不兼容 MySQL 8.0.31+ 的权限模型。你执行 INSTALL PLUGIN authentication_ldap SONAME 'auth_ldap.so' 时大概率遇到 Plugin 'authentication_ldap' is not loaded 或启动失败。
- MySQL 8.0+ 唯一受支持的外置认证路径是
authentication_pam插件 - 该插件不处理 LDAP 协议,只调用系统
pam_ldap.so或pam_sss.so - 任何宣称“MySQL 内置 LDAP 支持”的文档,基本是混淆了 PostgreSQL 的
ldap_auth或 ProxySQL 的自定义逻辑
authentication_pam + pam_ldap 的最小可行配置
这是目前生产环境唯一推荐的路径,但必须同步完成 MySQL 层和系统层两套配置:
- 确认 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 authentication_pam AS 'mysqld',其中'mysqld'必须与 PAM 配置文件名一致 - LDAP 用户登录时,MySQL 不校验密码,而是把用户名/密码传给 PAM;PAM 再通过
ldap_bind向 LDAP 服务器验证——这意味着 LDAP 密码不能被 MySQL 看到或缓存
SSSD 替代 pam_ldap 的实际影响
在 CentOS/RHEL 8+ 或 Ubuntu 22.04+ 上,pam_sss.so 比 pam_ldap.so 更常用,但它引入额外约束:
- 必须先配置好
/etc/sssd/sssd.conf,且ldap_id_use_start_tls = True(若 LDAP 启用 StartTLS)或ldap_tls_ciphers = NORMAL(避免 TLS 握手失败) - MySQL 用户名必须与 LDAP 中的
uid完全一致;大小写敏感,且不能含@符号(除非 SSSD 配置了use_fully_qualified_names = False) - SSSD 缓存机制会导致权限变更延迟(默认 15 分钟),调试时建议临时加
debug_level = 9并重启sssd服务 -
authentication_pam对 SSSD 返回的组信息无感知——MySQL 无法自动映射 LDAP 组到数据库角色,仍需手动执行GRANT ... TO ROLE 'analyst_role'并SET DEFAULT ROLE
ProxySQL 或网关方案的真实代价
如果硬要绕过 PAM,常见替代是 ProxySQL 或自研网关,但代价明确:
- ProxySQL 要求你维护一张
mysql_users表,每次 LDAP 用户增删都得同步更新,且无法自动继承 LDAP 组的权限策略 - 基于
mysql-connector-python写的轻量网关,在 MySQL 8.0.28+ 后面临caching_sha2_password握手协商问题,容易卡在 SSLRequest 阶段,连接直接 reset - 所有网关方案都无法处理
LOAD DATA INFILE、LOCAL INFILE等需要服务端文件访问的语句,因为认证与会话上下文分离
LDAP 用户的密码永远不出现在 MySQL 日志或内存中,这是 PAM 方案的核心优势;但权限本身仍由 MySQL 的 GRANT 语句控制,LDAP 只管“你是谁”,不管“你能干什么”。这点常被忽略——以为连上就等于有权限,其实连 SELECT 都要单独授权。











