mysql 8.0原生不支持直接ldap认证,必须依赖authentication_ldap_sasl插件,该插件仅企业版原生提供或8.0.28+社区版在补全系统依赖(openldap/sasl)并手动加载插件后才可用;跳过版本、许可证及插件存在性验证将导致后续配置全部静默失败。

MySQL 8.0 原生不支持直接对接 LDAP,必须依赖 authentication_ldap_sasl 插件,而该插件仅在 MySQL Enterprise Edition(企业版)或 MySQL 8.0.28+ 社区版中**有条件可用**——但社区版默认不带二进制文件,且需手动补全系统依赖。跳过版本与插件存在性验证,后续所有配置都会静默失败。
确认 MySQL 版本、许可证与插件是否存在
这是最常被跳过的致命步骤。很多用户卡在 Access denied 却反复调 my.cnf,实际是根本没加载成功插件。
- 运行
SELECT VERSION(); SHOW VARIABLES LIKE 'license';—— 若返回GPL且版本低于8.0.28,说明你用的是标准社区包,authentication_ldap_sasl不在其中 - 执行
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'authentication_ldap_sasl';—— 无返回或状态非ACTIVE,代表插件未就位,此时INSTALL PLUGIN必然报错Plugin 'authentication_ldap_sasl' is not loaded - Linux 下检查插件文件是否存在:
ls /usr/lib/mysql/plugin/authentication_ldap_sasl.so(路径依安装方式而异;RPM 包多在/usr/lib64/mysql/plugin/)
加载插件并确保启动时持久化
INSTALL PLUGIN 只是运行时加载,MySQL 重启后失效。真正起效的方式是通过启动参数强制加载,否则每次重启都要重装。
- 在
my.cnf的[mysqld]段添加:plugin_load_add = authentication_ldap_sasl.so - 插件必须位于
plugin_dir指向的目录下:先查路径SHOW VARIABLES LIKE 'plugin_dir';,再把authentication_ldap_sasl.so(Linux)或.dll(Windows)放进去 - Linux 下确认权限:
ls -l /path/to/plugin_dir/authentication_ldap_sasl.so,确保mysql用户可读;SELinux 启用时可能需setsebool -P allow_user_mysql_connect on - Windows 上注意:
authentication_ldap_sasl服务端插件不可用,只能用于客户端配合 SASL 工具,别指望它在 Windows Server 上直连 AD
配置系统级 OpenLDAP/SASL 并验证连通性
authentication_ldap_sasl 不读取 MySQL 变量如 ldap_server_host,它完全依赖操作系统级配置。你以为改了 my.cnf 就能连 LDAP,其实它根本不会看。
- 确保已安装底层依赖:
openldap-clients+cyrus-sasl-plain(RHEL/CentOS)或libsasl2-modules(Debian/Ubuntu) - 编辑
/etc/openldap/ldap.conf,写明:HOST ldap.example.com、PORT 389、TLS_CACERT /etc/openldap/certs/ca.crt(若用 LDAPS 或 START_TLS) - 用系统命令验证可达性:
ldapsearch -x -H ldap://ldap.example.com -b "dc=example,dc=com" "(uid=testuser)"—— 这步失败,MySQL 肯定连不上,错误日志里只会写LDAP search failed,不告诉你到底是网络不通还是 DN 写错 - OpenLDAP 服务端需开放
uid和memberOf属性可读,否则插件无法获取用户身份或组信息
创建映射用户并绑定正确 DN 格式
不能直接用 AD 或 OpenLDAP 的用户名登录 MySQL;必须显式创建一个“壳账户”,其 AS 子句内容不是密码,而是 LDAP 中该用户的完整可识别名(DN),大小写、OU 名称、属性名全部敏感。
- 典型语句:
CREATE USER 'alice'@'%' IDENTIFIED WITH authentication_ldap_sasl AS 'uid=alice,ou=People,dc=example,dc=com'; - AD 环境常用格式是
CN=alice,CN=Users,DC=example,DC=com或 UPN:alice@example.com(前提是 LDAP 服务器支持 UPN 解析) - 若用户分散在多个 OU,不能用通配符;要么为每个 DN 单独建用户,要么启用组映射模式(需额外配置
ldap_server_group_search_attr等变量) - 创建后必须手动
GRANT权限,LDAP 只管认证,不自动同步权限;角色映射需靠插件组搜索机制 + MySQL ROLE 配合,不是开箱即用
最容易被忽略的点是:插件行为完全由系统级 OpenLDAP/SASL 配置驱动,MySQL 层面几乎不参与连接建立。一旦 ldapsearch 能通但 MySQL 登录失败,问题一定出在 DN 格式、PAM 链路、SELinux 策略或插件未真正激活上,而不是 MySQL 密码策略或用户表结构。











