在Linux系统中通常使用的FTP服务器是vsftpd,所以下面我就记录一下我是如何在一台没有安装vsftpd的Linux主机上安装vsftpd。
1、安装vsftpd包
sudo yum install vsftpd
2、配置FTP账户
在Linux系统中FTP账户也是一种特殊的系统用户,只不过FTP账户的权限需要特殊设定而已。所以,我们先添加一个FTP账户:
sudo useradd -d /home/www www
其中,useradd为添加用户的命令,该命令只有超级用户组的用户才可以使用。参数“-d”表示该参数后面指定的是用户的主目录。最后面一个参数是FTP用户名。
然后为www用户设置密码:
sudo passwd www
根据提示输入两次密码。
3、设置www用户的权限:
usermod -s /sbin/nologin www
其中,usermod为修改用户信息的命令,它也是只能由超级用户组的成员才能使用。参数“-s”表示该参数后面指定的是用户登录所使用的shell。我们可以查看系统里面有哪些shell:cat /etc/shells
在我的CentOS 7上面显示有如下几个:
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
我们可以看到上面有两个名为nologin的shell,其实它们两个是一样的,只不过/sbin目录是/usr/sbin目录的链接目录,也就是我们通常所说的文件夹快捷方式。如果我们为某个用户指定了他登录所使用的shell为nologin,那就意味着不允许他使用ssh的方式登录系统,但是呢他仍旧可以有其它权限。为了安全性,我们刚创建的FTP账户就不能让他有ssh方式登录系统的权限,所以需要将他的登录shell设为nologin。
设置完不能登录还不算完,试想一下,如果FTP用户通过FTP方式登录系统,那他除了可以看到自己的主目录之外,是不是也可以调转到其它非自己主目录下的目录呢,答案是当然可以,如果不进行限定就是这样。所以,我们还需要限定www用户只能看到自己主目录下的东西。哦,对了,别忘了还有个匿名用户得禁掉。
这些配置我们需要在vsftpd的配置文件里面进行配置:
sudo vi /etc/vsftpd/vsftpd.conf
那么,配置文件里面有这么多选项,我们到底该配置哪些呢,不用担心,我们可以去vsftpd官网找答案。不过很可惜,我打不开官网,这也没关系,我们可以去wikipedia.org上找找看,很快地我就打开了wikipedia上的vsftpd的词条,我发现里面并没有将如何配置vsftpd的,但是我在下方的外部链接“External links”下面发现了“List of Config Directives”这项链接,打开一看,我发现这就是我要找的配置说明。
依次从上往下看,我发现了一些关于匿名账户的相关设置,它们多以“anon”开头,这些选项大多数的默认值都是NO,我看到“anon_world_readable_only”和“anonymous_enable”这两项的默认值是YES。其中“anon_world_readable_only”选项如果为YES,则允许匿名用户下载服务器上的文件,很明显我不能允许,所以这个选项应设为NO。“anonymous_enable”选项控制是否允许匿名用户登录FTP服务器,很明显这项也应设置为NO。所以,我们需要在配置文件中配置下面这两项:
anon_world_readable_only=NO
anonymous_enable=NO
再往下看,我发现可以改变用户根目录的两个选项“chroot_local_user”和“chroot_list_enable”,其中chroot其实是一个名为chroot(const char *path)的C函数,此函数的作用就是将改变调用进程的根目录为指定的路径。选项“chroot_local_user”的值如果设为YES,那么本地用户在通过FTP方式登录之后,他将会被关进他自己的根目录中,而不允许调转到非自己根目录及其子目录以外的其它目录。而选项“chroot_list_enable”如果设为YES,那么vsftpd将允许我们通过“chroot_list_file”选项指定一个包含本地用户列表的文件来控制到底哪些用户在登录后会被关进自己的根目录。
我们需要注意的是,“chroot_local_user”选项和“chroot_list_enable”选项组合使用时所表示的实际含义是相反的。什么意思呢,下面我用一个表格来说明:
chroot_local_user | chroot_list_enable | 实际含义 |
YES | YES | 只有“chroot_list_file”里面列出的用户才不会被关进自己的根目录。 |
YES | NO | 所有本地用户均会被关进自己的根目录。 |
NO | YES | 只有“chroot_list_file”里面列出的用户才会被关进自己的根目录。 |
NO | NO | 所有本地用户均不会被关进自己的根目录。 |
所以,通常情况下选项“chroot_local_user”和选项“chroot_list_enable”不应同时使用,除非有特殊癖好。
我这里只需要设置“chroot_local_user”选项即可:
chroot_loacl_user=YES
再往下看,我发现了一个名为“connect_from_port_20”的选项,该选项控制FTP传输方式,如果设为YES,则使用Port方式传输数据。关于FTP的传输方式,百度文库上有详细说明:http://wenku.baidu.com/view/728dc0104431b90d6c85c79c.html相对应的还有PASV方式,对于该方式,我们需要将“connect_from_port_20”选项设为NO或者注释掉。同时还应设置如下选项:
pasv_enable=YES
pasv_max_port=pasv模式最大端口
pasv_min_port=pasv模式最小端口
但是,PASV模式通常适用于多客户端,而我就一人使用,所以我就没必要使用这个模式。所以我只需设置“connect_from_port_20=YES”就OK。
4、重启vsftpd服务器:
sudo /etc/init.d/vsftpd restart
参考文献
- http://vsftpd.beasts.org/vsftpd_conf.html
- http://man7.org/linux/man-pages/man2/chroot.2.html