基于Spring boot的FTP工具类Demo详见Github
安装(在root用户下)
首先查询本机是否装有FTP服务器;命令如下:
rpm -qa | grep vsftpd
如果没有,则执行:yum -y install vsftpd 进行安装
若存在且想卸载,执行:rpm -e vsftpd-***(vsftpd-*** 查询出来的结果);具体如下所示:
删除后会保留主要的配置文件,并命名为.rpmsave后缀;如不需要,则可自行手动删除
防火墙和SELinux设置
防火墙设置
分别执行如下命令:
firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --reload
SELinux设置
a)临时关闭:setenforce 0
b)永久关闭方法:修改/etc/selinux/config文件中,设置SELINUX=disable,并重启服务器
登录配置
FTP的登录模式有三种;分别是匿名用户登录、本地用户登录和虚拟用户登录。
匿名用户登录
用户登录时不需要用户名和密码,就可直接进入FTP服务器;默认的用户为ftp用户,密码为空;在该模式下,默认的文件路径为:/var/ftp
该目录下有一个pub文件夹,若想上传文件到该目录下,则需要修改pub目录的所属组用户信息和目录的权限信息;若要上传目录到当前根目录(即:/var/ftp)下,则需修改ftp目录的组用户信息和权限信息;这里以pub目录为例:
修改目录的所属组用户信息:chown -R ftp:ftp /var/ftp/pub
修改目录的权限信息:chmod -R 777 /var/ftp/pub
其次,在/etc/vsftpd下,修改ftp的配置文件vsftpd.conf;再修改前,尽量养成备份原始配置文件的习惯:cp vsftpd.conf vsftpd.conf.bak
默认情况下匿名用户登录是开启的,如右图所示:anonymous_enable=YES
到这匿名登录方式已经配置完成,可以通过systemctl start vsftpd.service || systemctl stop vsftpd.service || systemctl restart vsftpd.service 分别开启、关闭和重启ftp服务,进而可以进行你的上传和下载任务。
本地用户登录
本地用户登录时指使用系统当前所注册的用户作为FTP的用户信息,来登录FTP服务器。
在刚开始接触的时候,搭建这个本地用户登录花费了太久的时间。看了网上一大堆的资料,五花八门的;每个人的配置都有差别,又没有对自己的配置做解释;导致在具体实施的时候,不明其里,到最后配来配去还是失败。在这分享一下个人心得,当自己完全搭建好了后,才发现并没有网上有些教程说的那么复杂;很多配置项其实是没有必要添加的。废话不多说,直接上干货。
目前系统中有一个初始用户:yhyr
修改FTP配置文件:vi /etc/vsftpd/vsftpd.conf
配置文件件里默认开启了本地用户登录模式;即:local_enable=YES
chroot_local_user=YES 表示限制所有用户都只能访问该用户的home目录;前提条件是配置文件里没有配置local_root属性;如果配置了local_root属性,则该用户只能访问local_root所指向的路径
当配置了chroot_local_user=YES,则一定要顺便配置一下allow_writeable_chroot=YES;否则在用户登录的时候会报如下错误:
到这,其实你已经配置好了本地用户登录;来检验一下
在终端连接ftp:ftp localhost;如下所示:
按照提示输入用户名:yhyr
输入该用户的密码后,你会看到如下接信息:
到这,你已经实现了本地用户的登录;因为配置了chroot_local_user=YES,所以当前登录的目录位置则为用户yhyr的目录,即:/home/yhyr
还是因为chroot_local_user=YES配置项的原因,你无法切换到其他目录;若想实现该功能,则可以直接注释掉chroot_local_user=YES和allow_writeable_chroot=YES即可(危险性太高,不建议)
在初学的时候,看到过网上有很多人配置了userlist_enable=YES属性,接下来我来说明一下这个属性的作用,以及如何正确使用该属性。
userlist_enable=YES 表示用/etc/vsftpd下的user_list名单来限制用户访问
userlist_deny=No 表示user_list名单中的用户禁止访问;反之,当userlist_deny=YES时,名单中的用户可以访问FTP服务器
在之前的配置文件中追加userlist_enable=YES和userlist_deny=No;则可以使用user_list名单里所包含的用户登录
以user_list中的root用户为例,登录ftp,结果如下所示:
你会发现登录失败,报530错误;
原因是尽管在user_list中root是有权登录的,但是在ftpusers中也存在root用户;且通过命令:cat /etc/pam.d/vsftpd 可以看出,系统是禁止ftpusers中的用户登录
所以要想使上述配置生效,只需要在user_list中添加一个ftpusers中不存在的用户即可;则把之前的用户yhyr添加到user_list中,如下所示:
然后重启ftp服务,再次登录yhyr用户,就会成功。
网上还有人用到了local_root=/xxx的配置项,谈到local_root,就需要和前面提到过的chroot_local_user一起说;chroot_local_user是指定用户登录的目录是该用户的home路径;而local_root则是指定用户登录的具体路径;如果在配置文件中使用了local_root配置项,则用户登录时以local_root指定的路径为准,而不会在考虑chroot_local_user所代表的home目录了。
需要注意的是:local_root所指定的目录的组用户信息必须是当前所登录的用户,否则登录失败。如下所示:
登录结果如下:
说完了之前初学时踩到的坑,接下来说一个比较实用,但是之前学习的时候还是不甚清晰的一点。
为FTP服务器添加用户。说起添加用户,晚上对于用添用户的方式各种各样,有禁用shell登录的,添加配置文件的,按照他们的做法实践一通,发现还是错误。接下来谈谈自己的心得。
我建议使用不禁用shell的方式来新建用户 (因为/etc/pam.d/vsftpd里默认是需要shell登录权限的秀勇,如果新建用户禁用掉shell登录,则需要注射掉/etc/pam.d/vsftpd里的对应选项)
命令如下:useradd -d /新建用户的根目录 用户名
eg: useradd -d /home/test test
设置test用户密码:passwd test
这样就创建了好test用户,在这首先注释掉配置文件vsftpd.conf中的local_root,userlist_enable ,userlist_deny配置项;重启服务后,用test用户登录,结果如下:
你也可以采用不注释掉userlist_enable,userlist_deny配置项,但必须把test用户添加到user_list中。(何必呢,不限麻烦嘛,不但要多写两行配置项,还要想user_list中添加新用户)
看到这,应该对配置本地用户登录有了较为清晰的认识了吧。最后在说一点,也是网上出现比较多的,个人觉得也稍微有点实际用途的:user_config_dir配置项。
说起这个配置项,首先需要在上述技术上做一个实践:
现在系统中有了两个用户:yhyr和test;之前说过,使用local_root配置项可以直径用户的登录路径,那么问题来了:在当前情况下(存在两个或多个用户时),在vsftpd.conf中配置了local_root配置项后,结果会如何呢。回想一下之前说过的,乳沟local_root所指向的路径的组用户信息和所登录的用户不一直,则会出现500 cannot change directory的错误,所以当多用户的情况下,在配置文件中直接添加local_root属性,必定至少会使一个用户登录失败。eg:
介于这种原因,所以我们才引入user_config_dir配置项,该配置项指定一个文件夹路径,该文件夹下存放各本地用户的配置文件;用户配置文件的名字与用户名相同,但不带后缀,可以通过在用户配置文件中指定local_root配置项,从而达到不同用户登录进入相应目录的需求。
vsftpd.conf配置文件如下所示:
在/etc/vsftpd目录下新建一个userconf文件夹:mkdir userconf
在userconf目录下,新建两个文件夹,分别命名为:yhyr和test;内容如下所示
然后重启附后,分别登录yhyr用户和test用户,结果如下所示:
到这,基于FTP的本地用户登录配置已经全部介绍完
虚拟用户登录
顾名思义,该用户不是真实存在系统中的用户;但是与匿名用户不同,虚拟用户登录时是需要密码的。当你熟悉了本地用户登录的配置原理以后,就会很容易理解虚拟用户的配置。废话不多说,直接上配置文件。
因为虚拟用户是依赖于一个真实存在的本地用户上的,所以需要开启本地用户模式;其次,限制用户只能在自己的目录下,不能随意切换(即:chroot_local_user和allow_writeable_chroot);
guest_enable=YES 表示开启虚拟用户模式
guest_username=yhyr 表示指定虚拟用户所依赖的一个本地用户(yhyr)
user_config_dir 用来指定不同虚拟用户的详细配置信息
在这可以看出,当启用虚拟用户模式的时候,本地用户配置中的user_config_dir配置项则是没有意义的,因而注释掉;因为本地用户的user_config_dir是配置多个本地用户登录;而虚拟用户中的该配置项是指多个虚拟用户登录;
写好配置文件以后,接下来就需要创建用户的账户和密码信息;在/etc/vsftpd下新建一个文件vuser_passwd;在里面填写需要添加的用户名和密码(注意:奇数行为用户名;偶数行为密码)。截图如下:
这里有两个用户:xxx和demo,密码分别为123和demo
然后生成虚拟用户认证的db文件;命令如下:
db_load -T -t hash -f /etc/vsftpd/vuser_passwd /etc/vsftpd/vuser_passwd.db
然后,修改/etc/pam.d/vsftpd,注释掉auth required pam_shells.so、auth include password-auth和account include password-auth三行;
并追加如下两行:
auth required pam_userdb.so db=/etc/vsftpd/vuser_passwd
account required pam_userdb.so db=/etc/vsftpd/vuser_passwd
如下图所示:
最后,根据user_config_dir中所指定的,在/etc/vsftpd下新建一个vuserconf文件夹,在该文件夹下新建两个文件xxx和demo,文件名分别对应于vuser_passwd中所配置的用户名。
在每个文件里添加local_root配置项,用来指明用该用户登录时的根目录。
因为之前yhyr目录下已经有了ftp文件夹,所以需要新建一个vftp目录,并修改vftp目录的组用户信息为yhyr,权限为777;否则会因为用户权限不对而无法登录,和权限不够导致无法上传和下载。
chown -R yhyr:yhyr /home/yhyr/vftp
chmod -R 777 /home/yhyr/vftp
此时虚拟用户的配置基本已经结束,接下来验证配置的正确性。
可以看到两个虚拟用户都是可以正常登录的;接下来测试一下上传下载:
可以看到,登录时没有问题的,但是上传下载报错,那是因为没有配置虚拟用户的读写权限;接下来只需要在vuserconf中的用户配置文件里添加相应权限即可:
然后重启服务,再次测试就ok了。