Percona 8 PAM+SSSD+AD认证客户端连接报错,求轻量解决方案
我们用的是搭了PAM+SSSD+AD认证的Percona MySQL 8,只有在服务器本机终端能正常完成认证;从其他机器连接时,会报这个错:
ERROR 2059 (HY000): Authentication plugin ‘dialog’ cannot be loaded: /usr/lib/mysql/plugin/dialog.so: cannot open shared object file: No such file or directory
一开始以为是原生MySQL客户端的问题,装了Percona客户端也没解决;手动把dialog.so拷到客户端机器后,又出新错:
ERROR 2059 (HY000): Authentication plugin ‘dialog’ cannot be loaded: Incompatible client plugin interface
最后发现只有在客户端装完整的percona-server-server才能正常连接,这明显不合理,估计是存在bug。想请教:怎么只传输必要模块,让客户端不用装完整服务器就能正常连接?
补充个实用技巧:最新版DBeaver连不上,但选择「MariaDB」而非「MySQL」连接类型时,能成功通过PAM认证,其他用户可以试试。我找到一个针对MariaDB和RedHat的类似问题补丁方案,翻译如下,但不知道怎么编译包含相关模块的Percona客户端:
MariaDB的RedHat补丁内容翻译
这个补丁修改了MariaDB客户端的CMake配置,让编译客户端时顺带把dialog认证插件也带上:
- 在
client/CMakeLists.txt中添加这段代码,确保dialog插件被编译:
MYSQL_ADD_PLUGIN(dialog dialog.c dialog_client.c LINK_LIBRARIES ${EDITLINE_LIBRARY} MODULE_ONLY MODULE_OUTPUT_NAME "dialog_client")
- 调整插件安装路径,把
dialog.so装到客户端插件目录,而非服务器插件目录:
修改安装路径配置,将插件目标路径指向${INSTALL_PLUGINDIR_CLIENT}(客户端专属插件目录),保证客户端能正常加载到该模块。
方法1:提取服务器上兼容的dialog.so模块
- 从Percona MySQL 8服务器的插件目录(通常是
/usr/lib64/mysql/plugin/)复制dialog.so文件到客户端的对应插件目录:- Percona客户端的插件目录一般是
/usr/lib64/mysql/plugin/或/usr/lib/mysql/plugin/ - 重点:客户端和服务器的Percona版本必须完全一致,否则还是会出现「插件接口不兼容」的报错
- Percona客户端的插件目录一般是
- 检查客户端插件目录的权限,确保MySQL客户端进程有读取该文件的权限
- 测试连接:执行
mysql -u <AD用户名> -h <服务器地址> -P 3306,此时应该能正常触发PAM认证流程
方法2:编译包含dialog插件的Percona客户端
参考上面MariaDB的补丁思路,修改Percona客户端源码后编译:
- 下载对应版本的Percona MySQL 8源码包
- 进入
client目录,修改CMakeLists.txt,添加dialog插件的编译规则(适配Percona的路径和依赖):
MYSQL_ADD_PLUGIN(dialog dialog.c dialog_client.c LINK_LIBRARIES ${CURSES_LIBRARIES} MODULE_ONLY MODULE_OUTPUT_NAME "dialog_client")
- 编译客户端时指定要编译
dialog插件:
cmake . -DWITH_CLIENT_PLUGINS=dialog -DCMAKE_INSTALL_PREFIX=/usr/local/percona-client make && make install
- 编译完成后,客户端插件目录会生成兼容的
dialog.so,使用这个编译好的客户端即可正常连接
方法3:换用MariaDB客户端
Percona与MariaDB的客户端插件兼容性较好,直接安装同版本的MariaDB客户端即可——它默认包含dialog插件,能正常触发PAM+SSSD+AD认证流程,无需额外配置
内容的提问来源于stack exchange,提问作者Vippi

