本文不是项目安装参照步骤,主要记录安装大体步骤和过程中出现的问题。
vsftp安装
按照官方文档安装,只是我遇到了安装依赖包超时的问题。
dnf install vsftpd
依赖包自动下载过程中出现:
Timeout was reached for http://repo.openeuler.org/openEuler-22.09/debuginfo/x86_64/repodata/repomd.xml [Connection timeout after 30000 ms]
open欧拉版本是22.09,具体原因没有细究。解决方法:执行#yum list all,然后在执行dnf install vsftpd
后来又出现curl下载文件超时情况,重新执行yum list all 后,再次执行dnf install vsftpd顺利安装完成。
配置虚拟账号
虚拟账号的整体思路为:
- 创建一个宿主用户,宿主用户shell设置为/sbin/nologin,并为宿主用户配置一个用户目录;
- 通过pam方式创建文件数据库,用来保存虚拟用户的账号密码,用户登录是进行验证;
- 修改vsftp主配置文件,启用虚拟用户;
- 为每个虚拟用户配置vsftp配置文件,为每个虚拟用户做权限、根目录等配置。
创建宿主用户
为了提高安全性,ftp用户的shell应该设置为“/sbin/nologin”,禁止登录,所以我们先来创建一个宿主用户,并配置用户目录为/home/ftp/vftp,用户名为virtual。
# useradd -s /sbin/nologin -d /home/ftp/vftp virtual
创建文本型用户数据库用于pam验证
网上比较多的方法是使用:
db_load -T -t hash -f /etc/vsftpd/virtual_user /etc/vsftpd/virtual_user.db来创建数据库,但是在我所有的openEuler22.09中并不能使用。通过查看systemctl status vsftpd,看到:pam_faillock(vsftpd:auth): User unknown: 报错。这个问题详细了解可参考:vsftpd搭建ftp服务器不能使用虚拟账户登录 · Issue #I5WRC0 · src-openEuler/vsftpd - Gitee.com 经过查找资料,说是因为pam_userdb使用的数据库由bdb换成了gdbm,需要更换格式。安装gdbm,使用以下命令创建数据库,增加用户:
gdbmtool -n /etc/vsftpd/virtual.pag open
gdbmtool /etc/vsftpd/virtual.pag store ${FtpUserName} ${FtpUserPass}
例如创建用户vftp,密码为123456:
gdbmtool -n /etc/vsftpd/virtual.pag open
gdbmtool /etc/vsftpd/virtual.pag store vftp 123456
可以重复第二个命令创建多个用户。
配置pam认证:
vim /etc/pam.d/vsftpd在第3行插入:
auth sufficient pam_userdb.so db=/etc/vsftpd/virtual #刚才生成的virtual.pag
account sufficient pam_userdb.so db=/etc/vsftpd/virtual
这里注意不能带扩展名,不然会出现pam_userdb(vsftpd:auth): user_lookup: could not init database `/etc/vsftpd/***': No such file
也有说这里sufficient为required的。但是我是用required的时候一直出现pam_faillock(vsftpd:auth): User unknown:问题,替换为sufficient好像可以认证了。
修改vsftpd.conf主配置文件
参数中需要注意的:
- chroot部分。下面参数中chroot_local_user、chroot_list_enable、allow_writeable_chroot、chroot_list_file=/etc/vsftpd/chroot_list四个参数限制了所有用户都被限制在主目录,chroot_list文件内的用户不受此限制。这四个参数的具体作用可参考wzlsunice88的文章建立vsftpd权限控制_vsftpd 读写权限-CSDN博客
- virtual_use_local_privs=YES。虚拟用户和宿主用户有一样的权限。ftp用户上传的文件和目录用户和组都是前面创建的宿主用户,如果宿主用户和虚拟用户权限不一致,则虚拟用户无法在上传的目录中进行写操作,在新建目录上传文件等。
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
chroot_list_enable=YES
allow_writeable_chroot=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
banner_file=/etc/vsftpd/welcome.txt
use_localtime=YES
#宿主用户配置部分
guest_enable=YES
guest_username=virtual #前面创建的宿主用户
virtual_use_local_privs=YES #yes表示虚拟用户和宿主用户有一样的权限,no则标识虚拟用户和匿名用户一样的权限
user_config_dir=/etc/vsftpd/vuser_conf #虚拟用户配置文件目录,每个虚拟用户一个文件,文件名和虚拟用户名相同
reverse_lookup_enable=NO
虚拟用户配置文件
vsftpd的主配置文件中,定义了虚拟用户配置文件的目录为vuser_conf。创建目录、创建和虚拟用户同名的文件vftp,编辑vftp文件。这里因为主配置文件virtual_use_local_privs=YES,设置虚拟用户和宿主用户通权限,所以anon_***的参数都是no。如果virtual_use_local_privs=NO,那么这里需要设置具体的anon_***为yes,来允许vftp具备上传、下载、删除等权限。具体可参照苦心明的文章vsftpd配置详解中虚拟用户设置部分。
# mkdir /etc/vsftpd/vuser_conf
# touch /etc/vsftpd/vuser_conf/vftp
#设置vftp可以上传,下载和删除文件
# vim /etc/vsftpd/vuser_conf/vftp
#指定虚拟用户仓库的具路径
local_root=/home/ftp/vftp
#设定不允许匿名访问
anonymous_enable=NO
#允许写的操作
write_enable=YES
#上传文件的权限掩码
local_umask=022
#不允许匿名上传
anon_upload_enable=NO
#不允许匿名用户建立目录
anon_mkdir_write_enable=NO
#设定空闲链接超时时间
idle_session_timeout=300
#设定单次传输最大时间
data_connection_timeout=1000
#设定并发客户端的访问数量
max_clients=3
#设定客户端的最大线程数
max_per_ip=3
#设定用户的最大传输速率,单位b/s
#local_max_rate=10000
重启vsftpd服务,就可以在本地测试ftp登录了。
# systemctl restart vsftpd
如果要远程登录,可能还需要在防火墙放行ftp协议。永久开放ftp服务
firewall-cmd --add-service=ftp --permanent
本地测试FTP
# ftp localhost
Trying ::1...
Connected to localhost (::1).
220-Welcome to ftp.
220
Name (localhost:root): vftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
遇到的主要问题
- Timeout was reached for http://repo.openeuler.org/openEuler-22.09/debuginfo/x86_64/repodata/repomd.xml [Connection timeout after 30000 ms] 参照上文vsftp安装部分
- 登录遇到530问题,具体通过systemctl status vsftpd的报错,有三种情况:
- 一个是检查pam.d/vsftpd文件中的路径,不能带db扩展名,否则出现pam_userdb(vsftpd:auth): user_lookup: could not init database `/etc/vsftpd/vuserpam': No such file or directory
- 第二种是报错pam_faillock(vsftpd:auth): User unknown:。pam.d/vsftpd文件中添加的两行,使用sufficient还是required的问题,我刚开始使用required报错,换成 sufficient可以正常认证了。
- 修改/etc/pam.d/vsftpd,将
auth required pam_shells.so
修改为->auth required pam_nologin.so
即可。原因是:auth required pam_shells.so
配置项的含义为仅允许用户的shell为 /etc/shells文件内的shell命令时,才能够成功,而创建ftp用户时,为了禁止ssh登录,一般多为/bin/false 、/usr/sbin/nologin 等,显然不是一个有效的bash,也就无法登录了。报错为
(参照L5S5S7的ubuntu vsftpd 530 Login incorrect 根本原因和解决方案 - 简书 (jianshu.com))vsftpd:auth): user_lookup: could not init database `/etc/vsftpd/virtual': Permission denied
- 500 OOPS: could not read chroot() list file:/etc/vsftpd/chroot_list。如果chroot_list_enable参数设置为yes,则需要在chroot_list_file指定文件目录,并创建chroot_list文件。
- vsftp 550 Permission denied。详细看看virtual_use_local_privs参数,再看看宿主用户是否有主目录读写权限。
- vsftp的主根目录是不能有写的权限的,但是虚拟用户在主根目录里分别创建自己的根目录,可以有写权限。例如主根目录为 /homt/ftp,ftp文件夹不能有写权限
chmod +600 /home/ftp
而虚拟用户vftp主目录/home/ftp/vftp可以有写的权限
chmod +755 /home/ftp/vftp
- 报错500 OOPS: cannot change directory:/ftphome/ftp。可以试试关闭sellinxu试试
如果关闭selinux后,可以正常登录,启动selinux。执行下面的命令修改selinux配置,-P是写入配置文件,重启也不会失效。setenforce 0 #关闭selinux sestatus #查看selinux状态
setenforce 1 #开启selinux setsebool -P ftpd_full_access 1 #修改ftpd的权限 systemctl restart ftpd
查看selinux修改情况:sestatus -b | grep ftp,输出如下:
# sestatus -b | grep ftp
ftpd_anon_write off
ftpd_connect_all_unreserved off
ftpd_connect_db off
ftpd_full_access on
ftpd_use_cifs off
ftpd_use_fusefs off
ftpd_use_nfs off
ftpd_use_passive_mode off
httpd_can_connect_ftp off
httpd_enable_ftp_server off
tftp_anon_write off
tftp_home_dir off
参照的优秀教程
vsftpd配置详解 - 苦心明 - 博客园 (cnblogs.com)
ubuntu vsftpd 530 Login incorrect 根本原因和解决方案 - 简书 (jianshu.com)