CentOS中的FTP是如此的简单,简单到只要安装了vsftpd
,把防火墙一关,什么设置都不用,就可以使用本地用户登录了。
但是,正因为太简单,反而不太适用。
一般来说,使用FTP只是用来上传和下载文件,不需要太多功能,而本地用户,权限就大得多了。
因此,可以创建一个专用的FTP用户,用来上传和下载文件。
1、创建一个FTP用户组。
因为在CentOS里,每个用户都会默认一个用户组,如果在添加用户的时候,不指定用户组,则会创建一个与他同名的用户组。这样不方便管理,所以,先创建一个FTP用户组,所有的FTP用户,都归在这个用户组中。
groupadd ftpgroup
2、添加一个FTP用户
添加FTP用户时,需要注意几个方面:
1)需要将这个用户添加到上面创建的FTP用户组中,参数为:-g ftpgroup
2)因为是FTP传文件专用,所以要禁止这个用户登录CentOS,参数:-s /sbin/nologin
3)CentOS在添加用户时,默认的家目录是/home/用户名
,很显然,这个目录不适合用来上传文件,所以可以指定一个FTP目录,并将这个目录设为FTP用户的家目录。在这里,假定FTP目录为/opt/ftp
,参数为:-d /opt/ftp
4)可以在添加用户的时候,直接创建/opt/ftp
目录,省去手动添加,参数为:-m
添加FTP用户代码为:
useradd -g ftpgroup -d /opt/ftp -s /sbin/nologin -m ftpuser1
3、设置FTP用户密码
为ftpuser1用户设置密码,要不然没法登录。
passwd ftpuser1
4、修改/etc/shells文件
为ftpuser1用户设置密码后,迫不及待地试试FTP功能,结果很失望,不能登录。
这是因为,在添加FTP用户的时候,使用了-s /sbin/nologin
,阻止了FTP用户登录CentOS,同时也阻止了他登录FTP。因为vsftpd
会通过/etc/shells
文件来判断一个用户是否为有效的FTP用户。使用以下代码,可以查看这个文件的内容
vim /etc/shells
如上图所示,/sbin/nologin
并没有在这个文件内,所以vsftpd
会认为FTP用户不是一个有效的用户,阻止登录。
按i
键,进入编辑状态,在文件最后添加/sbin/nologin
再按esc
键,进入命令状态,输入:wq
,存盘退出。
然后就可以使用FTP客户端登录了。如下图所示:
在上图中,可以看到登录后的目录为/opt/ftp
试着上传一个文件,结果……
如果出现这种情况,首先查看一下vsftpd是否启动,如果启动了,查看一下防火墙是否阻止了,如果还不是,那是因为Selinux阻止了,处理方法有三种:
1)在Selinux里添加策略。
2)使用setenforce 0,临时将Selinux模式改为宽容模式,但服务器重启后,还是会回到原来的状态。
3)使用《CentOS 8.2学习笔记之FTP(3)关闭防火墙和Selinux》中的方法彻底关闭Selinux。
处理完毕之后,在FTP客户端就没有任何限制了。可以上传文件、下载文件、为文件重命名,也可以添加文件夹、删除文件夹、为文件夹重命名。
5、锁定FTP目录
到目前为止,我们创建了FTP用户、禁止了FTP用户登录CentOS、设置了专用的FTP目录、并且可以上传下载了,看上去万事大吉了,可是,又发现了一个问题,如下图所示,这个FTP用户,通过FTP客户端,还是可以查看其他目录,这个可不是我们所需要的。
因此,我们需要把FTP用户访问权限锁定在FTP目录里。这就需要使用到vsftpd的配置文件/etc/vsftpd/vsftpd.conf
了。
#备份配置文件
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf-bak
#编辑配置文件
vim /etc/vsftpd/vsftpd.conf
其中相关的配置包括:
1)chroot_local_user
,如果为YES
,将所有用户都锁定在家目录,不能访问其他目录;如果为NO
,则所有用户都不锁定在家目录。默认值为NO
,所以在本节中的ftpuser1
用户和上节中的centos
用户都可以访问其他目录。如果改为YES的话,ftpuser1
就只能访问/opt/ftp
目录及子目录,centos
用户就只能访问/home/centos
目录及子目录。
一般来说,还是建议FTP用户只访问FTP目录,所以建议将chroot_local_user
的值设为YES
2)由于chroot_local_user
比如霸道,只要设为YES
,所有的用户都会被锁定在家目录中,但凡事总有例外,万一有一个用户希望使用FTP上传文件到其他目录怎么办呢?所以CentOS有一个参数chroot_list_file
可以用来指定一个列表,这个列表中可以添加不受chroot_local_user
控制的用户名。
3)使用chroot_list_enable
来启用或不启用chroot_list_file
指定的列表。
所以,这是一套组合拳。
1)无论是否将用户锁在家目录,都可以使用chroot_list_file
来指定“例外
”用户。
如果chroot_local_user
为YES
,那么chroot_list_file
中的用户,就是不被锁定
的用户;
如果chroot_local_user
为NO
,那么chroot_list_file
中的用户,就是被锁定
的用户。
2)如果要使用chroot_list_file
列表,就必须使用chroot_list_enable=YES
来启用。所以:
如果chroot_local_user
为YES
,那么chroot_list_enable
就必须为YES
,要不然,所有用户都会被强制锁在家目录了;
如果chroot_local_user
为NO
,那么chroot_list_enable
可以为YES
或NO
,可以指定例外,或不指定例个。
3)如果使用chroot_list_enable=YES
启用了例外列表,就一定要使用chroot_list_file
来指定例外列表的位置。
4)如果使用chroot_list_file
来指定例外列表的位置,这个位置上就必须要有文件,哪怕是个空文件。
6、文件夹权限设置
CentOS规定,如果用户被锁定在家目录的话,这个目录就不能再有可写权限,否则,FTP无法登录。解决方式有两种:
1、移除家目录的写权限,另外添加有上传权限的目录。
1)移除家目录的写权限。
chmod a-w /opt/ftp
2)添加一个上传文件夹
移除家目录写权限之后,家目录就不再有可写权限,也就不能上传文件、新建目录、重命名文件和文件夹了,只能下载文件。变通方法只能在家目录里,再添加一个文件夹。
mkdir -p /opt/ftp/uploads
3)修改文件夹权限
如果使用root
用户添加的话,默认文件夹的文件宿主和群宿主都为root
,默认权限为rwxr-xr-x
,而登录的FTP用户为ftpuser1
,所以需要修改一下权限,否则还是无法上传文件。
最简单的办法,就是为文件夹的other用户直接添加写权限。chmod o+w /opt/ftp/uploads
也可以将文件宿主改成上面的ftpuser1
,或将群宿主改成上面的ftpgroup
,当然也可以两个都改。chown ftpuser1:ftpgroup /opt/ftp/uploads
,然后再使用chmod
需要设置一下文件夹的对应的权限。假设只修改了文件宿主,那么就要把文件夹的user权限设为7(读、写、执行都需要);假设只修改了群宿主,那么就要将文件夹的group权限设为7;other权限随意。chmod 770 /opt/ftp/uploads
2、让家目录可以拥有写权限
修改/etc/vsftpd/vsftpd.conf
文件,添加allow_writeable_chroot=YES
,让家目录可以有可写权限,这种方法比较简单。
7、添加例外列表
添加/etc/vsftpd/chroot_list
文件,里面不需要添加内容。
touch /etc/vsftpd/chroot_list
8、总结
创建专用的FTP用户,需要以下几个步骤:
- 创建FTP用户组,
groupadd ftpgroup
。 - 创建FTP用户,指定上传目录为家目录,添加到FTP组中,设置为不能登录,同时创建上传目录文件夹,
useradd -g ftpgroup -d /opt/ftp -s /sbin/nologin -m ftpuser1
。 - 为FTP用户添加密码,
passwd ftpuser1
。 - 修改
/etc/shells
,将/sbin/nologin
添加其中,这样vsftpd
就会让FTP用户登录了。 - 锁定FTP目录
chroot_local_user=YES
,将所有用户都锁定在家目录chroot_list_enable=YES
,启用例外列表chroot_list_file=/etc/vsftpd/chroot_list
,设置例外列表位置
- 选择是为家目录称除写权限,还是让家目录可以拥有写权限
allow_writeable_chroot=YES
,让家目录可以拥有写权限。- 移除家目录的写权限,并添加一个上传目录。
chmod a-w /opt/ftp
,移除家目录权限。mkdir -p /opt/ftp/uploads
,添加一个用于上传的文件夹chown ftpuser1:ftpgroup /opt/ftp/uploads
,修改文件夹的宿主。chmod 770 /opt/ftp/uploads
,设置文件夹的权限。
touch /etc/vsftpd/chroot_list
,添加例外列表文件