什么是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。
主动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 [email protected] 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用户可以上传文件。是不是很简单呢?