MySQL商业版(5.7.21)对接OpenLDAP认证失败排查求助
首先,既然两台VM互通但抓不到任何LDAP相关数据包,说明MySQL服务器根本没有发起LDAP请求,问题大概率出在MySQL本地配置或安全策略上,而不是LDAP服务器那边。下面是几个最容易遗漏的配置点:
确认LDAP认证插件是否正确加载
商业版MySQL的LDAP插件是authentication_ldap.so,先检查插件是否已加载:SHOW PLUGINS LIKE 'authentication_ldap';如果没找到,检查
my.cnf(或my.ini)里是否添加了插件加载配置,并且MySQL已经重启生效:plugin-load-add=authentication_ldap.so另外,确保插件文件路径正确(通常在MySQL的
plugin目录下),权限属于mysql用户组。检查本地安全策略拦截
这是最常见的“无数据包”原因:- SELinux限制:执行
getsebool -a | grep mysql,看mysql_connect_any是否为on,如果是off,执行setsebool -P mysql_connect_any on放开限制。 - 防火墙出站规则:检查MySQL服务器的防火墙(firewalld/iptables)是否允许向LDAP服务器的389(明文)或636(TLS)端口发起出站请求。比如firewalld下可以临时测试:
firewall-cmd --add-port=389/tcp --permanent && firewall-cmd --reload。
- SELinux限制:执行
验证LDAP插件的核心配置参数
即使按文档配置,也可能有拼写或格式错误:
检查以下系统变量是否正确设置(可以用SHOW VARIABLES LIKE 'authentication_ldap%';查看):authentication_ldap_server_host:必须是LDAP服务器的正确IP或可解析的主机名(不要用localhost,因为是不同VM)authentication_ldap_server_port:默认389,若用TLS则是636,确保和LDAP服务器一致authentication_ldap_bind_dn&authentication_ldap_bind_password:绑定用户的DN和密码必须有查询LDAP用户条目的权限,比如cn=admin,dc=example,dc=com
如果启用了TLS,还要检查authentication_ldap_use_tls是否为ON,以及authentication_ldap_tls_ca_cert指向的CA证书是否有效且可读。
确认MySQL用户与LDAP用户的映射关系
必须创建对应的MySQL用户,指定使用LDAP认证插件,并且映射到正确的LDAP用户DN:CREATE USER 'johndoe'@'%' IDENTIFIED WITH authentication_ldap AS 'uid=johndoe,ou=users,dc=example,dc=com';如果用的是代理用户模式,还要确保代理用户的权限和映射规则正确,比如:
CREATE USER 'ldap_proxy'@'%' IDENTIFIED WITH authentication_ldap AS 'ou=users,dc=example,dc=com'; GRANT PROXY ON 'ldap_proxy'@'%' TO 'johndoe'@'%';检查LDAP服务器的访问控制列表(ACL)
虽然没数据包,但如果前面的配置都没问题,也要确认OpenLDAP的ACL是否允许MySQL服务器的IP地址执行绑定和用户查询操作。比如在slapd.conf里添加类似规则:access to dn.subtree="ou=users,dc=example,dc=com" by ip=<mysql-server-ip> read by * break
最后,建议先在MySQL服务器上用ldapsearch命令手动测试LDAP连接,确认能正常查询用户:
ldapsearch -x -H ldap://<ldap-server-ip> -b "ou=users,dc=example,dc=com" -D "cn=admin,dc=example,dc=com" -W "uid=johndoe"
如果这个命令能返回结果,说明LDAP连通性没问题,问题肯定在MySQL的配置或本地安全策略上。
内容的提问来源于stack exchange,提问作者Abel

