什么是vsftpd?

      vsftpd是一个类UNIX操作系统上的一个FTP服务器,包括linux。vsftpd全称是very secure FTP daemon(非常安全的FTP进程),顾名思义,安全是它的一大特性。

        比如说vsftpd是在chroot模式下工作的,通俗chroot模式就是把它禁锢在一个目录中,禁止它访问别的目录。如果你不是用chroot模式,使用系统用户账号登陆FTP时,那么便有了这个用户的所有权力,这样岂不是很不安全?


理解FTP协议

        在配置vsftp之前,先说一下什么是FTP,FTP(File Transfer Protocol)是文件传输协议的简称。工作于应用层,用于上传或下载文件,能够将一个主机的文件共享给其他主机。

        FTP有两种连接方式,命令连接和数据连接。命令连接也叫控制连接,是一直在线,21/tcp,和服务器进行沟通。数据连接是按需打开,按需关闭的,请求下载文件时打开,传输完毕后关闭。

        FTP有两种模式,主动FTP和被动FTP。

        wKioL1UjYNCDz7acAACjrXlVEn8845.jpg

        主动FTP有两次TCP三次握手,最终在20号端口建立连接。一次是客户端发起,另一次由服务器端发起。首先客户端以大于1024的源端口向FTP的服务器端21号目标端口发起连接请求。另一次是FTP服务器端主动发起到客户端的连接,使用20号源端口,主动向客户端的1025号端口发起连接请求。但是防火墙可能会阻止,因此有了被动FTP。

        被动FTP服务器端只是用21号端口,也有两次TCP的三次握手,只不过三次握手都是由客户端发起的。第一次客户端以1024为源端口向FTP服务器的21号端口发起连接请求,FTP服务器告诉客户端使用1024--5000的端口进行数据传输,这个消息帧属于第一次三次握手的一部分。而后第二次三次握手开始,客户端使用1025号源端口主动连接服务器端的发来的端口号。这样都是客户端发起的连接请求,防火墙便不会阻止。


FTP用户

    FTP有三类用户,无论那种用户都要映射为一个系统用户。

    匿名用户:anonymous用户

    系统用户:/etc/passwd中记录的用户

    虚拟用户:建立一个系统账号,将所有账号映射到此用户访问,使用的不是系统用户账号,提高安全性


简单配置vsftpd

    rpm包安装     

# yum install vsftpd
        # service vsftpd on
        # chkconfig vsftpd on

   

 vsftp配置文件调整及说明    

anonymous_enable=YES            #允许匿名用户登录
local_enable=YES                #是否开启系统用户
write_enable=YES                # 是否允许系统用户上传文件
anon_upload_enable=NO           #  匿名用户不可上传文件
local_umask=022                 #  上传文件的权限设定
anon_mkdir_write_enable=NO      #匿名用户不能创建目录
anon_other_write_enable=NO      #匿名用户不能删除文件
dirmessage_enable=YES           #显示用户欢迎信息,比如在/var/ftp/.message文件中写一句‘Welcome',则用户进入/var/ftp目录时,会显示此信息。                               xferlog_enable=YES              #开启日志传输
xferlog_file=/var/log/vsftpd.log   #定义日志传输文件,若不存在,请事先创建
#chown_upload                  #上传文件后将属主改为其他用户
#chown_username                #改为哪个用户,不建议root用户
connect_from_port_20=YES       #20号端口进行数据连接
idle_session_timeout =600      #控制连接超时时间
data_connection_timeout =120   #单次数据连接时间
#ascii_upload_enable=YES
#ascii_download_enable=YES     #以纯文本格式实现上传下载,有两种数据传输模式,文本和二进制,建议不要打开此项。
        
chroot_local_user=YES          #每一个用户都禁锢在家母录中
#chroot_list_file_enable=YES   #用一个文件将用户锁在家目录下
#chroot_list_file=/etc/vsftpd/chroot_list       #哪一个文件中创建一个用户列表,所有在此列表中的用户都禁锢在家目录当中。
        
listen=YES     #vsftpd是否工作为一个独立的守护进程
pam_service_name=vsftpd        #所有写在ftpuser都禁止登录ftp服务器
userlist_enable=YES            #拒绝user_list中用户登录
userlist_deny=YES              #拒绝user_list中用户登录,若改为NO则仅允许user_list 中用户登录
#max_clients                   #最大登录FTP服务器客户端的个数
#max_per_ip                    #每一个单独IP允许发起几个连接请求


基于mysql的虚拟用户

安装mysql  

# yum  install mysql-server mysql-devel

启动mysql  

# service mysqld start
    # chkconfig mysqld on

创建mysql数据库根用户密码 

 # mysqladmin -uroot password  'your_root_sql_password'
# mysql -uroot -p

输入密码进入mysql shell后,位vsftpd虚拟用户创建一个新的数据库,并赋予查询权限。

mysql> CREATE DATABASE vsftpd;
    mysql> GRANT SELECT ON vsftpd.* TO vsftpd@localhost IDENTIFIED BY 'vsftpd';
    mysql> GRANT SELECT ON vsftpd.* TO vsftpd@127.0.0.1 IDENTIFIED BY 'vsftpd';
    mysql> FLUSH PRIVILEGES;

在vsftpd数据库创建表  

mysql>USE vsftpd;
    mysql> CREATE TABLE users (
        -> id INT AUTO_INCREMENT NOT NULL,
        -> name CHAR(30) BINARY NOT NULL,
        -> password CHAR(48) BINARY NOT NULL,
        -> PRIMARY KEY (id)
        -> );

插入连个用户,这里使用md5加密。  

mysql> INSERT INTO users (name,password) VALUES ('tom',md5('xiaoming'));
    mysql> INSERT INTO users (name,password) VALUES ('cat',md5('xiaoming'));

vsftpd.conf配置文件设置:

 guest_enable=YES
    guest_username=viruser
    pam_service_name=vsftpd.mysql

创建一个用户viruser作为映射的用户。

注意,ftp中的匿名用户,系统用户,和虚拟用户都要映射为一个系统用户来访问。

# useradd -s /sbin/nologin -d /var/ftp_root viruser
# chmod go+rx /var/ftp_root

安装pam_mysql认证模块  

# yum install pam_mydql

编辑/etc/pam.d/vsftpd.mysql,添以下内容:

auth required /lib/security/pam_mysql.so user=vsftpd passwd=vsftpd host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=3
account required /lib/security/pam_mysql.so user=vsftpd passwd=vsftpd host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=3
# service vsfptd restart

即可实现基于mysql的虚拟用户。


如何使不同虚拟用户具有不同的权限,例如实现创建的两个用户tom和cat,如何让tom没有上传文件的权限,而cat具有上传文件的权限呢?很简单,只需在配置文件中稍微改动即可:

vsftpd.conf配置文件设置  

 user_config_dir=/etc/vsftpd/viruser

# mkdir /etc/vsftpd/viruser
# cd /etc/vsftpd/viruser
# touch tom cat

编辑tom文件,添以下内容 

anon_upload_enable=NO

编辑cat文件,添以下内容:  

anon_upload_enable=YES

这样配置,便可以实现tom用户不能上传文件,而cat用户可以上传文件。是不是很简单呢?