vsftpd搭建FTP服务器

一、要求

现在我们需要在Ubuntu14.04上利用vsftpd创建ftp服务器环境,然后在禁止匿名访问的前提下,创建以下四个虚拟用户并配权:

  1. 一个用户为:tea1,密码为:tea1pass,进入tea1目录(对该目录及其子目录拥有所有权限,不可进入上级目录)。
  2. 一个用户为:tea2,密码为:tea2pass,进入tea2目录(对该目录及其子目录拥有所有权限,不可进入上级目录)。
  3. 一个用户为:stu,密码为:stupass,进入ftp总目录(只拥有上传文件权限,不可进入上级目录)。
  4. 一个用户名为:admin,密码为:admin,进入ftp总目录(拥有ftp的全部权限)。

注:ftp的主目录为/home/ftp/ftp,如果需要创建其他用户,或者修改用户权限,使用SSH修改。

二、vsftpd安装:

在配置vsftpd之前,我们先安装vsftpdvsftpd的安装比较简单。我们直接使用apt-get进行安装,如下:

sudo apt-get -y install vsftpd

安装步骤很简单,这一个命令就ok了,不过配置才是大头。你可以使用下面的命令尝试去看vsftpd安装的一些文件:

dpkg -L vsftpd |tac

(这里只说明/etc/init/vsftpd.confvsftpd的初始化文件,而/etc/vsftpd.confvsftpd的配置文件)

vsftpd的启动,停止,重启方式:

  1. 在ubuntu下要启动、停止、重启vsftpd,我们必须使用以下命令:

    sudo service vsftpd stop
    sudo service vsftpd start
    sudo service vsftpd restart
  2. 在centos下,我们可以使用以下命令:

    service vsftpd stop
    /etc/init.d/vsftpd stop

三、配置

由于我们已经安装完了,所以,接下来我们就要进行一些配置,其实在我们安装完vsftpd之后,这个程序就会自动创建一个账户为ftp的账户,大家可以用下面的命令查看创建好的ftp用户:

cat /etc/passwd

不过我不想使用它,我们就先把它删除了吧,反正以后也用不到,然后我们再创建一个用户ftp,代码如下:

userdel -r ftp 
sudo useradd -m -s /bin/bash ftp

创建后,可以查看一下刚创建的用户(注意:这个用户是无法登录系统的,只是用来作后面虚拟用户的载体):

cat /etc/passwd |grep ftp

创建完成新用户后,我们来创建该用户的对应的目录并修改用户之前的对应目录:

sudo chown -R ftp:ftp /home/ftp/

由于我们需要使用虚拟用户登录系统,所以我们接下来设置虚拟用户的账户名和密码的文件login.txt,如下代码所示:

sudo mkdir /etc/vsftpd/
sudo vim /etc/vsftpd/login.txt

然后在文件中,输入我们想要创建的四个用户的用户名及其密码并保存,需要注意的是一个账户一行,一个密码一行,一共四个用户和密码,也就是需要占用八行。
之后,我们需要用到db_load进行加密处理,所以我们还需要下载并安装db-util,代码如下:

sudo apt-get -y install db-util

安装成功后,使用db_loadloginx.txt进行加密处理:

sudo db_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db

loginx.txt加密处理后,我们接下来配置vsftpd的PAM验证。
创建验证文件,代码如下:

sudo vim /etc/pam.d/vsftpd.virtual

在打开的文件中输入下面的代码(注意:下面代码中的pam_userdb.so的路径根据具体的路径进行填写,如果不知道,请find一下。下面的/etc/vsftpd/login等同于/etc/vsftpd/login.db文件,后面不需要写后缀。):

auth required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/login
account required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/login

接下来我们开始进行用户权限的分配!使用下面代码打开配置文件:

sudo vim /etc/vsftpd.conf

确保该文件中下面的代码正确并且已经启用(如果没有请手动添加):

listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
chroot_local_user=YES
chroot_list_enable=NO
allow_writeable_chroot=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
guest_enable=YES
pam_service_name=vsftpd.virtual
user_config_dir=/etc/vsftpd/vu
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000

上面这些代码的具体含义请自行查询,这里不做解释。
首先由于这些虚拟用户还没有对应的文件夹,所以我们需要在/home/ftp/ftp中创建对应的文件夹,并且将文件夹所有者设置为ftp,由于stu用户和admin用户都指向总目录,所以不需要额外创建目录,因此代码如下所示:

sudo mkdir /home/ftp/ftp
sudo chown -R ftp:ftp /home/ftp/ftp/
sudo mkdir /home/ftp/ftp/tea1
sudo chown -R ftp:ftp /home/ftp/ftp/tea1/
sudo mkdir /home/ftp/ftp/tea2
sudo chown -R ftp:ftp /home/ftp/ftp/tea2/

四、虚拟用户的权限的配置

创建完虚拟用户对应的目录后,我们需要建立虚拟用户对应的配置文件,对虚拟用户的权限进行配置,代码如下:

sudo mkdir /etc/vsftpd/vu
sudo vim /etc/vsftpd/vu/tea1

在打开的窗口中输入tea1用户的权限设置并保存:

guest_username=ftp
local_root=/home/ftp/ftp/tea1/
virtual_use_local_privs=YES
anon_umask=133
cmds_allowed=ABOR,ACCT,APPE,CWD,CDUP,DELE,HELP,LIST,MODE,MDTM,MKD,NOOP,NLST,PASS,PASV,PORT,PWD,QUIT,REIN,RETR,RMD,RNFR,RNTO,SITE,SIZE,STOR,STAT,STOU,STRU,SYST,TYPE,USER

然后建立tea2的配置文件并输入配置信息:

sudo vim /etc/vsftpd/vu/tea2

配置信息:

guest_username=ftp
local_root=/home/ftp/ftp/tea2/
virtual_use_local_privs=YES
anon_umask=133
cmds_allowed=ABOR,ACCT,APPE,CWD,CDUP,DELE,HELP,LIST,MODE,MDTM,MKD,NOOP,NLST,PASS,PASV,PORT,PWD,QUIT,REIN,RETR,RMD,RNFR,RNTO,SITE,SIZE,STOR,STAT,STOU,STRU,SYST,TYPE,USER

建立stu的配置文件并输入配置信息:

sudo vim /etc/vsftpd/vu/stu

配置信息:

guest_username=ftp
local_root=/home/ftp/ftp/
virtual_use_local_privs=YES
anon_umask=133
cmds_allowed=FEAT,REST,CWD,LIST,MDTM,MKD,NLST,PASS,PASV,PORT,PWD,QUIT,RMD,SIZE,STOR,TYPE,USER,ACCT,APPE,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST

建立admin的配置文件并输入配置信息:

sudo vim /etc/vsftpd/vu/admin

配置信息:

guest_username=ftp
local_root=/home/ftp/ftp/
virtual_use_local_privs=YES
anon_umask=133
cmds_allowed=ABOR,ACCT,APPE,CWD,CDUP,DELE,HELP,LIST,MODE,MDTM,MKD,NOOP,NLST,PASS,PASV,PORT,PWD,QUIT,REIN,RETR,RMD,RNFR,RNTO,SITE,SIZE,STOR,STAT,STOU,STRU,SYST,TYPE,USER

关于cmds_allowed的一些知识

以逗号分隔的方式指定可用的FTP命令(post login. USER, PASS and QUIT 是始终可用的命令)。在vsftpd中可以使用默认的一些方法配置来调节用户的对文件操作的权限,但是,对于有些权限的配置的效果却不尽人意,为此cmds_allowed就可以发挥它巨大的作用。这是一个强有力的locking down一个FTP服务器的手段。下面是它的实例和一些配置解释:

  1. 只能上传。不能下载、删除、重命名。 cmds_allowed=FEAT,REST,CWD,LIST,MDTM,MKD,NLST,PASS,PASV,PORT,PWD,QUIT,RMD,SIZE,STOR,TYPE,USER,ACCT,APPE,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST
  2. 只能下载、删除、重命名。不能上传。
    cmds_allowed=FEAT,REST,CWD,LIST,MDTM,MKD,NLST,PASS,PASV,PORT,PWD,QUIT,RMD,RNFR,RNTO,RETR,DELE,SIZE,TYPE,USER,ACCT,APPE,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST
  3. 配置解释:
    cmds_allowed=ABOR,ACCT,APPE,CWD,CDUP,DELE,HELP,LIST,MODE,MDTM,MKD,NOOP,NLST,PASS,PASV,PORT,PWD,QUIT,REIN,RETR,RMD,RNFR,RNTO,SITE,SIZE,STOR,STAT,STOU,STRU,SYST,TYPE,USER
    其中:
CWD - change working directory 更改目录
DELE - delete a remote file 删除文件
LIST - list remote files 列目录
MKD - make a remote directory 新建文件夹
NLST - name list of remote directory
PWD - print working directory 显示当前工作目录
RETR - retrieve a remote file 下载文件
RMD - remove a remote directory 删除目录
RNFR - rename from 重命名
RNTO - rename to 重命名
STOR - store a file on the remote host 上传文件
ABOR - abort a file transfer 取消文件传输
CWD - change working directory 更改目录
DELE - delete a remote file 删除文件
LIST - list remote files 列目录
MDTM - return the modification time of a file 返回文件的更新时间
MKD - make a remote directory 新建文件夹
NLST - name list of remote directory
PASS - send password
PASV - enter passive mode
PORT - open a data port 打开一个传输端口
PWD - print working directory 显示当前工作目录
QUIT - terminate the connection 退出
RETR - retrieve a remote file 下载文件
RMD - remove a remote directory
RNFR - rename from
RNTO - rename to
SITE - site-specific commands
SIZE - return the size of a file 返回文件大小
STOR - store a file on the remote host 上传文件
TYPE - set transfer type
USER - send username
ACCT* - send account information
APPE - append to a remote file
CDUP - CWD to the parent of the current directory
HELP - return help on using the server
MODE - set transfer mode
NOOP - do nothing
REIN* - reinitialize the connection
STAT - return server status
STOU - store a file uniquely
STRU - set file transfer structure
SYST - return system type

五、两个问题说明:

###问题一:vsftpd搭建的FTP服务器存在的中文编码问题

事先说明清楚的是,我的服务器环境是Ubuntu14.04,而FTP的访问者们大多都是使用Windows的系统,并且他们没有多少人使用一些比较专业的FTP客户端软件进行访问,他们大多数都是使用的Windows自带的资源管理器进行访问。

Linux中使用UTF-8作为locale已经成为理所当然的事,然而windows资源管理器却只支持GBK这一系列的编码,恰巧vsftpd并不会处理文件名的编码,这就会出现很不友好的问题,因此针对vsftpd的这个缺陷,网上之前也有过针对它的补丁,使得vsftpd可以进行编码转换,然而这个补丁的版本较老,针对新版本的vsftpd可能还会出现一系列的错误,这里就不对补丁进行介绍了。

之后通过一番查询,发现可以使用基于文件系统的fuse-convmvfs创建一个目录的镜像,一不用打补丁,二是所有的ftp服务器都可以使用,它的原理是:fuse-convmvfs 可以创建一个目录的镜像,在这个镜像里面的文件名都是经过 iconv 进行编码转换的结果,在底层则完全是同一个目录。例如下面代码所示:

convmvfs /home/ftp/ftpgbk -o srcdir=/home/ftp/ftp,icharset=utf8,ocharset=gbk,allow_other,uid=0,gid=11

上面代码的含义是将 /home/ftp/ftpgbk 作为 /home/ftp/ftp 的一个镜像,只是在 /home/ftp/ftpgbk 里面这些文件的名字“看起来是 GBK 编码的”。执行完上面语句之后,为使客户端使用时,查看的文件不会出现乱码,我们还需要将系统ftp的目录改为我们映射的/home/ftp/ftpgbk,然后还需要把ftp中的各个虚拟用户中的指定的路径中的/home/ftp/ftp改为/home/ftp/ftpgbk,这样就ok了。

###问题二:基于问题一成功后的仍旧的编码问题。

说起来很有意思,大家如果全部读完了上文,应该会知道如果我们没有在tea1,tea2以及admin的目录权限配置文件中书写cmds_allowed,它们还是会对该目录及目录下的所有文件拥有全部权限,但是,如果,你没在它们的配置文件中加上cmds_allowed配置项的话,即使你完成了问题一的解决方式,仍然会出现编码问题,因为我之前写的博客中没有在它们三个的配置文件中加上cmds_allowed配置项,之后调试的时候烦恼了我很长时间,特此记录。

Author: bugwz
Link: https://bugwz.com/2016/01/22/vsftpd-ftp/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.