news 2026/4/15 7:38:25

Kylin麒麟部署vsftpd虚拟用户的异常问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kylin麒麟部署vsftpd虚拟用户的异常问题

一、前因

今天同事在麒麟操作系统上部署vsftp的虚拟用户时,在后续验证的时候出现下列报错信息:

pam_userdb(vsftpd.pam:auth): user_lookup: could not open database `/etc/vsftpd/xxxxx': No such file or directory

经过检查后发现,该文件存在且权限没有任何问题。根据网上的排查步骤也没有任何效果,包括将PAM文件中db路径换成绝对路径。后续经过一段时间的摸索,总结出下列的解决方法。如果有更好的方法,欢迎各位一起交流。

二、还原过程

1. 需求与环境

简单案例演示

  • 新建2个虚拟用户,分别为:viruser01,viruser02,虚拟用户均映射为 ftpuser本地用户;
  • 建立本地用户 ftpuser,家目录为 /var/ftp/ftpuser,不允许登录系统
  • 用户 viruser01,允许登录ftp服务器,根目录为 /var/ftp/viruser01,具有完全控制权
  • 用户 viruser02,允许登录ftp服务器,只读权限

节点设置

选项参数
主机名kylin
网络信息192.168.8.11/24
系统版本Kylin Linux Advanced Server V11 (Swan25)
内核Linux 6.6.0-32.7.v2505.ky11.x86_64
Firewallddisabled
SELinux statusdisabled

2. 配置过程

[Step1]在kylin虚拟机上新建本地用户ftpuser。

// 指定家目录,且不允许登陆系统(由于不允许登陆系统,这里就不设置密码) [root@kylin ~]# useradd -d /var/ftp/ftpuser -s /sbin/nologin ftpuser [root@kylin ~]# chmod 755 /var/ftp/ftpuser // 给目录调整权限 [root@kylin ~]# chown -R ftpuser:ftpuser /var/ftp/ftpuser

[Step2]在ftpuser家目录中创建文件,用于后续访问测试。

[root@kylin ~]# echo "Hello World!" > /var/ftp/ftpuser/ftp.txt

[Step3]在kylin虚拟机上安装vsftpd和lftp服务。

[root@kylin ~]# yum install -y vsftpd lftp

[Step4]新建明文用户名密码文件,该文件用于后续的PAM认证。文件名无任何要求,可以自定义。

[root@kylin ~]# vim /etc/vsftpd/ftpuser # 写入下列内容,格式要求单数行为虚拟用户名,偶数行为虚拟用户密码 viruser01 viruser01@123 viruser02 viruser02@123

[Step5]生成虚拟用户数据库文件。db_load用于加密信息并生成数据库文件。Linux系统中最常用的数据库文件生成工具之一,能够将用户信息进行hash加密并生成db数据库文件,方便第三方应用程序调用。我这里用的是最小化安装,默认不存在 db_load,需要安装额外的数据包。

[root@kylin ~]# yum install -y libdb-utils [root@kylin ~]# db_load -T -t hash -f /etc/vsftpd/ftpuser /etc/vsftpd/ftpuser.db # -T -t hash:指定数据库加密格式为hash # -f:指定用户名密码文件

[Step6]验证:使用db_dump读取db文件内容,能够返回内容即正确。

[root@kylin ~]# db_dump /etc/vsftpd/ftpuser.db

[Step7]为虚拟用户创建PAM文件,对虚拟用户进行访问控制。PAM文件名没有任何要求,可以自定义。

[root@kylin ~]# vim /etc/pam.d/vsftpd.pam # 写入下列内容,指定生成的数据库文件路径,文件名不需要加上".db"后缀 auth required pam_userdb.so db=/etc/vsftpd/ftpuser account required pam_userdb.so db=/etc/vsftpd/ftpuser
  • auth:认证阶段,负责验证用户的身份
  • required:控制标志,表示该模块验证必须成功,否则认证过程失败
  • pam_userdb.so:数据库的用户认证模块,用于读取db哈希数据库文件来验证用户
  • account:账号阶段,负责检查账户合法性

[Step8]先备份一个vsftpd配置文件,然后再编辑vsftpd配置文件。

[root@kylin ~]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak [root@kylin ~]# vim /etc/vsftpd/vsftpd.conf # 修改和添加下列参数 listen=YES listen_ipv6=NO pam_service_name=vsftpd.pam // 用于虚拟用户认证的PAM文件位置[也就是/etc/pam.d/vsftpd.pam] guest_enable=YES // 启用虚拟账户 guest_username=ftpuser //虚拟用户映射的本地用户 user_config_dir=/etc/vsftpd/ftpuser_list // 虚拟用户的独立配置目录 allow_writeable_chroot=YES // 允许可写用户登陆

[Step9]创建虚拟用户权限文件目录,对应的是vsftpd配置文件中的“user_config_dir=/etc/vsftpd/ftpuser_list”。

[root@kylin ~]# mkdir /etc/vsftpd/ftpuser_list

[Step10]新建虚拟用户 viruser01 的权限文件。

[root@kylin ~]# vim /etc/vsftpd/ftpuser_list/viruser01 # 写入下列内容 local_root=/var/ftp/ftpuser # 虚拟用户登陆进来的目录 # 控制虚拟用户是否可以使用本地用户的权限(不会继承本地用户权限),通常用来确保虚拟用户只能访问被授权访问的目录,而非整个文件系统 virtual_use_local_privs=NO write_enable=YES # 允许用户进行写操作(上传、重命名、删除文件或目录) anon_world_readable_only=NO # 控制虚拟用户是否可以访问世界中可读文件 anon_upload_enable=YES # 允许虚拟用户上传文件 anon_mkdir_write_enable=YES # 允许虚拟用户创建目录 anon_other_write_enable=YES # 允许虚拟用户进行其他写操作(删除、重命名文件或目录) download_enable=YES # 允许虚拟用户下载文件

[Step11]新建虚拟用户 viruser02 的权限文件。

[root@kylin ~]# vim /etc/vsftpd/ftpuser_list/viruser02 # 写入下列内容 virtual_use_local_privs=NO write_enable=NO anon_world_readable_only=NO anon_upload_enable=NO anon_mkdir_write_enable=NO anon_other_write_enable=NO download_enable=YES

[Step12]启动vsftpd服务并加入到开机自启,这里我们的防火墙和SELinux均为关闭状态。

[root@kylin ~]# systemctl enable --now vsftpd.service

3. 出现的问题

[Step1]验证:使用 viruser01 虚拟用户进行测试,此时出现“Login failed: 530 Login incorrect.”。

[root@kylin ~]# lftp viruser01@192.168.8.11 Password:viruser01@123

[Step2]验证:使用 viruser02 虚拟用户进行测试,同样出现“Login failed: 530 Login incorrect.”。

[root@kylin ~]# lftp viruser02@192.168.8.11 Password:viruser02@123

[Step3]验证:查看vsftpd的日志,可以看到报错信息“pam_userdb(vsftpd.pam:auth): user_lookup: could not open database `/etc/vsftpd/ftpuser’: No such file or directory”。大致意思就是说“/etc/vsftpd/ftpuser”文件不存在。

[root@kylin ~]# systemctl status vsftpd.service

三、思考与解决

1. 更换环境测试

节点设置

选项参数
主机名redhat
网络信息192.168.8.10/24
系统版本Red Hat Enterprise Linux 9.2 (Plow)
内核Linux 5.14.0-284.11.1.el9_2.x86_64
Firewallddisabled
SELinux statusdisabled

[Step1]之前也做过关于vsftp的虚拟用户的实验,使用的环境是RedHat9。根据上述的步骤,在RedHat9中进行实验。能够正常访问到FTP,不会出现上述的问题。

2. 问题分析

首先需要明确为什么报错信息为“No such file or directory”:这是PAM模块的通用错误报警——当pam_userdb.so无法读取数据库文件时(无论原因是权限、格式、库依赖),都会返回最常见的“No such file or directory”错误,而非精准的故障信息。

在文件存在且没有任何问题的情况下,只可能是KylinV11自带的pam_userdb.so/libcrypt.so.2存在兼容性缺陷。KylinV11系统预装的“pam_userdb.so”(PAM数据库认证模块)或依赖的“libcrypt.so.2”(加密库),在解析libdb格式数据库文件**、**权限检查逻辑或库版本兼容上存在bug,导致模块无法正确读取“/etc/vsftpd/ftpuser.db”,进而伪装成“No such file or directory”的报错。

通过替换libcrypt.so.2解决问题:RedHat9是RHEL官方稳定版本,其“pam_userdb.so”是基于标准libdb库编译的,理论上不会出现缺陷问题。而国产化操作系统,可能在移植或编译该文件的出现问题。替换文件的时候需要注意,属于同型号的处理器之间才能顺利替换,而不同型号则仍然会出现问题。

3. 解决问题

[Step1]将redhat系统上的“pam_userdb.so”复制到kylin系统中。在复制该文件之前,先将本地文件进行备份。

[root@kylin ~]# cp /lib64/security/pam_userdb.so /lib64/security/pam_userdb.so.bak [root@kylin ~]# scp root@192.168.8.10:/lib64/security/pam_userdb.so /lib64/security/pam_userdb.so

[Step2]重新启动vsftpd服务,并进行验证。此时仍然无法访问,出现新的报错信息。

Jan 08 14:10:24 kylin vsftpd[6655]: PAM unable to dlopen(/usr/lib64/security/pam_userdb.so): libcrypt.so.2: cannot open shared object file: No such file or directory Jan 08 14:10:24 kylin vsftpd[6655]: PAM adding faulty module: /usr/lib64/security/pam_userdb.so

[Step3]根据报错信息,可以得知是缺少了“libcrypt.so.2”模块。在kylin系统上检索该模块,确实无法找到。

[root@kylin ~]# find / -name libcrypt.so.2

[Step4]在RedHat系统上检索该模块,能够找到。

[root@redhat ~]# find / -name libcrypt.so.2

[Step5]将redhat系统上的“libcrypt.so.2”复制到kylin系统中。

[root@kylin ~]# scp root@192.168.8.10:/usr/lib64/libcrypt.so.2 /usr/lib64/

[Step6]重新启动vsftpd服务,并进行验证,此时能够正常访问。

[root@kylin ~]# systemctl restart vsftpd.service [root@kylin ~]# lftp viruser01@192.168.8.11 Password:viruser01@123 [root@kylin ~]# lftp viruser02@192.168.8.11 Password:viruser02@123

[Step7]查看vsftpd服务日志信息,没有任何异常信息。

[root@kylin ~]# systemctl status vsftpd.service

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 7:38:08

极简API:将Llama Factory微调模型转化为Web服务

极简API:将Llama Factory微调模型转化为Web服务 作为一名后端工程师,当团队完成大语言模型的微调后,如何快速将其转化为可调用的Web服务?本文将介绍如何使用极简API方案,将Llama Factory微调好的模型部署为REST API。…

作者头像 李华
网站建设 2026/4/1 5:54:56

PlotNeuralNet终极教程:用LaTeX代码绘制专业神经网络图表

PlotNeuralNet终极教程:用LaTeX代码绘制专业神经网络图表 【免费下载链接】PlotNeuralNet Latex code for making neural networks diagrams 项目地址: https://gitcode.com/gh_mirrors/pl/PlotNeuralNet 还在为手绘神经网络结构图而烦恼吗?PlotN…

作者头像 李华
网站建设 2026/4/7 7:18:45

从零开始:掌握Kafka Connect数据导出实战技巧

从零开始:掌握Kafka Connect数据导出实战技巧 【免费下载链接】kafka Mirror of Apache Kafka 项目地址: https://gitcode.com/gh_mirrors/kafka31/kafka Apache Kafka Connect作为Kafka生态系统中至关重要的数据导出工具,为开发者和数据工程师提…

作者头像 李华
网站建设 2026/4/11 23:43:30

BoringNotch完整指南:解锁MacBook凹口的无限可能

BoringNotch完整指南:解锁MacBook凹口的无限可能 【免费下载链接】boring.notch TheBoringNotch: Not so boring notch That Rocks 🎸🎶 项目地址: https://gitcode.com/gh_mirrors/bor/boring.notch 您是否曾盯着MacBook的凹口区域&a…

作者头像 李华
网站建设 2026/4/3 5:06:52

MacBook凹口音乐控制终极指南:让刘海区域变身智能音乐中枢

MacBook凹口音乐控制终极指南:让刘海区域变身智能音乐中枢 【免费下载链接】boring.notch TheBoringNotch: Not so boring notch That Rocks 🎸🎶 项目地址: https://gitcode.com/gh_mirrors/bor/boring.notch 还在为MacBook的凹口区域…

作者头像 李华
网站建设 2026/3/22 11:17:52

传统vsAI设计:MT3608电路开发效率提升300%实测

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 构建一个MT3608设计效率对比项目:1. 传统设计流程文档 2. AI辅助设计流程记录 3. 关键环节耗时统计表 4. 最终方案性能对比 5. 典型问题解决时间记录。要求自动生成可视…

作者头像 李华