vsftpd是一个基于GPL发布的类UNIX类操作系统上运行的服务器的名字(是一种守护进程),可以运行在诸如Linux、BSD、Solaris、HP-UX以及Irix上面。该服务器支持很多其他传统的FTP服务器不支持的良好特征,本文将介绍该服务使用的一些高级配置方式。
推荐阅读:
Ubuntu实用简单的FTP架设 http://www.linuxidc.com/Linux/2012-02/55346.htm
Ubuntu 上架设FTP服务器和Apache服务器 http://www.linuxidc.com/Linux/2011-04/35295.htm
Ubuntu 13.04 安装 LAMP\vsftpd\Webmin\phpMyAdmin 服务及设置 http://www.linuxidc.com/Linux/2013-06/86250.htm
RHEL6平台下SeLinux和vsftpd的匿名上传的简单案例 http://www.linuxidc.com/Linux/2013-04/82300.htm
Linux系统vsftpd源码安装 http://www.linuxidc.com/Linux/2013-03/81475.htm
vsftpd的安全配置案例分析 http://www.linuxidc.com/Linux/2012-12/76501.htm
虚拟用户是指在FTP服务器上拥有账号,并且该账号只能用于文件传输服务的用户,也称作Guest用户。该类用户可以通过输入账号以及口令来进行授权登录。登录入系统后,其登录目录为指定的目录。一般情况下,该类用户既可以下载也可以上传文件。
vsftpd的虚拟用户采用单独的用户名/口令保存方式,与系统账号(passwd/shadow)分离,这大大增强了系统的安全性。vsftpd可以采用数据库文件来保存用户/口令,如hash;也可以将用户/口令保存在数据库服务器中,如MySQL等。vsftpd验证虚拟用户,则采用PAM方式。由于虚拟用户的用户名/口令被单独保存,因此在验证时,vsftpd须要用一个系统用户的身份来读取数据库文件或数据库服务器以完成验证,这就是guest用户,这正如同匿名用户也需要有一个系统用户ftp一样。当然,guest用户也可以被认为是用于映射虚拟用户。
在虚拟用户使用vsftpd服务器之前,要对服务器进行配置,主要包括如下几个步骤:
(1)生成虚拟用户口令库文件。
(2)配置生成vsftpd的认证文件。
(3)建立虚拟用户访问所需要的目录并且设定相应的访问权限。
(4)建立配置文件。
(5)重新启动vsftpd服务器。
下面是完成上述五个步骤的基本命令和过程,如下所示:
生成虚拟用户口令库文件
//生成虚拟用户口令库文件,按照格式编辑口令文件。单数行为用户名,偶数行为用户口令 #vi login.txt liyangsuper//用户名 real//口令 patterson//用户名 jef//口令 guest//用户名 guest//口令 //存盘退出
配置生成vsftpd的认证文件
//使用db_load命令生成口令库文件 #db_load –T –t hash –f login.txt /etc/vsftpd/vsftpd_login.db //修改该口令库文件的权限 #chmod 600 /etc/vsftpd/vsftpd_login.db //编辑虚拟用户所需的PAM配置文件 #vi /etc/pam.d/vsftpd //在该文件中加入如下两行,并且保存后退出 auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login.db account required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login.db
建立虚拟用户访问所需要的目录并且设定相应的访问权限
#useradd –d /home/ftp virtual #chmod 700 /home/ftp
对vsftpd的主配置文件进行配置
//为了保证安全,首先生成该文件的一个备份,然后进行修改 #cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak #vi /etc/vsftpd/vsftpd.conf //配置相关选项如下所示 listen=YES tcp_wrappers=YES //支持tcp_wrappers,限制访问 (/etc/hosts.allow,/etc/hosts.deny) listen=YES的意思是使用standalone启动vsftpd,而不是super daemon(xinetd)控制它 (vsftpd推荐使用standalone方式) anonymous_enable=NO local_enable=YES //PAM方式此处必须为YES write_enable=NO anon_upload_enable=NO anon_mkdir_write_enable=NO anon_other_write_enable=NO chroot_local_user=YES guest_enable=YES guest_username=vsftpd //采用虚拟用户形式
重新启动vsftpd服务器
#service vsftpd restart
经过上面几个步骤的配置后,就可以使用虚拟用户登录vsftpd服务器了,如下所示:
使用创建的虚拟用户liyangsuper,登录成功:
#ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1). 220 Welcome to virtual FTP service. Name (127.0.0.1:root): liyangsuper 331 Please specify the password. Password: 230 Login successful. Have fun. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 227 Entering Passive Mode (127,0,0,1,119,210) 150 Here comes the directory listing. drwxr-xr-x 2 0 0 4096 Jul 09 15:26 ftp 226 Directory send OK.
能够浏览虚拟目录/home/ftp里的文件和目录
ftp> cd ftp 250 Directory successfully changed. ftp> ls 227 Entering Passive Mode (127,0,0,1,149,3) 150 Here comes the directory listing. -rw-r--r-- 1 0 0 10 Jul 09 15:26 test.c 226 Directory send OK.
测试是否能够创建目录
ftp> mkdir super 550 Permission denied.//操作被禁止 ftp> bye 221 Goodbye.
通过以上的测试可以知道,系统关于虚拟用户的默认用户权限与匿名用户的用户权限一致,都只有浏览以及下载的权限,而不具有上传和创建目录等写操作权限。
在vsftpd服务器的默认设置中,本地用户可以切换到主目录以外的目录进行浏览访问,这样对于服务器来说是不太安全的,因为任何用户可以随时浏览到别的用户的私有信息,下面介绍如何使用chroot选项来防止这种情况的发生。
与该功能相关的选项主要包括:
可以通过如下两种方法来设置chroot,从而杜绝上述不安全的情况发生:
(1)设置所有的本地用户执行chroot,只要将/etc/vsftpd/vsftpd.con文件中的chroot_local_ user值置为YES,即chroot_local_user=YES。
(2)设置指定的用户执行chroot,按照如下方法进行设置:
chroot_local_user=NO chroot_list_enable=YES chroot_list_file=/etc/vsftpd.chroot_list
设置后,只有/etc/vsftpd.chroot_list文件中指定的用户才能够执行chroot命令。
在使用FTP服务的过程中,可以使该服务在非标准端口(非21端口)工作,不过要完成这项工作,须要使vsftpd服务器运行在独立启动方式下,而且要配置vsftpd的主配置文件/etc/vsftpd/vsftpd.conf,将listen_port=10003或者是其他端口号的选项加入该文件即可,然后要重新启动vsftpd守护进程:
#service vsftpd restart
下面是对该功能进行实例验证:
使用匿名用户登录到服务器的10003端口,成功:
#ftp 127.0.0.1 10003 Connected to 127.0.0.1 (127.0.0.1). 220 (vsFTPd 1.1.3) Name (127.0.0.1:root): anonymous 331 Please specify the password. Password: 230 Login successful. Have fun. Remote system type is UNIX. Using binary mode to transfer files. ftp> bye 221 Goodbye.
测试以前使用的21端口,该端口已经不再有用:
# ftp 127.0.0.1 ftp: connect: Connection refused
所谓虚拟FTP服务器,是指一台机器上有多个IP地址,并且可以向外提供多FTP服务,这些服务器在逻辑上是独立的,有不同的访问控制表和不同的下载内容。
配置虚拟FTP服务器的步骤如下所示:
(1)为一个服务器配置多个IP地址。假设原来的主机内部地址为210.77.27.222,可再绑定一个IP地址如下:
向接口添加一个新的IP210.77.27.223
#/sbin/ifconfig eth0:0 210.77.27.223 up
(2)创建虚拟FTP服务器的根目录,并确保/var/newftp和/var/newftp/pub目录的拥有者和组均为root,掩码为755。
#mkdir -p /var/newftp/pub #chmod 755 /var/newftp #chmod 755 /var/new/ftp/pub
(3)增加虚拟FTP服务器的匿名用户账号。原先的FTP服务器使用系统用户ftp作为其匿名用户账号。需要增加一个newftp用于虚拟FTP服务器。
useradd -d /var/newftp -M newftp
(4)创建虚拟FTP服务器的配置文件。复制原来的vsftpd.conf作为虚拟FTP服务器的配置文件,并修改相关参数。
#cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd2.conf
新添或修改以下参数:
listen=YES listen_address=210.77.27.223 ftp_username=newftp
此处需要特别注意:由于vsftpd默认是监听所有的IP地址,当设定基于IP的虚拟FTP服务器时,为防止原来的FTP服务器与虚拟FTP服务器发生监听上的冲突,原FTP服务器须要指定监听的IP地址。在这里,原来的配置文件中就要设置listen_address=//向接口添加一个新的IP210.77.27.222。
(5)启动和测试虚拟FTP服务器。
可以使用命令同时启动或关闭原FTP服务器和新加的虚拟FTP服务器,如下:
#service vsftpd restart Shutting down vsftpd: [ OK ] Starting vsftpd for vsftpd2: [ OK ] Starting vsftpd for vsftpd: [ OK ]
启动成功后,就可以对该虚拟服务器登录进行测试,如下面所示:
测试以127.0.0.1登录:
# ftp 127.0.0.1 ftp: connect: Connection refused ftp> bye //测试失败,因为该服务器具有两个不同的IP
连接原来的FTP服务器,其IP地址为210.77.27.222,端口号为10003:
# ftp 210.77.27.222 10003 Connected to 210.77.27.222 (210.77.27.222). 220 Welcome to virtual FTP service.
使用匿名用户登录,成功:
Name (210.77.27.222:root): anonymous 331 Please specify the password. Password: 230 Login successful. Have fun. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 227 Entering Passive Mode (210,77,27,222,51,224) 150 Here comes the directory listing. drwxr-xr-x 2 0 0 4096 Jul 09 15:26 pub 226 Directory send OK. ftp> cd pub 250 Directory successfully changed. ftp> ls 227 Entering Passive Mode (210,77,27,222,223,123) 150 Here comes the directory listing. -rw-r--r-- 1 0 0 10 Jul 09 15:26 test.c 226 Directory send OK. ftp> bye 221 Goodbye.
连接虚拟FTP服务器,其IP地址为210.77.27.223,端口号为10004:
# ftp 210.77.27.223 10004 Connected to 210.77.27.223 (210.77.27.223). 220 Welcome to virtual FTP service.
使用匿名用户登录,成功:
Name (210.77.27.223:root): anonymous 331 Please specify the password. Password: 230 Login successful. Have fun. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 227 Entering Passive Mode (210,77,27,223,102,119) 150 Here comes the directory listing. drwxr-xr-x 2 0 0 4096 Jul 10 13:23 pub 226 Directory send OK.
进入该登录文件夹:
ftp> cd pub 250 Directory successfully changed. ftp> ls //由于该虚拟服务器没有加入任何文件,所以ls结果为空 227 Entering Passive Mode (210,77,27,223,170,40) 150 Here comes the directory listing. 226 Directory send OK. ftp> bye 221 Goodbye.
作者简介:李洋,博士毕业于中科院计算所。10多年来一直从事计算机网络信息安全研发工作,曾主持和参与多项国家重点项目以及信息安全系统和企业信息安全系统的研发工作。具有Linux系统应用、管理、安全及内核的研发经验,擅长网络安全技术、协议分析、Linux系统安全技术、Linux系统及网络管理、Linux内核开发等。
原文地址:http://www.linuxidc.com/Linux/2013-09/90565.htm